hippo-memory 1.69.0 → 1.71.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 (1014) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +5 -5
  5. package/dist/agent-memories/claude-code.js +25 -12
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +26 -14
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/markdown.d.ts +1 -3
  13. package/dist/agent-memories/markdown.js +1 -3
  14. package/dist/agent-memories/report.d.ts +1 -1
  15. package/dist/agent-memories/report.js +3 -2
  16. package/dist/agent-memories/source.d.ts +1 -1
  17. package/dist/agent-memories/source.js +6 -5
  18. package/dist/agent-memories/sync.d.ts +5 -3
  19. package/dist/agent-memories/sync.js +34 -38
  20. package/dist/agent-memories/types.d.ts +1 -1
  21. package/dist/api/assemble.d.ts +9 -46
  22. package/dist/api/assemble.js +44 -54
  23. package/dist/api/audit.d.ts +8 -7
  24. package/dist/api/audit.js +15 -21
  25. package/dist/api/auth.d.ts +17 -39
  26. package/dist/api/auth.js +76 -216
  27. package/dist/api/auto-sleep.d.ts +13 -0
  28. package/dist/api/auto-sleep.js +32 -0
  29. package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
  30. package/dist/{availability.js → api/availability.js} +14 -44
  31. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  32. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  33. package/dist/{context-render.js → api/context-render.js} +7 -6
  34. package/dist/api/context-select.d.ts +5 -5
  35. package/dist/api/context-select.js +39 -48
  36. package/dist/api/context-types.d.ts +15 -40
  37. package/dist/api/context.d.ts +7 -26
  38. package/dist/api/context.js +67 -97
  39. package/dist/api/dormant.d.ts +7 -23
  40. package/dist/api/dormant.js +40 -128
  41. package/dist/api/drill-down.d.ts +9 -48
  42. package/dist/api/drill-down.js +41 -90
  43. package/dist/api/forget.d.ts +5 -33
  44. package/dist/api/forget.js +17 -73
  45. package/dist/api/goals.d.ts +1 -1
  46. package/dist/api/goals.js +2 -2
  47. package/dist/api/graph.d.ts +8 -0
  48. package/dist/api/graph.js +7 -0
  49. package/dist/api/index.d.ts +28 -0
  50. package/dist/api/index.js +31 -0
  51. package/dist/api/instruction-detect.js +85 -0
  52. package/dist/api/learn.js +63 -55
  53. package/dist/api/ledger-db.d.ts +21 -0
  54. package/dist/api/ledger-db.js +81 -0
  55. package/dist/api/memories.d.ts +5 -0
  56. package/dist/api/memories.js +7 -0
  57. package/dist/api/objects.d.ts +9 -0
  58. package/dist/api/objects.js +11 -0
  59. package/dist/api/on-store.d.ts +16 -0
  60. package/dist/api/on-store.js +38 -0
  61. package/dist/api/outcome.d.ts +5 -42
  62. package/dist/api/outcome.js +15 -80
  63. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  64. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  65. package/dist/api/predictions.d.ts +9 -0
  66. package/dist/api/predictions.js +18 -0
  67. package/dist/api/promote.d.ts +16 -31
  68. package/dist/api/promote.js +38 -123
  69. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
  70. package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
  71. package/dist/api/quarantine.d.ts +5 -5
  72. package/dist/api/quarantine.js +30 -106
  73. package/dist/api/recall-cli.d.ts +55 -0
  74. package/dist/api/recall-cli.js +94 -0
  75. package/dist/api/recall-core.d.ts +4 -0
  76. package/dist/api/recall-core.js +120 -0
  77. package/dist/api/recall-finish.d.ts +53 -0
  78. package/dist/api/recall-finish.js +30 -0
  79. package/dist/api/recall-history.d.ts +64 -0
  80. package/dist/api/recall-history.js +159 -0
  81. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
  82. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
  83. package/dist/api/recall-record.d.ts +10 -13
  84. package/dist/api/recall-record.js +10 -30
  85. package/dist/api/recall-request.d.ts +2 -2
  86. package/dist/api/recall-request.js +3 -3
  87. package/dist/api/recall-types.d.ts +101 -316
  88. package/dist/api/recall.d.ts +5 -33
  89. package/dist/api/recall.js +92 -91
  90. package/dist/api/refine.d.ts +7 -0
  91. package/dist/api/refine.js +10 -0
  92. package/dist/api/remember-local.d.ts +57 -0
  93. package/dist/api/remember-local.js +90 -0
  94. package/dist/api/remember.d.ts +27 -12
  95. package/dist/api/remember.js +42 -46
  96. package/dist/api/session-owners.d.ts +4 -0
  97. package/dist/api/session-owners.js +17 -0
  98. package/dist/api/sleep-run.d.ts +7 -9
  99. package/dist/api/sleep-run.js +78 -94
  100. package/dist/api/sleep.d.ts +10 -29
  101. package/dist/api/tokens.d.ts +5 -12
  102. package/dist/api/tokens.js +12 -31
  103. package/dist/api/types.d.ts +8 -31
  104. package/dist/api/types.js +5 -23
  105. package/dist/capture/caller-session.d.ts +2 -2
  106. package/dist/capture/caller-session.js +8 -8
  107. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  108. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  109. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  110. package/dist/capture/command.d.ts +5 -13
  111. package/dist/capture/command.js +57 -60
  112. package/dist/capture/compact-resume-caller.d.ts +1 -1
  113. package/dist/capture/compact-resume-caller.js +7 -7
  114. package/dist/capture/compact.d.ts +8 -16
  115. package/dist/capture/compact.js +56 -47
  116. package/dist/capture/compaction-items-caller.d.ts +1 -1
  117. package/dist/capture/compaction-items-caller.js +7 -5
  118. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  119. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  120. package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
  121. package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
  122. package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
  123. package/dist/capture/copilot-transcript.js +1 -1
  124. package/dist/capture/extract.js +2 -2
  125. package/dist/capture/failure-caller.d.ts +2 -2
  126. package/dist/capture/failure-caller.js +6 -6
  127. package/dist/capture/failure-reading.d.ts +2 -5
  128. package/dist/capture/failure-reading.js +11 -12
  129. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  130. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  131. package/dist/capture/pre-compact-caller.d.ts +1 -1
  132. package/dist/capture/pre-compact-caller.js +2 -2
  133. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
  134. package/dist/{session-digest.js → capture/session-digest.js} +29 -29
  135. package/dist/capture/session-end-caller.d.ts +2 -2
  136. package/dist/capture/session-end-caller.js +1 -1
  137. package/dist/capture/session-texts.d.ts +1 -1
  138. package/dist/capture/session-texts.js +5 -5
  139. package/dist/capture/session-worker.js +6 -4
  140. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  141. package/dist/capture/transcript.d.ts +2 -10
  142. package/dist/capture/transcript.js +72 -92
  143. package/dist/capture/working-state.d.ts +0 -3
  144. package/dist/capture/working-state.js +7 -7
  145. package/dist/cli/api-context.d.ts +3 -0
  146. package/dist/cli/api-context.js +6 -0
  147. package/dist/cli/audit-prune.d.ts +28 -0
  148. package/dist/cli/audit-prune.js +40 -0
  149. package/dist/cli/audit.d.ts +2 -2
  150. package/dist/cli/audit.js +92 -88
  151. package/dist/cli/auth.d.ts +2 -1
  152. package/dist/cli/auth.js +69 -53
  153. package/dist/cli/briefs.d.ts +4 -3
  154. package/dist/cli/briefs.js +76 -202
  155. package/dist/cli/card.d.ts +2 -1
  156. package/dist/cli/card.js +55 -54
  157. package/dist/cli/client.d.ts +28 -0
  158. package/dist/{client.js → cli/client.js} +25 -44
  159. package/dist/cli/compact-resume-payload.d.ts +8 -0
  160. package/dist/cli/compact-resume-payload.js +40 -0
  161. package/dist/cli/context.d.ts +1 -13
  162. package/dist/cli/context.js +51 -77
  163. package/dist/cli/continuity.d.ts +6 -5
  164. package/dist/cli/continuity.js +153 -145
  165. package/dist/cli/correction-latency.d.ts +24 -0
  166. package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
  167. package/dist/cli/curate.d.ts +13 -17
  168. package/dist/cli/curate.js +226 -222
  169. package/dist/cli/dag.d.ts +4 -4
  170. package/dist/cli/dag.js +70 -52
  171. package/dist/cli/decisions.d.ts +4 -3
  172. package/dist/cli/decisions.js +129 -253
  173. package/dist/cli/eval.d.ts +1 -3
  174. package/dist/cli/eval.js +56 -42
  175. package/dist/cli/exit.d.ts +6 -0
  176. package/dist/cli/exit.js +11 -0
  177. package/dist/cli/explain.d.ts +1 -2
  178. package/dist/cli/explain.js +39 -21
  179. package/dist/cli/flag-values.d.ts +30 -0
  180. package/dist/cli/flag-values.js +120 -0
  181. package/dist/cli/flags.d.ts +304 -0
  182. package/dist/cli/flags.js +169 -0
  183. package/dist/cli/github.d.ts +14 -0
  184. package/dist/cli/github.js +184 -0
  185. package/dist/cli/goals.d.ts +2 -1
  186. package/dist/cli/goals.js +76 -75
  187. package/dist/cli/hook-runtime.d.ts +31 -0
  188. package/dist/cli/hook-runtime.js +139 -0
  189. package/dist/cli/init.d.ts +2 -1
  190. package/dist/cli/init.js +153 -126
  191. package/dist/cli/install-steps.d.ts +7 -0
  192. package/dist/cli/install-steps.js +101 -0
  193. package/dist/cli/last-sleep.d.ts +3 -1
  194. package/dist/cli/last-sleep.js +12 -7
  195. package/dist/cli/maintenance.d.ts +5 -4
  196. package/dist/cli/maintenance.js +41 -42
  197. package/dist/cli/object-verbs.d.ts +40 -0
  198. package/dist/cli/object-verbs.js +66 -0
  199. package/dist/cli/owner-validation.d.ts +18 -0
  200. package/dist/cli/owner-validation.js +33 -0
  201. package/dist/cli/playbooks.d.ts +4 -3
  202. package/dist/cli/playbooks.js +98 -306
  203. package/dist/cli/print.d.ts +15 -0
  204. package/dist/cli/print.js +82 -0
  205. package/dist/cli/projects.d.ts +2 -3
  206. package/dist/cli/projects.js +56 -51
  207. package/dist/cli/provenance-coverage.d.ts +14 -0
  208. package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
  209. package/dist/cli/quality-repair-once.js +4 -4
  210. package/dist/cli/recall.d.ts +2 -6
  211. package/dist/cli/recall.js +128 -253
  212. package/dist/cli/refine-llm.d.ts +35 -0
  213. package/dist/cli/refine-llm.js +128 -0
  214. package/dist/cli/remember.d.ts +4 -6
  215. package/dist/cli/remember.js +193 -230
  216. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
  217. package/dist/{scheduler.js → cli/scheduler.js} +22 -22
  218. package/dist/cli/serve.d.ts +1 -1
  219. package/dist/cli/serve.js +46 -7
  220. package/dist/cli/session-hooks.d.ts +11 -19
  221. package/dist/cli/session-hooks.js +263 -258
  222. package/dist/cli/setup.d.ts +4 -3
  223. package/dist/cli/setup.js +55 -37
  224. package/dist/cli/shared.d.ts +14 -118
  225. package/dist/cli/shared.js +26 -400
  226. package/dist/cli/slack.d.ts +2 -1
  227. package/dist/cli/slack.js +46 -74
  228. package/dist/cli/sleep-render.d.ts +4 -0
  229. package/dist/cli/sleep-render.js +61 -0
  230. package/dist/cli/sleep.d.ts +3 -8
  231. package/dist/cli/sleep.js +34 -91
  232. package/dist/cli/status.d.ts +9 -12
  233. package/dist/cli/status.js +86 -131
  234. package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
  235. package/dist/{stdin.js → cli/stdin.js} +8 -9
  236. package/dist/cli/transfer.d.ts +9 -9
  237. package/dist/cli/transfer.js +125 -122
  238. package/dist/cli/usage.js +13 -5
  239. package/dist/cli.d.ts +69 -167
  240. package/dist/cli.js +187 -296
  241. package/dist/connectors/dlq.d.ts +44 -0
  242. package/dist/connectors/dlq.js +30 -0
  243. package/dist/connectors/github/backfill.d.ts +6 -26
  244. package/dist/connectors/github/backfill.js +42 -114
  245. package/dist/connectors/github/deletion.d.ts +6 -21
  246. package/dist/connectors/github/deletion.js +17 -64
  247. package/dist/connectors/github/dlq.d.ts +12 -91
  248. package/dist/connectors/github/dlq.js +23 -140
  249. package/dist/connectors/github/ingest.d.ts +4 -37
  250. package/dist/connectors/github/ingest.js +24 -93
  251. package/dist/connectors/github/octokit-client.d.ts +5 -17
  252. package/dist/connectors/github/octokit-client.js +29 -25
  253. package/dist/connectors/github/ratelimit.d.ts +3 -14
  254. package/dist/connectors/github/ratelimit.js +3 -14
  255. package/dist/connectors/github/scope.d.ts +3 -5
  256. package/dist/connectors/github/scope.js +3 -5
  257. package/dist/connectors/github/signature.d.ts +4 -26
  258. package/dist/connectors/github/signature.js +4 -26
  259. package/dist/connectors/github/tenant-routing.d.ts +4 -26
  260. package/dist/connectors/github/tenant-routing.js +13 -61
  261. package/dist/connectors/github/transform.d.ts +1 -1
  262. package/dist/connectors/github/transform.js +2 -16
  263. package/dist/connectors/github/types.d.ts +4 -16
  264. package/dist/connectors/github/types.js +17 -27
  265. package/dist/connectors/github/webhook.d.ts +5 -18
  266. package/dist/connectors/github/webhook.js +86 -105
  267. package/dist/connectors/slack/backfill.d.ts +5 -18
  268. package/dist/connectors/slack/backfill.js +9 -42
  269. package/dist/connectors/slack/deletion.d.ts +4 -7
  270. package/dist/connectors/slack/deletion.js +20 -49
  271. package/dist/connectors/slack/dlq.d.ts +9 -68
  272. package/dist/connectors/slack/dlq.js +26 -136
  273. package/dist/connectors/slack/ingest.d.ts +4 -18
  274. package/dist/connectors/slack/ingest.js +26 -91
  275. package/dist/connectors/slack/scope.d.ts +2 -8
  276. package/dist/connectors/slack/scope.js +2 -8
  277. package/dist/connectors/slack/signature.d.ts +1 -6
  278. package/dist/connectors/slack/signature.js +2 -1
  279. package/dist/connectors/slack/tenant-routing.d.ts +4 -18
  280. package/dist/connectors/slack/tenant-routing.js +11 -31
  281. package/dist/connectors/slack/transform.d.ts +3 -19
  282. package/dist/connectors/slack/transform.js +2 -18
  283. package/dist/connectors/slack/types.d.ts +4 -10
  284. package/dist/connectors/slack/types.js +5 -16
  285. package/dist/connectors/slack/web-client.js +34 -28
  286. package/dist/connectors/slack/webhook.d.ts +5 -21
  287. package/dist/connectors/slack/webhook.js +80 -108
  288. package/dist/connectors/slack/workspaces.d.ts +8 -41
  289. package/dist/connectors/slack/workspaces.js +8 -58
  290. package/dist/consolidate/conflicts.d.ts +1 -1
  291. package/dist/consolidate/conflicts.js +10 -18
  292. package/dist/consolidate/dag-summary.d.ts +8 -0
  293. package/dist/consolidate/dag-summary.js +41 -0
  294. package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
  295. package/dist/{dag.js → consolidate/dag.js} +49 -131
  296. package/dist/consolidate/decay.d.ts +2 -2
  297. package/dist/consolidate/decay.js +35 -41
  298. package/dist/consolidate/dedupe.d.ts +29 -0
  299. package/dist/consolidate/dedupe.js +103 -0
  300. package/dist/consolidate/flush-units.d.ts +5 -6
  301. package/dist/consolidate/flush-units.js +3 -3
  302. package/dist/consolidate/half-life-migration.d.ts +34 -0
  303. package/dist/consolidate/half-life-migration.js +89 -0
  304. package/dist/consolidate/llm-passes.js +12 -29
  305. package/dist/consolidate/memory-value-weights.d.ts +8 -0
  306. package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
  307. package/dist/consolidate/memory-value.d.ts +45 -0
  308. package/dist/consolidate/memory-value.js +164 -0
  309. package/dist/consolidate/merge.js +65 -83
  310. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  311. package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
  312. package/dist/consolidate/physics-pass.js +46 -48
  313. package/dist/consolidate/replay.d.ts +9 -0
  314. package/dist/consolidate/replay.js +84 -0
  315. package/dist/consolidate/run.d.ts +7 -13
  316. package/dist/consolidate/run.js +6 -37
  317. package/dist/consolidate/sleep.d.ts +2 -9
  318. package/dist/consolidate/sleep.js +69 -151
  319. package/dist/consolidate/trace.d.ts +19 -0
  320. package/dist/{trace.js → consolidate/trace.js} +7 -24
  321. package/dist/consolidate/traces.js +40 -51
  322. package/dist/core/ablation.d.ts +15 -0
  323. package/dist/core/ablation.js +49 -0
  324. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  325. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  326. package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
  327. package/dist/{ambient.js → core/ambient.js} +13 -18
  328. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  329. package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
  330. package/dist/{card.d.ts → core/card.d.ts} +4 -1
  331. package/dist/{card.js → core/card.js} +8 -0
  332. package/dist/core/compare.d.ts +32 -0
  333. package/dist/core/compare.js +70 -0
  334. package/dist/{config.d.ts → core/config.d.ts} +14 -28
  335. package/dist/{config.js → core/config.js} +101 -75
  336. package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
  337. package/dist/core/handoff.js +81 -0
  338. package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
  339. package/dist/core/memory.d.ts +183 -0
  340. package/dist/core/memory.js +380 -0
  341. package/dist/core/package-root.d.ts +3 -0
  342. package/dist/core/package-root.js +5 -0
  343. package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
  344. package/dist/{physics-config.js → core/physics-config.js} +3 -8
  345. package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
  346. package/dist/{physics.js → core/physics.js} +60 -122
  347. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
  348. package/dist/{project-identity.js → core/project-identity.js} +22 -55
  349. package/dist/{project-remote.js → core/project-remote.js} +17 -6
  350. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  351. package/dist/core/raw-append-only.d.ts +5 -0
  352. package/dist/core/raw-append-only.js +7 -0
  353. package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
  354. package/dist/{salience.js → core/salience.js} +36 -27
  355. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  356. package/dist/{search/types.js → core/search-types.js} +1 -1
  357. package/dist/core/session-digest-row.d.ts +5 -0
  358. package/dist/core/session-digest-row.js +6 -0
  359. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  360. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
  361. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  362. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  363. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
  364. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
  365. package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
  366. package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
  367. package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
  368. package/dist/db/backup.js +1 -1
  369. package/dist/db/busy.d.ts +19 -2
  370. package/dist/db/busy.js +88 -14
  371. package/dist/db/connect.d.ts +11 -2
  372. package/dist/db/connect.js +43 -10
  373. package/dist/db/index.d.ts +9 -0
  374. package/dist/db/index.js +8 -0
  375. package/dist/db/meta.d.ts +4 -0
  376. package/dist/db/meta.js +11 -1
  377. package/dist/db/migrate.d.ts +8 -1
  378. package/dist/db/migrate.js +28 -33
  379. package/dist/db/migrations/types.d.ts +2 -5
  380. package/dist/db/migrations/v08.js +1 -1
  381. package/dist/db/migrations/v14.js +39 -36
  382. package/dist/db/migrations/v15.js +2 -8
  383. package/dist/db/migrations/v16.js +31 -29
  384. package/dist/db/migrations/v17.js +2 -3
  385. package/dist/db/migrations/v18.js +6 -5
  386. package/dist/db/migrations/v19.js +2 -5
  387. package/dist/db/migrations/v20.js +5 -8
  388. package/dist/db/migrations/v22.js +28 -38
  389. package/dist/db/migrations/v23.js +3 -14
  390. package/dist/db/migrations/v24.js +25 -22
  391. package/dist/db/migrations/v25.js +3 -8
  392. package/dist/db/migrations/v26.js +2 -13
  393. package/dist/db/migrations/v27.js +3 -11
  394. package/dist/db/migrations/v28.js +2 -14
  395. package/dist/db/migrations/v29.js +23 -32
  396. package/dist/db/migrations/v30.js +4 -16
  397. package/dist/db/migrations/v31.js +23 -31
  398. package/dist/db/migrations/v32.js +4 -22
  399. package/dist/db/migrations/v33.js +2 -15
  400. package/dist/db/migrations/v34.js +2 -11
  401. package/dist/db/migrations/v35.js +2 -11
  402. package/dist/db/migrations/v36.js +2 -11
  403. package/dist/db/migrations/v37.js +8 -33
  404. package/dist/db/migrations/v38.js +5 -38
  405. package/dist/db/migrations/v39.js +10 -21
  406. package/dist/db/migrations/v40.js +8 -14
  407. package/dist/db/migrations/v41.js +2 -24
  408. package/dist/db/migrations/v43.js +7 -6
  409. package/dist/db/migrations/v44.js +2 -8
  410. package/dist/db/migrations/v45.js +2 -7
  411. package/dist/db/migrations/v46.js +1 -1
  412. package/dist/db/migrations/v47.js +2 -3
  413. package/dist/db/migrations/v48.js +1 -1
  414. package/dist/db/migrations/v49.js +1 -1
  415. package/dist/db/migrations/v50.js +8 -7
  416. package/dist/db/migrations/v51.js +1 -1
  417. package/dist/db/migrations/v52.js +1 -1
  418. package/dist/db/open.d.ts +11 -1
  419. package/dist/db/open.js +37 -4
  420. package/dist/db/physics-state.d.ts +23 -0
  421. package/dist/{physics-state.js → db/physics-state.js} +34 -52
  422. package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
  423. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
  424. package/dist/db/request-stores.d.ts +15 -2
  425. package/dist/db/request-stores.js +37 -15
  426. package/dist/db/tables.d.ts +2 -0
  427. package/dist/db/tables.js +6 -0
  428. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
  429. package/dist/{vector-store.js → db/vector-store.js} +83 -51
  430. package/dist/db/wal-checkpointer.d.ts +11 -0
  431. package/dist/db/wal-checkpointer.js +92 -0
  432. package/dist/doctor.js +176 -152
  433. package/dist/entry/json-hooks.d.ts +1 -1
  434. package/dist/entry/json-hooks.js +1 -1
  435. package/dist/entry/project-identity.d.ts +1 -1
  436. package/dist/entry/project-identity.js +1 -1
  437. package/dist/entry/session-text.d.ts +3 -3
  438. package/dist/entry/session-text.js +5 -4
  439. package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
  440. package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
  441. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
  442. package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
  443. package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
  444. package/dist/{eval.js → eval/eval.js} +35 -55
  445. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
  446. package/dist/{judgment.js → eval/judgment.js} +23 -20
  447. package/dist/extensions/openclaw-plugin/index.js +2 -3
  448. package/dist/graph/delta.d.ts +3 -2
  449. package/dist/graph/delta.js +9 -23
  450. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
  451. package/dist/{graph-extract.js → graph/extract.js} +40 -81
  452. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
  453. package/dist/{graph-recall.js → graph/recall.js} +65 -108
  454. package/dist/graph/stream.d.ts +38 -0
  455. package/dist/{graph-stream.js → graph/stream.js} +20 -41
  456. package/dist/graph/view.d.ts +50 -0
  457. package/dist/graph/view.js +265 -0
  458. package/dist/graph/write.d.ts +4 -76
  459. package/dist/graph/write.js +13 -397
  460. package/dist/hooks/codex-session.js +1 -1
  461. package/dist/hooks/codex-wrapper.js +16 -17
  462. package/dist/hooks/copilot.d.ts +1 -8
  463. package/dist/hooks/copilot.js +16 -16
  464. package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
  465. package/dist/{cli → hooks}/hook-blocks.js +38 -125
  466. package/dist/hooks/json-hooks.d.ts +5 -37
  467. package/dist/hooks/json-hooks.js +49 -179
  468. package/dist/hooks/opencode.d.ts +0 -38
  469. package/dist/hooks/opencode.js +44 -103
  470. package/dist/hooks/shared.d.ts +8 -21
  471. package/dist/hooks/shared.js +30 -25
  472. package/dist/importers/core.d.ts +13 -42
  473. package/dist/importers/core.js +48 -64
  474. package/dist/importers/markdown-parse.d.ts +9 -32
  475. package/dist/importers/markdown-parse.js +10 -44
  476. package/dist/importers/markdown.js +5 -13
  477. package/dist/importers/sources.js +57 -81
  478. package/dist/importers/vault.d.ts +2 -8
  479. package/dist/importers/vault.js +95 -172
  480. package/dist/index.d.ts +26 -22
  481. package/dist/index.js +25 -21
  482. package/dist/learn/autolearn.d.ts +29 -0
  483. package/dist/{autolearn.js → learn/autolearn.js} +26 -51
  484. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  485. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  486. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  487. package/dist/learn/extract.js +123 -0
  488. package/dist/learn/forward-claim-detector.d.ts +12 -0
  489. package/dist/learn/forward-claim-detector.js +60 -0
  490. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
  491. package/dist/{invalidation.js → learn/invalidation.js} +92 -125
  492. package/dist/mcp/admin-tools.d.ts +1 -1
  493. package/dist/mcp/admin-tools.js +39 -64
  494. package/dist/mcp/format.d.ts +5 -5
  495. package/dist/mcp/format.js +7 -6
  496. package/dist/mcp/framing.d.ts +6 -0
  497. package/dist/mcp/framing.js +11 -3
  498. package/dist/mcp/memory-tools.js +10 -35
  499. package/dist/mcp/protocol.d.ts +14 -36
  500. package/dist/mcp/protocol.js +10 -19
  501. package/dist/mcp/recall-tools.d.ts +2 -2
  502. package/dist/mcp/recall-tools.js +70 -52
  503. package/dist/mcp/request.d.ts +3 -11
  504. package/dist/mcp/request.js +71 -85
  505. package/dist/mcp/server.d.ts +3 -9
  506. package/dist/mcp/server.js +6 -17
  507. package/dist/mcp/session-state.d.ts +2 -3
  508. package/dist/mcp/session-state.js +7 -13
  509. package/dist/mcp/shared-gate.js +1 -1
  510. package/dist/mcp/stdio.d.ts +2 -6
  511. package/dist/mcp/stdio.js +112 -38
  512. package/dist/mcp/tool-args.js +2 -1
  513. package/dist/mcp/tools.js +7 -5
  514. package/dist/objects/customer-notes.d.ts +44 -0
  515. package/dist/objects/customer-notes.js +71 -0
  516. package/dist/objects/decisions.d.ts +41 -0
  517. package/dist/objects/decisions.js +63 -0
  518. package/dist/objects/descriptor.d.ts +52 -0
  519. package/dist/objects/descriptor.js +4 -0
  520. package/dist/objects/fields.d.ts +15 -0
  521. package/dist/objects/fields.js +21 -0
  522. package/dist/objects/incidents.d.ts +45 -0
  523. package/dist/objects/incidents.js +96 -0
  524. package/dist/objects/lifecycle.d.ts +27 -0
  525. package/dist/objects/lifecycle.js +96 -0
  526. package/dist/objects/policies.d.ts +60 -0
  527. package/dist/objects/policies.js +102 -0
  528. package/dist/objects/processes.d.ts +43 -0
  529. package/dist/objects/processes.js +92 -0
  530. package/dist/objects/project-briefs.d.ts +63 -0
  531. package/dist/objects/project-briefs.js +194 -0
  532. package/dist/objects/skills.d.ts +51 -0
  533. package/dist/objects/skills.js +110 -0
  534. package/dist/postinstall.js +10 -21
  535. package/dist/predictions/planning-fallacy.d.ts +14 -109
  536. package/dist/predictions/planning-fallacy.js +4 -129
  537. package/dist/rerankers/clef.d.ts +2 -6
  538. package/dist/rerankers/clef.js +28 -76
  539. package/dist/rerankers/cross-encoder.d.ts +0 -7
  540. package/dist/rerankers/cross-encoder.js +18 -28
  541. package/dist/rerankers/index.js +8 -7
  542. package/dist/rerankers/jev.d.ts +1 -4
  543. package/dist/rerankers/jev.js +36 -52
  544. package/dist/rerankers/llm.d.ts +2 -13
  545. package/dist/rerankers/llm.js +42 -59
  546. package/dist/rerankers/outage-warning.d.ts +8 -0
  547. package/dist/rerankers/outage-warning.js +32 -0
  548. package/dist/rerankers/remote.d.ts +4 -0
  549. package/dist/rerankers/remote.js +25 -0
  550. package/dist/rerankers/types.d.ts +3 -15
  551. package/dist/search/as-of.d.ts +1 -1
  552. package/dist/search/bm25-search.d.ts +2 -2
  553. package/dist/search/bm25-search.js +7 -7
  554. package/dist/search/bm25.d.ts +1 -1
  555. package/dist/search/bm25.js +1 -1
  556. package/dist/search/boosts.d.ts +5 -3
  557. package/dist/search/boosts.js +36 -15
  558. package/dist/search/breakdown.d.ts +2 -2
  559. package/dist/search/breakdown.js +2 -1
  560. package/dist/search/explain.d.ts +1 -1
  561. package/dist/search/explain.js +3 -2
  562. package/dist/search/finalize.d.ts +2 -2
  563. package/dist/search/finalize.js +4 -3
  564. package/dist/search/fusion.d.ts +1 -1
  565. package/dist/search/fusion.js +3 -3
  566. package/dist/search/goal-boost.d.ts +23 -0
  567. package/dist/search/goal-boost.js +90 -0
  568. package/dist/search/hybrid-score.d.ts +2 -2
  569. package/dist/search/hybrid-score.js +1 -1
  570. package/dist/search/hybrid.d.ts +6 -4
  571. package/dist/search/hybrid.js +11 -8
  572. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  573. package/dist/{multihop.js → search/multihop.js} +9 -8
  574. package/dist/search/path-context.d.ts +11 -0
  575. package/dist/{path-context.js → search/path-context.js} +8 -19
  576. package/dist/search/physics-search.d.ts +4 -4
  577. package/dist/search/physics-search.js +25 -22
  578. package/dist/search/rerank.d.ts +3 -3
  579. package/dist/search/rerank.js +4 -3
  580. package/dist/search/rrf.d.ts +15 -0
  581. package/dist/search/rrf.js +36 -0
  582. package/dist/search/temporal.d.ts +1 -1
  583. package/dist/search/temporal.js +5 -2
  584. package/dist/search/vector.d.ts +10 -3
  585. package/dist/search/vector.js +51 -15
  586. package/dist/server/auth.d.ts +10 -29
  587. package/dist/server/auth.js +57 -42
  588. package/dist/server/boot.d.ts +5 -0
  589. package/dist/server/boot.js +432 -0
  590. package/dist/server/client-ip.d.ts +8 -20
  591. package/dist/server/client-ip.js +23 -34
  592. package/dist/server/cursor.d.ts +1 -1
  593. package/dist/server/cursor.js +2 -3
  594. package/dist/server/deadline.d.ts +13 -0
  595. package/dist/server/deadline.js +45 -0
  596. package/dist/server/defaults.d.ts +3 -0
  597. package/dist/server/defaults.js +4 -0
  598. package/dist/server/key-check-bounds.d.ts +9 -0
  599. package/dist/server/key-check-bounds.js +46 -0
  600. package/dist/server/lifecycle.d.ts +5 -4
  601. package/dist/server/lifecycle.js +20 -5
  602. package/dist/server/mcp-http.d.ts +1 -4
  603. package/dist/server/mcp-http.js +44 -68
  604. package/dist/server/rate-limit.d.ts +21 -0
  605. package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
  606. package/dist/server/ready.d.ts +7 -0
  607. package/dist/server/ready.js +38 -0
  608. package/dist/server/request.d.ts +14 -12
  609. package/dist/server/request.js +71 -28
  610. package/dist/server/route-table.d.ts +15 -0
  611. package/dist/server/route-table.js +202 -0
  612. package/dist/server/routes/admin.js +29 -30
  613. package/dist/server/routes/customer-notes.d.ts +5 -5
  614. package/dist/server/routes/customer-notes.js +35 -105
  615. package/dist/server/routes/decisions.d.ts +5 -5
  616. package/dist/server/routes/decisions.js +45 -115
  617. package/dist/server/routes/incidents.d.ts +5 -5
  618. package/dist/server/routes/incidents.js +44 -105
  619. package/dist/server/routes/memories.js +21 -43
  620. package/dist/server/routes/object-routes.d.ts +35 -0
  621. package/dist/server/routes/object-routes.js +72 -0
  622. package/dist/server/routes/policies.d.ts +6 -6
  623. package/dist/server/routes/policies.js +42 -134
  624. package/dist/server/routes/predictions.js +35 -63
  625. package/dist/server/routes/processes.d.ts +5 -5
  626. package/dist/server/routes/processes.js +44 -134
  627. package/dist/server/routes/project-briefs.d.ts +6 -6
  628. package/dist/server/routes/project-briefs.js +41 -120
  629. package/dist/server/routes/recall.js +21 -44
  630. package/dist/server/routes/skills.d.ts +6 -6
  631. package/dist/server/routes/skills.js +40 -138
  632. package/dist/server/server-detect.d.ts +28 -0
  633. package/dist/server/server-detect.js +156 -0
  634. package/dist/server/sleep-child.d.ts +2 -0
  635. package/dist/server/sleep-child.js +19 -0
  636. package/dist/server/sleep-offload.d.ts +20 -0
  637. package/dist/server/sleep-offload.js +73 -0
  638. package/dist/server/tls.d.ts +6 -0
  639. package/dist/server/tls.js +24 -0
  640. package/dist/server/types.d.ts +35 -14
  641. package/dist/server/validation.d.ts +6 -5
  642. package/dist/server/validation.js +16 -34
  643. package/dist/server.d.ts +39 -61
  644. package/dist/server.js +26 -569
  645. package/dist/sharing/global-store.d.ts +19 -0
  646. package/dist/sharing/global-store.js +75 -0
  647. package/dist/sharing/global-sync.d.ts +6 -0
  648. package/dist/sharing/global-sync.js +80 -0
  649. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
  650. package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
  651. package/dist/sharing/scope.d.ts +7 -0
  652. package/dist/{scope.js → sharing/scope.js} +5 -12
  653. package/dist/sharing/search-both.d.ts +60 -0
  654. package/dist/sharing/search-both.js +138 -0
  655. package/dist/sharing/share.d.ts +38 -0
  656. package/dist/sharing/share.js +226 -0
  657. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  658. package/dist/{ambient-store.js → store/ambient.js} +11 -16
  659. package/dist/store/audit-event.d.ts +15 -17
  660. package/dist/store/audit-event.js +9 -16
  661. package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
  662. package/dist/{audit.js → store/audit.js} +95 -18
  663. package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
  664. package/dist/{auth.js → store/auth.js} +108 -99
  665. package/dist/store/candidates.d.ts +41 -13
  666. package/dist/store/candidates.js +141 -60
  667. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
  668. package/dist/{card-detail.js → store/card-detail.js} +3 -2
  669. package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
  670. package/dist/{store-cards.js → store/cards.js} +133 -248
  671. package/dist/store/compactions.d.ts +78 -0
  672. package/dist/store/compactions.js +93 -0
  673. package/dist/store/conflicts.d.ts +26 -26
  674. package/dist/store/conflicts.js +194 -222
  675. package/dist/store/connectors/github.d.ts +84 -0
  676. package/dist/store/connectors/github.js +180 -0
  677. package/dist/store/connectors/slack.d.ts +69 -0
  678. package/dist/store/connectors/slack.js +177 -0
  679. package/dist/store/dashboard-reads.d.ts +27 -0
  680. package/dist/store/dashboard-reads.js +88 -0
  681. package/dist/store/delete-and-batch.d.ts +27 -51
  682. package/dist/store/delete-and-batch.js +100 -92
  683. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
  684. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
  685. package/dist/store/descendant-page.d.ts +12 -0
  686. package/dist/store/descendant-page.js +99 -0
  687. package/dist/store/diagnostics.d.ts +47 -0
  688. package/dist/store/diagnostics.js +44 -0
  689. package/dist/store/doctor-reads.d.ts +16 -0
  690. package/dist/store/doctor-reads.js +19 -0
  691. package/dist/store/dormant.d.ts +105 -0
  692. package/dist/store/dormant.js +241 -0
  693. package/dist/store/embeddings/index.d.ts +36 -0
  694. package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
  695. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  696. package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
  697. package/dist/store/embeddings/provider.d.ts +40 -0
  698. package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
  699. package/dist/store/entry-reads.d.ts +66 -63
  700. package/dist/store/entry-reads.js +159 -121
  701. package/dist/store/entry-row.d.ts +14 -37
  702. package/dist/store/entry-row.js +37 -45
  703. package/dist/store/entry-writes.d.ts +40 -17
  704. package/dist/store/entry-writes.js +105 -41
  705. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  706. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  707. package/dist/store/goals.d.ts +96 -0
  708. package/dist/store/goals.js +260 -0
  709. package/dist/store/graph-queue.d.ts +13 -0
  710. package/dist/store/graph-queue.js +70 -0
  711. package/dist/store/graph-reads.d.ts +41 -0
  712. package/dist/{graph/read.js → store/graph-reads.js} +72 -162
  713. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
  714. package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
  715. package/dist/store/graph-view-rows.d.ts +13 -0
  716. package/dist/store/graph-view-rows.js +68 -0
  717. package/dist/store/graph-writes.d.ts +33 -0
  718. package/dist/store/graph-writes.js +232 -0
  719. package/dist/store/half-life.d.ts +35 -0
  720. package/dist/store/half-life.js +75 -0
  721. package/dist/store/handoffs.d.ts +6 -12
  722. package/dist/store/handoffs.js +54 -63
  723. package/dist/store/index-and-stats.d.ts +14 -20
  724. package/dist/store/index-and-stats.js +74 -119
  725. package/dist/store/index.d.ts +4 -0
  726. package/dist/store/index.js +3 -0
  727. package/dist/store/key-audit.d.ts +2 -2
  728. package/dist/store/key-audit.js +4 -4
  729. package/dist/store/key-writes.d.ts +12 -5
  730. package/dist/store/key-writes.js +30 -4
  731. package/dist/store/ledger-turn.d.ts +17 -0
  732. package/dist/store/ledger-turn.js +27 -0
  733. package/dist/store/markdown.d.ts +3 -7
  734. package/dist/store/markdown.js +25 -23
  735. package/dist/store/mirrors.d.ts +7 -13
  736. package/dist/store/mirrors.js +52 -47
  737. package/dist/store/object-types.d.ts +189 -0
  738. package/dist/store/object-types.js +4 -0
  739. package/dist/store/open.d.ts +6 -4
  740. package/dist/store/open.js +30 -36
  741. package/dist/store/planning-fallacy-evidence.d.ts +14 -0
  742. package/dist/store/planning-fallacy-evidence.js +52 -0
  743. package/dist/store/port.d.ts +649 -0
  744. package/dist/store/port.js +17 -0
  745. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
  746. package/dist/{predictions/store.js → store/predictions.js} +88 -184
  747. package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
  748. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  749. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  750. package/dist/store/raw-archive.d.ts +14 -0
  751. package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
  752. package/dist/store/recall-scope.d.ts +78 -0
  753. package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
  754. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
  755. package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
  756. package/dist/store/rejected-values.d.ts +55 -0
  757. package/dist/store/rejected-values.js +150 -0
  758. package/dist/store/rejection.d.ts +54 -0
  759. package/dist/{rejection.js → store/rejection.js} +16 -67
  760. package/dist/store/report-reads.d.ts +6 -0
  761. package/dist/store/report-reads.js +29 -0
  762. package/dist/store/rows.d.ts +11 -22
  763. package/dist/store/rows.js +52 -43
  764. package/dist/store/rule-sql.d.ts +5 -0
  765. package/dist/store/rule-sql.js +37 -0
  766. package/dist/store/search-rows.d.ts +22 -42
  767. package/dist/store/search-rows.js +55 -78
  768. package/dist/store/sessions.d.ts +23 -49
  769. package/dist/store/sessions.js +96 -118
  770. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  771. package/dist/store/sqlite/commit-watch.js +29 -0
  772. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  773. package/dist/store/sqlite/connector-events-group.js +50 -0
  774. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  775. package/dist/store/sqlite/connector-writes-group.js +65 -0
  776. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  777. package/dist/store/sqlite/dag-reads-group.js +45 -0
  778. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  779. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  780. package/dist/store/sqlite/error-codec.d.ts +17 -0
  781. package/dist/store/sqlite/error-codec.js +61 -0
  782. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  783. package/dist/store/sqlite/executor-counts.js +11 -0
  784. package/dist/store/sqlite/executor.d.ts +29 -0
  785. package/dist/store/sqlite/executor.js +287 -0
  786. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  787. package/dist/store/sqlite/graph-reads-group.js +18 -0
  788. package/dist/store/sqlite/local.d.ts +21 -0
  789. package/dist/store/sqlite/local.js +39 -0
  790. package/dist/store/sqlite/object-rows.d.ts +102 -0
  791. package/dist/store/sqlite/object-rows.js +221 -0
  792. package/dist/store/sqlite/objects-group.d.ts +20 -0
  793. package/dist/store/sqlite/objects-group.js +316 -0
  794. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  795. package/dist/store/sqlite/predictions-group.js +28 -0
  796. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  797. package/dist/store/sqlite/quarantine-group.js +38 -0
  798. package/dist/store/sqlite/store.d.ts +23 -0
  799. package/dist/store/sqlite/store.js +294 -0
  800. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  801. package/dist/store/sqlite/vector-pack.js +46 -0
  802. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  803. package/dist/store/sqlite/vector-reads-group.js +23 -0
  804. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  805. package/dist/store/sqlite/worker-entry.js +8 -0
  806. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  807. package/dist/store/sqlite/worker-jobs.js +116 -0
  808. package/dist/store/sqlite/worker-ops.d.ts +135 -0
  809. package/dist/store/sqlite/worker-ops.js +93 -0
  810. package/dist/store/sqlite/worker-store.d.ts +8 -0
  811. package/dist/store/sqlite/worker-store.js +79 -0
  812. package/dist/store/summaries.d.ts +11 -72
  813. package/dist/store/summaries.js +47 -186
  814. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  815. package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
  816. package/dist/store/tenant-lookup.d.ts +6 -1
  817. package/dist/store/tenant-lookup.js +7 -0
  818. package/dist/store/tenant.d.ts +11 -0
  819. package/dist/store/tenant.js +28 -0
  820. package/dist/store/token-ledger-rows.d.ts +61 -0
  821. package/dist/store/token-ledger-rows.js +68 -0
  822. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
  823. package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
  824. package/dist/store/tombstone-checks.d.ts +12 -0
  825. package/dist/store/tombstone-checks.js +31 -0
  826. package/dist/store/usage-reports.d.ts +7 -0
  827. package/dist/store/usage-reports.js +18 -0
  828. package/dist/store/vector-index.d.ts +46 -0
  829. package/dist/store/vector-index.js +170 -0
  830. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
  831. package/dist/store/working-memory.js +118 -0
  832. package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
  833. package/dist/{yaml.js → store/yaml.js} +2 -6
  834. package/dist/support-bundle.d.ts +1 -1
  835. package/dist/support-bundle.js +19 -37
  836. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  837. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  838. package/dist/trust/quarantine.d.ts +4 -0
  839. package/dist/trust/quarantine.js +8 -0
  840. package/dist/trust/reject-flow.d.ts +23 -0
  841. package/dist/trust/reject-flow.js +65 -0
  842. package/dist/util/anthropic-messages.d.ts +31 -0
  843. package/dist/util/anthropic-messages.js +58 -0
  844. package/dist/util/atomic-write.d.ts +4 -0
  845. package/dist/util/atomic-write.js +138 -0
  846. package/dist/util/capped-json.d.ts +6 -0
  847. package/dist/util/capped-json.js +46 -0
  848. package/dist/util/crash-handlers.d.ts +12 -0
  849. package/dist/util/crash-handlers.js +72 -0
  850. package/dist/{env.d.ts → util/env.d.ts} +27 -7
  851. package/dist/{env.js → util/env.js} +33 -8
  852. package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
  853. package/dist/util/home-path.js +69 -0
  854. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
  855. package/dist/util/http-retry.js +103 -0
  856. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  857. package/dist/{http-util.js → util/http-util.js} +31 -11
  858. package/dist/util/json.d.ts +17 -0
  859. package/dist/util/json.js +25 -0
  860. package/dist/{log.d.ts → util/log.d.ts} +7 -3
  861. package/dist/{log.js → util/log.js} +36 -11
  862. package/dist/util/real-path.d.ts +3 -0
  863. package/dist/util/real-path.js +15 -0
  864. package/dist/util/request-scope.d.ts +28 -0
  865. package/dist/util/request-scope.js +48 -0
  866. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  867. package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
  868. package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
  869. package/dist/util/stored-json.d.ts +9 -0
  870. package/dist/util/stored-json.js +8 -0
  871. package/dist/util/time.d.ts +2 -0
  872. package/dist/util/time.js +3 -0
  873. package/dist/util/token-text.d.ts +15 -0
  874. package/dist/util/token-text.js +20 -0
  875. package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
  876. package/dist/util/transcript-tail.js +49 -0
  877. package/dist/util/version.d.ts +11 -0
  878. package/dist/util/version.js +26 -0
  879. package/extensions/openclaw-plugin/index.ts +2 -6
  880. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  881. package/extensions/openclaw-plugin/package.json +1 -1
  882. package/openclaw.plugin.json +1 -1
  883. package/package.json +2 -2
  884. package/dist/ablation.d.ts +0 -102
  885. package/dist/ablation.js +0 -136
  886. package/dist/api.d.ts +0 -26
  887. package/dist/api.js +0 -29
  888. package/dist/audit-prune.d.ts +0 -62
  889. package/dist/audit-prune.js +0 -107
  890. package/dist/autolearn.d.ts +0 -56
  891. package/dist/client.d.ts +0 -48
  892. package/dist/compare.d.ts +0 -86
  893. package/dist/compare.js +0 -117
  894. package/dist/connectors/github/cli-impl.d.ts +0 -25
  895. package/dist/connectors/github/cli-impl.js +0 -227
  896. package/dist/connectors/github/idempotency.d.ts +0 -19
  897. package/dist/connectors/github/idempotency.js +0 -27
  898. package/dist/connectors/slack/idempotency.d.ts +0 -17
  899. package/dist/connectors/slack/idempotency.js +0 -31
  900. package/dist/correction-latency.d.ts +0 -36
  901. package/dist/customer-notes.d.ts +0 -96
  902. package/dist/customer-notes.js +0 -336
  903. package/dist/db.d.ts +0 -9
  904. package/dist/db.js +0 -8
  905. package/dist/decisions.d.ts +0 -94
  906. package/dist/decisions.js +0 -326
  907. package/dist/dedupe.d.ts +0 -75
  908. package/dist/dedupe.js +0 -169
  909. package/dist/dormant.d.ts +0 -93
  910. package/dist/dormant.js +0 -137
  911. package/dist/embedding-provider.d.ts +0 -77
  912. package/dist/embeddings.d.ts +0 -101
  913. package/dist/extract.js +0 -133
  914. package/dist/forward-claim-detector.d.ts +0 -36
  915. package/dist/forward-claim-detector.js +0 -112
  916. package/dist/goals.d.ts +0 -173
  917. package/dist/goals.js +0 -448
  918. package/dist/graph/read.d.ts +0 -73
  919. package/dist/graph/rows.d.ts +0 -45
  920. package/dist/graph/types.js +0 -11
  921. package/dist/graph-stream.d.ts +0 -70
  922. package/dist/graph-view.d.ts +0 -73
  923. package/dist/graph-view.js +0 -333
  924. package/dist/half-life-migration.d.ts +0 -63
  925. package/dist/half-life-migration.js +0 -182
  926. package/dist/handoff.js +0 -68
  927. package/dist/home-path.js +0 -24
  928. package/dist/http-retry.js +0 -51
  929. package/dist/incidents.d.ts +0 -103
  930. package/dist/incidents.js +0 -349
  931. package/dist/instruction-detect.js +0 -27
  932. package/dist/json.d.ts +0 -7
  933. package/dist/json.js +0 -11
  934. package/dist/ledger-db.d.ts +0 -10
  935. package/dist/ledger-db.js +0 -42
  936. package/dist/memory-value-weights.d.ts +0 -19
  937. package/dist/memory-value.d.ts +0 -113
  938. package/dist/memory-value.js +0 -250
  939. package/dist/memory.d.ts +0 -294
  940. package/dist/memory.js +0 -522
  941. package/dist/owner-validation.d.ts +0 -42
  942. package/dist/owner-validation.js +0 -56
  943. package/dist/path-context.d.ts +0 -24
  944. package/dist/physics-state.d.ts +0 -39
  945. package/dist/policies.d.ts +0 -151
  946. package/dist/policies.js +0 -434
  947. package/dist/processes.d.ts +0 -108
  948. package/dist/processes.js +0 -371
  949. package/dist/project-briefs.d.ts +0 -128
  950. package/dist/project-briefs.js +0 -523
  951. package/dist/provenance-coverage.d.ts +0 -18
  952. package/dist/rate-limit.d.ts +0 -34
  953. package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
  954. package/dist/raw-archive.d.ts +0 -24
  955. package/dist/recall-history.d.ts +0 -131
  956. package/dist/recall-history.js +0 -227
  957. package/dist/recall-scope.d.ts +0 -138
  958. package/dist/refine-llm.d.ts +0 -61
  959. package/dist/refine-llm.js +0 -167
  960. package/dist/reject-flow.d.ts +0 -69
  961. package/dist/reject-flow.js +0 -260
  962. package/dist/rejection.d.ts +0 -100
  963. package/dist/replay.d.ts +0 -41
  964. package/dist/replay.js +0 -122
  965. package/dist/rrf.d.ts +0 -43
  966. package/dist/rrf.js +0 -61
  967. package/dist/scope.d.ts +0 -14
  968. package/dist/server-detect.d.ts +0 -72
  969. package/dist/server-detect.js +0 -222
  970. package/dist/session-owners.d.ts +0 -7
  971. package/dist/session-owners.js +0 -54
  972. package/dist/shared.d.ts +0 -186
  973. package/dist/shared.js +0 -540
  974. package/dist/skills.d.ts +0 -101
  975. package/dist/skills.js +0 -367
  976. package/dist/store/entry-writes-group.d.ts +0 -9
  977. package/dist/store/vector-writes.d.ts +0 -6
  978. package/dist/store/vector-writes.js +0 -59
  979. package/dist/store-port.d.ts +0 -262
  980. package/dist/store-port.js +0 -178
  981. package/dist/tenant.d.ts +0 -25
  982. package/dist/tenant.js +0 -43
  983. package/dist/trace.d.ts +0 -34
  984. package/dist/transcript-tail.js +0 -48
  985. package/dist/version.d.ts +0 -26
  986. package/dist/version.js +0 -41
  987. package/dist/working-memory.js +0 -154
  988. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  989. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  990. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  991. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  992. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  993. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  994. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  995. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  996. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  997. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  998. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  999. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  1000. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  1001. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  1002. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  1003. /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
  1004. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  1005. /package/dist/{escape.js → util/escape.js} +0 -0
  1006. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  1007. /package/dist/{keyset.js → util/keyset.js} +0 -0
  1008. /package/dist/{same-text.js → util/same-text.js} +0 -0
  1009. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  1010. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  1011. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  1012. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  1013. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  1014. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,111 +1,142 @@
1
- import { closeHippoDb, openHippoDb } from '../db.js';
2
- import { rejectionDigest, insertRejectedValue, normalizeValueForRejection } from '../rejection.js';
3
- import { archiveRawMemory } from '../raw-archive.js';
1
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
2
+ import { closeHippoDb, withWriteScope } from '../db/index.js';
3
+ import { rejectionDigest, insertRejectedValue, normalizeValueForRejection } from './rejection.js';
4
+ import { archiveRawMemory } from './raw-archive.js';
4
5
  import { rowToMemoryConflict } from './rows.js';
5
6
  import { audit } from './audit-event.js';
6
7
  import { syncChangedMirrors, purgeMirrorBestEffort } from './mirrors.js';
7
- import { selectEntriesByIds } from './entry-reads.js';
8
- import { openStore } from './open.js';
8
+ import { chunked, selectEntriesByIds } from './entry-reads.js';
9
+ import { onHandle, openStore } from './open.js';
9
10
  import { deleteEntryCore } from './delete-and-batch.js';
10
- import { BadRequestError } from '../api-errors.js';
11
- import { canTouchScope, isPersonalScope } from '../recall-scope.js';
11
+ import { BadRequestError } from '../core/api-errors.js';
12
+ import { canTouchScope, isPersonalScope } from './recall-scope.js';
12
13
  import { selectMemoryReach } from './tenant-lookup.js';
14
+ // The one place MemoryConflictRow's columns are listed; CONFLICT_COLS_MC is the same list under the `mc` alias.
15
+ const CONFLICT_COLS = 'id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at';
16
+ const CONFLICT_COLS_MC = CONFLICT_COLS.split(', ').map((c) => `mc.${c}`).join(', ');
13
17
  function canonicalConflictPair(aId, bId) {
14
18
  return aId < bId
15
19
  ? { memory_a_id: aId, memory_b_id: bId }
16
20
  : { memory_a_id: bId, memory_b_id: aId };
17
21
  }
22
+ function selectConflictRowsInTenant(db, status, allStatuses, tenantId) {
23
+ // Tenanted query: JOIN memories on both members and require each in-tenant, so no cross-tenant or stale pre-fix pair surfaces.
24
+ // SAFETY: both branches select CONFLICT_COLS_MC, MemoryConflictRow's columns.
25
+ return allStatuses
26
+ ? db.prepare(`
27
+ SELECT ${CONFLICT_COLS_MC}
28
+ FROM memory_conflicts mc
29
+ JOIN memories ma ON ma.id = mc.memory_a_id
30
+ JOIN memories mb ON mb.id = mc.memory_b_id
31
+ WHERE ma.tenant_id = ? AND mb.tenant_id = ?
32
+ ORDER BY mc.updated_at DESC, mc.id DESC
33
+ `).all(tenantId, tenantId)
34
+ : db.prepare(`
35
+ SELECT ${CONFLICT_COLS_MC}
36
+ FROM memory_conflicts mc
37
+ JOIN memories ma ON ma.id = mc.memory_a_id
38
+ JOIN memories mb ON mb.id = mc.memory_b_id
39
+ WHERE mc.status = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
40
+ ORDER BY mc.updated_at DESC, mc.id DESC
41
+ `).all(status, tenantId, tenantId);
42
+ }
43
+ function selectConflictRowsUnscoped(db, status, allStatuses) {
44
+ // Unscoped query — legacy direct-mode (CLI, tests, consolidate).
45
+ // SAFETY: both branches select CONFLICT_COLS, MemoryConflictRow's columns.
46
+ return allStatuses
47
+ ? db.prepare(`
48
+ SELECT ${CONFLICT_COLS}
49
+ FROM memory_conflicts
50
+ ORDER BY updated_at DESC, id DESC
51
+ `).all()
52
+ : db.prepare(`
53
+ SELECT ${CONFLICT_COLS}
54
+ FROM memory_conflicts
55
+ WHERE status = ?
56
+ ORDER BY updated_at DESC, id DESC
57
+ `).all(status);
58
+ }
18
59
  export function listMemoryConflicts(hippoRoot, status = 'open', tenantId) {
19
- const db = openStore(hippoRoot);
20
- try {
21
- // v0.28 — '*' is a sentinel meaning "no status filter, return all rows".
22
- // Pre-v0.28 callers (cli/mcp/dashboard) always passed 'open' or default,
23
- // so this sentinel is purely additive. The 4 SQL branches below cover
24
- // {tenanted | unscoped} × {all-statuses | specific-status}.
60
+ return onHandle(hippoRoot, (db) => {
61
+ // '*' is a sentinel for no status filter; the 4 SQL branches below cover {tenanted | unscoped} x {all-statuses | specific-status}.
25
62
  const allStatuses = status === '*';
26
- let rows;
27
- if (tenantId !== undefined) {
28
- // Tenanted query — JOIN to memories on both conflict members and require
29
- // each in-tenant, so neither a normal cross-tenant pair nor a stale
30
- // pre-fix row surfaces (consistent with resolveConflict).
31
- // SAFETY: both branches select the same eight mc.* columns (aliased
32
- // to MemoryConflictRow's field names) from memory_conflicts.
33
- rows = allStatuses
34
- ? db.prepare(`
35
- SELECT mc.id, mc.memory_a_id, mc.memory_b_id, mc.reason, mc.score,
36
- mc.status, mc.detected_at, mc.updated_at
37
- FROM memory_conflicts mc
38
- JOIN memories ma ON ma.id = mc.memory_a_id
39
- JOIN memories mb ON mb.id = mc.memory_b_id
40
- WHERE ma.tenant_id = ? AND mb.tenant_id = ?
41
- ORDER BY mc.updated_at DESC, mc.id DESC
42
- `).all(tenantId, tenantId)
43
- : db.prepare(`
44
- SELECT mc.id, mc.memory_a_id, mc.memory_b_id, mc.reason, mc.score,
45
- mc.status, mc.detected_at, mc.updated_at
46
- FROM memory_conflicts mc
47
- JOIN memories ma ON ma.id = mc.memory_a_id
48
- JOIN memories mb ON mb.id = mc.memory_b_id
49
- WHERE mc.status = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
50
- ORDER BY mc.updated_at DESC, mc.id DESC
51
- `).all(status, tenantId, tenantId);
52
- }
53
- else {
54
- // Unscoped query — legacy direct-mode (CLI, tests, consolidate).
55
- // SAFETY: both branches select the same eight columns matching
56
- // MemoryConflictRow's field set.
57
- rows = allStatuses
58
- ? db.prepare(`
59
- SELECT id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at
60
- FROM memory_conflicts
61
- ORDER BY updated_at DESC, id DESC
62
- `).all()
63
- : db.prepare(`
64
- SELECT id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at
65
- FROM memory_conflicts
66
- WHERE status = ?
67
- ORDER BY updated_at DESC, id DESC
68
- `).all(status);
69
- }
63
+ const rows = tenantId !== undefined
64
+ ? selectConflictRowsInTenant(db, status, allStatuses, tenantId)
65
+ : selectConflictRowsUnscoped(db, status, allStatuses);
70
66
  return rows.map(rowToMemoryConflict);
71
- }
72
- finally {
73
- closeHippoDb(db);
74
- }
67
+ }, openStore);
68
+ }
69
+ // listMemoryConflicts' tenanted open set: both members in the tenant.
70
+ const OPEN_IN_TENANT = `FROM memory_conflicts mc
71
+ JOIN memories ma ON ma.id = mc.memory_a_id
72
+ JOIN memories mb ON mb.id = mc.memory_b_id
73
+ WHERE mc.status = 'open' AND ma.tenant_id = ? AND mb.tenant_id = ?`;
74
+ /** How many open conflicts listMemoryConflicts returns for a tenant, without loading one. */
75
+ export function countOpenConflicts(hippoRoot, tenantId) {
76
+ return onHandle(hippoRoot, (db) => {
77
+ // SAFETY: one row with the single aliased count column.
78
+ const row = db.prepare(`SELECT COUNT(*) AS n ${OPEN_IN_TENANT}`).get(tenantId, tenantId);
79
+ return Number(row.n);
80
+ }, openStore);
81
+ }
82
+ /** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts' order, each with its other member read in one batch. */
83
+ export function loadOpenConflictsOf(hippoRoot, tenantId, memoryId) {
84
+ return onHandle(hippoRoot, (db) => {
85
+ // SAFETY: selects CONFLICT_COLS_MC, MemoryConflictRow's columns.
86
+ const rows = db.prepare(`SELECT ${CONFLICT_COLS_MC}
87
+ ${OPEN_IN_TENANT} AND (mc.memory_a_id = ? OR mc.memory_b_id = ?)
88
+ ORDER BY mc.updated_at DESC, mc.id DESC`).all(tenantId, tenantId, memoryId, memoryId);
89
+ const conflicts = rows.map(rowToMemoryConflict);
90
+ const otherId = (c) => (c.memory_a_id === memoryId ? c.memory_b_id : c.memory_a_id);
91
+ const others = selectEntriesByIds(db, conflicts.map(otherId), tenantId);
92
+ const out = [];
93
+ for (const conflict of conflicts) {
94
+ const other = others.get(otherId(conflict));
95
+ if (other)
96
+ out.push({ conflict, other });
97
+ }
98
+ return out;
99
+ }, openStore);
75
100
  }
76
101
  /** Conflicts whose two rows `actor` may both touch; someone else's personal row hides its whole pair. */
77
102
  export function listTouchableConflicts(hippoRoot, status, tenantId, actor) {
78
103
  const conflicts = listMemoryConflicts(hippoRoot, status, tenantId);
79
- const db = openHippoDb(hippoRoot);
80
- try {
104
+ return onHandle(hippoRoot, (db) => {
81
105
  return conflicts.filter((c) => [c.memory_a_id, c.memory_b_id].every((id) => canTouchScope(actor, selectMemoryReach(db, id)?.scope ?? null)));
82
- }
83
- finally {
84
- closeHippoDb(db);
85
- }
106
+ });
86
107
  }
87
108
  export function replaceDetectedConflicts(hippoRoot, detected, detectedAt = new Date().toISOString()) {
88
- const db = openStore(hippoRoot);
89
- try {
90
- const changedIds = writeConflictRefresh(db, readConflictRefresh(db), detected, detectedAt);
109
+ onHandle(hippoRoot, (db) => {
110
+ const changedIds = writeConflictRefresh(db, readConflictRefresh(db, detected), detected, detectedAt);
91
111
  syncChangedMirrors(hippoRoot, db, [...selectEntriesByIds(db, changedIds).values()]);
92
- }
93
- finally {
94
- closeHippoDb(db);
95
- }
112
+ }, openStore);
96
113
  }
97
- /** The refresh's read of the whole memories table, kept out of the write lock because it grows with the store. */
98
- export function readConflictRefresh(db) {
114
+ /** 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. */
115
+ function readConflictRefresh(db, detected) {
99
116
  // Tenant guard (E2): a conflict is meaningful only within one tenant, so cross-tenant pairs are
100
117
  // skipped on insert and on rebuild, and a stale cross-tenant row can neither persist nor leak a foreign id.
101
118
  const tenantById = new Map();
102
119
  const storedRefs = new Map();
103
120
  // SAFETY: rows' shape matches the three columns named in the SELECT.
104
- for (const r of db.prepare(`SELECT id, tenant_id, conflicts_with_json FROM memories`).all()) {
121
+ const rows = db.prepare(`
122
+ SELECT id, tenant_id, conflicts_with_json FROM memories
123
+ WHERE conflicts_with_json != '[]'
124
+ OR id IN (SELECT memory_a_id FROM memory_conflicts WHERE status = 'open')
125
+ OR id IN (SELECT memory_b_id FROM memory_conflicts WHERE status = 'open')
126
+ `).all();
127
+ for (const r of rows) {
105
128
  tenantById.set(r.id, r.tenant_id);
106
129
  if (r.conflicts_with_json !== '[]')
107
130
  storedRefs.set(r.id, r.conflicts_with_json);
108
131
  }
132
+ const given = [...new Set(detected.flatMap((c) => [c.memory_a_id, c.memory_b_id]))].filter((id) => !tenantById.has(id));
133
+ for (const ids of chunked(given)) {
134
+ const marks = ids.map(() => '?').join(',');
135
+ // SAFETY: rows' shape matches the two columns named in the SELECT.
136
+ const found = db.prepare(`SELECT id, tenant_id FROM memories WHERE id IN (${marks})`).all(...ids);
137
+ for (const r of found)
138
+ tenantById.set(r.id, r.tenant_id);
139
+ }
109
140
  const sameTenant = (a, b) => {
110
141
  const ta = tenantById.get(a);
111
142
  const tb = tenantById.get(b);
@@ -114,32 +145,23 @@ export function readConflictRefresh(db) {
114
145
  return { sameTenant, storedRefs };
115
146
  }
116
147
  /** Under the write lock: the memory_conflicts rows, then each memory whose refs change; returns the ids it rewrote. */
117
- export function writeConflictRefresh(db, reads, detected, detectedAt) {
148
+ function writeConflictRefresh(db, reads, detected, detectedAt) {
118
149
  const canonicalDetected = detected.map((conflict) => ({
119
150
  ...canonicalConflictPair(conflict.memory_a_id, conflict.memory_b_id),
120
151
  reason: conflict.reason,
121
152
  score: conflict.score,
122
153
  }));
123
- db.exec('BEGIN IMMEDIATE');
124
- try {
154
+ return withWriteScope(db, 'replace_conflicts', () => {
125
155
  resolveStaleOpenConflicts(db, canonicalDetected, reads.sameTenant, detectedAt);
126
156
  upsertDetectedConflicts(db, canonicalDetected, reads.sameTenant, detectedAt);
127
- const changedIds = rebuildConflictsWithJson(db, reads);
128
- db.exec('COMMIT');
129
- return changedIds;
130
- }
131
- catch (error) {
132
- if (db.isTransaction !== false)
133
- db.exec('ROLLBACK');
134
- throw error;
135
- }
157
+ return rebuildConflictsWithJson(db, reads);
158
+ });
136
159
  }
137
160
  function resolveStaleOpenConflicts(db, canonicalDetected, sameTenant, detectedAt) {
138
161
  const detectedKeys = new Set(canonicalDetected.map((conflict) => `${conflict.memory_a_id}::${conflict.memory_b_id}`));
139
- // SAFETY: openRows' shape matches the eight columns named in the SELECT
140
- // above.
162
+ // SAFETY: openRows' shape matches the columns named in CONFLICT_COLS.
141
163
  const openRows = db.prepare(`
142
- SELECT id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at
164
+ SELECT ${CONFLICT_COLS}
143
165
  FROM memory_conflicts
144
166
  WHERE status = 'open'
145
167
  `).all();
@@ -147,11 +169,7 @@ function resolveStaleOpenConflicts(db, canonicalDetected, sameTenant, detectedAt
147
169
  for (const row of openRows) {
148
170
  const key = `${row.memory_a_id}::${row.memory_b_id}`;
149
171
  const stale = !detectedKeys.has(key);
150
- // v1.11.0 residue: auto-resolve any open cross-tenant row. The insert
151
- // loop in upsertDetectedConflicts and the refMap rebuild skip
152
- // cross-tenant pairs, but the resolve-stale loop previously left
153
- // re-detected cross-tenant rows lingering status='open'. The
154
- // sameTenant() helper is already built one block up; no extra query.
172
+ // Auto-resolve any open cross-tenant row: the insert loop and refMap rebuild skip those pairs, so re-detected ones would linger as 'open'.
155
173
  const crossTenant = !sameTenant(row.memory_a_id, row.memory_b_id);
156
174
  if (stale || crossTenant)
157
175
  resolve.run(detectedAt, row.id);
@@ -208,85 +226,72 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
208
226
  }
209
227
  return changedIds;
210
228
  }
211
- /**
212
- * Resolve a conflict by keeping one memory and weakening the other.
213
- * Sets conflict status to 'resolved' and halves the loser's half-life.
214
- * If --forget is used, the loser is removed entirely (kind-aware: raw rows
215
- * are archived via archiveRawMemory, others deleted via deleteEntryCore —
216
- * AT1 fix for the pre-existing crash where a raw loser aborted the whole
217
- * resolve transaction against the append-only trigger). `opts.rejectLoserValue`
218
- * additionally tombstones the loser's normalized digest so it cannot be
219
- * re-asserted later.
220
- *
221
- * Every resolution path (weaken / forget / reject) emits a `conflict_resolve`
222
- * audit row (AT1 — previously resolveConflict wrote zero audit rows on any path).
223
- *
224
- * Returns the resolved conflict, or null if not found.
225
- */
226
- export function resolveConflict(hippoRoot, conflictId, keepId, forgetLoser = false, tenantId, opts) {
227
- const db = openStore(hippoRoot);
228
- // When tenantId is set, the conflict lookup requires BOTH members in-tenant
229
- // and every memories mutation carries AND tenant_id = ?. A cross-tenant probe
230
- // then returns null, indistinguishable from a bad id. Omitted tenantId =
231
- // legacy unscoped behaviour (CLI direct mode, tests, consolidate.ts).
232
- const scope = {
229
+ // 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.
230
+ // Omitted tenantId = unscoped (CLI direct mode, tests).
231
+ function conflictMemScope(tenantId) {
232
+ return {
233
233
  memScope: tenantId !== undefined ? ' AND tenant_id = ?' : '',
234
234
  memArgs: tenantId !== undefined ? [tenantId] : [],
235
235
  };
236
+ }
237
+ function findResolvableConflict(db, conflictId, keepId, tenantId) {
238
+ const row = selectConflictRow(db, conflictId, tenantId);
239
+ if (!row)
240
+ return null;
241
+ const conflict = rowToMemoryConflict(row);
242
+ if (conflict.status !== 'open')
243
+ return null;
244
+ const loserId = keepId === conflict.memory_a_id
245
+ ? conflict.memory_b_id
246
+ : keepId === conflict.memory_b_id
247
+ ? conflict.memory_a_id
248
+ : null;
249
+ if (!loserId)
250
+ return null;
251
+ return { conflict, loserId };
252
+ }
253
+ /** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser, `opts.rejectLoserValue` also tombstones its
254
+ * digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
255
+ export function resolveConflict(hippoRoot, conflictId, keepId, forgetLoser = false, tenantId, opts) {
256
+ const db = openStore(hippoRoot);
257
+ const scope = conflictMemScope(tenantId);
236
258
  try {
237
- const row = selectConflictRow(db, conflictId, tenantId);
238
- if (!row)
239
- return null;
240
- const conflict = rowToMemoryConflict(row);
241
- if (conflict.status !== 'open')
259
+ const resolvable = findResolvableConflict(db, conflictId, keepId, tenantId);
260
+ if (!resolvable)
242
261
  return null;
243
- const loserId = keepId === conflict.memory_a_id
244
- ? conflict.memory_b_id
245
- : keepId === conflict.memory_b_id
246
- ? conflict.memory_a_id
247
- : null;
248
- if (!loserId)
249
- return null;
250
- db.exec('BEGIN IMMEDIATE');
251
- // Mark conflict as resolved
252
- db.prepare(`UPDATE memory_conflicts SET status = 'resolved', updated_at = datetime('now') WHERE id = ?`)
253
- .run(conflictId);
262
+ const { conflict, loserId } = resolvable;
254
263
  const target = { conflictId, keepId, loserId, scope, opts };
255
- const removeLoser = forgetLoser || opts?.rejectLoserValue === true;
256
- const removal = removeLoser ? removeConflictLoser(db, target) : weakenConflictLoser(db, target);
257
- stripConflictRefs(db, target, removal.loserRemoved);
258
- auditConflictResolve(db, target, removal, tenantId);
259
- db.exec('COMMIT');
264
+ const removal = withWriteScope(db, 'resolve_conflict', () => {
265
+ // Mark conflict as resolved
266
+ db.prepare(`UPDATE memory_conflicts SET status = 'resolved', updated_at = datetime('now') WHERE id = ?`)
267
+ .run(conflictId);
268
+ const removeLoser = forgetLoser || opts?.rejectLoserValue === true;
269
+ const out = removeLoser ? removeConflictLoser(db, target) : weakenConflictLoser(db, target);
270
+ stripConflictRefs(db, target, out.loserRemoved);
271
+ auditConflictResolve(db, target, out, tenantId);
272
+ return out;
273
+ });
260
274
  syncChangedMirrors(hippoRoot, db, [...selectEntriesByIds(db, [keepId, loserId]).values()]);
261
275
  if (removal.loserRemoved)
262
276
  purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal);
263
277
  return { conflict: { ...conflict, status: 'resolved' }, loserId };
264
278
  }
265
- catch (error) {
266
- try {
267
- db.exec('ROLLBACK');
268
- }
269
- catch { /* ignore */ }
270
- throw error;
271
- }
272
279
  finally {
273
280
  closeHippoDb(db);
274
281
  }
275
282
  }
276
283
  function selectConflictRow(db, conflictId, tenantId) {
277
- // SAFETY: both branches select the same eight columns (aliased in the
278
- // tenanted branch) matching MemoryConflictRow's field set.
284
+ // SAFETY: the branches select CONFLICT_COLS_MC and CONFLICT_COLS, MemoryConflictRow's columns.
279
285
  return (tenantId !== undefined
280
286
  ? db.prepare(`
281
- SELECT mc.id, mc.memory_a_id, mc.memory_b_id, mc.reason, mc.score,
282
- mc.status, mc.detected_at, mc.updated_at
287
+ SELECT ${CONFLICT_COLS_MC}
283
288
  FROM memory_conflicts mc
284
289
  JOIN memories ma ON ma.id = mc.memory_a_id
285
290
  JOIN memories mb ON mb.id = mc.memory_b_id
286
291
  WHERE mc.id = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
287
292
  `).get(conflictId, tenantId, tenantId)
288
293
  : db.prepare(`
289
- SELECT id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at
294
+ SELECT ${CONFLICT_COLS}
290
295
  FROM memory_conflicts WHERE id = ?
291
296
  `).get(conflictId));
292
297
  }
@@ -297,21 +302,13 @@ function weakenConflictLoser(db, t) {
297
302
  return { loserRemoved: false, loserWasRaw: false, rejectedDigest: undefined, extraRemovedIds: [], extraRemovedRawIds: [] };
298
303
  }
299
304
  function removeConflictLoser(db, t) {
300
- // AT1 (plan §5): removal (forgetLoser OR rejectLoserValue — a tombstoned
301
- // value cannot be left live) is now kind-aware. The old bare
302
- // `DELETE FROM memories WHERE id = ?` aborted the whole transaction when
303
- // the loser was kind='raw' (append-only trigger fires); route through
304
- // the same helpers the reject verb uses (both db-scoped, both compose
305
- // inside this BEGIN/COMMIT). loserRemoved / loserWasRaw drive both the
306
- // conflicts_with_json skip below and the post-commit mirror purge.
305
+ // 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.
306
+ // loserRemoved / loserWasRaw drive the conflicts_with_json skip below and the post-commit mirror purge.
307
307
  const removal = {
308
308
  loserRemoved: false,
309
309
  loserWasRaw: false,
310
310
  rejectedDigest: undefined,
311
- // AT1 P1 fix (codex): same-tenant duplicates of the loser's content that
312
- // rejectLoserValue also removes (see below) — separate from loserId so
313
- // the audit + post-commit mirror purge can cover ALL of them, not just
314
- // loserId.
311
+ // 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.
315
312
  extraRemovedIds: [],
316
313
  extraRemovedRawIds: [],
317
314
  };
@@ -340,6 +337,17 @@ function removeConflictLoser(db, t) {
340
337
  // the old tenant-scoped DELETE's silent 0-rows-affected behavior.
341
338
  return removal;
342
339
  }
340
+ function recordRejectedLoserValue(db, t, loserRow, digest, who) {
341
+ insertRejectedValue(db, {
342
+ tenantId: loserRow.tenant_id ?? DEFAULT_TENANT_ID,
343
+ digest,
344
+ reason: who.reason,
345
+ rejectedBy: who.actor,
346
+ rejectedAt: new Date().toISOString(),
347
+ sourceMemoryId: t.loserId,
348
+ normalizedChars: normalizeValueForRejection(loserRow.content).length,
349
+ });
350
+ }
343
351
  /** Tombstones the loser's digest and removes its same-tenant duplicates into `removal`; returns the digest. */
344
352
  function tombstoneLoserValue(db, t, loserRow, who, removal) {
345
353
  if (isPersonalScope(loserRow.scope)) {
@@ -347,28 +355,10 @@ function tombstoneLoserValue(db, t, loserRow, who, removal) {
347
355
  }
348
356
  const { actor, reason } = who;
349
357
  const rejectedDigest = rejectionDigest(loserRow.content);
350
- insertRejectedValue(db, {
351
- tenantId: loserRow.tenant_id ?? 'default',
352
- digest: rejectedDigest,
353
- reason,
354
- rejectedBy: actor,
355
- rejectedAt: new Date().toISOString(),
356
- sourceMemoryId: t.loserId,
357
- normalizedChars: normalizeValueForRejection(loserRow.content).length,
358
- });
359
- // AT1 P1 fix (codex): reject-flow.ts's `rejectValue` removes ALL
360
- // live same-tenant rows whose normalized digest matches, not just
361
- // the one id passed — but this branch only ever removed loserId,
362
- // leaving same-TENANT duplicates live while their shared content
363
- // was tombstoned. Same O(N) scan pattern as reject-flow.ts (human-
364
- // triggered command, tenant's row count is human-scale). CRITICAL
365
- // BOUNDARY: tenant-scoped ONLY — tombstones are tenant-scoped by
366
- // design, so a same-content row in ANOTHER tenant is legitimately
367
- // live and must NOT be touched here. `keepId` is excluded even if
368
- // its content coincidentally matches: the human explicitly chose
369
- // to keep it in this same resolution, and this branch must not
370
- // undo that choice in the same transaction.
371
- const loserTenantId = loserRow.tenant_id ?? 'default';
358
+ recordRejectedLoserValue(db, t, loserRow, rejectedDigest, who);
359
+ // 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.
360
+ // Tenant-scoped ONLY, since tombstones are; `keepId` is excluded even if its content matches, because the human chose to keep it.
361
+ const loserTenantId = loserRow.tenant_id ?? DEFAULT_TENANT_ID;
372
362
  // SAFETY: dupRows' shape matches the four columns named in the SELECT above.
373
363
  const dupRows = db
374
364
  .prepare(`SELECT id, kind, content, scope FROM memories WHERE tenant_id = ? AND id != ? AND id != ?`)
@@ -393,9 +383,8 @@ function tombstoneLoserValue(db, t, loserRow, who, removal) {
393
383
  function stripConflictRefs(db, t, loserRemoved) {
394
384
  const { memScope, memArgs } = t.scope;
395
385
  const { keepId, loserId } = t;
396
- // Clean up conflicts_with references
397
- // SAFETY: keepRow's shape matches the single `conflicts_with_json`
398
- // column selected above.
386
+ // Clean up conflicts_with references.
387
+ // SAFETY: keepRow's shape matches the single `conflicts_with_json` column selected above.
399
388
  const keepRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(keepId, ...memArgs);
400
389
  if (keepRow) {
401
390
  const refs = JSON.parse(keepRow.conflicts_with_json || '[]');
@@ -417,60 +406,43 @@ function stripConflictRefs(db, t, loserRemoved) {
417
406
  }
418
407
  function auditConflictResolve(db, t, removal, tenantId) {
419
408
  const { loserRemoved, loserWasRaw, rejectedDigest, extraRemovedIds } = removal;
420
- // AT1: the missing audit (plan §5 — resolveConflict wrote ZERO audit_log
421
- // rows on any path before this). Every path — weaken, forget, reject —
422
- // lands exactly one conflict_resolve row.
409
+ // Every path (weaken, forget, reject) lands exactly one conflict_resolve audit row.
423
410
  const conflictResolveMeta = {
424
411
  conflictId: t.conflictId,
425
412
  keepId: t.keepId,
426
413
  loserId: t.loserId,
427
414
  disposition: loserRemoved ? (loserWasRaw ? 'archived_raw' : 'deleted') : 'weakened',
428
415
  rejected: Boolean(t.opts?.rejectLoserValue),
429
- // AT1 P1 fix: every row this call removed, not just loserId — the
430
- // same-tenant duplicate sweep above (extraRemovedIds) needs an
431
- // audit trail too.
416
+ // Every row this call removed, not just loserId, so the duplicate sweep (extraRemovedIds) is audited too.
432
417
  removedIds: loserRemoved ? [t.loserId, ...extraRemovedIds] : [],
433
418
  };
434
419
  // Assigned only when present so the serialized audit payload keeps
435
420
  // omitting the key, exactly as the pre-migration object literal did.
436
421
  if (rejectedDigest !== undefined)
437
422
  conflictResolveMeta.rejectedDigest = rejectedDigest;
438
- // Fresh spread literal: ConflictResolveMeta is a closed interface (no
439
- // index signature) and isn't directly assignable to audit()'s
440
- // Record<string, JsonValue> metadata param; a spread into a fresh
441
- // object literal satisfies it without widening the declared type above.
442
- audit(db, 'conflict_resolve', t.keepId, { ...conflictResolveMeta }, t.opts?.rejectedBy ?? 'cli', tenantId);
423
+ // Fresh spread literal: ConflictResolveMeta is a closed interface, not assignable to audit()'s Record<string, JsonValue> metadata otherwise.
424
+ audit(db, 'conflict_resolve', { targetId: t.keepId, metadata: { ...conflictResolveMeta }, actor: t.opts?.rejectedBy ?? 'cli', tenantId });
443
425
  }
444
426
  function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
445
- // AT1 P1b fix: mirror purge + reaper stamp for EVERY removed loser, not
446
- // just the rejectLoserValue path. Pre-AT1, the plain forgetLoser path on
447
- // a raw loser crashed outright (bare DELETE FROM memories hit the
448
- // append-only trigger) — there is no legacy "successful forget, no
449
- // purge" behavior to preserve for that case. Post-AT1's kind-aware
450
- // removal (archiveRawMemory / deleteEntryCore above) makes plain
451
- // --forget succeed on every kind, but until this fix the mirror was
452
- // only purged when rejectLoserValue was ALSO set: a plain raw --forget
453
- // left its markdown mirror orphaned (the reaper still catches it
454
- // eventually, since archiveRawMemory's own raw_archive insert leaves
455
- // mirror_cleaned_at NULL) and a plain non-raw --forget left its mirror
456
- // orphaned FOREVER (no reaper exists for non-raw rows). Same post-commit
457
- // purge+reaper pattern as the reject verb (src/reject-flow.ts) and
458
- // api.archiveRaw — reusing removeEntryMirrors + raw_archive bookkeeping.
459
- // AT1 P1 fix: loop over loserId AND every same-tenant duplicate the
460
- // rejectLoserValue sweep above removed (extraRemovedIds) — previously
461
- // only loserId's mirror was purged, leaving duplicate mirrors orphaned
462
- // despite their rows being gone.
427
+ // Mirror purge and reaper stamp for EVERY removed loser (loserId and each extraRemovedIds duplicate), post-commit like the reject verb.
428
+ // A non-raw mirror has no reaper, so skipping the purge would orphan it forever.
463
429
  for (const removedId of [loserId, ...removal.extraRemovedIds]) {
464
430
  const isRaw = removedId === loserId ? removal.loserWasRaw : removal.extraRemovedRawIds.includes(removedId);
465
- // AT1 fix: purgeMirrorBestEffort retries once, then — for non-raw ids,
466
- // which cleanupArchivedMirrors' reaper never scans — reports the
467
- // EXPLICIT leftover path(s) instead of the false "will retry via
468
- // reaper" claim. See its own doc comment (store.ts, near
469
- // removeEntryMirrors) for the full rationale.
431
+ // purgeMirrorBestEffort retries once, then reports the explicit leftover paths for non-raw ids, which the cleanupArchivedMirrors reaper never scans.
470
432
  const mirrorOk = purgeMirrorBestEffort(hippoRoot, removedId, isRaw, 'resolveConflict');
471
433
  if (mirrorOk && isRaw) {
472
434
  db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(new Date().toISOString(), removedId);
473
435
  }
474
436
  }
475
437
  }
438
+ /** The conflict and loser ids every conflict_resolve audit row names. */
439
+ export function conflictResolveAuditsAt(db) {
440
+ // SAFETY: SELECT of two fields every conflict_resolve audit row carries (ConflictResolveMeta above).
441
+ return db.prepare(`SELECT json_extract(metadata_json, '$.conflictId') AS conflictId, json_extract(metadata_json, '$.loserId') AS loserId FROM audit_log WHERE op = 'conflict_resolve'`).all();
442
+ }
443
+ /** Every resolved conflict with both sides. */
444
+ export function resolvedConflictsAt(db) {
445
+ // SAFETY: SELECT of three columns of resolved conflicts.
446
+ return db.prepare(`SELECT id, memory_a_id, memory_b_id FROM memory_conflicts WHERE status = 'resolved'`).all();
447
+ }
476
448
  //# sourceMappingURL=conflicts.js.map
@@ -0,0 +1,84 @@
1
+ import { type DatabaseSyncLike } from '../../db/index.js';
2
+ /** One github_event_log row to write; `memoryId` is null for an event that produced no memory. */
3
+ export interface GitHubEventLogEntry {
4
+ idempotencyKey: string;
5
+ deliveryId: string;
6
+ eventName: string;
7
+ memoryId: string | null;
8
+ }
9
+ export declare function eventSeenAt(db: DatabaseSyncLike, idempotencyKey: string): boolean;
10
+ export declare function eventMemoryAt(db: DatabaseSyncLike, idempotencyKey: string): string | null;
11
+ /** False when the key was already logged, so a caller inside a write scope can roll its own row back. */
12
+ export declare function logEventAt(db: DatabaseSyncLike, entry: GitHubEventLogEntry): boolean;
13
+ /** The memory an already-seen key points at, or null when the key is new. */
14
+ export declare function seenEvent(hippoRoot: string, idempotencyKey: string): {
15
+ memoryId: string | null;
16
+ } | null;
17
+ export declare function logEvent(hippoRoot: string, entry: GitHubEventLogEntry): void;
18
+ export interface ArtifactDeletion {
19
+ tenantId: string;
20
+ artifactRef: string;
21
+ idempotencyKey: string;
22
+ deliveryId: string;
23
+ eventName: string;
24
+ reason: string;
25
+ who: string;
26
+ }
27
+ /** 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. */
28
+ export declare function archiveDeletedArtifact(hippoRoot: string, del: ArtifactDeletion): {
29
+ duplicate: boolean;
30
+ archived: number;
31
+ };
32
+ export type DlqBucket = 'parse_error' | 'unroutable' | 'signature_failed' | 'unhandled';
33
+ export interface DlqItem {
34
+ id: number;
35
+ tenantId: string;
36
+ rawPayload: string;
37
+ error: string;
38
+ eventName: string | null;
39
+ deliveryId: string | null;
40
+ signature: string | null;
41
+ installationId: string | null;
42
+ repoFullName: string | null;
43
+ retryCount: number;
44
+ receivedAt: string;
45
+ retriedAt: string | null;
46
+ bucket: DlqBucket | string;
47
+ }
48
+ /** One github_dlq row to write, already redacted by the caller; the four GitHub-only columns are stored NULL when left out. */
49
+ export interface GitHubDlqInsert {
50
+ tenantId: string;
51
+ rawPayload: string;
52
+ error: string;
53
+ eventName?: string | null;
54
+ deliveryId?: string | null;
55
+ signature: string | null;
56
+ installationId?: string | null;
57
+ repoFullName?: string | null;
58
+ bucket: DlqBucket;
59
+ }
60
+ export declare function insertGitHubDlq(hippoRoot: string, row: GitHubDlqInsert): number;
61
+ export declare function listGitHubDlq(hippoRoot: string, tenantId: string, limit: number): DlqItem[];
62
+ export declare function githubDlqEntry(hippoRoot: string, id: number): DlqItem | null;
63
+ export declare function bumpGitHubDlqRetryCount(hippoRoot: string, id: number): void;
64
+ /** What the routing tables say about one webhook; `tenant` is the installation match, or the repo match when no installation was sent. */
65
+ export interface GitHubRouting {
66
+ installations: number;
67
+ repositories: number;
68
+ tenant: string | null;
69
+ }
70
+ export declare function githubRouting(hippoRoot: string, args: {
71
+ installationId?: string | null;
72
+ repoFullName?: string | null;
73
+ }): GitHubRouting;
74
+ export type HwmColumn = 'issues_hwm' | 'issue_comments_hwm' | 'pr_review_comments_hwm';
75
+ export interface StoredCursors {
76
+ issues: string | null;
77
+ issueComments: string | null;
78
+ prReviewComments: string | null;
79
+ }
80
+ export declare function readCursors(hippoRoot: string, tenantId: string, repo: string): StoredCursors;
81
+ export declare function writeHwm(hippoRoot: string, tenantId: string, repo: string, column: HwmColumn, value: string): void;
82
+ /** Sets all three HWMs to `since` for a first run; COALESCE keeps any HWM a stream has already saved. */
83
+ export declare function seedCursors(hippoRoot: string, tenantId: string, repo: string, since: string): void;
84
+ //# sourceMappingURL=github.d.ts.map