hippo-memory 1.72.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 (995) hide show
  1. package/README.md +6 -4
  2. package/dist/agent-memories/apply.d.ts +7 -5
  3. package/dist/agent-memories/apply.js +66 -39
  4. package/dist/agent-memories/claude-code.d.ts +8 -2
  5. package/dist/agent-memories/claude-code.js +26 -7
  6. package/dist/agent-memories/copilot.js +2 -1
  7. package/dist/agent-memories/files.js +2 -1
  8. package/dist/agent-memories/legacy.d.ts +6 -3
  9. package/dist/agent-memories/legacy.js +35 -14
  10. package/dist/agent-memories/markdown.d.ts +3 -1
  11. package/dist/agent-memories/markdown.js +3 -1
  12. package/dist/agent-memories/openclaw.js +5 -2
  13. package/dist/agent-memories/plan.js +11 -1
  14. package/dist/agent-memories/project-folds.js +2 -1
  15. package/dist/agent-memories/report.d.ts +4 -1
  16. package/dist/agent-memories/report.js +43 -9
  17. package/dist/agent-memories/source.d.ts +8 -2
  18. package/dist/agent-memories/source.js +11 -3
  19. package/dist/agent-memories/sync.d.ts +7 -2
  20. package/dist/agent-memories/sync.js +141 -101
  21. package/dist/api/assemble.d.ts +6 -4
  22. package/dist/api/assemble.js +11 -5
  23. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  24. package/dist/api/auth/audit.js +58 -0
  25. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
  26. package/dist/api/{auth.js → auth/auth.js} +66 -54
  27. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  28. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
  29. package/dist/api/auth/session-owners.d.ts +10 -0
  30. package/dist/api/auth/session-owners.js +35 -0
  31. package/dist/api/availability.d.ts +3 -1
  32. package/dist/api/availability.js +3 -1
  33. package/dist/api/busy.d.ts +2 -0
  34. package/dist/api/busy.js +2 -0
  35. package/dist/api/cli-surface.d.ts +6 -0
  36. package/dist/api/cli-surface.js +6 -0
  37. package/dist/api/config-of.d.ts +5 -0
  38. package/dist/api/config-of.js +6 -0
  39. package/dist/api/context-auto.d.ts +4 -1
  40. package/dist/api/context-auto.js +14 -4
  41. package/dist/api/context-render.js +14 -7
  42. package/dist/api/context-select.d.ts +4 -1
  43. package/dist/api/context-select.js +31 -34
  44. package/dist/api/context-types.d.ts +38 -12
  45. package/dist/api/context.d.ts +8 -5
  46. package/dist/api/context.js +120 -63
  47. package/dist/api/continuity.d.ts +24 -21
  48. package/dist/api/continuity.js +18 -20
  49. package/dist/api/correction-latency.d.ts +3 -1
  50. package/dist/api/correction-latency.js +3 -1
  51. package/dist/api/error-reply.d.ts +4 -1
  52. package/dist/api/error-reply.js +12 -3
  53. package/dist/api/index.d.ts +39 -23
  54. package/dist/api/index.js +21 -23
  55. package/dist/api/instruction-detect.d.ts +4 -1
  56. package/dist/api/instruction-detect.js +75 -20
  57. package/dist/api/ledger-db.d.ts +15 -11
  58. package/dist/api/ledger-db.js +21 -23
  59. package/dist/api/memories/conflicts.d.ts +33 -0
  60. package/dist/api/memories/conflicts.js +67 -0
  61. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  62. package/dist/api/{forget.js → memories/forget.js} +23 -17
  63. package/dist/api/memories/memories.d.ts +27 -0
  64. package/dist/api/memories/memories.js +52 -0
  65. package/dist/api/memories/outcome.d.ts +22 -0
  66. package/dist/api/memories/outcome.js +28 -0
  67. package/dist/api/memories/promote.d.ts +40 -0
  68. package/dist/api/memories/promote.js +76 -0
  69. package/dist/api/memories/refine.d.ts +10 -0
  70. package/dist/api/memories/refine.js +12 -0
  71. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
  72. package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
  73. package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
  74. package/dist/api/{remember.js → memories/remember.js} +50 -32
  75. package/dist/api/objects/cards.d.ts +39 -0
  76. package/dist/api/{cards.js → objects/cards.js} +12 -14
  77. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  78. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
  79. package/dist/api/objects/goals.d.ts +18 -0
  80. package/dist/api/{goals.js → objects/goals.js} +12 -12
  81. package/dist/api/objects/graph.d.ts +11 -0
  82. package/dist/api/objects/graph.js +16 -0
  83. package/dist/api/objects/objects.d.ts +9 -0
  84. package/dist/api/{objects.js → objects/objects.js} +2 -3
  85. package/dist/api/objects/predictions.d.ts +11 -0
  86. package/dist/api/{predictions.js → objects/predictions.js} +7 -5
  87. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  88. package/dist/api/{projects.js → objects/projects.js} +8 -4
  89. package/dist/api/pilot-arm.d.ts +8 -4
  90. package/dist/api/pilot-arm.js +5 -4
  91. package/dist/api/prompt-hook.d.ts +35 -20
  92. package/dist/api/prompt-hook.js +66 -44
  93. package/dist/api/provenance-coverage.d.ts +3 -1
  94. package/dist/api/provenance-coverage.js +3 -1
  95. package/dist/api/recall/finish.d.ts +185 -0
  96. package/dist/api/recall/finish.js +301 -0
  97. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  98. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
  99. package/dist/api/recall/recall.d.ts +6 -0
  100. package/dist/api/{recall.js → recall/recall.js} +116 -72
  101. package/dist/api/recall/render.d.ts +39 -0
  102. package/dist/api/recall/render.js +60 -0
  103. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  104. package/dist/api/recall/request.js +261 -0
  105. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  106. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  107. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
  108. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  109. package/dist/api/session-end.d.ts +36 -8
  110. package/dist/api/session-end.js +71 -25
  111. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  112. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  113. package/dist/api/sleep/dormant.d.ts +25 -0
  114. package/dist/api/sleep/dormant.js +64 -0
  115. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  116. package/dist/api/sleep/learn.js +138 -0
  117. package/dist/api/sleep/sleep-run.d.ts +38 -0
  118. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
  119. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  120. package/dist/api/sleep/sleep.js +9 -0
  121. package/dist/api/status.d.ts +3 -1
  122. package/dist/api/status.js +3 -1
  123. package/dist/api/store-init.d.ts +4 -1
  124. package/dist/api/store-init.js +4 -1
  125. package/dist/api/tokens.d.ts +10 -9
  126. package/dist/api/tokens.js +9 -10
  127. package/dist/api/types.d.ts +27 -12
  128. package/dist/api/types.js +13 -4
  129. package/dist/capture/caller-session.d.ts +8 -2
  130. package/dist/capture/caller-session.js +16 -6
  131. package/dist/capture/capture-error.d.ts +3 -1
  132. package/dist/capture/capture-error.js +3 -1
  133. package/dist/capture/codex-patch.js +7 -2
  134. package/dist/capture/command.d.ts +4 -2
  135. package/dist/capture/command.js +34 -15
  136. package/dist/capture/compact-resume-caller.js +15 -8
  137. package/dist/capture/compact.d.ts +8 -5
  138. package/dist/capture/compact.js +34 -23
  139. package/dist/capture/compaction-items-caller.js +9 -3
  140. package/dist/capture/compaction-record.d.ts +4 -3
  141. package/dist/capture/compaction-record.js +20 -12
  142. package/dist/capture/compaction-spool.d.ts +18 -9
  143. package/dist/capture/compaction-spool.js +105 -63
  144. package/dist/capture/copilot-transcript.d.ts +11 -3
  145. package/dist/capture/copilot-transcript.js +16 -6
  146. package/dist/capture/extract.js +20 -8
  147. package/dist/capture/failure-caller.js +23 -12
  148. package/dist/capture/failure-reading.d.ts +10 -3
  149. package/dist/capture/failure-reading.js +24 -7
  150. package/dist/capture/pre-compact-caller.js +11 -4
  151. package/dist/capture/session-digest.d.ts +15 -4
  152. package/dist/capture/session-digest.js +39 -13
  153. package/dist/capture/session-end-caller.d.ts +4 -1
  154. package/dist/capture/session-end-caller.js +20 -8
  155. package/dist/capture/session-texts.d.ts +6 -2
  156. package/dist/capture/session-texts.js +22 -7
  157. package/dist/capture/session-worker.d.ts +4 -2
  158. package/dist/capture/session-worker.js +58 -17
  159. package/dist/capture/transcript.d.ts +13 -4
  160. package/dist/capture/transcript.js +32 -10
  161. package/dist/capture/working-state.d.ts +13 -4
  162. package/dist/capture/working-state.js +50 -56
  163. package/dist/cli/api-context.d.ts +14 -2
  164. package/dist/cli/api-context.js +45 -2
  165. package/dist/cli/audit.js +33 -33
  166. package/dist/cli/auth.js +23 -31
  167. package/dist/cli/briefs.d.ts +1 -1
  168. package/dist/cli/briefs.js +20 -15
  169. package/dist/cli/card.d.ts +1 -1
  170. package/dist/cli/card.js +56 -73
  171. package/dist/cli/client.d.ts +12 -5
  172. package/dist/cli/client.js +53 -23
  173. package/dist/cli/compact-resume-payload.d.ts +4 -1
  174. package/dist/cli/compact-resume-payload.js +12 -5
  175. package/dist/cli/context.js +43 -18
  176. package/dist/cli/continuity.d.ts +5 -5
  177. package/dist/cli/continuity.js +90 -107
  178. package/dist/cli/curate.d.ts +5 -4
  179. package/dist/cli/curate.js +55 -77
  180. package/dist/cli/dag.d.ts +1 -1
  181. package/dist/cli/dag.js +14 -17
  182. package/dist/cli/decisions.js +30 -30
  183. package/dist/cli/eval.js +16 -21
  184. package/dist/cli/exit.d.ts +4 -1
  185. package/dist/cli/exit.js +10 -2
  186. package/dist/cli/explain.js +12 -11
  187. package/dist/cli/flag-values.d.ts +1 -1
  188. package/dist/cli/flag-values.js +9 -18
  189. package/dist/cli/github.d.ts +6 -0
  190. package/dist/cli/github.js +25 -13
  191. package/dist/cli/goals.d.ts +1 -1
  192. package/dist/cli/goals.js +39 -56
  193. package/dist/cli/graph.d.ts +1 -1
  194. package/dist/cli/graph.js +15 -11
  195. package/dist/cli/hook-runtime.d.ts +34 -10
  196. package/dist/cli/hook-runtime.js +41 -16
  197. package/dist/cli/incidents.d.ts +1 -1
  198. package/dist/cli/incidents.js +25 -25
  199. package/dist/cli/init.d.ts +1 -1
  200. package/dist/cli/init.js +35 -20
  201. package/dist/cli/install-steps.d.ts +12 -3
  202. package/dist/cli/install-steps.js +42 -18
  203. package/dist/cli/last-sleep.d.ts +4 -1
  204. package/dist/cli/last-sleep.js +9 -4
  205. package/dist/cli/maintenance.d.ts +1 -1
  206. package/dist/cli/maintenance.js +11 -12
  207. package/dist/cli/notes.d.ts +1 -1
  208. package/dist/cli/notes.js +8 -5
  209. package/dist/cli/object-verbs.d.ts +5 -5
  210. package/dist/cli/object-verbs.js +13 -16
  211. package/dist/cli/open-browser.js +11 -2
  212. package/dist/cli/playbooks.d.ts +3 -3
  213. package/dist/cli/playbooks.js +40 -32
  214. package/dist/cli/predictions.js +17 -22
  215. package/dist/cli/print.js +4 -2
  216. package/dist/cli/projects.js +21 -11
  217. package/dist/cli/quality-repair-once.d.ts +1 -1
  218. package/dist/cli/quality-repair-once.js +7 -6
  219. package/dist/cli/recall.js +129 -93
  220. package/dist/cli/refine-llm.d.ts +15 -4
  221. package/dist/cli/refine-llm.js +17 -7
  222. package/dist/cli/remember.js +51 -55
  223. package/dist/cli/scheduler.d.ts +4 -1
  224. package/dist/cli/scheduler.js +9 -5
  225. package/dist/cli/serve.js +28 -18
  226. package/dist/cli/session-hooks.d.ts +2 -6
  227. package/dist/cli/session-hooks.js +140 -112
  228. package/dist/cli/setup.d.ts +1 -1
  229. package/dist/cli/setup.js +56 -34
  230. package/dist/cli/shared.d.ts +4 -2
  231. package/dist/cli/shared.js +26 -11
  232. package/dist/cli/slack.js +15 -24
  233. package/dist/cli/sleep-render.d.ts +3 -1
  234. package/dist/cli/sleep-render.js +8 -5
  235. package/dist/cli/sleep.js +16 -8
  236. package/dist/cli/status.d.ts +4 -4
  237. package/dist/cli/status.js +32 -27
  238. package/dist/cli/stdin.d.ts +10 -3
  239. package/dist/cli/stdin.js +10 -3
  240. package/dist/cli/transfer.d.ts +4 -4
  241. package/dist/cli/transfer.js +97 -82
  242. package/dist/cli/usage.d.ts +1 -1
  243. package/dist/cli/usage.js +1 -1
  244. package/dist/cli/verb-row.d.ts +2 -0
  245. package/dist/cli/verbs/health.js +2 -0
  246. package/dist/cli/verbs/memory.js +47 -53
  247. package/dist/cli/verbs/objects.js +16 -7
  248. package/dist/cli/verbs/sessions.js +4 -2
  249. package/dist/cli/versioned-verbs.d.ts +8 -7
  250. package/dist/cli/versioned-verbs.js +31 -21
  251. package/dist/cli.js +14 -18
  252. package/dist/connectors/dlq.d.ts +6 -6
  253. package/dist/connectors/dlq.js +12 -7
  254. package/dist/connectors/github/backfill.d.ts +4 -4
  255. package/dist/connectors/github/backfill.js +6 -4
  256. package/dist/connectors/github/deletion.d.ts +6 -4
  257. package/dist/connectors/github/deletion.js +5 -4
  258. package/dist/connectors/github/dlq.d.ts +8 -6
  259. package/dist/connectors/github/dlq.js +11 -5
  260. package/dist/connectors/github/ingest.d.ts +2 -2
  261. package/dist/connectors/github/ingest.js +9 -5
  262. package/dist/connectors/github/octokit-client.d.ts +3 -1
  263. package/dist/connectors/github/octokit-client.js +7 -2
  264. package/dist/connectors/github/ratelimit.d.ts +6 -2
  265. package/dist/connectors/github/ratelimit.js +6 -2
  266. package/dist/connectors/github/signature.d.ts +14 -3
  267. package/dist/connectors/github/signature.js +17 -3
  268. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  269. package/dist/connectors/github/tenant-routing.js +6 -5
  270. package/dist/connectors/github/transform.js +50 -67
  271. package/dist/connectors/github/types.d.ts +10 -3
  272. package/dist/connectors/github/types.js +6 -2
  273. package/dist/connectors/github/webhook.d.ts +5 -5
  274. package/dist/connectors/github/webhook.js +36 -23
  275. package/dist/connectors/ingest.d.ts +5 -3
  276. package/dist/connectors/ingest.js +3 -3
  277. package/dist/connectors/slack/backfill.d.ts +5 -5
  278. package/dist/connectors/slack/backfill.js +3 -3
  279. package/dist/connectors/slack/deletion.d.ts +4 -4
  280. package/dist/connectors/slack/deletion.js +6 -5
  281. package/dist/connectors/slack/dlq.d.ts +4 -4
  282. package/dist/connectors/slack/dlq.js +6 -6
  283. package/dist/connectors/slack/ingest.d.ts +6 -4
  284. package/dist/connectors/slack/ingest.js +5 -4
  285. package/dist/connectors/slack/signature.d.ts +4 -1
  286. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  287. package/dist/connectors/slack/tenant-routing.js +6 -5
  288. package/dist/connectors/slack/transform.d.ts +6 -2
  289. package/dist/connectors/slack/transform.js +6 -2
  290. package/dist/connectors/slack/types.d.ts +3 -1
  291. package/dist/connectors/slack/web-client.js +8 -3
  292. package/dist/connectors/slack/webhook.d.ts +5 -5
  293. package/dist/connectors/slack/webhook.js +19 -11
  294. package/dist/connectors/slack/workspaces.d.ts +7 -3
  295. package/dist/connectors/slack/workspaces.js +7 -3
  296. package/dist/connectors/store.d.ts +8 -0
  297. package/dist/connectors/store.js +2 -0
  298. package/dist/consolidate/conflicts.js +24 -10
  299. package/dist/consolidate/dag-summary.js +2 -1
  300. package/dist/consolidate/dag.d.ts +10 -5
  301. package/dist/consolidate/dag.js +45 -39
  302. package/dist/consolidate/decay.js +19 -6
  303. package/dist/consolidate/dedupe.d.ts +14 -5
  304. package/dist/consolidate/dedupe.js +28 -17
  305. package/dist/consolidate/flush-units.d.ts +4 -1
  306. package/dist/consolidate/flush-units.js +4 -1
  307. package/dist/consolidate/half-life-migration.d.ts +18 -8
  308. package/dist/consolidate/half-life-migration.js +48 -18
  309. package/dist/consolidate/llm-passes.js +27 -11
  310. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  311. package/dist/consolidate/memory-value-weights.js +6 -2
  312. package/dist/consolidate/memory-value.d.ts +30 -10
  313. package/dist/consolidate/memory-value.js +37 -14
  314. package/dist/consolidate/merge.d.ts +4 -1
  315. package/dist/consolidate/merge.js +47 -37
  316. package/dist/consolidate/overlap-index.d.ts +8 -2
  317. package/dist/consolidate/overlap-index.js +11 -4
  318. package/dist/consolidate/physics-pass.d.ts +3 -1
  319. package/dist/consolidate/physics-pass.js +10 -7
  320. package/dist/consolidate/replay.d.ts +11 -4
  321. package/dist/consolidate/replay.js +19 -7
  322. package/dist/consolidate/run.d.ts +13 -5
  323. package/dist/consolidate/run.js +4 -4
  324. package/dist/consolidate/sleep.d.ts +14 -6
  325. package/dist/consolidate/sleep.js +42 -39
  326. package/dist/consolidate/trace.d.ts +7 -2
  327. package/dist/consolidate/trace.js +7 -2
  328. package/dist/consolidate/traces.js +27 -30
  329. package/dist/core/ablation.d.ts +9 -3
  330. package/dist/core/ablation.js +14 -4
  331. package/dist/core/active-scope.d.ts +3 -1
  332. package/dist/core/active-scope.js +3 -1
  333. package/dist/core/agent-memory-tools.d.ts +2 -0
  334. package/dist/core/agent-memory-tools.js +2 -0
  335. package/dist/core/ambient.d.ts +4 -3
  336. package/dist/core/ambient.js +8 -6
  337. package/dist/core/api-errors.d.ts +9 -3
  338. package/dist/core/api-errors.js +9 -3
  339. package/dist/core/capture-contract.d.ts +4 -1
  340. package/dist/core/capture-contract.js +27 -8
  341. package/dist/core/compare.d.ts +24 -8
  342. package/dist/core/compare.js +24 -8
  343. package/dist/core/config.d.ts +18 -9
  344. package/dist/core/config.js +38 -29
  345. package/dist/core/cosine.d.ts +4 -1
  346. package/dist/core/cosine.js +4 -1
  347. package/dist/core/handoff.d.ts +7 -2
  348. package/dist/core/handoff.js +4 -1
  349. package/dist/core/markdown.js +22 -17
  350. package/dist/core/memory-audit.js +14 -3
  351. package/dist/core/memory-quality.d.ts +12 -3
  352. package/dist/core/memory-quality.js +57 -21
  353. package/dist/core/memory.d.ts +87 -30
  354. package/dist/core/memory.js +82 -33
  355. package/dist/core/merged-row.d.ts +8 -2
  356. package/dist/core/merged-row.js +10 -3
  357. package/dist/core/package-root.d.ts +3 -1
  358. package/dist/core/package-root.js +3 -1
  359. package/dist/core/particle-refresh.d.ts +8 -0
  360. package/dist/core/particle-refresh.js +22 -0
  361. package/dist/core/physics-config.d.ts +4 -1
  362. package/dist/core/physics-config.js +6 -2
  363. package/dist/core/physics.d.ts +39 -11
  364. package/dist/core/physics.js +71 -21
  365. package/dist/core/project-identity.d.ts +34 -17
  366. package/dist/core/project-identity.js +35 -18
  367. package/dist/core/project-remote.d.ts +8 -4
  368. package/dist/core/project-remote.js +31 -14
  369. package/dist/core/recall-scope.d.ts +33 -11
  370. package/dist/core/recall-scope.js +42 -15
  371. package/dist/core/rejection-digest.d.ts +7 -0
  372. package/dist/core/rejection-digest.js +13 -0
  373. package/dist/core/salience.d.ts +3 -1
  374. package/dist/core/salience.js +10 -4
  375. package/dist/core/search-types.d.ts +15 -2
  376. package/dist/core/search-types.js +11 -0
  377. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  378. package/dist/dashboard/dashboard-actions.js +18 -7
  379. package/dist/dashboard/dashboard-queries.js +2 -7
  380. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  381. package/dist/dashboard/dashboard-snapshot.js +5 -7
  382. package/dist/dashboard/dashboard.js +22 -8
  383. package/dist/db/backup.js +2 -2
  384. package/dist/db/busy.d.ts +10 -3
  385. package/dist/db/busy.js +27 -5
  386. package/dist/db/connect.d.ts +10 -2
  387. package/dist/db/connect.js +8 -2
  388. package/dist/db/continuity.d.ts +1 -1
  389. package/dist/db/continuity.js +27 -11
  390. package/dist/db/meta.d.ts +4 -1
  391. package/dist/db/meta.js +4 -1
  392. package/dist/db/migrate.d.ts +10 -5
  393. package/dist/db/migrate.js +40 -20
  394. package/dist/db/migrations/index.d.ts +1 -1
  395. package/dist/db/migrations/index.js +3 -1
  396. package/dist/db/migrations/types.d.ts +2 -1
  397. package/dist/db/migrations/v11.js +1 -0
  398. package/dist/db/migrations/v12.js +2 -1
  399. package/dist/db/migrations/v14.js +2 -0
  400. package/dist/db/migrations/v15.js +4 -2
  401. package/dist/db/migrations/v16.js +6 -3
  402. package/dist/db/migrations/v17.js +2 -1
  403. package/dist/db/migrations/v19.js +4 -2
  404. package/dist/db/migrations/v20.js +2 -1
  405. package/dist/db/migrations/v22.js +12 -6
  406. package/dist/db/migrations/v23.js +6 -3
  407. package/dist/db/migrations/v24.js +6 -3
  408. package/dist/db/migrations/v25.js +4 -2
  409. package/dist/db/migrations/v26.js +4 -2
  410. package/dist/db/migrations/v27.js +6 -3
  411. package/dist/db/migrations/v28.js +4 -2
  412. package/dist/db/migrations/v29.js +4 -2
  413. package/dist/db/migrations/v30.js +6 -3
  414. package/dist/db/migrations/v31.js +4 -2
  415. package/dist/db/migrations/v32.js +6 -3
  416. package/dist/db/migrations/v33.js +4 -2
  417. package/dist/db/migrations/v34.js +2 -1
  418. package/dist/db/migrations/v35.js +2 -1
  419. package/dist/db/migrations/v36.js +2 -1
  420. package/dist/db/migrations/v37.js +10 -5
  421. package/dist/db/migrations/v38.js +10 -5
  422. package/dist/db/migrations/v39.js +14 -6
  423. package/dist/db/migrations/v40.js +4 -2
  424. package/dist/db/migrations/v41.js +4 -2
  425. package/dist/db/migrations/v42.js +2 -1
  426. package/dist/db/migrations/v44.js +4 -2
  427. package/dist/db/migrations/v45.js +4 -2
  428. package/dist/db/migrations/v49.js +2 -1
  429. package/dist/db/migrations/v50.js +4 -2
  430. package/dist/db/migrations/v51.js +4 -2
  431. package/dist/db/migrations/v52.js +2 -1
  432. package/dist/db/migrations/v53.js +8 -4
  433. package/dist/db/migrations/v54.js +2 -1
  434. package/dist/db/migrations/v55.js +4 -2
  435. package/dist/db/migrations/v56.d.ts +3 -0
  436. package/dist/db/migrations/v56.js +28 -0
  437. package/dist/db/open.d.ts +24 -12
  438. package/dist/db/open.js +25 -13
  439. package/dist/db/physics-state.d.ts +8 -8
  440. package/dist/db/physics-state.js +17 -50
  441. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  442. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  443. package/dist/db/request-stores.d.ts +20 -5
  444. package/dist/db/request-stores.js +15 -5
  445. package/dist/db/tables.d.ts +2 -1
  446. package/dist/db/tables.js +12 -4
  447. package/dist/db/vector-store.d.ts +13 -4
  448. package/dist/db/vector-store.js +35 -14
  449. package/dist/db/wal-checkpointer.d.ts +2 -1
  450. package/dist/db/wal-checkpointer.js +19 -7
  451. package/dist/doctor.d.ts +7 -1
  452. package/dist/doctor.js +128 -46
  453. package/dist/embeddings/local.d.ts +8 -4
  454. package/dist/embeddings/local.js +11 -7
  455. package/dist/embeddings/provider.d.ts +19 -10
  456. package/dist/embeddings/provider.js +32 -27
  457. package/dist/embeddings/transformers.d.ts +16 -4
  458. package/dist/embeddings/transformers.js +32 -15
  459. package/dist/entry/json-hooks.d.ts +1 -1
  460. package/dist/entry/json-hooks.js +1 -1
  461. package/dist/entry/project-identity.js +2 -1
  462. package/dist/entry/session-text.d.ts +1 -1
  463. package/dist/entry/session-text.js +1 -1
  464. package/dist/entry/sqlite-handles.d.ts +10 -0
  465. package/dist/entry/sqlite-handles.js +9 -0
  466. package/dist/entry/store-kit.d.ts +50 -0
  467. package/dist/entry/store-kit.js +27 -0
  468. package/dist/entry/testing.d.ts +6 -0
  469. package/dist/entry/testing.js +7 -0
  470. package/dist/eval/eval-stats.d.ts +27 -8
  471. package/dist/eval/eval-stats.js +17 -5
  472. package/dist/eval/eval-suite.d.ts +3 -1
  473. package/dist/eval/eval-suite.js +409 -187
  474. package/dist/eval/eval.d.ts +8 -2
  475. package/dist/eval/eval.js +8 -2
  476. package/dist/eval/judgment.js +17 -7
  477. package/dist/graph/delta.d.ts +9 -42
  478. package/dist/graph/delta.js +17 -11
  479. package/dist/graph/extract.d.ts +10 -7
  480. package/dist/graph/extract.js +57 -25
  481. package/dist/graph/recall.d.ts +12 -4
  482. package/dist/graph/recall.js +30 -13
  483. package/dist/graph/stream.d.ts +18 -6
  484. package/dist/graph/stream.js +32 -10
  485. package/dist/graph/view.d.ts +19 -6
  486. package/dist/graph/view.js +42 -17
  487. package/dist/hooks/codex-session.js +2 -2
  488. package/dist/hooks/codex-wrapper.d.ts +3 -1
  489. package/dist/hooks/codex-wrapper.js +9 -4
  490. package/dist/hooks/copilot.d.ts +19 -5
  491. package/dist/hooks/copilot.js +54 -15
  492. package/dist/hooks/hook-blocks.d.ts +4 -1
  493. package/dist/hooks/hook-blocks.js +8 -3
  494. package/dist/hooks/json-hooks.d.ts +9 -5
  495. package/dist/hooks/json-hooks.js +72 -33
  496. package/dist/hooks/opencode.js +15 -5
  497. package/dist/hooks/shared.d.ts +27 -8
  498. package/dist/hooks/shared.js +57 -16
  499. package/dist/importers/core.d.ts +12 -4
  500. package/dist/importers/core.js +11 -10
  501. package/dist/importers/markdown-parse.d.ts +15 -5
  502. package/dist/importers/markdown-parse.js +16 -7
  503. package/dist/importers/markdown.js +6 -9
  504. package/dist/importers/sources.js +10 -23
  505. package/dist/importers/vault.d.ts +3 -3
  506. package/dist/importers/vault.js +61 -45
  507. package/dist/index.d.ts +33 -7
  508. package/dist/index.js +26 -8
  509. package/dist/learn/autolearn.d.ts +21 -6
  510. package/dist/learn/autolearn.js +57 -26
  511. package/dist/learn/churn-git.d.ts +4 -1
  512. package/dist/learn/churn-git.js +29 -5
  513. package/dist/learn/extract.d.ts +4 -1
  514. package/dist/learn/extract.js +17 -10
  515. package/dist/learn/forward-claim-detector.d.ts +17 -5
  516. package/dist/learn/forward-claim-detector.js +34 -15
  517. package/dist/learn/invalidation.d.ts +12 -6
  518. package/dist/learn/invalidation.js +62 -28
  519. package/dist/learn/roots.d.ts +3 -0
  520. package/dist/learn/roots.js +5 -0
  521. package/dist/mcp/admin-tools.d.ts +5 -5
  522. package/dist/mcp/admin-tools.js +28 -23
  523. package/dist/mcp/format.d.ts +1 -1
  524. package/dist/mcp/format.js +4 -2
  525. package/dist/mcp/framing.d.ts +3 -1
  526. package/dist/mcp/framing.js +20 -8
  527. package/dist/mcp/memory-tools.d.ts +3 -3
  528. package/dist/mcp/memory-tools.js +21 -20
  529. package/dist/mcp/protocol.d.ts +32 -16
  530. package/dist/mcp/protocol.js +12 -9
  531. package/dist/mcp/recall-tools.d.ts +3 -3
  532. package/dist/mcp/recall-tools.js +62 -74
  533. package/dist/mcp/request.d.ts +7 -5
  534. package/dist/mcp/request.js +61 -77
  535. package/dist/mcp/server.d.ts +3 -1
  536. package/dist/mcp/server.js +8 -3
  537. package/dist/mcp/session-state.d.ts +1 -1
  538. package/dist/mcp/session-state.js +4 -3
  539. package/dist/mcp/shared-gate.d.ts +3 -2
  540. package/dist/mcp/shared-gate.js +3 -2
  541. package/dist/mcp/stdio.d.ts +6 -3
  542. package/dist/mcp/stdio.js +59 -23
  543. package/dist/mcp/tool-args.d.ts +4 -1
  544. package/dist/mcp/tool-args.js +8 -3
  545. package/dist/mcp/tools.js +76 -32
  546. package/dist/objects/customer-notes.d.ts +12 -10
  547. package/dist/objects/customer-notes.js +21 -15
  548. package/dist/objects/decisions.d.ts +18 -10
  549. package/dist/objects/decisions.js +23 -17
  550. package/dist/objects/descriptor.js +2 -1
  551. package/dist/objects/fields.d.ts +4 -1
  552. package/dist/objects/fields.js +6 -2
  553. package/dist/objects/incidents.d.ts +14 -16
  554. package/dist/objects/incidents.js +29 -30
  555. package/dist/objects/lifecycle.d.ts +0 -4
  556. package/dist/objects/lifecycle.js +21 -24
  557. package/dist/objects/policies.d.ts +12 -16
  558. package/dist/objects/policies.js +17 -21
  559. package/dist/objects/processes.d.ts +16 -10
  560. package/dist/objects/processes.js +20 -15
  561. package/dist/objects/project-briefs.d.ts +13 -14
  562. package/dist/objects/project-briefs.js +33 -39
  563. package/dist/objects/skills.d.ts +10 -12
  564. package/dist/objects/skills.js +17 -22
  565. package/dist/postinstall.js +15 -7
  566. package/dist/predictions/planning-fallacy.d.ts +19 -6
  567. package/dist/predictions/planning-fallacy.js +4 -2
  568. package/dist/rerankers/clef.d.ts +8 -2
  569. package/dist/rerankers/clef.js +14 -9
  570. package/dist/rerankers/cross-encoder.d.ts +2 -1
  571. package/dist/rerankers/cross-encoder.js +19 -9
  572. package/dist/rerankers/index.js +2 -1
  573. package/dist/rerankers/jev.js +2 -1
  574. package/dist/rerankers/llm.d.ts +6 -2
  575. package/dist/rerankers/llm.js +8 -3
  576. package/dist/rerankers/remote.d.ts +3 -1
  577. package/dist/rerankers/remote.js +5 -2
  578. package/dist/rerankers/types.d.ts +6 -2
  579. package/dist/search/bm25-search.d.ts +3 -1
  580. package/dist/search/bm25-search.js +15 -2
  581. package/dist/search/boosts.js +4 -3
  582. package/dist/search/embed-memories.d.ts +12 -4
  583. package/dist/search/embed-memories.js +96 -58
  584. package/dist/search/engine.d.ts +11 -0
  585. package/dist/search/engine.js +14 -0
  586. package/dist/search/goal-boost.d.ts +10 -3
  587. package/dist/search/goal-boost.js +13 -6
  588. package/dist/search/hybrid-score.d.ts +4 -1
  589. package/dist/search/hybrid-score.js +4 -1
  590. package/dist/search/hybrid.d.ts +23 -8
  591. package/dist/search/hybrid.js +12 -7
  592. package/dist/search/multihop.js +14 -13
  593. package/dist/search/path-context.d.ts +10 -3
  594. package/dist/search/path-context.js +10 -3
  595. package/dist/search/physics-search.d.ts +9 -4
  596. package/dist/search/physics-search.js +38 -14
  597. package/dist/search/rerank.d.ts +2 -1
  598. package/dist/search/rerank.js +2 -1
  599. package/dist/search/rrf.d.ts +14 -5
  600. package/dist/search/rrf.js +11 -4
  601. package/dist/search/vector.d.ts +8 -2
  602. package/dist/search/vector.js +14 -8
  603. package/dist/server/auth.d.ts +19 -15
  604. package/dist/server/auth.js +68 -38
  605. package/dist/server/boot.d.ts +4 -1
  606. package/dist/server/boot.js +115 -67
  607. package/dist/server/client-ip.d.ts +17 -5
  608. package/dist/server/client-ip.js +56 -21
  609. package/dist/server/cursor.d.ts +10 -3
  610. package/dist/server/cursor.js +10 -3
  611. package/dist/server/deadline.d.ts +5 -2
  612. package/dist/server/deadline.js +10 -3
  613. package/dist/server/key-check-bounds.js +12 -4
  614. package/dist/server/lifecycle.d.ts +4 -1
  615. package/dist/server/lifecycle.js +10 -4
  616. package/dist/server/mcp-http.d.ts +2 -1
  617. package/dist/server/mcp-http.js +37 -22
  618. package/dist/server/rate-limit.d.ts +17 -5
  619. package/dist/server/rate-limit.js +55 -26
  620. package/dist/server/ready.js +7 -4
  621. package/dist/server/request.d.ts +15 -4
  622. package/dist/server/request.js +42 -15
  623. package/dist/server/route-checks.d.ts +4 -1
  624. package/dist/server/route-checks.js +8 -3
  625. package/dist/server/route-table.d.ts +8 -6
  626. package/dist/server/route-table.js +550 -97
  627. package/dist/server/routes/admin.d.ts +7 -7
  628. package/dist/server/routes/admin.js +36 -15
  629. package/dist/server/routes/customer-notes.d.ts +5 -5
  630. package/dist/server/routes/customer-notes.js +5 -4
  631. package/dist/server/routes/decisions.d.ts +5 -5
  632. package/dist/server/routes/decisions.js +12 -6
  633. package/dist/server/routes/incidents.d.ts +5 -5
  634. package/dist/server/routes/incidents.js +10 -4
  635. package/dist/server/routes/memories.d.ts +8 -8
  636. package/dist/server/routes/memories.js +12 -17
  637. package/dist/server/routes/object-routes.d.ts +8 -5
  638. package/dist/server/routes/object-routes.js +4 -2
  639. package/dist/server/routes/policies.d.ts +6 -6
  640. package/dist/server/routes/policies.js +11 -4
  641. package/dist/server/routes/predictions.d.ts +5 -5
  642. package/dist/server/routes/predictions.js +9 -4
  643. package/dist/server/routes/processes.d.ts +5 -5
  644. package/dist/server/routes/processes.js +15 -6
  645. package/dist/server/routes/project-briefs.d.ts +6 -6
  646. package/dist/server/routes/project-briefs.js +3 -2
  647. package/dist/server/routes/recall.d.ts +3 -3
  648. package/dist/server/routes/recall.js +21 -10
  649. package/dist/server/routes/skills.d.ts +6 -6
  650. package/dist/server/routes/skills.js +12 -4
  651. package/dist/server/server-detect.d.ts +24 -8
  652. package/dist/server/server-detect.js +57 -22
  653. package/dist/server/sleep-child.js +16 -10
  654. package/dist/server/sleep-offload.d.ts +8 -5
  655. package/dist/server/sleep-offload.js +40 -18
  656. package/dist/server/tls.d.ts +10 -2
  657. package/dist/server/tls.js +25 -5
  658. package/dist/server/types.d.ts +41 -24
  659. package/dist/server/validation.d.ts +4 -1
  660. package/dist/server/validation.js +22 -9
  661. package/dist/server.d.ts +17 -49
  662. package/dist/server.js +33 -40
  663. package/dist/sharing/global-store.d.ts +6 -12
  664. package/dist/sharing/global-store.js +8 -48
  665. package/dist/sharing/global-sync.d.ts +3 -1
  666. package/dist/sharing/global-sync.js +17 -7
  667. package/dist/sharing/project-merge.d.ts +25 -7
  668. package/dist/sharing/project-merge.js +49 -17
  669. package/dist/sharing/search-both.d.ts +8 -4
  670. package/dist/sharing/search-both.js +28 -14
  671. package/dist/sharing/share.d.ts +8 -4
  672. package/dist/sharing/share.js +40 -18
  673. package/dist/store/ambient.js +10 -5
  674. package/dist/store/audit-event.d.ts +2 -2
  675. package/dist/store/audit-event.js +8 -3
  676. package/dist/store/audit.d.ts +6 -3
  677. package/dist/store/audit.js +16 -6
  678. package/dist/store/auth.d.ts +4 -2
  679. package/dist/store/auth.js +63 -20
  680. package/dist/store/busy.d.ts +9 -0
  681. package/dist/store/busy.js +16 -0
  682. package/dist/store/candidates.d.ts +12 -5
  683. package/dist/store/candidates.js +90 -41
  684. package/dist/store/capture-write.d.ts +2 -1
  685. package/dist/store/capture-write.js +2 -1
  686. package/dist/store/card-detail.d.ts +4 -4
  687. package/dist/store/card-detail.js +15 -8
  688. package/dist/store/cards.d.ts +24 -10
  689. package/dist/store/cards.js +97 -63
  690. package/dist/store/compaction-caller.d.ts +2 -1
  691. package/dist/store/compaction-caller.js +2 -1
  692. package/dist/store/compactions-record.d.ts +14 -8
  693. package/dist/store/compactions-record.js +101 -37
  694. package/dist/store/compactions.js +35 -15
  695. package/dist/store/conflicts.d.ts +16 -5
  696. package/dist/store/conflicts.js +104 -48
  697. package/dist/store/connectors/dlq.d.ts +17 -5
  698. package/dist/store/connectors/dlq.js +58 -6
  699. package/dist/store/connectors/event-log.d.ts +122 -0
  700. package/dist/store/connectors/event-log.js +25 -0
  701. package/dist/store/connectors/github.d.ts +6 -3
  702. package/dist/store/connectors/github.js +30 -48
  703. package/dist/store/connectors/slack.d.ts +2 -1
  704. package/dist/store/connectors/slack.js +31 -47
  705. package/dist/store/dashboard-reads.d.ts +7 -3
  706. package/dist/store/dashboard-reads.js +32 -10
  707. package/dist/store/delete-and-batch.d.ts +17 -11
  708. package/dist/store/delete-and-batch.js +70 -28
  709. package/dist/store/delivery-recorder.d.ts +10 -7
  710. package/dist/store/delivery-recorder.js +70 -37
  711. package/dist/store/descendant-page.d.ts +2 -1
  712. package/dist/store/descendant-page.js +26 -10
  713. package/dist/store/diagnostics.d.ts +2 -1
  714. package/dist/store/diagnostics.js +2 -1
  715. package/dist/store/doctor-reads.d.ts +2 -1
  716. package/dist/store/doctor-reads.js +13 -5
  717. package/dist/store/dormant.d.ts +19 -11
  718. package/dist/store/dormant.js +45 -19
  719. package/dist/store/embeddings/index.d.ts +13 -9
  720. package/dist/store/embeddings/index.js +19 -12
  721. package/dist/store/entry-reads.d.ts +72 -21
  722. package/dist/store/entry-reads.js +215 -69
  723. package/dist/store/entry-row.d.ts +10 -6
  724. package/dist/store/entry-row.js +26 -14
  725. package/dist/store/entry-writes.d.ts +28 -13
  726. package/dist/store/entry-writes.js +61 -22
  727. package/dist/store/failure-log-at.js +1 -1
  728. package/dist/store/failure-log.d.ts +4 -2
  729. package/dist/store/failure-log.js +13 -6
  730. package/dist/store/gated-write.d.ts +3 -3
  731. package/dist/store/gated-write.js +3 -3
  732. package/dist/store/goals.d.ts +5 -4
  733. package/dist/store/goals.js +11 -12
  734. package/dist/store/graph-apply.d.ts +21 -0
  735. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  736. package/dist/store/graph-queue.d.ts +9 -6
  737. package/dist/store/graph-queue.js +15 -10
  738. package/dist/store/graph-reads.d.ts +16 -11
  739. package/dist/store/graph-reads.js +29 -19
  740. package/dist/store/graph-rows.d.ts +41 -3
  741. package/dist/store/graph-rows.js +10 -7
  742. package/dist/store/graph-view-rows.js +15 -7
  743. package/dist/store/graph-writes.d.ts +16 -10
  744. package/dist/store/graph-writes.js +59 -36
  745. package/dist/store/half-life.js +2 -2
  746. package/dist/store/handoffs.d.ts +13 -7
  747. package/dist/store/handoffs.js +44 -22
  748. package/dist/store/index-and-stats.d.ts +2 -2
  749. package/dist/store/index-and-stats.js +6 -5
  750. package/dist/store/index.d.ts +4 -2
  751. package/dist/store/index.js +2 -1
  752. package/dist/store/key-audit.d.ts +2 -1
  753. package/dist/store/key-audit.js +2 -1
  754. package/dist/store/key-writes.d.ts +2 -1
  755. package/dist/store/key-writes.js +9 -2
  756. package/dist/store/ledger-turn.d.ts +4 -1
  757. package/dist/store/ledger-turn.js +7 -2
  758. package/dist/store/mirrors.d.ts +11 -4
  759. package/dist/store/mirrors.js +96 -19
  760. package/dist/store/narrow.d.ts +6 -0
  761. package/dist/store/narrow.js +11 -0
  762. package/dist/store/open.d.ts +6 -3
  763. package/dist/store/open.js +20 -10
  764. package/dist/store/pilot-arm.d.ts +2 -1
  765. package/dist/store/pilot-arm.js +18 -6
  766. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  767. package/dist/store/planning-fallacy-evidence.js +8 -5
  768. package/dist/store/port/agent-import.d.ts +62 -0
  769. package/dist/store/port/agent-import.js +2 -0
  770. package/dist/store/port/consolidation.d.ts +129 -0
  771. package/dist/store/port/consolidation.js +2 -0
  772. package/dist/store/port/learning.d.ts +19 -0
  773. package/dist/store/port/learning.js +2 -0
  774. package/dist/store/port/local-files.d.ts +18 -0
  775. package/dist/store/port/local-files.js +2 -0
  776. package/dist/store/port/promotion.d.ts +20 -0
  777. package/dist/store/port/promotion.js +3 -0
  778. package/dist/store/port-groups.d.ts +160 -0
  779. package/dist/store/port-groups.js +2 -0
  780. package/dist/store/port.d.ts +261 -219
  781. package/dist/store/port.js +3 -9
  782. package/dist/store/predictions.d.ts +14 -10
  783. package/dist/store/predictions.js +37 -17
  784. package/dist/store/project-tags.d.ts +4 -1
  785. package/dist/store/project-tags.js +16 -5
  786. package/dist/store/quality-repair.d.ts +8 -4
  787. package/dist/store/quality-repair.js +53 -20
  788. package/dist/store/quarantine.d.ts +1 -0
  789. package/dist/store/quarantine.js +23 -9
  790. package/dist/store/raw-archive.d.ts +5 -4
  791. package/dist/store/raw-archive.js +11 -10
  792. package/dist/store/recall-trace.d.ts +22 -17
  793. package/dist/store/recall-trace.js +128 -64
  794. package/dist/store/rejected-values.d.ts +15 -10
  795. package/dist/store/rejected-values.js +46 -20
  796. package/dist/store/rejection.d.ts +12 -11
  797. package/dist/store/rejection.js +18 -19
  798. package/dist/store/report-reads.d.ts +2 -1
  799. package/dist/store/report-reads.js +2 -1
  800. package/dist/store/rows.d.ts +7 -5
  801. package/dist/store/rows.js +20 -13
  802. package/dist/store/rule-sql.d.ts +7 -3
  803. package/dist/store/rule-sql.js +26 -13
  804. package/dist/store/search-rows.d.ts +16 -11
  805. package/dist/store/search-rows.js +54 -32
  806. package/dist/store/sessions.d.ts +12 -10
  807. package/dist/store/sessions.js +40 -21
  808. package/dist/store/set-aside.d.ts +2 -2
  809. package/dist/store/set-aside.js +18 -5
  810. package/dist/store/sqlite/agent-import.d.ts +3 -0
  811. package/dist/store/sqlite/agent-import.js +77 -0
  812. package/dist/store/sqlite/cards-group.d.ts +6 -0
  813. package/dist/store/sqlite/cards-group.js +37 -0
  814. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  815. package/dist/store/sqlite/conflicts-group.js +18 -0
  816. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  817. package/dist/store/sqlite/connector-events-group.js +17 -6
  818. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  819. package/dist/store/sqlite/connector-writes-group.js +12 -5
  820. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  821. package/dist/store/sqlite/consolidation-group.js +64 -0
  822. package/dist/store/sqlite/dag-reads-group.js +1 -1
  823. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  824. package/dist/store/sqlite/dormant-group.js +29 -0
  825. package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
  826. package/dist/store/sqlite/entry-writes-group.js +37 -14
  827. package/dist/store/sqlite/error-codec.d.ts +4 -2
  828. package/dist/store/sqlite/error-codec.js +32 -10
  829. package/dist/store/sqlite/executor-counts.js +2 -1
  830. package/dist/store/sqlite/executor.d.ts +8 -3
  831. package/dist/store/sqlite/executor.js +56 -18
  832. package/dist/store/sqlite/global-promote.d.ts +5 -0
  833. package/dist/store/sqlite/global-promote.js +48 -0
  834. package/dist/store/sqlite/goals-group.d.ts +6 -0
  835. package/dist/store/sqlite/goals-group.js +23 -0
  836. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  837. package/dist/store/sqlite/graph-reads-group.js +2 -1
  838. package/dist/store/sqlite/held-connection.d.ts +8 -0
  839. package/dist/store/sqlite/held-connection.js +34 -7
  840. package/dist/store/sqlite/last-recall-group.d.ts +15 -0
  841. package/dist/store/sqlite/last-recall-group.js +62 -0
  842. package/dist/store/sqlite/learning-group.d.ts +4 -0
  843. package/dist/store/sqlite/learning-group.js +17 -0
  844. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  845. package/dist/store/sqlite/maintenance-groups.js +61 -0
  846. package/dist/store/sqlite/object-rows.d.ts +6 -3
  847. package/dist/store/sqlite/object-rows.js +34 -5
  848. package/dist/store/sqlite/objects-group.d.ts +5 -4
  849. package/dist/store/sqlite/objects-group.js +97 -38
  850. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  851. package/dist/store/sqlite/predictions-group.js +4 -2
  852. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  853. package/dist/store/sqlite/promotion-group.js +10 -0
  854. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  855. package/dist/store/sqlite/quarantine-group.js +4 -2
  856. package/dist/store/sqlite/reports-group.d.ts +6 -0
  857. package/dist/store/sqlite/reports-group.js +33 -0
  858. package/dist/store/sqlite/request-scope.d.ts +6 -0
  859. package/dist/store/sqlite/request-scope.js +18 -0
  860. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  861. package/dist/store/sqlite/sessions-group.js +46 -0
  862. package/dist/store/sqlite/store.d.ts +22 -18
  863. package/dist/store/sqlite/store.js +95 -33
  864. package/dist/store/sqlite/vector-pack.js +2 -1
  865. package/dist/store/sqlite/vector-reads-group.js +2 -1
  866. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  867. package/dist/store/sqlite/worker-jobs.js +19 -7
  868. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  869. package/dist/store/sqlite/worker-ops.js +6 -3
  870. package/dist/store/sqlite/worker-store.d.ts +4 -3
  871. package/dist/store/sqlite/worker-store.js +24 -14
  872. package/dist/store/summaries.d.ts +25 -11
  873. package/dist/store/summaries.js +84 -27
  874. package/dist/store/summary-dirty.d.ts +2 -1
  875. package/dist/store/summary-dirty.js +2 -1
  876. package/dist/store/tenant.d.ts +3 -2
  877. package/dist/store/tenant.js +5 -4
  878. package/dist/store/token-ledger-rows.js +8 -4
  879. package/dist/store/token-ledger.d.ts +19 -13
  880. package/dist/store/token-ledger.js +27 -14
  881. package/dist/store/tombstone-checks.d.ts +4 -1
  882. package/dist/store/tombstone-checks.js +10 -1
  883. package/dist/store/usage-reports.js +2 -1
  884. package/dist/store/vector-index.d.ts +8 -5
  885. package/dist/store/vector-index.js +28 -11
  886. package/dist/store/working-memory.d.ts +6 -4
  887. package/dist/store/working-memory.js +14 -9
  888. package/dist/support-bundle.js +10 -5
  889. package/dist/trust/quarantine.d.ts +1 -2
  890. package/dist/trust/quarantine.js +1 -5
  891. package/dist/trust/reject-flow.d.ts +12 -3
  892. package/dist/trust/reject-flow.js +12 -4
  893. package/dist/util/anthropic-messages.d.ts +7 -2
  894. package/dist/util/anthropic-messages.js +18 -7
  895. package/dist/util/atomic-write.d.ts +8 -3
  896. package/dist/util/atomic-write.js +36 -21
  897. package/dist/util/compaction-items.d.ts +4 -1
  898. package/dist/util/compaction-items.js +8 -2
  899. package/dist/util/crash-handlers.d.ts +7 -2
  900. package/dist/util/crash-handlers.js +13 -4
  901. package/dist/util/env.d.ts +26 -5
  902. package/dist/util/env.js +87 -25
  903. package/dist/util/format.d.ts +2 -0
  904. package/dist/util/format.js +4 -0
  905. package/dist/util/home-path.js +12 -6
  906. package/dist/util/hook-payload.d.ts +3 -1
  907. package/dist/util/hook-payload.js +3 -1
  908. package/dist/util/http-retry.d.ts +12 -6
  909. package/dist/util/http-retry.js +16 -6
  910. package/dist/util/http-util.d.ts +20 -5
  911. package/dist/util/http-util.js +28 -9
  912. package/dist/util/json.d.ts +4 -1
  913. package/dist/util/json.js +4 -1
  914. package/dist/util/keyset.js +2 -1
  915. package/dist/util/limits.js +4 -2
  916. package/dist/util/log.d.ts +13 -5
  917. package/dist/util/log.js +29 -6
  918. package/dist/util/net.d.ts +5 -0
  919. package/dist/util/net.js +19 -0
  920. package/dist/util/real-path.d.ts +2 -1
  921. package/dist/util/real-path.js +4 -3
  922. package/dist/util/request-scope.d.ts +16 -4
  923. package/dist/util/request-scope.js +19 -6
  924. package/dist/util/same-text.d.ts +10 -3
  925. package/dist/util/same-text.js +10 -3
  926. package/dist/util/secret-detect.d.ts +24 -7
  927. package/dist/util/secret-detect.js +49 -14
  928. package/dist/util/spawn-argv.d.ts +11 -0
  929. package/dist/util/spawn-argv.js +66 -0
  930. package/dist/util/sql.d.ts +3 -0
  931. package/dist/util/sql.js +6 -0
  932. package/dist/util/sqlite-blocked.d.ts +15 -4
  933. package/dist/util/sqlite-blocked.js +19 -6
  934. package/dist/util/stored-json.d.ts +4 -1
  935. package/dist/util/stored-json.js +6 -2
  936. package/dist/util/stream-tee.d.ts +2 -1
  937. package/dist/util/stream-tee.js +8 -5
  938. package/dist/util/transcript-tail.d.ts +4 -1
  939. package/dist/util/transcript-tail.js +4 -1
  940. package/dist/util/vector-codec.d.ts +4 -0
  941. package/dist/util/vector-codec.js +15 -0
  942. package/dist/util/version.d.ts +8 -3
  943. package/dist/util/version.js +8 -3
  944. package/dist/util/write-budget.d.ts +7 -2
  945. package/dist/util/write-budget.js +5 -2
  946. package/dist/util/yaml.d.ts +4 -1
  947. package/dist/util/yaml.js +4 -1
  948. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  949. package/extensions/openclaw-plugin/package.json +1 -1
  950. package/openclaw.plugin.json +1 -1
  951. package/package.json +4 -1
  952. package/scripts/postinstall.cjs +3 -1
  953. package/dist/api/audit.js +0 -56
  954. package/dist/api/cards.d.ts +0 -42
  955. package/dist/api/conflicts.d.ts +0 -28
  956. package/dist/api/conflicts.js +0 -61
  957. package/dist/api/dormant.d.ts +0 -14
  958. package/dist/api/dormant.js +0 -58
  959. package/dist/api/goals.d.ts +0 -18
  960. package/dist/api/graph.d.ts +0 -8
  961. package/dist/api/graph.js +0 -7
  962. package/dist/api/learn.js +0 -124
  963. package/dist/api/memories.d.ts +0 -23
  964. package/dist/api/memories.js +0 -46
  965. package/dist/api/objects.d.ts +0 -9
  966. package/dist/api/on-store.d.ts +0 -16
  967. package/dist/api/on-store.js +0 -38
  968. package/dist/api/outcome.d.ts +0 -19
  969. package/dist/api/outcome.js +0 -21
  970. package/dist/api/predictions.d.ts +0 -11
  971. package/dist/api/promote.d.ts +0 -36
  972. package/dist/api/promote.js +0 -65
  973. package/dist/api/recall-core.d.ts +0 -4
  974. package/dist/api/recall-core.js +0 -120
  975. package/dist/api/recall-finish.d.ts +0 -53
  976. package/dist/api/recall-finish.js +0 -30
  977. package/dist/api/recall-history.d.ts +0 -64
  978. package/dist/api/recall-history.js +0 -159
  979. package/dist/api/recall-record.d.ts +0 -43
  980. package/dist/api/recall-record.js +0 -78
  981. package/dist/api/recall-request.js +0 -121
  982. package/dist/api/recall.d.ts +0 -6
  983. package/dist/api/refine.d.ts +0 -7
  984. package/dist/api/refine.js +0 -10
  985. package/dist/api/session-owners.d.ts +0 -4
  986. package/dist/api/session-owners.js +0 -17
  987. package/dist/api/sleep-run.d.ts +0 -26
  988. package/dist/api/sleep.js +0 -10
  989. package/dist/cli/lenient-id.d.ts +0 -2
  990. package/dist/cli/lenient-id.js +0 -13
  991. package/dist/graph/write.d.ts +0 -14
  992. package/dist/store/sqlite/busy.d.ts +0 -3
  993. package/dist/store/sqlite/busy.js +0 -8
  994. package/dist/store/sqlite/local.d.ts +0 -21
  995. package/dist/store/sqlite/local.js +0 -39
@@ -2,7 +2,7 @@ import { DEFAULT_TENANT_ID } from '../util/env.js';
2
2
  import { closeHippoDb, withWriteScope } from '../db/index.js';
3
3
  import { rejectionDigest, insertRejectedValue, normalizeValueForRejection } from './rejection.js';
4
4
  import { archiveRawMemory } from './raw-archive.js';
5
- import { rowToMemoryConflict } from './rows.js';
5
+ import { parseJsonArray, rowToMemoryConflict } from './rows.js';
6
6
  import { audit } from './audit-event.js';
7
7
  import { syncChangedMirrors, purgeMirrorBestEffort } from './mirrors.js';
8
8
  import { selectEntriesByIds } from './entry-reads.js';
@@ -12,6 +12,7 @@ import { deleteEntryCore } from './delete-and-batch.js';
12
12
  import { BadRequestError } from '../core/api-errors.js';
13
13
  import { canTouchScope, isPersonalScope } from '../core/recall-scope.js';
14
14
  import { selectMemoryReach } from './tenant-lookup.js';
15
+ import { placeholders } from '../util/sql.js';
15
16
  // The one place MemoryConflictRow's columns are listed; CONFLICT_COLS_MC is the same list under the `mc` alias.
16
17
  const CONFLICT_COLS = 'id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at';
17
18
  const CONFLICT_COLS_MC = CONFLICT_COLS.split(', ').map((c) => `mc.${c}`).join(', ');
@@ -21,25 +22,30 @@ function canonicalConflictPair(aId, bId) {
21
22
  : { memory_a_id: bId, memory_b_id: aId };
22
23
  }
23
24
  function selectConflictRowsInTenant(db, status, allStatuses, tenantId) {
24
- // 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.
25
27
  // SAFETY: both branches select CONFLICT_COLS_MC, MemoryConflictRow's columns.
26
28
  return allStatuses
27
- ? db.prepare(`
29
+ ? db
30
+ .prepare(`
28
31
  SELECT ${CONFLICT_COLS_MC}
29
32
  FROM memory_conflicts mc
30
33
  JOIN memories ma ON ma.id = mc.memory_a_id
31
34
  JOIN memories mb ON mb.id = mc.memory_b_id
32
35
  WHERE ma.tenant_id = ? AND mb.tenant_id = ?
33
36
  ORDER BY mc.updated_at DESC, mc.id DESC
34
- `).all(tenantId, tenantId)
35
- : db.prepare(`
37
+ `)
38
+ .all(tenantId, tenantId)
39
+ : db
40
+ .prepare(`
36
41
  SELECT ${CONFLICT_COLS_MC}
37
42
  FROM memory_conflicts mc
38
43
  JOIN memories ma ON ma.id = mc.memory_a_id
39
44
  JOIN memories mb ON mb.id = mc.memory_b_id
40
45
  WHERE mc.status = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
41
46
  ORDER BY mc.updated_at DESC, mc.id DESC
42
- `).all(status, tenantId, tenantId);
47
+ `)
48
+ .all(status, tenantId, tenantId);
43
49
  }
44
50
  function selectConflictRowsUnscoped(db, status, allStatuses) {
45
51
  // Unscoped query — legacy direct-mode (CLI, tests, consolidate).
@@ -59,7 +65,8 @@ function selectConflictRowsUnscoped(db, status, allStatuses) {
59
65
  }
60
66
  export function listMemoryConflicts(hippoRoot, status = 'open', tenantId) {
61
67
  return onHandle(hippoRoot, (db) => {
62
- // '*' 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}.
63
70
  const allStatuses = status === '*';
64
71
  const rows = tenantId !== undefined
65
72
  ? selectConflictRowsInTenant(db, status, allStatuses, tenantId)
@@ -74,13 +81,16 @@ const OPEN_IN_TENANT = `FROM memory_conflicts mc
74
81
  WHERE mc.status = 'open' AND ma.tenant_id = ? AND mb.tenant_id = ?`;
75
82
  /** How many open conflicts listMemoryConflicts returns for a tenant, without loading one. */
76
83
  export function countOpenConflicts(hippoRoot, tenantId) {
77
- return onHandle(hippoRoot, (db) => {
78
- // SAFETY: one row with the single aliased count column.
79
- const row = db.prepare(`SELECT COUNT(*) AS n ${OPEN_IN_TENANT}`).get(tenantId, tenantId);
80
- return Number(row.n);
81
- }, openStore);
84
+ return onHandle(hippoRoot, (db) => countOpenConflictsAt(db, tenantId), openStore);
82
85
  }
83
- /** 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. */
84
94
  export function loadOpenConflictsOf(hippoRoot, tenantId, memoryId) {
85
95
  return onHandle(hippoRoot, (db) => {
86
96
  // SAFETY: selects CONFLICT_COLS_MC, MemoryConflictRow's columns.
@@ -112,7 +122,8 @@ export function replaceDetectedConflicts(hippoRoot, detected, detectedAt = new D
112
122
  syncChangedMirrors(hippoRoot, db, [...selectEntriesByIds(db, changedIds).values()]);
113
123
  }, openStore);
114
124
  }
115
- /** 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. */
116
127
  function readConflictRefresh(db, detected) {
117
128
  // Tenant guard (E2): a conflict is meaningful only within one tenant, so cross-tenant pairs are
118
129
  // skipped on insert and on rebuild, and a stale cross-tenant row can neither persist nor leak a foreign id.
@@ -132,7 +143,7 @@ function readConflictRefresh(db, detected) {
132
143
  }
133
144
  const given = [...new Set(detected.flatMap((c) => [c.memory_a_id, c.memory_b_id]))].filter((id) => !tenantById.has(id));
134
145
  for (const ids of chunked(given)) {
135
- const marks = ids.map(() => '?').join(',');
146
+ const marks = placeholders(ids.length);
136
147
  // SAFETY: rows' shape matches the two columns named in the SELECT.
137
148
  const found = db.prepare(`SELECT id, tenant_id FROM memories WHERE id IN (${marks})`).all(...ids);
138
149
  for (const r of found)
@@ -170,7 +181,8 @@ function resolveStaleOpenConflicts(db, canonicalDetected, sameTenant, detectedAt
170
181
  for (const row of openRows) {
171
182
  const key = `${row.memory_a_id}::${row.memory_b_id}`;
172
183
  const stale = !detectedKeys.has(key);
173
- // 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'.
174
186
  const crossTenant = !sameTenant(row.memory_a_id, row.memory_b_id);
175
187
  if (stale || crossTenant)
176
188
  resolve.run(detectedAt, row.id);
@@ -203,8 +215,8 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
203
215
  `).all();
204
216
  const refMap = new Map();
205
217
  for (const row of openConflicts) {
206
- // Skip cross-tenant pairs so a stale row never seeds a foreign id
207
- // into conflicts_with_json.
218
+ // Skip cross-tenant pairs so a stale row never
219
+ // seeds a foreign id into conflicts_with_json.
208
220
  if (!sameTenant(row.memory_a_id, row.memory_b_id))
209
221
  continue;
210
222
  if (!refMap.has(row.memory_a_id))
@@ -214,8 +226,10 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
214
226
  refMap.get(row.memory_a_id).add(row.memory_b_id);
215
227
  refMap.get(row.memory_b_id).add(row.memory_a_id);
216
228
  }
217
- // 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.
218
- 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 ?`);
219
233
  const changedIds = [];
220
234
  for (const id of new Set([...storedRefs.keys(), ...refMap.keys()])) {
221
235
  const stored = storedRefs.has(id) ? storedRefs.get(id) ?? null : '[]';
@@ -227,7 +241,8 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
227
241
  }
228
242
  return changedIds;
229
243
  }
230
- // 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.
231
246
  // Omitted tenantId = unscoped (CLI direct mode, tests).
232
247
  function conflictMemScope(tenantId) {
233
248
  return {
@@ -251,9 +266,10 @@ function findResolvableConflict(db, conflictId, keepId, tenantId) {
251
266
  return null;
252
267
  return { conflict, loserId };
253
268
  }
254
- /** 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
255
271
  * digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
256
- export function resolveConflict(hippoRoot, conflictId, keepId, forgetLoser = false, tenantId, opts) {
272
+ export function resolveConflict(hippoRoot, { conflictId, keepId, forgetLoser = false, tenantId }, opts) {
257
273
  const db = openStore(hippoRoot);
258
274
  const scope = conflictMemScope(tenantId);
259
275
  try {
@@ -298,18 +314,26 @@ function selectConflictRow(db, conflictId, tenantId) {
298
314
  }
299
315
  function weakenConflictLoser(db, t) {
300
316
  // Halve the loser's half-life (weakens it over time)
301
- db.prepare(`UPDATE memories SET half_life_days = MAX(1, half_life_days / 2), updated_at = datetime('now') WHERE id = ?${t.scope.memScope}`)
302
- .run(t.loserId, ...t.scope.memArgs);
303
- 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
+ };
304
326
  }
305
327
  function removeConflictLoser(db, t) {
306
- // 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.
307
330
  // loserRemoved / loserWasRaw drive the conflicts_with_json skip below and the post-commit mirror purge.
308
331
  const removal = {
309
332
  loserRemoved: false,
310
333
  loserWasRaw: false,
311
334
  rejectedDigest: undefined,
312
- // 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.
313
337
  extraRemovedIds: [],
314
338
  extraRemovedRawIds: [],
315
339
  };
@@ -349,28 +373,31 @@ function recordRejectedLoserValue(db, t, loserRow, digest, who) {
349
373
  normalizedChars: normalizeValueForRejection(loserRow.content).length,
350
374
  });
351
375
  }
352
- /** Tombstones the loser's digest and removes its same-tenant duplicates into `removal`; returns the digest. */
353
- function tombstoneLoserValue(db, t, loserRow, who, removal) {
354
- if (isPersonalScope(loserRow.scope)) {
355
- throw new BadRequestError(`cannot reject the value of personal memory ${t.loserId}: a rejection reaches the whole tenant, ` +
356
- `so its reason would show to everyone; resolve with forget instead`);
357
- }
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) {
358
378
  const { actor, reason } = who;
359
- const rejectedDigest = rejectionDigest(loserRow.content);
360
- recordRejectedLoserValue(db, t, loserRow, rejectedDigest, who);
361
- // 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.
362
- // 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.
363
383
  const loserTenantId = loserRow.tenant_id ?? DEFAULT_TENANT_ID;
364
- // 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.
365
387
  const dupRows = db
366
388
  .prepare(`SELECT id, kind, content, scope FROM memories WHERE tenant_id = ? AND id != ? AND id != ?`)
367
- .all(loserTenantId, t.loserId, t.keepId);
389
+ .iterate(loserTenantId, t.loserId, t.keepId);
390
+ const dups = [];
368
391
  for (const dup of dupRows) {
369
392
  if (rejectionDigest(dup.content) !== rejectedDigest)
370
393
  continue;
371
394
  // Another person's personal row is outside this resolver's reach, as it is outside their recall.
372
395
  if (isPersonalScope(dup.scope) && dup.scope !== loserRow.scope)
373
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) {
374
401
  if (dup.kind === 'raw') {
375
402
  archiveRawMemory(db, dup.id, { reason, who: actor });
376
403
  removal.extraRemovedRawIds.push(dup.id);
@@ -380,6 +407,16 @@ function tombstoneLoserValue(db, t, loserRow, who, removal) {
380
407
  }
381
408
  removal.extraRemovedIds.push(dup.id);
382
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);
383
420
  return rejectedDigest;
384
421
  }
385
422
  function stripConflictRefs(db, t, loserRemoved) {
@@ -389,7 +426,11 @@ function stripConflictRefs(db, t, loserRemoved) {
389
426
  // SAFETY: keepRow's shape matches the single `conflicts_with_json` column selected above.
390
427
  const keepRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(keepId, ...memArgs);
391
428
  if (keepRow) {
392
- const refs = JSON.parse(keepRow.conflicts_with_json || '[]');
429
+ const refs = parseJsonArray(keepRow.conflicts_with_json, {
430
+ table: 'memories',
431
+ id: keepId,
432
+ column: 'conflicts_with_json',
433
+ });
393
434
  const cleaned = refs.filter((r) => r !== loserId);
394
435
  db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') WHERE id = ?${memScope}`)
395
436
  .run(JSON.stringify(cleaned), keepId, ...memArgs);
@@ -399,7 +440,11 @@ function stripConflictRefs(db, t, loserRemoved) {
399
440
  // column named in the SELECT below.
400
441
  const loserRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(loserId, ...memArgs);
401
442
  if (loserRow) {
402
- const refs = JSON.parse(loserRow.conflicts_with_json || '[]');
443
+ const refs = parseJsonArray(loserRow.conflicts_with_json, {
444
+ table: 'memories',
445
+ id: loserId,
446
+ column: 'conflicts_with_json',
447
+ });
403
448
  const cleaned = refs.filter((r) => r !== keepId);
404
449
  db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') WHERE id = ?${memScope}`)
405
450
  .run(JSON.stringify(cleaned), loserId, ...memArgs);
@@ -422,15 +467,23 @@ function auditConflictResolve(db, t, removal, tenantId) {
422
467
  // omitting the key, exactly as the pre-migration object literal did.
423
468
  if (rejectedDigest !== undefined)
424
469
  conflictResolveMeta.rejectedDigest = rejectedDigest;
425
- // Fresh spread literal: ConflictResolveMeta is a closed interface, not assignable to audit()'s Record<string, JsonValue> metadata otherwise.
426
- 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
+ });
427
478
  }
428
479
  function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
429
- // 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.
430
482
  // A non-raw mirror has no reaper, so skipping the purge would orphan it forever.
431
483
  for (const removedId of [loserId, ...removal.extraRemovedIds]) {
432
484
  const isRaw = removedId === loserId ? removal.loserWasRaw : removal.extraRemovedRawIds.includes(removedId);
433
- // 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.
434
487
  const mirrorOk = purgeMirrorBestEffort(hippoRoot, removedId, isRaw, 'resolveConflict');
435
488
  if (mirrorOk && isRaw) {
436
489
  db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(new Date().toISOString(), removedId);
@@ -440,8 +493,11 @@ function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
440
493
  /** The conflict and loser ids every conflict_resolve audit row names. */
441
494
  export function conflictResolveAuditsAt(db) {
442
495
  // SAFETY: SELECT of two fields every conflict_resolve audit row carries (ConflictResolveMeta above).
443
- return db.prepare(`SELECT json_extract(metadata_json, '$.conflictId') AS conflictId, json_extract(metadata_json, '$.loserId') AS loserId ` +
444
- `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();
445
501
  }
446
502
  /** Every resolved conflict with both sides. */
447
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,14 +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.
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
+ }
2
17
  /** Inserts one row, stamping received_at; `columns` pairs each column name with its value, in insert order. */
3
- export function insertDlqRow(db, table, columns) {
18
+ function insertDlqRow(db, table, columns) {
19
+ assertTable(table);
4
20
  const names = [...columns.map(([name]) => name), 'received_at'];
21
+ assertColumns(names);
5
22
  const values = [...columns.map(([, value]) => value), new Date().toISOString()];
6
23
  const result = db
7
- .prepare(`INSERT INTO ${table} (${names.join(', ')}) VALUES (${names.map(() => '?').join(', ')})`)
24
+ .prepare(`INSERT INTO ${table} (${names.join(', ')}) VALUES (${placeholders(names.length)})`)
8
25
  .run(...values);
9
26
  return Number(result.lastInsertRowid);
10
27
  }
11
- 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()));
12
31
  // SAFETY: the caller's selectColumns names exactly the fields its rowToItem reads.
13
32
  return db
14
33
  .prepare(`SELECT ${selectColumns}
@@ -18,15 +37,48 @@ export function listDlqRows(db, table, selectColumns, tenantId, limit) {
18
37
  LIMIT ?`)
19
38
  .all(tenantId, limit);
20
39
  }
21
- 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()));
22
43
  // SAFETY: the caller's selectColumns names exactly the fields its rowToItem reads.
23
44
  const row = db
24
45
  .prepare(`SELECT ${selectColumns} FROM ${table} WHERE id = ?`)
25
46
  .get(id);
26
47
  return row ?? null;
27
48
  }
28
- export function markDlqRetried(db, table, id) {
49
+ function markDlqRetried(db, table, id) {
50
+ assertTable(table);
29
51
  db.prepare(`UPDATE ${table} SET retried_at = ?, retry_count = retry_count + 1 WHERE id = ?`)
30
52
  .run(new Date().toISOString(), id);
31
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
+ }
32
84
  //# sourceMappingURL=dlq.js.map
@@ -0,0 +1,122 @@
1
+ import type { DatabaseSyncLike } from '../../db/index.js';
2
+ import type { EntryWrite, RawArchive } from '../port.js';
3
+ import type { GitHubDlqInsert, GitHubRouting } from './github.js';
4
+ import type { SlackDlqInsert, SlackTeamRoute } from './slack.js';
5
+ /** Which log table a connector writes and the column its dedupe key lives in. */
6
+ export interface EventLogSpec {
7
+ readonly table: 'slack_event_log' | 'github_event_log';
8
+ readonly keyColumn: 'event_id' | 'idempotency_key';
9
+ }
10
+ export declare function eventSeenAt(db: DatabaseSyncLike, log: EventLogSpec, key: string): boolean;
11
+ export declare function eventMemoryAt(db: DatabaseSyncLike, log: EventLogSpec, key: string): string | null;
12
+ /** Records the key unless a row holds it already; false means another writer got there first. `extra` pairs
13
+ * connector-only columns with values. */
14
+ export declare function markEventSeenAt(db: DatabaseSyncLike, log: EventLogSpec, key: string, extra: ReadonlyArray<readonly [string, string]>, memoryId: string | null): boolean;
15
+ export declare function eventRecord(hippoRoot: string, log: EventLogSpec, key: string): ConnectorEventRecord;
16
+ /** The source event a connector's write answers, by the source's own key. The store logs each key once per connector,
17
+ * across every tenant. */
18
+ export type ConnectorEvent = {
19
+ readonly connector: 'slack';
20
+ readonly eventId: string;
21
+ } | {
22
+ readonly connector: 'github';
23
+ readonly idempotencyKey: string;
24
+ readonly deliveryId: string;
25
+ readonly eventName: string;
26
+ };
27
+ /** An entry a connector brings in. `quarantine` is the review record of flagged content, whose entry already carries
28
+ * its quarantine scope. */
29
+ export interface ConnectorWrite extends EntryWrite {
30
+ readonly event?: ConnectorEvent;
31
+ readonly quarantine?: {
32
+ readonly originalScope: string | null;
33
+ readonly reason: string;
34
+ };
35
+ }
36
+ /** 'duplicate': the event's key was logged before; `memoryId` is the id its log row holds, null for an event logged
37
+ * with no memory. */
38
+ export type ConnectorWriteOutcome = {
39
+ readonly outcome: 'written';
40
+ } | {
41
+ readonly outcome: 'duplicate';
42
+ readonly memoryId: string | null;
43
+ };
44
+ export interface ConnectorArchive extends RawArchive {
45
+ readonly event: ConnectorEvent;
46
+ }
47
+ /** A connector's writes with the rows that must commit with them: the event log row
48
+ * that turns a redelivery into a no-op, and the quarantine record of flagged content. */
49
+ export interface ConnectorWrites {
50
+ /** entryWrites.writeEntry plus, in its transaction: with `quarantine`, one pending record and quarantine row; with
51
+ * `event`, one log row. All commit or none. A key logged before resolves 'duplicate' and stores nothing (never a
52
+ * rejection); every other refusal is writeEntry's own, decided first. */
53
+ writeConnectorEntry(write: ConnectorWrite): Promise<ConnectorWriteOutcome>;
54
+ /** entryWrites.archiveRaw plus, in its transaction, one log row for `event` naming the archived id, so a redelivery
55
+ * finds it logged; a failed log write undoes the archive. A key logged before keeps its row and does not stop the
56
+ * archive. Reach and every rejection are archiveRaw's own. */
57
+ archiveConnectorEntry(archive: ConnectorArchive): Promise<string>;
58
+ }
59
+ /** What the event log holds for one event's key; `memoryId` is null for an event logged with no memory. */
60
+ export type ConnectorEventRecord = {
61
+ readonly seen: false;
62
+ } | {
63
+ readonly seen: true;
64
+ readonly memoryId: string | null;
65
+ };
66
+ export interface DeletionLookup {
67
+ readonly event: ConnectorEvent;
68
+ readonly artifactRef: string;
69
+ readonly tenantId: string;
70
+ }
71
+ /** `memoryId` is null when the tenant holds no raw row for the artifact. */
72
+ export type DeletionTarget = {
73
+ readonly seen: true;
74
+ } | {
75
+ readonly seen: false;
76
+ readonly memoryId: string | null;
77
+ };
78
+ export interface ArtifactArchive {
79
+ readonly tenantId: string;
80
+ readonly actor: string;
81
+ readonly artifactRef: string;
82
+ readonly reason: string;
83
+ readonly event: Extract<ConnectorEvent, {
84
+ readonly connector: 'github';
85
+ }>;
86
+ }
87
+ /** One payload a webhook could not use, already redacted, for the dead-letter queue of its connector. */
88
+ export type ConnectorDeadLetter = ({
89
+ readonly connector: 'slack';
90
+ } & SlackDlqInsert) | ({
91
+ readonly connector: 'github';
92
+ } & GitHubDlqInsert);
93
+ /** What a connector delivery reads and writes beside connectorWrites: the event log,
94
+ * tenant routing, the dead-letter queue and the archive of a deleted artifact. */
95
+ export interface ConnectorEvents {
96
+ /** The log row of the event's key, in its connector's own key space. */
97
+ eventRecord(event: ConnectorEvent): Promise<ConnectorEventRecord>;
98
+ /** Logs an event that stored no memory, so its redelivery finds it. A key logged before keeps its row, the memory id
99
+ * it names included. */
100
+ markEventSeen(event: ConnectorEvent): Promise<void>;
101
+ /** Both reads on one snapshot: an event logged before answers `seen`, else the raw row the
102
+ * tenant holds for the artifact. Another tenant's row under the same ref is never returned. */
103
+ deletionTarget(lookup: DeletionLookup): Promise<DeletionTarget>;
104
+ /** A logged event answers `duplicate` and changes nothing. Else one transaction archives every raw row of the
105
+ * artifact (archive_raw row each, under `actor`) and logs the event naming the first, or no memory if none; one
106
+ * failed archive undoes all and the log row. No reach check. */
107
+ archiveDeletedArtifact(archive: ArtifactArchive): Promise<{
108
+ readonly duplicate: boolean;
109
+ readonly archived: number;
110
+ }>;
111
+ /** The tenant a Slack team is registered to, or how many workspaces are registered when it is not. */
112
+ slackTeamRoute(teamId: string): Promise<SlackTeamRoute>;
113
+ /** The tenant of the installation, or of the repository when no installation is named, with the size of both routing
114
+ * tables. */
115
+ githubRouting(query: {
116
+ readonly installationId?: string | null;
117
+ readonly repoFullName?: string | null;
118
+ }): Promise<GitHubRouting>;
119
+ /** Appends the row and answers its id. */
120
+ parkDeadLetter(letter: ConnectorDeadLetter): Promise<number>;
121
+ }
122
+ //# sourceMappingURL=event-log.d.ts.map
@@ -0,0 +1,25 @@
1
+ // The event-log statements both connectors share; each connector names its table, key column and extra columns.
2
+ import { placeholders } from '../../util/sql.js';
3
+ import { onHandle } from '../open.js';
4
+ export function eventSeenAt(db, log, key) {
5
+ return !!db.prepare(`SELECT 1 FROM ${log.table} WHERE ${log.keyColumn} = ?`).get(key);
6
+ }
7
+ export function eventMemoryAt(db, log, key) {
8
+ // SAFETY: the SELECT projects only `memory_id`, a nullable column; .get() returns undefined when no row matches.
9
+ const row = db.prepare(`SELECT memory_id FROM ${log.table} WHERE ${log.keyColumn} = ?`).get(key);
10
+ return row?.memory_id ?? null;
11
+ }
12
+ /** Records the key unless a row holds it already; false means another writer got there first. `extra` pairs
13
+ * connector-only columns with values. */
14
+ export function markEventSeenAt(db, log, key, extra, memoryId) {
15
+ const names = [log.keyColumn, ...extra.map(([name]) => name), 'ingested_at', 'memory_id'];
16
+ const values = [key, ...extra.map(([, value]) => value), new Date().toISOString(), memoryId];
17
+ const inserted = db
18
+ .prepare(`INSERT OR IGNORE INTO ${log.table} (${names.join(', ')}) VALUES (${placeholders(names.length)})`)
19
+ .run(...values);
20
+ return Number(inserted.changes ?? 0) !== 0;
21
+ }
22
+ export function eventRecord(hippoRoot, log, key) {
23
+ return onHandle(hippoRoot, (db) => eventSeenAt(db, log, key) ? { seen: true, memoryId: eventMemoryAt(db, log, key) } : { seen: false });
24
+ }
25
+ //# sourceMappingURL=event-log.js.map
@@ -22,7 +22,8 @@ export interface ArtifactDeletion {
22
22
  reason: string;
23
23
  who: string;
24
24
  }
25
- /** Archives every active raw row of one tenant's artifact and logs the delete event; a failed archive rolls back the batch and the log row. */
25
+ /** Archives every active raw row of one tenant's artifact and logs the delete event; a failed archive rolls back the
26
+ * batch and the log row. */
26
27
  export declare function archiveDeletedArtifact(hippoRoot: string, del: ArtifactDeletion): {
27
28
  duplicate: boolean;
28
29
  archived: number;
@@ -43,7 +44,8 @@ export interface DlqItem {
43
44
  retriedAt: string | null;
44
45
  bucket: DlqBucket | string;
45
46
  }
46
- /** One github_dlq row to write, already redacted by the caller; the four GitHub-only columns are stored NULL when left out. */
47
+ /** One github_dlq row to write, already redacted by the caller; the four GitHub-only columns are stored NULL when left
48
+ * out. */
47
49
  export interface GitHubDlqInsert {
48
50
  tenantId: string;
49
51
  rawPayload: string;
@@ -59,7 +61,8 @@ export declare function insertGitHubDlq(hippoRoot: string, row: GitHubDlqInsert)
59
61
  export declare function listGitHubDlq(hippoRoot: string, tenantId: string, limit: number): DlqItem[];
60
62
  export declare function githubDlqEntry(hippoRoot: string, id: number): DlqItem | null;
61
63
  export declare function markGitHubDlqRetried(hippoRoot: string, id: number): void;
62
- /** What the routing tables say about one webhook; `tenant` is the installation match, or the repo match when no installation was sent. */
64
+ /** What the routing tables say about one webhook; `tenant` is the installation match, or the repo match when no
65
+ * installation was sent. */
63
66
  export interface GitHubRouting {
64
67
  installations: number;
65
68
  repositories: number;