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