hippo-memory 1.72.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (995) hide show
  1. package/README.md +6 -4
  2. package/dist/agent-memories/apply.d.ts +7 -5
  3. package/dist/agent-memories/apply.js +66 -39
  4. package/dist/agent-memories/claude-code.d.ts +8 -2
  5. package/dist/agent-memories/claude-code.js +26 -7
  6. package/dist/agent-memories/copilot.js +2 -1
  7. package/dist/agent-memories/files.js +2 -1
  8. package/dist/agent-memories/legacy.d.ts +6 -3
  9. package/dist/agent-memories/legacy.js +35 -14
  10. package/dist/agent-memories/markdown.d.ts +3 -1
  11. package/dist/agent-memories/markdown.js +3 -1
  12. package/dist/agent-memories/openclaw.js +5 -2
  13. package/dist/agent-memories/plan.js +11 -1
  14. package/dist/agent-memories/project-folds.js +2 -1
  15. package/dist/agent-memories/report.d.ts +4 -1
  16. package/dist/agent-memories/report.js +43 -9
  17. package/dist/agent-memories/source.d.ts +8 -2
  18. package/dist/agent-memories/source.js +11 -3
  19. package/dist/agent-memories/sync.d.ts +7 -2
  20. package/dist/agent-memories/sync.js +141 -101
  21. package/dist/api/assemble.d.ts +6 -4
  22. package/dist/api/assemble.js +11 -5
  23. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  24. package/dist/api/auth/audit.js +58 -0
  25. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
  26. package/dist/api/{auth.js → auth/auth.js} +66 -54
  27. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  28. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
  29. package/dist/api/auth/session-owners.d.ts +10 -0
  30. package/dist/api/auth/session-owners.js +35 -0
  31. package/dist/api/availability.d.ts +3 -1
  32. package/dist/api/availability.js +3 -1
  33. package/dist/api/busy.d.ts +2 -0
  34. package/dist/api/busy.js +2 -0
  35. package/dist/api/cli-surface.d.ts +6 -0
  36. package/dist/api/cli-surface.js +6 -0
  37. package/dist/api/config-of.d.ts +5 -0
  38. package/dist/api/config-of.js +6 -0
  39. package/dist/api/context-auto.d.ts +4 -1
  40. package/dist/api/context-auto.js +14 -4
  41. package/dist/api/context-render.js +14 -7
  42. package/dist/api/context-select.d.ts +4 -1
  43. package/dist/api/context-select.js +31 -34
  44. package/dist/api/context-types.d.ts +38 -12
  45. package/dist/api/context.d.ts +8 -5
  46. package/dist/api/context.js +120 -63
  47. package/dist/api/continuity.d.ts +24 -21
  48. package/dist/api/continuity.js +18 -20
  49. package/dist/api/correction-latency.d.ts +3 -1
  50. package/dist/api/correction-latency.js +3 -1
  51. package/dist/api/error-reply.d.ts +4 -1
  52. package/dist/api/error-reply.js +12 -3
  53. package/dist/api/index.d.ts +39 -23
  54. package/dist/api/index.js +21 -23
  55. package/dist/api/instruction-detect.d.ts +4 -1
  56. package/dist/api/instruction-detect.js +75 -20
  57. package/dist/api/ledger-db.d.ts +15 -11
  58. package/dist/api/ledger-db.js +21 -23
  59. package/dist/api/memories/conflicts.d.ts +33 -0
  60. package/dist/api/memories/conflicts.js +67 -0
  61. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  62. package/dist/api/{forget.js → memories/forget.js} +23 -17
  63. package/dist/api/memories/memories.d.ts +27 -0
  64. package/dist/api/memories/memories.js +52 -0
  65. package/dist/api/memories/outcome.d.ts +22 -0
  66. package/dist/api/memories/outcome.js +28 -0
  67. package/dist/api/memories/promote.d.ts +40 -0
  68. package/dist/api/memories/promote.js +76 -0
  69. package/dist/api/memories/refine.d.ts +10 -0
  70. package/dist/api/memories/refine.js +12 -0
  71. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
  72. package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
  73. package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
  74. package/dist/api/{remember.js → memories/remember.js} +50 -32
  75. package/dist/api/objects/cards.d.ts +39 -0
  76. package/dist/api/{cards.js → objects/cards.js} +12 -14
  77. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  78. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
  79. package/dist/api/objects/goals.d.ts +18 -0
  80. package/dist/api/{goals.js → objects/goals.js} +12 -12
  81. package/dist/api/objects/graph.d.ts +11 -0
  82. package/dist/api/objects/graph.js +16 -0
  83. package/dist/api/objects/objects.d.ts +9 -0
  84. package/dist/api/{objects.js → objects/objects.js} +2 -3
  85. package/dist/api/objects/predictions.d.ts +11 -0
  86. package/dist/api/{predictions.js → objects/predictions.js} +7 -5
  87. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  88. package/dist/api/{projects.js → objects/projects.js} +8 -4
  89. package/dist/api/pilot-arm.d.ts +8 -4
  90. package/dist/api/pilot-arm.js +5 -4
  91. package/dist/api/prompt-hook.d.ts +35 -20
  92. package/dist/api/prompt-hook.js +66 -44
  93. package/dist/api/provenance-coverage.d.ts +3 -1
  94. package/dist/api/provenance-coverage.js +3 -1
  95. package/dist/api/recall/finish.d.ts +185 -0
  96. package/dist/api/recall/finish.js +301 -0
  97. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  98. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
  99. package/dist/api/recall/recall.d.ts +6 -0
  100. package/dist/api/{recall.js → recall/recall.js} +116 -72
  101. package/dist/api/recall/render.d.ts +39 -0
  102. package/dist/api/recall/render.js +60 -0
  103. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  104. package/dist/api/recall/request.js +261 -0
  105. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  106. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  107. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
  108. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  109. package/dist/api/session-end.d.ts +36 -8
  110. package/dist/api/session-end.js +71 -25
  111. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  112. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  113. package/dist/api/sleep/dormant.d.ts +25 -0
  114. package/dist/api/sleep/dormant.js +64 -0
  115. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  116. package/dist/api/sleep/learn.js +138 -0
  117. package/dist/api/sleep/sleep-run.d.ts +38 -0
  118. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
  119. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  120. package/dist/api/sleep/sleep.js +9 -0
  121. package/dist/api/status.d.ts +3 -1
  122. package/dist/api/status.js +3 -1
  123. package/dist/api/store-init.d.ts +4 -1
  124. package/dist/api/store-init.js +4 -1
  125. package/dist/api/tokens.d.ts +10 -9
  126. package/dist/api/tokens.js +9 -10
  127. package/dist/api/types.d.ts +27 -12
  128. package/dist/api/types.js +13 -4
  129. package/dist/capture/caller-session.d.ts +8 -2
  130. package/dist/capture/caller-session.js +16 -6
  131. package/dist/capture/capture-error.d.ts +3 -1
  132. package/dist/capture/capture-error.js +3 -1
  133. package/dist/capture/codex-patch.js +7 -2
  134. package/dist/capture/command.d.ts +4 -2
  135. package/dist/capture/command.js +34 -15
  136. package/dist/capture/compact-resume-caller.js +15 -8
  137. package/dist/capture/compact.d.ts +8 -5
  138. package/dist/capture/compact.js +34 -23
  139. package/dist/capture/compaction-items-caller.js +9 -3
  140. package/dist/capture/compaction-record.d.ts +4 -3
  141. package/dist/capture/compaction-record.js +20 -12
  142. package/dist/capture/compaction-spool.d.ts +18 -9
  143. package/dist/capture/compaction-spool.js +105 -63
  144. package/dist/capture/copilot-transcript.d.ts +11 -3
  145. package/dist/capture/copilot-transcript.js +16 -6
  146. package/dist/capture/extract.js +20 -8
  147. package/dist/capture/failure-caller.js +23 -12
  148. package/dist/capture/failure-reading.d.ts +10 -3
  149. package/dist/capture/failure-reading.js +24 -7
  150. package/dist/capture/pre-compact-caller.js +11 -4
  151. package/dist/capture/session-digest.d.ts +15 -4
  152. package/dist/capture/session-digest.js +39 -13
  153. package/dist/capture/session-end-caller.d.ts +4 -1
  154. package/dist/capture/session-end-caller.js +20 -8
  155. package/dist/capture/session-texts.d.ts +6 -2
  156. package/dist/capture/session-texts.js +22 -7
  157. package/dist/capture/session-worker.d.ts +4 -2
  158. package/dist/capture/session-worker.js +58 -17
  159. package/dist/capture/transcript.d.ts +13 -4
  160. package/dist/capture/transcript.js +32 -10
  161. package/dist/capture/working-state.d.ts +13 -4
  162. package/dist/capture/working-state.js +50 -56
  163. package/dist/cli/api-context.d.ts +14 -2
  164. package/dist/cli/api-context.js +45 -2
  165. package/dist/cli/audit.js +33 -33
  166. package/dist/cli/auth.js +23 -31
  167. package/dist/cli/briefs.d.ts +1 -1
  168. package/dist/cli/briefs.js +20 -15
  169. package/dist/cli/card.d.ts +1 -1
  170. package/dist/cli/card.js +56 -73
  171. package/dist/cli/client.d.ts +12 -5
  172. package/dist/cli/client.js +53 -23
  173. package/dist/cli/compact-resume-payload.d.ts +4 -1
  174. package/dist/cli/compact-resume-payload.js +12 -5
  175. package/dist/cli/context.js +43 -18
  176. package/dist/cli/continuity.d.ts +5 -5
  177. package/dist/cli/continuity.js +90 -107
  178. package/dist/cli/curate.d.ts +5 -4
  179. package/dist/cli/curate.js +55 -77
  180. package/dist/cli/dag.d.ts +1 -1
  181. package/dist/cli/dag.js +14 -17
  182. package/dist/cli/decisions.js +30 -30
  183. package/dist/cli/eval.js +16 -21
  184. package/dist/cli/exit.d.ts +4 -1
  185. package/dist/cli/exit.js +10 -2
  186. package/dist/cli/explain.js +12 -11
  187. package/dist/cli/flag-values.d.ts +1 -1
  188. package/dist/cli/flag-values.js +9 -18
  189. package/dist/cli/github.d.ts +6 -0
  190. package/dist/cli/github.js +25 -13
  191. package/dist/cli/goals.d.ts +1 -1
  192. package/dist/cli/goals.js +39 -56
  193. package/dist/cli/graph.d.ts +1 -1
  194. package/dist/cli/graph.js +15 -11
  195. package/dist/cli/hook-runtime.d.ts +34 -10
  196. package/dist/cli/hook-runtime.js +41 -16
  197. package/dist/cli/incidents.d.ts +1 -1
  198. package/dist/cli/incidents.js +25 -25
  199. package/dist/cli/init.d.ts +1 -1
  200. package/dist/cli/init.js +35 -20
  201. package/dist/cli/install-steps.d.ts +12 -3
  202. package/dist/cli/install-steps.js +42 -18
  203. package/dist/cli/last-sleep.d.ts +4 -1
  204. package/dist/cli/last-sleep.js +9 -4
  205. package/dist/cli/maintenance.d.ts +1 -1
  206. package/dist/cli/maintenance.js +11 -12
  207. package/dist/cli/notes.d.ts +1 -1
  208. package/dist/cli/notes.js +8 -5
  209. package/dist/cli/object-verbs.d.ts +5 -5
  210. package/dist/cli/object-verbs.js +13 -16
  211. package/dist/cli/open-browser.js +11 -2
  212. package/dist/cli/playbooks.d.ts +3 -3
  213. package/dist/cli/playbooks.js +40 -32
  214. package/dist/cli/predictions.js +17 -22
  215. package/dist/cli/print.js +4 -2
  216. package/dist/cli/projects.js +21 -11
  217. package/dist/cli/quality-repair-once.d.ts +1 -1
  218. package/dist/cli/quality-repair-once.js +7 -6
  219. package/dist/cli/recall.js +129 -93
  220. package/dist/cli/refine-llm.d.ts +15 -4
  221. package/dist/cli/refine-llm.js +17 -7
  222. package/dist/cli/remember.js +51 -55
  223. package/dist/cli/scheduler.d.ts +4 -1
  224. package/dist/cli/scheduler.js +9 -5
  225. package/dist/cli/serve.js +28 -18
  226. package/dist/cli/session-hooks.d.ts +2 -6
  227. package/dist/cli/session-hooks.js +140 -112
  228. package/dist/cli/setup.d.ts +1 -1
  229. package/dist/cli/setup.js +56 -34
  230. package/dist/cli/shared.d.ts +4 -2
  231. package/dist/cli/shared.js +26 -11
  232. package/dist/cli/slack.js +15 -24
  233. package/dist/cli/sleep-render.d.ts +3 -1
  234. package/dist/cli/sleep-render.js +8 -5
  235. package/dist/cli/sleep.js +16 -8
  236. package/dist/cli/status.d.ts +4 -4
  237. package/dist/cli/status.js +32 -27
  238. package/dist/cli/stdin.d.ts +10 -3
  239. package/dist/cli/stdin.js +10 -3
  240. package/dist/cli/transfer.d.ts +4 -4
  241. package/dist/cli/transfer.js +97 -82
  242. package/dist/cli/usage.d.ts +1 -1
  243. package/dist/cli/usage.js +1 -1
  244. package/dist/cli/verb-row.d.ts +2 -0
  245. package/dist/cli/verbs/health.js +2 -0
  246. package/dist/cli/verbs/memory.js +47 -53
  247. package/dist/cli/verbs/objects.js +16 -7
  248. package/dist/cli/verbs/sessions.js +4 -2
  249. package/dist/cli/versioned-verbs.d.ts +8 -7
  250. package/dist/cli/versioned-verbs.js +31 -21
  251. package/dist/cli.js +14 -18
  252. package/dist/connectors/dlq.d.ts +6 -6
  253. package/dist/connectors/dlq.js +12 -7
  254. package/dist/connectors/github/backfill.d.ts +4 -4
  255. package/dist/connectors/github/backfill.js +6 -4
  256. package/dist/connectors/github/deletion.d.ts +6 -4
  257. package/dist/connectors/github/deletion.js +5 -4
  258. package/dist/connectors/github/dlq.d.ts +8 -6
  259. package/dist/connectors/github/dlq.js +11 -5
  260. package/dist/connectors/github/ingest.d.ts +2 -2
  261. package/dist/connectors/github/ingest.js +9 -5
  262. package/dist/connectors/github/octokit-client.d.ts +3 -1
  263. package/dist/connectors/github/octokit-client.js +7 -2
  264. package/dist/connectors/github/ratelimit.d.ts +6 -2
  265. package/dist/connectors/github/ratelimit.js +6 -2
  266. package/dist/connectors/github/signature.d.ts +14 -3
  267. package/dist/connectors/github/signature.js +17 -3
  268. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  269. package/dist/connectors/github/tenant-routing.js +6 -5
  270. package/dist/connectors/github/transform.js +50 -67
  271. package/dist/connectors/github/types.d.ts +10 -3
  272. package/dist/connectors/github/types.js +6 -2
  273. package/dist/connectors/github/webhook.d.ts +5 -5
  274. package/dist/connectors/github/webhook.js +36 -23
  275. package/dist/connectors/ingest.d.ts +5 -3
  276. package/dist/connectors/ingest.js +3 -3
  277. package/dist/connectors/slack/backfill.d.ts +5 -5
  278. package/dist/connectors/slack/backfill.js +3 -3
  279. package/dist/connectors/slack/deletion.d.ts +4 -4
  280. package/dist/connectors/slack/deletion.js +6 -5
  281. package/dist/connectors/slack/dlq.d.ts +4 -4
  282. package/dist/connectors/slack/dlq.js +6 -6
  283. package/dist/connectors/slack/ingest.d.ts +6 -4
  284. package/dist/connectors/slack/ingest.js +5 -4
  285. package/dist/connectors/slack/signature.d.ts +4 -1
  286. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  287. package/dist/connectors/slack/tenant-routing.js +6 -5
  288. package/dist/connectors/slack/transform.d.ts +6 -2
  289. package/dist/connectors/slack/transform.js +6 -2
  290. package/dist/connectors/slack/types.d.ts +3 -1
  291. package/dist/connectors/slack/web-client.js +8 -3
  292. package/dist/connectors/slack/webhook.d.ts +5 -5
  293. package/dist/connectors/slack/webhook.js +19 -11
  294. package/dist/connectors/slack/workspaces.d.ts +7 -3
  295. package/dist/connectors/slack/workspaces.js +7 -3
  296. package/dist/connectors/store.d.ts +8 -0
  297. package/dist/connectors/store.js +2 -0
  298. package/dist/consolidate/conflicts.js +24 -10
  299. package/dist/consolidate/dag-summary.js +2 -1
  300. package/dist/consolidate/dag.d.ts +10 -5
  301. package/dist/consolidate/dag.js +45 -39
  302. package/dist/consolidate/decay.js +19 -6
  303. package/dist/consolidate/dedupe.d.ts +14 -5
  304. package/dist/consolidate/dedupe.js +28 -17
  305. package/dist/consolidate/flush-units.d.ts +4 -1
  306. package/dist/consolidate/flush-units.js +4 -1
  307. package/dist/consolidate/half-life-migration.d.ts +18 -8
  308. package/dist/consolidate/half-life-migration.js +48 -18
  309. package/dist/consolidate/llm-passes.js +27 -11
  310. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  311. package/dist/consolidate/memory-value-weights.js +6 -2
  312. package/dist/consolidate/memory-value.d.ts +30 -10
  313. package/dist/consolidate/memory-value.js +37 -14
  314. package/dist/consolidate/merge.d.ts +4 -1
  315. package/dist/consolidate/merge.js +47 -37
  316. package/dist/consolidate/overlap-index.d.ts +8 -2
  317. package/dist/consolidate/overlap-index.js +11 -4
  318. package/dist/consolidate/physics-pass.d.ts +3 -1
  319. package/dist/consolidate/physics-pass.js +10 -7
  320. package/dist/consolidate/replay.d.ts +11 -4
  321. package/dist/consolidate/replay.js +19 -7
  322. package/dist/consolidate/run.d.ts +13 -5
  323. package/dist/consolidate/run.js +4 -4
  324. package/dist/consolidate/sleep.d.ts +14 -6
  325. package/dist/consolidate/sleep.js +42 -39
  326. package/dist/consolidate/trace.d.ts +7 -2
  327. package/dist/consolidate/trace.js +7 -2
  328. package/dist/consolidate/traces.js +27 -30
  329. package/dist/core/ablation.d.ts +9 -3
  330. package/dist/core/ablation.js +14 -4
  331. package/dist/core/active-scope.d.ts +3 -1
  332. package/dist/core/active-scope.js +3 -1
  333. package/dist/core/agent-memory-tools.d.ts +2 -0
  334. package/dist/core/agent-memory-tools.js +2 -0
  335. package/dist/core/ambient.d.ts +4 -3
  336. package/dist/core/ambient.js +8 -6
  337. package/dist/core/api-errors.d.ts +9 -3
  338. package/dist/core/api-errors.js +9 -3
  339. package/dist/core/capture-contract.d.ts +4 -1
  340. package/dist/core/capture-contract.js +27 -8
  341. package/dist/core/compare.d.ts +24 -8
  342. package/dist/core/compare.js +24 -8
  343. package/dist/core/config.d.ts +18 -9
  344. package/dist/core/config.js +38 -29
  345. package/dist/core/cosine.d.ts +4 -1
  346. package/dist/core/cosine.js +4 -1
  347. package/dist/core/handoff.d.ts +7 -2
  348. package/dist/core/handoff.js +4 -1
  349. package/dist/core/markdown.js +22 -17
  350. package/dist/core/memory-audit.js +14 -3
  351. package/dist/core/memory-quality.d.ts +12 -3
  352. package/dist/core/memory-quality.js +57 -21
  353. package/dist/core/memory.d.ts +87 -30
  354. package/dist/core/memory.js +82 -33
  355. package/dist/core/merged-row.d.ts +8 -2
  356. package/dist/core/merged-row.js +10 -3
  357. package/dist/core/package-root.d.ts +3 -1
  358. package/dist/core/package-root.js +3 -1
  359. package/dist/core/particle-refresh.d.ts +8 -0
  360. package/dist/core/particle-refresh.js +22 -0
  361. package/dist/core/physics-config.d.ts +4 -1
  362. package/dist/core/physics-config.js +6 -2
  363. package/dist/core/physics.d.ts +39 -11
  364. package/dist/core/physics.js +71 -21
  365. package/dist/core/project-identity.d.ts +34 -17
  366. package/dist/core/project-identity.js +35 -18
  367. package/dist/core/project-remote.d.ts +8 -4
  368. package/dist/core/project-remote.js +31 -14
  369. package/dist/core/recall-scope.d.ts +33 -11
  370. package/dist/core/recall-scope.js +42 -15
  371. package/dist/core/rejection-digest.d.ts +7 -0
  372. package/dist/core/rejection-digest.js +13 -0
  373. package/dist/core/salience.d.ts +3 -1
  374. package/dist/core/salience.js +10 -4
  375. package/dist/core/search-types.d.ts +15 -2
  376. package/dist/core/search-types.js +11 -0
  377. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  378. package/dist/dashboard/dashboard-actions.js +18 -7
  379. package/dist/dashboard/dashboard-queries.js +2 -7
  380. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  381. package/dist/dashboard/dashboard-snapshot.js +5 -7
  382. package/dist/dashboard/dashboard.js +22 -8
  383. package/dist/db/backup.js +2 -2
  384. package/dist/db/busy.d.ts +10 -3
  385. package/dist/db/busy.js +27 -5
  386. package/dist/db/connect.d.ts +10 -2
  387. package/dist/db/connect.js +8 -2
  388. package/dist/db/continuity.d.ts +1 -1
  389. package/dist/db/continuity.js +27 -11
  390. package/dist/db/meta.d.ts +4 -1
  391. package/dist/db/meta.js +4 -1
  392. package/dist/db/migrate.d.ts +10 -5
  393. package/dist/db/migrate.js +40 -20
  394. package/dist/db/migrations/index.d.ts +1 -1
  395. package/dist/db/migrations/index.js +3 -1
  396. package/dist/db/migrations/types.d.ts +2 -1
  397. package/dist/db/migrations/v11.js +1 -0
  398. package/dist/db/migrations/v12.js +2 -1
  399. package/dist/db/migrations/v14.js +2 -0
  400. package/dist/db/migrations/v15.js +4 -2
  401. package/dist/db/migrations/v16.js +6 -3
  402. package/dist/db/migrations/v17.js +2 -1
  403. package/dist/db/migrations/v19.js +4 -2
  404. package/dist/db/migrations/v20.js +2 -1
  405. package/dist/db/migrations/v22.js +12 -6
  406. package/dist/db/migrations/v23.js +6 -3
  407. package/dist/db/migrations/v24.js +6 -3
  408. package/dist/db/migrations/v25.js +4 -2
  409. package/dist/db/migrations/v26.js +4 -2
  410. package/dist/db/migrations/v27.js +6 -3
  411. package/dist/db/migrations/v28.js +4 -2
  412. package/dist/db/migrations/v29.js +4 -2
  413. package/dist/db/migrations/v30.js +6 -3
  414. package/dist/db/migrations/v31.js +4 -2
  415. package/dist/db/migrations/v32.js +6 -3
  416. package/dist/db/migrations/v33.js +4 -2
  417. package/dist/db/migrations/v34.js +2 -1
  418. package/dist/db/migrations/v35.js +2 -1
  419. package/dist/db/migrations/v36.js +2 -1
  420. package/dist/db/migrations/v37.js +10 -5
  421. package/dist/db/migrations/v38.js +10 -5
  422. package/dist/db/migrations/v39.js +14 -6
  423. package/dist/db/migrations/v40.js +4 -2
  424. package/dist/db/migrations/v41.js +4 -2
  425. package/dist/db/migrations/v42.js +2 -1
  426. package/dist/db/migrations/v44.js +4 -2
  427. package/dist/db/migrations/v45.js +4 -2
  428. package/dist/db/migrations/v49.js +2 -1
  429. package/dist/db/migrations/v50.js +4 -2
  430. package/dist/db/migrations/v51.js +4 -2
  431. package/dist/db/migrations/v52.js +2 -1
  432. package/dist/db/migrations/v53.js +8 -4
  433. package/dist/db/migrations/v54.js +2 -1
  434. package/dist/db/migrations/v55.js +4 -2
  435. package/dist/db/migrations/v56.d.ts +3 -0
  436. package/dist/db/migrations/v56.js +28 -0
  437. package/dist/db/open.d.ts +24 -12
  438. package/dist/db/open.js +25 -13
  439. package/dist/db/physics-state.d.ts +8 -8
  440. package/dist/db/physics-state.js +17 -50
  441. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  442. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  443. package/dist/db/request-stores.d.ts +20 -5
  444. package/dist/db/request-stores.js +15 -5
  445. package/dist/db/tables.d.ts +2 -1
  446. package/dist/db/tables.js +12 -4
  447. package/dist/db/vector-store.d.ts +13 -4
  448. package/dist/db/vector-store.js +35 -14
  449. package/dist/db/wal-checkpointer.d.ts +2 -1
  450. package/dist/db/wal-checkpointer.js +19 -7
  451. package/dist/doctor.d.ts +7 -1
  452. package/dist/doctor.js +128 -46
  453. package/dist/embeddings/local.d.ts +8 -4
  454. package/dist/embeddings/local.js +11 -7
  455. package/dist/embeddings/provider.d.ts +19 -10
  456. package/dist/embeddings/provider.js +32 -27
  457. package/dist/embeddings/transformers.d.ts +16 -4
  458. package/dist/embeddings/transformers.js +32 -15
  459. package/dist/entry/json-hooks.d.ts +1 -1
  460. package/dist/entry/json-hooks.js +1 -1
  461. package/dist/entry/project-identity.js +2 -1
  462. package/dist/entry/session-text.d.ts +1 -1
  463. package/dist/entry/session-text.js +1 -1
  464. package/dist/entry/sqlite-handles.d.ts +10 -0
  465. package/dist/entry/sqlite-handles.js +9 -0
  466. package/dist/entry/store-kit.d.ts +50 -0
  467. package/dist/entry/store-kit.js +27 -0
  468. package/dist/entry/testing.d.ts +6 -0
  469. package/dist/entry/testing.js +7 -0
  470. package/dist/eval/eval-stats.d.ts +27 -8
  471. package/dist/eval/eval-stats.js +17 -5
  472. package/dist/eval/eval-suite.d.ts +3 -1
  473. package/dist/eval/eval-suite.js +409 -187
  474. package/dist/eval/eval.d.ts +8 -2
  475. package/dist/eval/eval.js +8 -2
  476. package/dist/eval/judgment.js +17 -7
  477. package/dist/graph/delta.d.ts +9 -42
  478. package/dist/graph/delta.js +17 -11
  479. package/dist/graph/extract.d.ts +10 -7
  480. package/dist/graph/extract.js +57 -25
  481. package/dist/graph/recall.d.ts +12 -4
  482. package/dist/graph/recall.js +30 -13
  483. package/dist/graph/stream.d.ts +18 -6
  484. package/dist/graph/stream.js +32 -10
  485. package/dist/graph/view.d.ts +19 -6
  486. package/dist/graph/view.js +42 -17
  487. package/dist/hooks/codex-session.js +2 -2
  488. package/dist/hooks/codex-wrapper.d.ts +3 -1
  489. package/dist/hooks/codex-wrapper.js +9 -4
  490. package/dist/hooks/copilot.d.ts +19 -5
  491. package/dist/hooks/copilot.js +54 -15
  492. package/dist/hooks/hook-blocks.d.ts +4 -1
  493. package/dist/hooks/hook-blocks.js +8 -3
  494. package/dist/hooks/json-hooks.d.ts +9 -5
  495. package/dist/hooks/json-hooks.js +72 -33
  496. package/dist/hooks/opencode.js +15 -5
  497. package/dist/hooks/shared.d.ts +27 -8
  498. package/dist/hooks/shared.js +57 -16
  499. package/dist/importers/core.d.ts +12 -4
  500. package/dist/importers/core.js +11 -10
  501. package/dist/importers/markdown-parse.d.ts +15 -5
  502. package/dist/importers/markdown-parse.js +16 -7
  503. package/dist/importers/markdown.js +6 -9
  504. package/dist/importers/sources.js +10 -23
  505. package/dist/importers/vault.d.ts +3 -3
  506. package/dist/importers/vault.js +61 -45
  507. package/dist/index.d.ts +33 -7
  508. package/dist/index.js +26 -8
  509. package/dist/learn/autolearn.d.ts +21 -6
  510. package/dist/learn/autolearn.js +57 -26
  511. package/dist/learn/churn-git.d.ts +4 -1
  512. package/dist/learn/churn-git.js +29 -5
  513. package/dist/learn/extract.d.ts +4 -1
  514. package/dist/learn/extract.js +17 -10
  515. package/dist/learn/forward-claim-detector.d.ts +17 -5
  516. package/dist/learn/forward-claim-detector.js +34 -15
  517. package/dist/learn/invalidation.d.ts +12 -6
  518. package/dist/learn/invalidation.js +62 -28
  519. package/dist/learn/roots.d.ts +3 -0
  520. package/dist/learn/roots.js +5 -0
  521. package/dist/mcp/admin-tools.d.ts +5 -5
  522. package/dist/mcp/admin-tools.js +28 -23
  523. package/dist/mcp/format.d.ts +1 -1
  524. package/dist/mcp/format.js +4 -2
  525. package/dist/mcp/framing.d.ts +3 -1
  526. package/dist/mcp/framing.js +20 -8
  527. package/dist/mcp/memory-tools.d.ts +3 -3
  528. package/dist/mcp/memory-tools.js +21 -20
  529. package/dist/mcp/protocol.d.ts +32 -16
  530. package/dist/mcp/protocol.js +12 -9
  531. package/dist/mcp/recall-tools.d.ts +3 -3
  532. package/dist/mcp/recall-tools.js +62 -74
  533. package/dist/mcp/request.d.ts +7 -5
  534. package/dist/mcp/request.js +61 -77
  535. package/dist/mcp/server.d.ts +3 -1
  536. package/dist/mcp/server.js +8 -3
  537. package/dist/mcp/session-state.d.ts +1 -1
  538. package/dist/mcp/session-state.js +4 -3
  539. package/dist/mcp/shared-gate.d.ts +3 -2
  540. package/dist/mcp/shared-gate.js +3 -2
  541. package/dist/mcp/stdio.d.ts +6 -3
  542. package/dist/mcp/stdio.js +59 -23
  543. package/dist/mcp/tool-args.d.ts +4 -1
  544. package/dist/mcp/tool-args.js +8 -3
  545. package/dist/mcp/tools.js +76 -32
  546. package/dist/objects/customer-notes.d.ts +12 -10
  547. package/dist/objects/customer-notes.js +21 -15
  548. package/dist/objects/decisions.d.ts +18 -10
  549. package/dist/objects/decisions.js +23 -17
  550. package/dist/objects/descriptor.js +2 -1
  551. package/dist/objects/fields.d.ts +4 -1
  552. package/dist/objects/fields.js +6 -2
  553. package/dist/objects/incidents.d.ts +14 -16
  554. package/dist/objects/incidents.js +29 -30
  555. package/dist/objects/lifecycle.d.ts +0 -4
  556. package/dist/objects/lifecycle.js +21 -24
  557. package/dist/objects/policies.d.ts +12 -16
  558. package/dist/objects/policies.js +17 -21
  559. package/dist/objects/processes.d.ts +16 -10
  560. package/dist/objects/processes.js +20 -15
  561. package/dist/objects/project-briefs.d.ts +13 -14
  562. package/dist/objects/project-briefs.js +33 -39
  563. package/dist/objects/skills.d.ts +10 -12
  564. package/dist/objects/skills.js +17 -22
  565. package/dist/postinstall.js +15 -7
  566. package/dist/predictions/planning-fallacy.d.ts +19 -6
  567. package/dist/predictions/planning-fallacy.js +4 -2
  568. package/dist/rerankers/clef.d.ts +8 -2
  569. package/dist/rerankers/clef.js +14 -9
  570. package/dist/rerankers/cross-encoder.d.ts +2 -1
  571. package/dist/rerankers/cross-encoder.js +19 -9
  572. package/dist/rerankers/index.js +2 -1
  573. package/dist/rerankers/jev.js +2 -1
  574. package/dist/rerankers/llm.d.ts +6 -2
  575. package/dist/rerankers/llm.js +8 -3
  576. package/dist/rerankers/remote.d.ts +3 -1
  577. package/dist/rerankers/remote.js +5 -2
  578. package/dist/rerankers/types.d.ts +6 -2
  579. package/dist/search/bm25-search.d.ts +3 -1
  580. package/dist/search/bm25-search.js +15 -2
  581. package/dist/search/boosts.js +4 -3
  582. package/dist/search/embed-memories.d.ts +12 -4
  583. package/dist/search/embed-memories.js +96 -58
  584. package/dist/search/engine.d.ts +11 -0
  585. package/dist/search/engine.js +14 -0
  586. package/dist/search/goal-boost.d.ts +10 -3
  587. package/dist/search/goal-boost.js +13 -6
  588. package/dist/search/hybrid-score.d.ts +4 -1
  589. package/dist/search/hybrid-score.js +4 -1
  590. package/dist/search/hybrid.d.ts +23 -8
  591. package/dist/search/hybrid.js +12 -7
  592. package/dist/search/multihop.js +14 -13
  593. package/dist/search/path-context.d.ts +10 -3
  594. package/dist/search/path-context.js +10 -3
  595. package/dist/search/physics-search.d.ts +9 -4
  596. package/dist/search/physics-search.js +38 -14
  597. package/dist/search/rerank.d.ts +2 -1
  598. package/dist/search/rerank.js +2 -1
  599. package/dist/search/rrf.d.ts +14 -5
  600. package/dist/search/rrf.js +11 -4
  601. package/dist/search/vector.d.ts +8 -2
  602. package/dist/search/vector.js +14 -8
  603. package/dist/server/auth.d.ts +19 -15
  604. package/dist/server/auth.js +68 -38
  605. package/dist/server/boot.d.ts +4 -1
  606. package/dist/server/boot.js +115 -67
  607. package/dist/server/client-ip.d.ts +17 -5
  608. package/dist/server/client-ip.js +56 -21
  609. package/dist/server/cursor.d.ts +10 -3
  610. package/dist/server/cursor.js +10 -3
  611. package/dist/server/deadline.d.ts +5 -2
  612. package/dist/server/deadline.js +10 -3
  613. package/dist/server/key-check-bounds.js +12 -4
  614. package/dist/server/lifecycle.d.ts +4 -1
  615. package/dist/server/lifecycle.js +10 -4
  616. package/dist/server/mcp-http.d.ts +2 -1
  617. package/dist/server/mcp-http.js +37 -22
  618. package/dist/server/rate-limit.d.ts +17 -5
  619. package/dist/server/rate-limit.js +55 -26
  620. package/dist/server/ready.js +7 -4
  621. package/dist/server/request.d.ts +15 -4
  622. package/dist/server/request.js +42 -15
  623. package/dist/server/route-checks.d.ts +4 -1
  624. package/dist/server/route-checks.js +8 -3
  625. package/dist/server/route-table.d.ts +8 -6
  626. package/dist/server/route-table.js +550 -97
  627. package/dist/server/routes/admin.d.ts +7 -7
  628. package/dist/server/routes/admin.js +36 -15
  629. package/dist/server/routes/customer-notes.d.ts +5 -5
  630. package/dist/server/routes/customer-notes.js +5 -4
  631. package/dist/server/routes/decisions.d.ts +5 -5
  632. package/dist/server/routes/decisions.js +12 -6
  633. package/dist/server/routes/incidents.d.ts +5 -5
  634. package/dist/server/routes/incidents.js +10 -4
  635. package/dist/server/routes/memories.d.ts +8 -8
  636. package/dist/server/routes/memories.js +12 -17
  637. package/dist/server/routes/object-routes.d.ts +8 -5
  638. package/dist/server/routes/object-routes.js +4 -2
  639. package/dist/server/routes/policies.d.ts +6 -6
  640. package/dist/server/routes/policies.js +11 -4
  641. package/dist/server/routes/predictions.d.ts +5 -5
  642. package/dist/server/routes/predictions.js +9 -4
  643. package/dist/server/routes/processes.d.ts +5 -5
  644. package/dist/server/routes/processes.js +15 -6
  645. package/dist/server/routes/project-briefs.d.ts +6 -6
  646. package/dist/server/routes/project-briefs.js +3 -2
  647. package/dist/server/routes/recall.d.ts +3 -3
  648. package/dist/server/routes/recall.js +21 -10
  649. package/dist/server/routes/skills.d.ts +6 -6
  650. package/dist/server/routes/skills.js +12 -4
  651. package/dist/server/server-detect.d.ts +24 -8
  652. package/dist/server/server-detect.js +57 -22
  653. package/dist/server/sleep-child.js +16 -10
  654. package/dist/server/sleep-offload.d.ts +8 -5
  655. package/dist/server/sleep-offload.js +40 -18
  656. package/dist/server/tls.d.ts +10 -2
  657. package/dist/server/tls.js +25 -5
  658. package/dist/server/types.d.ts +41 -24
  659. package/dist/server/validation.d.ts +4 -1
  660. package/dist/server/validation.js +22 -9
  661. package/dist/server.d.ts +17 -49
  662. package/dist/server.js +33 -40
  663. package/dist/sharing/global-store.d.ts +6 -12
  664. package/dist/sharing/global-store.js +8 -48
  665. package/dist/sharing/global-sync.d.ts +3 -1
  666. package/dist/sharing/global-sync.js +17 -7
  667. package/dist/sharing/project-merge.d.ts +25 -7
  668. package/dist/sharing/project-merge.js +49 -17
  669. package/dist/sharing/search-both.d.ts +8 -4
  670. package/dist/sharing/search-both.js +28 -14
  671. package/dist/sharing/share.d.ts +8 -4
  672. package/dist/sharing/share.js +40 -18
  673. package/dist/store/ambient.js +10 -5
  674. package/dist/store/audit-event.d.ts +2 -2
  675. package/dist/store/audit-event.js +8 -3
  676. package/dist/store/audit.d.ts +6 -3
  677. package/dist/store/audit.js +16 -6
  678. package/dist/store/auth.d.ts +4 -2
  679. package/dist/store/auth.js +63 -20
  680. package/dist/store/busy.d.ts +9 -0
  681. package/dist/store/busy.js +16 -0
  682. package/dist/store/candidates.d.ts +12 -5
  683. package/dist/store/candidates.js +90 -41
  684. package/dist/store/capture-write.d.ts +2 -1
  685. package/dist/store/capture-write.js +2 -1
  686. package/dist/store/card-detail.d.ts +4 -4
  687. package/dist/store/card-detail.js +15 -8
  688. package/dist/store/cards.d.ts +24 -10
  689. package/dist/store/cards.js +97 -63
  690. package/dist/store/compaction-caller.d.ts +2 -1
  691. package/dist/store/compaction-caller.js +2 -1
  692. package/dist/store/compactions-record.d.ts +14 -8
  693. package/dist/store/compactions-record.js +101 -37
  694. package/dist/store/compactions.js +35 -15
  695. package/dist/store/conflicts.d.ts +16 -5
  696. package/dist/store/conflicts.js +104 -48
  697. package/dist/store/connectors/dlq.d.ts +17 -5
  698. package/dist/store/connectors/dlq.js +58 -6
  699. package/dist/store/connectors/event-log.d.ts +122 -0
  700. package/dist/store/connectors/event-log.js +25 -0
  701. package/dist/store/connectors/github.d.ts +6 -3
  702. package/dist/store/connectors/github.js +30 -48
  703. package/dist/store/connectors/slack.d.ts +2 -1
  704. package/dist/store/connectors/slack.js +31 -47
  705. package/dist/store/dashboard-reads.d.ts +7 -3
  706. package/dist/store/dashboard-reads.js +32 -10
  707. package/dist/store/delete-and-batch.d.ts +17 -11
  708. package/dist/store/delete-and-batch.js +70 -28
  709. package/dist/store/delivery-recorder.d.ts +10 -7
  710. package/dist/store/delivery-recorder.js +70 -37
  711. package/dist/store/descendant-page.d.ts +2 -1
  712. package/dist/store/descendant-page.js +26 -10
  713. package/dist/store/diagnostics.d.ts +2 -1
  714. package/dist/store/diagnostics.js +2 -1
  715. package/dist/store/doctor-reads.d.ts +2 -1
  716. package/dist/store/doctor-reads.js +13 -5
  717. package/dist/store/dormant.d.ts +19 -11
  718. package/dist/store/dormant.js +45 -19
  719. package/dist/store/embeddings/index.d.ts +13 -9
  720. package/dist/store/embeddings/index.js +19 -12
  721. package/dist/store/entry-reads.d.ts +72 -21
  722. package/dist/store/entry-reads.js +215 -69
  723. package/dist/store/entry-row.d.ts +10 -6
  724. package/dist/store/entry-row.js +26 -14
  725. package/dist/store/entry-writes.d.ts +28 -13
  726. package/dist/store/entry-writes.js +61 -22
  727. package/dist/store/failure-log-at.js +1 -1
  728. package/dist/store/failure-log.d.ts +4 -2
  729. package/dist/store/failure-log.js +13 -6
  730. package/dist/store/gated-write.d.ts +3 -3
  731. package/dist/store/gated-write.js +3 -3
  732. package/dist/store/goals.d.ts +5 -4
  733. package/dist/store/goals.js +11 -12
  734. package/dist/store/graph-apply.d.ts +21 -0
  735. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  736. package/dist/store/graph-queue.d.ts +9 -6
  737. package/dist/store/graph-queue.js +15 -10
  738. package/dist/store/graph-reads.d.ts +16 -11
  739. package/dist/store/graph-reads.js +29 -19
  740. package/dist/store/graph-rows.d.ts +41 -3
  741. package/dist/store/graph-rows.js +10 -7
  742. package/dist/store/graph-view-rows.js +15 -7
  743. package/dist/store/graph-writes.d.ts +16 -10
  744. package/dist/store/graph-writes.js +59 -36
  745. package/dist/store/half-life.js +2 -2
  746. package/dist/store/handoffs.d.ts +13 -7
  747. package/dist/store/handoffs.js +44 -22
  748. package/dist/store/index-and-stats.d.ts +2 -2
  749. package/dist/store/index-and-stats.js +6 -5
  750. package/dist/store/index.d.ts +4 -2
  751. package/dist/store/index.js +2 -1
  752. package/dist/store/key-audit.d.ts +2 -1
  753. package/dist/store/key-audit.js +2 -1
  754. package/dist/store/key-writes.d.ts +2 -1
  755. package/dist/store/key-writes.js +9 -2
  756. package/dist/store/ledger-turn.d.ts +4 -1
  757. package/dist/store/ledger-turn.js +7 -2
  758. package/dist/store/mirrors.d.ts +11 -4
  759. package/dist/store/mirrors.js +96 -19
  760. package/dist/store/narrow.d.ts +6 -0
  761. package/dist/store/narrow.js +11 -0
  762. package/dist/store/open.d.ts +6 -3
  763. package/dist/store/open.js +20 -10
  764. package/dist/store/pilot-arm.d.ts +2 -1
  765. package/dist/store/pilot-arm.js +18 -6
  766. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  767. package/dist/store/planning-fallacy-evidence.js +8 -5
  768. package/dist/store/port/agent-import.d.ts +62 -0
  769. package/dist/store/port/agent-import.js +2 -0
  770. package/dist/store/port/consolidation.d.ts +129 -0
  771. package/dist/store/port/consolidation.js +2 -0
  772. package/dist/store/port/learning.d.ts +19 -0
  773. package/dist/store/port/learning.js +2 -0
  774. package/dist/store/port/local-files.d.ts +18 -0
  775. package/dist/store/port/local-files.js +2 -0
  776. package/dist/store/port/promotion.d.ts +20 -0
  777. package/dist/store/port/promotion.js +3 -0
  778. package/dist/store/port-groups.d.ts +160 -0
  779. package/dist/store/port-groups.js +2 -0
  780. package/dist/store/port.d.ts +261 -219
  781. package/dist/store/port.js +3 -9
  782. package/dist/store/predictions.d.ts +14 -10
  783. package/dist/store/predictions.js +37 -17
  784. package/dist/store/project-tags.d.ts +4 -1
  785. package/dist/store/project-tags.js +16 -5
  786. package/dist/store/quality-repair.d.ts +8 -4
  787. package/dist/store/quality-repair.js +53 -20
  788. package/dist/store/quarantine.d.ts +1 -0
  789. package/dist/store/quarantine.js +23 -9
  790. package/dist/store/raw-archive.d.ts +5 -4
  791. package/dist/store/raw-archive.js +11 -10
  792. package/dist/store/recall-trace.d.ts +22 -17
  793. package/dist/store/recall-trace.js +128 -64
  794. package/dist/store/rejected-values.d.ts +15 -10
  795. package/dist/store/rejected-values.js +46 -20
  796. package/dist/store/rejection.d.ts +12 -11
  797. package/dist/store/rejection.js +18 -19
  798. package/dist/store/report-reads.d.ts +2 -1
  799. package/dist/store/report-reads.js +2 -1
  800. package/dist/store/rows.d.ts +7 -5
  801. package/dist/store/rows.js +20 -13
  802. package/dist/store/rule-sql.d.ts +7 -3
  803. package/dist/store/rule-sql.js +26 -13
  804. package/dist/store/search-rows.d.ts +16 -11
  805. package/dist/store/search-rows.js +54 -32
  806. package/dist/store/sessions.d.ts +12 -10
  807. package/dist/store/sessions.js +40 -21
  808. package/dist/store/set-aside.d.ts +2 -2
  809. package/dist/store/set-aside.js +18 -5
  810. package/dist/store/sqlite/agent-import.d.ts +3 -0
  811. package/dist/store/sqlite/agent-import.js +77 -0
  812. package/dist/store/sqlite/cards-group.d.ts +6 -0
  813. package/dist/store/sqlite/cards-group.js +37 -0
  814. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  815. package/dist/store/sqlite/conflicts-group.js +18 -0
  816. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  817. package/dist/store/sqlite/connector-events-group.js +17 -6
  818. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  819. package/dist/store/sqlite/connector-writes-group.js +12 -5
  820. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  821. package/dist/store/sqlite/consolidation-group.js +64 -0
  822. package/dist/store/sqlite/dag-reads-group.js +1 -1
  823. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  824. package/dist/store/sqlite/dormant-group.js +29 -0
  825. package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
  826. package/dist/store/sqlite/entry-writes-group.js +37 -14
  827. package/dist/store/sqlite/error-codec.d.ts +4 -2
  828. package/dist/store/sqlite/error-codec.js +32 -10
  829. package/dist/store/sqlite/executor-counts.js +2 -1
  830. package/dist/store/sqlite/executor.d.ts +8 -3
  831. package/dist/store/sqlite/executor.js +56 -18
  832. package/dist/store/sqlite/global-promote.d.ts +5 -0
  833. package/dist/store/sqlite/global-promote.js +48 -0
  834. package/dist/store/sqlite/goals-group.d.ts +6 -0
  835. package/dist/store/sqlite/goals-group.js +23 -0
  836. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  837. package/dist/store/sqlite/graph-reads-group.js +2 -1
  838. package/dist/store/sqlite/held-connection.d.ts +8 -0
  839. package/dist/store/sqlite/held-connection.js +34 -7
  840. package/dist/store/sqlite/last-recall-group.d.ts +15 -0
  841. package/dist/store/sqlite/last-recall-group.js +62 -0
  842. package/dist/store/sqlite/learning-group.d.ts +4 -0
  843. package/dist/store/sqlite/learning-group.js +17 -0
  844. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  845. package/dist/store/sqlite/maintenance-groups.js +61 -0
  846. package/dist/store/sqlite/object-rows.d.ts +6 -3
  847. package/dist/store/sqlite/object-rows.js +34 -5
  848. package/dist/store/sqlite/objects-group.d.ts +5 -4
  849. package/dist/store/sqlite/objects-group.js +97 -38
  850. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  851. package/dist/store/sqlite/predictions-group.js +4 -2
  852. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  853. package/dist/store/sqlite/promotion-group.js +10 -0
  854. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  855. package/dist/store/sqlite/quarantine-group.js +4 -2
  856. package/dist/store/sqlite/reports-group.d.ts +6 -0
  857. package/dist/store/sqlite/reports-group.js +33 -0
  858. package/dist/store/sqlite/request-scope.d.ts +6 -0
  859. package/dist/store/sqlite/request-scope.js +18 -0
  860. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  861. package/dist/store/sqlite/sessions-group.js +46 -0
  862. package/dist/store/sqlite/store.d.ts +22 -18
  863. package/dist/store/sqlite/store.js +95 -33
  864. package/dist/store/sqlite/vector-pack.js +2 -1
  865. package/dist/store/sqlite/vector-reads-group.js +2 -1
  866. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  867. package/dist/store/sqlite/worker-jobs.js +19 -7
  868. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  869. package/dist/store/sqlite/worker-ops.js +6 -3
  870. package/dist/store/sqlite/worker-store.d.ts +4 -3
  871. package/dist/store/sqlite/worker-store.js +24 -14
  872. package/dist/store/summaries.d.ts +25 -11
  873. package/dist/store/summaries.js +84 -27
  874. package/dist/store/summary-dirty.d.ts +2 -1
  875. package/dist/store/summary-dirty.js +2 -1
  876. package/dist/store/tenant.d.ts +3 -2
  877. package/dist/store/tenant.js +5 -4
  878. package/dist/store/token-ledger-rows.js +8 -4
  879. package/dist/store/token-ledger.d.ts +19 -13
  880. package/dist/store/token-ledger.js +27 -14
  881. package/dist/store/tombstone-checks.d.ts +4 -1
  882. package/dist/store/tombstone-checks.js +10 -1
  883. package/dist/store/usage-reports.js +2 -1
  884. package/dist/store/vector-index.d.ts +8 -5
  885. package/dist/store/vector-index.js +28 -11
  886. package/dist/store/working-memory.d.ts +6 -4
  887. package/dist/store/working-memory.js +14 -9
  888. package/dist/support-bundle.js +10 -5
  889. package/dist/trust/quarantine.d.ts +1 -2
  890. package/dist/trust/quarantine.js +1 -5
  891. package/dist/trust/reject-flow.d.ts +12 -3
  892. package/dist/trust/reject-flow.js +12 -4
  893. package/dist/util/anthropic-messages.d.ts +7 -2
  894. package/dist/util/anthropic-messages.js +18 -7
  895. package/dist/util/atomic-write.d.ts +8 -3
  896. package/dist/util/atomic-write.js +36 -21
  897. package/dist/util/compaction-items.d.ts +4 -1
  898. package/dist/util/compaction-items.js +8 -2
  899. package/dist/util/crash-handlers.d.ts +7 -2
  900. package/dist/util/crash-handlers.js +13 -4
  901. package/dist/util/env.d.ts +26 -5
  902. package/dist/util/env.js +87 -25
  903. package/dist/util/format.d.ts +2 -0
  904. package/dist/util/format.js +4 -0
  905. package/dist/util/home-path.js +12 -6
  906. package/dist/util/hook-payload.d.ts +3 -1
  907. package/dist/util/hook-payload.js +3 -1
  908. package/dist/util/http-retry.d.ts +12 -6
  909. package/dist/util/http-retry.js +16 -6
  910. package/dist/util/http-util.d.ts +20 -5
  911. package/dist/util/http-util.js +28 -9
  912. package/dist/util/json.d.ts +4 -1
  913. package/dist/util/json.js +4 -1
  914. package/dist/util/keyset.js +2 -1
  915. package/dist/util/limits.js +4 -2
  916. package/dist/util/log.d.ts +13 -5
  917. package/dist/util/log.js +29 -6
  918. package/dist/util/net.d.ts +5 -0
  919. package/dist/util/net.js +19 -0
  920. package/dist/util/real-path.d.ts +2 -1
  921. package/dist/util/real-path.js +4 -3
  922. package/dist/util/request-scope.d.ts +16 -4
  923. package/dist/util/request-scope.js +19 -6
  924. package/dist/util/same-text.d.ts +10 -3
  925. package/dist/util/same-text.js +10 -3
  926. package/dist/util/secret-detect.d.ts +24 -7
  927. package/dist/util/secret-detect.js +49 -14
  928. package/dist/util/spawn-argv.d.ts +11 -0
  929. package/dist/util/spawn-argv.js +66 -0
  930. package/dist/util/sql.d.ts +3 -0
  931. package/dist/util/sql.js +6 -0
  932. package/dist/util/sqlite-blocked.d.ts +15 -4
  933. package/dist/util/sqlite-blocked.js +19 -6
  934. package/dist/util/stored-json.d.ts +4 -1
  935. package/dist/util/stored-json.js +6 -2
  936. package/dist/util/stream-tee.d.ts +2 -1
  937. package/dist/util/stream-tee.js +8 -5
  938. package/dist/util/transcript-tail.d.ts +4 -1
  939. package/dist/util/transcript-tail.js +4 -1
  940. package/dist/util/vector-codec.d.ts +4 -0
  941. package/dist/util/vector-codec.js +15 -0
  942. package/dist/util/version.d.ts +8 -3
  943. package/dist/util/version.js +8 -3
  944. package/dist/util/write-budget.d.ts +7 -2
  945. package/dist/util/write-budget.js +5 -2
  946. package/dist/util/yaml.d.ts +4 -1
  947. package/dist/util/yaml.js +4 -1
  948. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  949. package/extensions/openclaw-plugin/package.json +1 -1
  950. package/openclaw.plugin.json +1 -1
  951. package/package.json +4 -1
  952. package/scripts/postinstall.cjs +3 -1
  953. package/dist/api/audit.js +0 -56
  954. package/dist/api/cards.d.ts +0 -42
  955. package/dist/api/conflicts.d.ts +0 -28
  956. package/dist/api/conflicts.js +0 -61
  957. package/dist/api/dormant.d.ts +0 -14
  958. package/dist/api/dormant.js +0 -58
  959. package/dist/api/goals.d.ts +0 -18
  960. package/dist/api/graph.d.ts +0 -8
  961. package/dist/api/graph.js +0 -7
  962. package/dist/api/learn.js +0 -124
  963. package/dist/api/memories.d.ts +0 -23
  964. package/dist/api/memories.js +0 -46
  965. package/dist/api/objects.d.ts +0 -9
  966. package/dist/api/on-store.d.ts +0 -16
  967. package/dist/api/on-store.js +0 -38
  968. package/dist/api/outcome.d.ts +0 -19
  969. package/dist/api/outcome.js +0 -21
  970. package/dist/api/predictions.d.ts +0 -11
  971. package/dist/api/promote.d.ts +0 -36
  972. package/dist/api/promote.js +0 -65
  973. package/dist/api/recall-core.d.ts +0 -4
  974. package/dist/api/recall-core.js +0 -120
  975. package/dist/api/recall-finish.d.ts +0 -53
  976. package/dist/api/recall-finish.js +0 -30
  977. package/dist/api/recall-history.d.ts +0 -64
  978. package/dist/api/recall-history.js +0 -159
  979. package/dist/api/recall-record.d.ts +0 -43
  980. package/dist/api/recall-record.js +0 -78
  981. package/dist/api/recall-request.js +0 -121
  982. package/dist/api/recall.d.ts +0 -6
  983. package/dist/api/refine.d.ts +0 -7
  984. package/dist/api/refine.js +0 -10
  985. package/dist/api/session-owners.d.ts +0 -4
  986. package/dist/api/session-owners.js +0 -17
  987. package/dist/api/sleep-run.d.ts +0 -26
  988. package/dist/api/sleep.js +0 -10
  989. package/dist/cli/lenient-id.d.ts +0 -2
  990. package/dist/cli/lenient-id.js +0 -13
  991. package/dist/graph/write.d.ts +0 -14
  992. package/dist/store/sqlite/busy.d.ts +0 -3
  993. package/dist/store/sqlite/busy.js +0 -8
  994. package/dist/store/sqlite/local.d.ts +0 -21
  995. package/dist/store/sqlite/local.js +0 -39
@@ -2,29 +2,42 @@ import { type MemoryEntry } from '../core/memory.js';
2
2
  import { type DatabaseSyncLike } from '../db/index.js';
3
3
  export interface WriteEntryOptions {
4
4
  actor?: string;
5
- afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
6
5
  /** Runs after the row commits and before the mirrors, on an idle connection; keep it best-effort. */
7
6
  afterCommit?: () => void;
8
7
  }
9
- /** Write an entry to SQLite and refresh mirrors; `opts.afterWrite` runs in the same SAVEPOINT as the INSERT, so a throw rolls the row back.
10
- * `opts.actor` defaults to 'cli'; the api layer passes the resolved actor so the audit log gets one row per write. */
8
+ /** Store-side only, never exported from a package entry: `afterWrite` hands the write's own db handle to the hook. */
9
+ export interface WriteEntryInternalOptions extends WriteEntryOptions {
10
+ /** Runs in the same SAVEPOINT as the INSERT, so a throw rolls the row back. */
11
+ afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
12
+ }
13
+ /** Write an entry to SQLite and refresh mirrors. `opts.actor` defaults to 'cli'; the api layer passes the resolved
14
+ * actor, so the audit log gets one row per write. */
11
15
  export declare function writeEntry(hippoRoot: string, entry: MemoryEntry, opts?: WriteEntryOptions): void;
16
+ /** Writes a promoted copy; with `auditAs` the `promote` audit row joins the INSERT's SAVEPOINT, so both or neither. */
17
+ export declare function writePromotedEntry(hippoRoot: string, entry: MemoryEntry, opts: {
18
+ readonly actor?: string;
19
+ readonly sourceId: string;
20
+ readonly auditAs?: {
21
+ tenantId: string;
22
+ actor: string;
23
+ };
24
+ }): void;
12
25
  /** writeEntry for each of `entries` in one transaction, so all land or none; each
13
26
  * keeps its audit row, and mirrors follow the commit. Returns how many were written; an empty list opens no store. */
14
27
  export declare function writeEntriesTogether(hippoRoot: string, entries: readonly MemoryEntry[]): number;
15
28
  /** Runs `fill` in one transaction; each `put` writes one entry and returns false when the store rejects its value,
16
- * leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were written. */
29
+ * leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were
30
+ * written. */
17
31
  export declare function writeEntriesSkippingRejected(hippoRoot: string, fill: (put: (entry: MemoryEntry) => boolean) => void, actor?: string): number;
18
32
  /** Adds `tag` to each of a tenant's rows that lacks it, in `ids` order, each read fresh
19
33
  * on one open store and committed alone; an id the tenant does not hold is skipped. */
20
34
  export declare function addTagToEntries(hippoRoot: string, tenantId: string, ids: readonly string[], tag: string): void;
21
- /** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must call `writeEntryMirrors` after any
22
- * outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row commits atomically with the INSERT. */
23
- export declare function writeEntryDbOnly(db: DatabaseSyncLike, entry: MemoryEntry, opts?: {
24
- actor?: string;
25
- afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
26
- }): void;
27
- /** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the summary parent's dirty mark. */
35
+ /** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must
36
+ * call `writeEntryMirrors` after any outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row
37
+ * commits atomically with the INSERT. */
38
+ export declare function writeEntryDbOnly(db: DatabaseSyncLike, entry: MemoryEntry, opts?: Pick<WriteEntryInternalOptions, 'actor' | 'afterWrite'>): void;
39
+ /** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the
40
+ * summary parent's dirty mark. */
28
41
  export declare function auditEntryWrite(db: DatabaseSyncLike, entry: MemoryEntry, actor: string): void;
29
42
  /** Markdown mirror path, invoked AFTER commit (a rolled-back tx must leave no orphan markdown). */
30
43
  export declare function writeEntryMirrors(hippoRoot: string, entry: MemoryEntry): void;
@@ -36,13 +49,15 @@ export interface StrengthenOptions {
36
49
  /** Strengthen what a read returned: update only the four retrieval columns on the live row, never a stale copy.
37
50
  * Best effort: a failure logs and never fails the read. Returns the ids found in this store. */
38
51
  export declare function strengthenRetrieved(hippoRoot: string, ids: readonly string[], opts: StrengthenOptions): Set<string>;
39
- /** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a recall's last writes share one handle. */
52
+ /** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a
53
+ * recall's last writes share one handle. */
40
54
  export declare function strengthenRetrievedInOwnTx(db: DatabaseSyncLike, ids: readonly string[], opts: StrengthenOptions): Set<string>;
41
55
  /** strengthenRetrieved on the caller's handle, inside the caller's transaction. Throws; the caller decides. */
42
56
  export declare function strengthenRetrievedOn(db: DatabaseSyncLike, ids: readonly string[], opts: StrengthenOptions): Set<string>;
43
57
  /** Rewrites a live row's tags and its full-text row on the caller's transaction, with no audit row. */
44
58
  export declare function setEntryTagsInTx(db: DatabaseSyncLike, entry: MemoryEntry): void;
45
- /** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and marks its summary parent dirty. */
59
+ /** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and
60
+ * marks its summary parent dirty. */
46
61
  export declare function deleteEntryRowInTx(db: DatabaseSyncLike, entry: MemoryEntry, actor: string): void;
47
62
  /** One half-life per memory id, on the caller's transaction. */
48
63
  export declare function setHalfLivesAt(db: DatabaseSyncLike, rows: readonly {
@@ -2,21 +2,43 @@ import { strengthAblation } from '../core/ablation.js';
2
2
  import { markRetrieved } from '../core/memory.js';
3
3
  import { closeHippoDb, openHippoDb, withWriteScope } from '../db/index.js';
4
4
  import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
5
+ import { chunked } from '../util/chunked.js';
5
6
  import { RejectedValueError } from '../core/api-errors.js';
6
7
  import { markSummaryDirtyInTx } from './summary-dirty.js';
7
8
  import { errorMessage, log } from '../util/log.js';
8
9
  import { auditRejectionRefusal, audit } from './audit-event.js';
10
+ import { appendAuditEvent } from './audit.js';
9
11
  import { selectEntriesByIds } from './entry-reads.js';
10
12
  import { stampOriginProject, upsertEntryRow, syncFtsRow, deleteFtsRow } from './entry-row.js';
11
13
  import { mirrorBestEffort, writeMarkdownMirror } from './mirrors.js';
12
14
  import { onHandle, openStore } from './open.js';
13
- /** Write an entry to SQLite and refresh mirrors; `opts.afterWrite` runs in the same SAVEPOINT as the INSERT, so a throw rolls the row back.
14
- * `opts.actor` defaults to 'cli'; the api layer passes the resolved actor so the audit log gets one row per write. */
15
+ /** Write an entry to SQLite and refresh mirrors. `opts.actor` defaults to 'cli'; the api layer passes the resolved
16
+ * actor, so the audit log gets one row per write. */
15
17
  export function writeEntry(hippoRoot, entry, opts) {
18
+ writeEntryWithHook(hippoRoot, entry, opts);
19
+ }
20
+ /** writeEntry for store code that needs the write's own handle: `opts.afterWrite` shares the INSERT's SAVEPOINT. */
21
+ function writeEntryWithHook(hippoRoot, entry, opts) {
16
22
  onHandle(hippoRoot, (db) => {
17
23
  writeEntryOn(db, hippoRoot, entry, opts);
18
24
  }, openStore);
19
25
  }
26
+ /** Writes a promoted copy; with `auditAs` the `promote` audit row joins the INSERT's SAVEPOINT, so both or neither. */
27
+ export function writePromotedEntry(hippoRoot, entry, opts) {
28
+ const { auditAs, sourceId } = opts;
29
+ writeEntryWithHook(hippoRoot, entry, {
30
+ actor: opts.actor,
31
+ afterWrite: auditAs && ((db, globalId) => {
32
+ appendAuditEvent(db, {
33
+ tenantId: auditAs.tenantId,
34
+ actor: auditAs.actor,
35
+ op: 'promote',
36
+ targetId: globalId,
37
+ metadata: { sourceId },
38
+ });
39
+ }),
40
+ });
41
+ }
20
42
  /** writeEntry for each of `entries` in one transaction, so all land or none; each
21
43
  * keeps its audit row, and mirrors follow the commit. Returns how many were written; an empty list opens no store. */
22
44
  export function writeEntriesTogether(hippoRoot, entries) {
@@ -44,7 +66,8 @@ export function writeEntriesTogether(hippoRoot, entries) {
44
66
  return stamped.length;
45
67
  }
46
68
  /** Runs `fill` in one transaction; each `put` writes one entry and returns false when the store rejects its value,
47
- * leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were written. */
69
+ * leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were
70
+ * written. */
48
71
  export function writeEntriesSkippingRejected(hippoRoot, fill, actor = 'cli') {
49
72
  const written = [];
50
73
  onHandle(hippoRoot, (db) => {
@@ -99,8 +122,9 @@ function writeEntryOn(db, hippoRoot, entry, opts) {
99
122
  throw error;
100
123
  }
101
124
  }
102
- /** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must call `writeEntryMirrors` after any
103
- * outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row commits atomically with the INSERT. */
125
+ /** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must
126
+ * call `writeEntryMirrors` after any outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row
127
+ * commits atomically with the INSERT. */
104
128
  export function writeEntryDbOnly(db, entry, opts) {
105
129
  // Inside a caller's transaction (e.g. supersede's BEGIN IMMEDIATE) the scope is a SAVEPOINT,
106
130
  // so a throw here rolls back only this write and leaves the outer open.
@@ -112,16 +136,17 @@ export function writeEntryDbOnly(db, entry, opts) {
112
136
  auditEntryWrite(db, entry, opts?.actor ?? 'cli');
113
137
  });
114
138
  }
115
- /** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the summary parent's dirty mark. */
139
+ /** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the
140
+ * summary parent's dirty mark. */
116
141
  export function auditEntryWrite(db, entry, actor) {
117
142
  audit(db, 'remember', { targetId: entry.id, metadata: {
118
143
  kind: entry.kind ?? 'distilled',
119
144
  scope: entry.scope ?? null,
120
- }, actor, tenantId: entry.tenantId });
145
+ }, actor, tenantId: entry.tenant_id });
121
146
  // A child write marks its summary parent dirty for the sleep-cycle rebuild; most writes
122
147
  // have no parent, so the hot path pays one null check.
123
148
  if (entry.dag_parent_id) {
124
- markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenantId, actor);
149
+ markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenant_id, actor);
125
150
  }
126
151
  }
127
152
  /** Markdown mirror path, invoked AFTER commit (a rolled-back tx must leave no orphan markdown). */
@@ -149,7 +174,8 @@ export function strengthenRetrieved(hippoRoot, ids, opts) {
149
174
  closeHippoDb(db);
150
175
  }
151
176
  }
152
- /** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a recall's last writes share one handle. */
177
+ /** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a
178
+ * recall's last writes share one handle. */
153
179
  export function strengthenRetrievedInOwnTx(db, ids, opts) {
154
180
  if (ids.length === 0 || opts.recallBoostAblated)
155
181
  return new Set();
@@ -164,6 +190,8 @@ export function strengthenRetrievedInOwnTx(db, ids, opts) {
164
190
  function warnStrengthenFailed(error) {
165
191
  log.warn(`retrieval stats not saved (${errorMessage(error)})`);
166
192
  }
193
+ /** Rows per recall-write statement: five bound values each, far under SQLite's parameter limit. */
194
+ const RETRIEVAL_UPDATE_CHUNK = 100;
167
195
  /** strengthenRetrieved on the caller's handle, inside the caller's transaction. Throws; the caller decides. */
168
196
  export function strengthenRetrievedOn(db, ids, opts) {
169
197
  const found = new Set();
@@ -171,25 +199,31 @@ export function strengthenRetrievedOn(db, ids, opts) {
171
199
  return found;
172
200
  const byId = selectEntriesByIds(db, ids, opts.tenantId);
173
201
  const live = [...new Set(ids)].flatMap((id) => byId.get(id) ?? []);
174
- const update = db.prepare('UPDATE memories SET retrieval_count = ?, last_retrieved = ?, half_life_days = ?, strength = ? WHERE id = ?');
175
- for (const e of markRetrieved(live, undefined, { ablation: strengthAblation() })) {
176
- update.run(e.retrieval_count, e.last_retrieved, e.half_life_days, e.strength, e.id);
177
- found.add(e.id);
202
+ const updated = markRetrieved(live, undefined, { ablation: strengthAblation() });
203
+ // One UPDATE ... FROM per chunk of rows instead of one statement per row.
204
+ for (const chunk of chunked(updated, RETRIEVAL_UPDATE_CHUNK)) {
205
+ const values = chunk.map(() => '(?, ?, ?, ?, ?)').join(', ');
206
+ db.prepare(`WITH v(id, rc, lr, hl, st) AS (VALUES ${values})
207
+ UPDATE memories SET retrieval_count = v.rc, last_retrieved = v.lr, half_life_days = v.hl, strength = v.st
208
+ FROM v WHERE memories.id = v.id`).run(...chunk.flatMap((e) => [e.id, e.retrieval_count, e.last_retrieved, e.half_life_days, e.strength]));
209
+ for (const e of chunk)
210
+ found.add(e.id);
178
211
  }
179
212
  return found;
180
213
  }
181
214
  /** Rewrites a live row's tags and its full-text row on the caller's transaction, with no audit row. */
182
215
  export function setEntryTagsInTx(db, entry) {
183
216
  db.prepare(`UPDATE memories SET tags_json = ?, updated_at = datetime('now') WHERE id = ? AND tenant_id = ?`)
184
- .run(JSON.stringify(entry.tags), entry.id, entry.tenantId);
217
+ .run(JSON.stringify(entry.tags), entry.id, entry.tenant_id);
185
218
  syncFtsRow(db, entry);
186
219
  }
187
- /** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and marks its summary parent dirty. */
220
+ /** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and
221
+ * marks its summary parent dirty. */
188
222
  export function deleteEntryRowInTx(db, entry, actor) {
189
- db.prepare('DELETE FROM memories WHERE id = ? AND tenant_id = ?').run(entry.id, entry.tenantId);
223
+ db.prepare('DELETE FROM memories WHERE id = ? AND tenant_id = ?').run(entry.id, entry.tenant_id);
190
224
  deleteFtsRow(db, entry.id);
191
225
  if (entry.dag_parent_id)
192
- markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenantId, actor);
226
+ markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenant_id, actor);
193
227
  }
194
228
  /** One half-life per memory id, on the caller's transaction. */
195
229
  export function setHalfLivesAt(db, rows) {
@@ -199,8 +233,7 @@ export function setHalfLivesAt(db, rows) {
199
233
  }
200
234
  /** Moves every row of `from` in a tenant to project `into`. */
201
235
  export function restampOriginProjectAt(db, tenantId, from, into) {
202
- db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND origin_project = ?`)
203
- .run(into, tenantId, from);
236
+ db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND origin_project = ?`).run(into, tenantId, from);
204
237
  }
205
238
  /** Stamps each id with its project. */
206
239
  export function stampOriginProjectsAt(db, tenantId, rows) {
@@ -210,18 +243,24 @@ export function stampOriginProjectsAt(db, tenantId, rows) {
210
243
  }
211
244
  /** Renames a live row's source from `from` to `to`; the count is 0 when another writer moved or superseded it first. */
212
245
  export function renameEntrySourceAt(db, tenantId, id, from, to) {
213
- const moved = db.prepare(`UPDATE memories SET source = ? WHERE id = ? AND tenant_id = ? AND source = ? AND superseded_by IS NULL`).run(to, id, tenantId, from);
246
+ const moved = db
247
+ .prepare(`UPDATE memories SET source = ? WHERE id = ? AND tenant_id = ? AND source = ? AND superseded_by IS NULL`)
248
+ .run(to, id, tenantId, from);
214
249
  return Number(moved.changes ?? 0);
215
250
  }
216
251
  /** Renames a row's source and, when `origin` is not null, its project; the count is 0 when the row is gone or moved. */
217
252
  export function renameEntrySourceAndOriginAt(db, tenantId, id, options) {
218
253
  const { from, to, origin } = options;
219
- const done = db.prepare(`UPDATE memories SET source = ?, origin_project = COALESCE(?, origin_project) WHERE id = ? AND tenant_id = ? AND source = ?`).run(to, origin, id, tenantId, from);
254
+ const done = db
255
+ .prepare(`UPDATE memories SET source = ?, origin_project = COALESCE(?, origin_project) WHERE id = ? AND tenant_id = ? ` +
256
+ `AND source = ?`)
257
+ .run(to, origin, id, tenantId, from);
220
258
  return Number(done.changes ?? 0);
221
259
  }
222
260
  /** Marks `id` superseded by `newId`; false when another writer superseded it first. */
223
261
  export function supersedeEntryAt(db, tenantId, id, newId) {
224
- const result = db.prepare(`UPDATE memories SET superseded_by = ? WHERE id = ? AND tenant_id = ? AND superseded_by IS NULL`)
262
+ const result = db
263
+ .prepare(`UPDATE memories SET superseded_by = ? WHERE id = ? AND tenant_id = ? AND superseded_by IS NULL`)
225
264
  .run(newId, id, tenantId);
226
265
  return Number(result.changes ?? 0) !== 0;
227
266
  }
@@ -1,6 +1,6 @@
1
1
  // The failure log on a handle of its own, for code that has a folder and no connection.
2
2
  import { onHandle } from './open.js';
3
- import { recordFailure, requestOutcome, settleFailureOutcome } from './failure-log.js';
3
+ import { recordFailure, requestOutcome, settleFailureOutcome, } from './failure-log.js';
4
4
  /** {@link recordFailure} on a handle of its own. */
5
5
  export function recordFailureAt(hippoRoot, event) {
6
6
  return onHandle(hippoRoot, (db) => recordFailure(db, event));
@@ -30,9 +30,11 @@ export interface FailureEvent {
30
30
  }
31
31
  /** Prune rows past {@link FAILURE_LOG_RETENTION_DAYS}, then append one failure row; returns the new row's id. */
32
32
  export declare function recordFailure(db: DatabaseSyncLike, event: FailureEvent): number;
33
- /** The outcome logged for a caller's request id, or null, so a retried send finds the first one; another session's id is a ConflictError. */
33
+ /** The outcome logged for a caller's request id, or null, so a retried send finds the first one; another session's id
34
+ * is a ConflictError. */
34
35
  export declare function requestOutcome(db: DatabaseSyncLike, tenantId: string, requestId: string, sessionId: string): FailureOutcome | null;
35
- /** A retry that stored what the first try could not rewrites that row, since the request id allows one row per tenant. */
36
+ /** A retry that stored what the first try could not rewrites that row, since the request id allows one row per
37
+ * tenant. */
36
38
  export declare function settleFailureOutcome(db: DatabaseSyncLike, tenantId: string, requestId: string, outcome: FailureOutcome): void;
37
39
  /** Rated failures and repeats in one session, for {@link failuresBySession}. */
38
40
  export interface SessionFailures {
@@ -12,22 +12,29 @@ export function recordFailure(db, event) {
12
12
  // Prune first: nothing after the insert can throw, so a returned id always means a committed row.
13
13
  const cutoff = new Date(Date.parse(now) - FAILURE_LOG_RETENTION_DAYS * DAY_MS).toISOString();
14
14
  db.prepare(`DELETE FROM failure_log WHERE ts < ?`).run(cutoff);
15
- const inserted = db.prepare(`INSERT INTO failure_log (ts, tenant_id, session_id, tool, outcome, skip_rule, sig_hash, detail_hash, owner_subject, origin_project, request_id)
16
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(now, event.tenantId, event.sessionId?.slice(0, MAX_FIELD) ?? null, event.tool?.slice(0, MAX_FIELD) ?? null, event.outcome, event.rule ?? null, event.sigHash ?? null, event.detailHash ?? null, event.ownerSubject ?? null, event.originProject ?? null, event.requestId ?? null);
15
+ const inserted = db
16
+ .prepare(`INSERT INTO failure_log (ts, tenant_id, session_id, tool, outcome, skip_rule, sig_hash, detail_hash, ` +
17
+ `owner_subject, origin_project, request_id)
18
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
19
+ .run(now, event.tenantId, event.sessionId?.slice(0, MAX_FIELD) ?? null, event.tool?.slice(0, MAX_FIELD) ?? null, event.outcome, event.rule ?? null, event.sigHash ?? null, event.detailHash ?? null, event.ownerSubject ?? null, event.originProject ?? null, event.requestId ?? null);
17
20
  return Number(inserted.lastInsertRowid);
18
21
  }
19
- /** The outcome logged for a caller's request id, or null, so a retried send finds the first one; another session's id is a ConflictError. */
22
+ /** The outcome logged for a caller's request id, or null, so a retried send finds the first one; another session's id
23
+ * is a ConflictError. */
20
24
  export function requestOutcome(db, tenantId, requestId, sessionId) {
21
- const row = db.prepare(`SELECT outcome, session_id FROM failure_log WHERE tenant_id = ? AND request_id = ?`)
25
+ const row = db
26
+ .prepare(`SELECT outcome, session_id FROM failure_log WHERE tenant_id = ? AND request_id = ?`)
22
27
  .get(tenantId, requestId);
23
28
  if (row === undefined)
24
29
  return null;
25
30
  // Sessions are owner-bound, so this also keeps one owner from reading or settling another's row; compared as stored.
26
- if (row.session_id !== sessionId.slice(0, MAX_FIELD))
31
+ if (row.session_id !== sessionId.slice(0, MAX_FIELD)) {
27
32
  throw new ConflictError('request id belongs to another session');
33
+ }
28
34
  return row.outcome;
29
35
  }
30
- /** A retry that stored what the first try could not rewrites that row, since the request id allows one row per tenant. */
36
+ /** A retry that stored what the first try could not rewrites that row, since the request id allows one row per
37
+ * tenant. */
31
38
  export function settleFailureOutcome(db, tenantId, requestId, outcome) {
32
39
  db.prepare(`UPDATE failure_log SET outcome = ? WHERE tenant_id = ? AND request_id = ?`).run(outcome, tenantId, requestId);
33
40
  }
@@ -1,9 +1,9 @@
1
1
  import type { DatabaseSyncLike } from '../db/index.js';
2
2
  import type { MemoryEntry } from '../core/memory.js';
3
3
  export type GatedWriteResult = 'written' | 'skipped:not-worth-storing' | 'skipped:secret' | 'skipped:rejected';
4
- /** Runs on the caller's handle so it nests in the caller's transaction (writeEntry would open a second handle and wait on that lock); the
5
- * caller mirrors after commit with an entry it stamped itself. The rejection audit lands inside that transaction, which is safe because
6
- * a batch that rolls back stays `summarised` and replay writes the audit again. */
4
+ /** Runs on the caller's handle so it nests in the caller's transaction (writeEntry would open a second handle and wait
5
+ * on that lock); the caller mirrors after commit with an entry it stamped itself. The rejection audit lands inside that
6
+ * transaction, which is safe because a batch that rolls back stays `summarised` and replay writes the audit again. */
7
7
  export declare function gatedWrite(db: DatabaseSyncLike, hippoRoot: string, entry: MemoryEntry, opts?: {
8
8
  actor?: string;
9
9
  worthCheck?: boolean;
@@ -5,9 +5,9 @@ import { detectSecret } from '../util/secret-detect.js';
5
5
  import { auditRejectionRefusal } from './audit-event.js';
6
6
  import { stampOriginProject } from './entry-row.js';
7
7
  import { writeEntryDbOnly } from './entry-writes.js';
8
- /** Runs on the caller's handle so it nests in the caller's transaction (writeEntry would open a second handle and wait on that lock); the
9
- * caller mirrors after commit with an entry it stamped itself. The rejection audit lands inside that transaction, which is safe because
10
- * a batch that rolls back stays `summarised` and replay writes the audit again. */
8
+ /** Runs on the caller's handle so it nests in the caller's transaction (writeEntry would open a second handle and wait
9
+ * on that lock); the caller mirrors after commit with an entry it stamped itself. The rejection audit lands inside that
10
+ * transaction, which is safe because a batch that rolls back stays `summarised` and replay writes the audit again. */
11
11
  export function gatedWrite(db, hippoRoot, entry, opts) {
12
12
  // Off for imported agent memories: a person wrote those notes, and a one-line preference fails the check.
13
13
  if (opts?.worthCheck !== false && !isContentWorthStoring(entry.content))
@@ -60,7 +60,6 @@ export interface GetActiveGoalsOpts {
60
60
  sessionId: string;
61
61
  tenantId: string;
62
62
  }
63
- export declare function getActiveGoals(hippoRoot: string, opts: GetActiveGoalsOpts): Goal[];
64
63
  /** A session's active goals, oldest first, and the retrieval policy of each goal that names one. */
65
64
  export interface ActiveGoals {
66
65
  readonly goals: Goal[];
@@ -82,12 +81,14 @@ export interface GoalRecallLogRow {
82
81
  /** The rows whose memory lives in this store: goal_recall_log.memory_id references memories, so a global row would fail
83
82
  * the insert. A global result keeps its boost; it only earns no log row, so no outcome propagation. */
84
83
  export declare function localGoalRecallRows(db: DatabaseSyncLike, rows: readonly GoalRecallLogRow[]): GoalRecallLogRow[];
85
- /** INSERT OR IGNORE: UNIQUE(memory_id, goal_id) makes a re-recall during the same goal life a no-op for outcome attribution. */
84
+ /** INSERT OR IGNORE: UNIQUE(memory_id, goal_id) makes a re-recall during the same goal life a no-op for outcome
85
+ * attribution. */
86
86
  export declare function writeGoalRecallLog(db: DatabaseSyncLike, rows: readonly GoalRecallLogRow[]): void;
87
87
  export interface CompleteGoalOpts {
88
88
  outcomeScore?: number;
89
- /** When true, skip the strength-multiplier propagation (default false); status still goes to 'completed' and `outcome_score` is still recorded.
90
- * The idempotency guard returns early on a second `completeGoal` call before this flag is read. */
89
+ /** When true, skip the strength-multiplier propagation (default false); status still goes to 'completed' and
90
+ * `outcome_score` is still recorded. The idempotency guard returns early on a second `completeGoal` call before this
91
+ * flag is read. */
91
92
  noPropagate?: boolean;
92
93
  }
93
94
  export declare function completeGoal(hippoRoot: string, goalId: string, opts: CompleteGoalOpts): void;
@@ -2,6 +2,7 @@
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { withWriteScope } from '../db/index.js';
4
4
  import { onHandle } from './open.js';
5
+ import { placeholders } from '../util/sql.js';
5
6
  const MAX_ACTIVE_GOAL_DEPTH = 3;
6
7
  export function rowToGoal(row) {
7
8
  return {
@@ -24,8 +25,8 @@ export function pushGoal(hippoRoot, opts) {
24
25
  return pushGoalWithDb(db, opts);
25
26
  });
26
27
  }
27
- /** Depth-cap enforcer for pushGoalWithDb and resumeGoal: suspends the oldest `overflow` goals; **caller MUST be inside a `BEGIN IMMEDIATE` transaction**.
28
- * @internal Internal goal-stack invariant. Subject to change. */
28
+ /** Depth-cap enforcer for pushGoalWithDb and resumeGoal: suspends the oldest `overflow` goals; **caller MUST be inside
29
+ * a `BEGIN IMMEDIATE` transaction**. @internal Internal goal-stack invariant. Subject to change. */
29
30
  function enforceDepthCapWithinTx(db, tenantId, sessionId) {
30
31
  // SAFETY: the row comes from the SELECT above, which projects exactly one
31
32
  // column, `c`, as a COUNT(*).
@@ -105,11 +106,6 @@ function insertRetrievalPolicy(db, goalId, policy) {
105
106
  db.prepare(`UPDATE goal_stack SET retrieval_policy_id = ? WHERE id = ?`).run(policyId, goalId);
106
107
  return policyId;
107
108
  }
108
- export function getActiveGoals(hippoRoot, opts) {
109
- return onHandle(hippoRoot, (db) => {
110
- return getActiveGoalsWithDb(db, opts);
111
- });
112
- }
113
109
  /** The active goals and their policies on one handle, so a goal and its policy never disagree. */
114
110
  export function activeGoalsWithPolicies(hippoRoot, opts) {
115
111
  return onHandle(hippoRoot, (db) => {
@@ -143,7 +139,8 @@ function getActiveGoalsWithDb(db, opts) {
143
139
  `).all(opts.tenantId, opts.sessionId);
144
140
  return rows.map(rowToGoal);
145
141
  }
146
- // Per-goal retrieval_policy multipliers compose onto the base goal-tag boost and are hard-capped at MAX_FINAL_MULTIPLIER (3.0x) before scoring.
142
+ // Per-goal retrieval_policy multipliers compose onto the base goal-tag boost and are hard-capped at
143
+ // MAX_FINAL_MULTIPLIER (3.0x) before scoring.
147
144
  function loadGoalPolicies(db, active) {
148
145
  const policiesByGoalId = new Map();
149
146
  const policyIds = [...new Set(active.flatMap((g) => (g.retrievalPolicyId ? [g.retrievalPolicyId] : [])))];
@@ -152,7 +149,7 @@ function loadGoalPolicies(db, active) {
152
149
  // SAFETY: the SELECT projects exactly these seven retrieval_policy columns; MAX_ACTIVE_GOAL_DEPTH bounds the IN list.
153
150
  const rows = db.prepare(`
154
151
  SELECT id, goal_id, policy_type, weight_schema_fit, weight_recency, weight_outcome, error_priority
155
- FROM retrieval_policy WHERE id IN (${policyIds.map(() => '?').join(',')})
152
+ FROM retrieval_policy WHERE id IN (${placeholders(policyIds.length)})
156
153
  `).all(...policyIds);
157
154
  const byId = new Map(rows.map((row) => [row.id, row]));
158
155
  for (const g of active) {
@@ -178,11 +175,12 @@ export function localGoalRecallRows(db, rows) {
178
175
  return [];
179
176
  const ids = [...new Set(rows.map((r) => r.memoryId))];
180
177
  // SAFETY: the SELECT projects exactly one column, `id`, from memories.
181
- const local = db.prepare(`SELECT id FROM memories WHERE id IN (${ids.map(() => '?').join(',')})`).all(...ids);
178
+ const local = db.prepare(`SELECT id FROM memories WHERE id IN (${placeholders(ids.length)})`).all(...ids);
182
179
  const localIds = new Set(local.map((r) => r.id));
183
180
  return rows.filter((r) => localIds.has(r.memoryId));
184
181
  }
185
- /** INSERT OR IGNORE: UNIQUE(memory_id, goal_id) makes a re-recall during the same goal life a no-op for outcome attribution. */
182
+ /** INSERT OR IGNORE: UNIQUE(memory_id, goal_id) makes a re-recall during the same goal life a no-op for outcome
183
+ * attribution. */
186
184
  export function writeGoalRecallLog(db, rows) {
187
185
  if (rows.length === 0)
188
186
  return;
@@ -225,7 +223,8 @@ export function completeGoal(hippoRoot, goalId, opts) {
225
223
  else if (score < NEGATIVE_OUTCOME_THRESHOLD)
226
224
  multiplier = STRENGTH_DECAY;
227
225
  if (multiplier !== 1) {
228
- // Lifespan window: only recalls during this goal's active life; UNIQUE(memory_id, goal_id) gives one adjustment per pair.
226
+ // Lifespan window: only recalls during this goal's active life; UNIQUE(memory_id, goal_id) gives one
227
+ // adjustment per pair.
229
228
  db.prepare(`
230
229
  UPDATE memories
231
230
  SET strength = MIN(1.0, MAX(0.0, strength * ?))
@@ -0,0 +1,21 @@
1
+ import type { GraphOp, StoredGraph } from './graph-rows.js';
2
+ export interface ApplyGraphOpsResult {
3
+ readonly next: number;
4
+ readonly skipped: number;
5
+ }
6
+ export interface ApplyGraphOpsOptions {
7
+ readonly from: number;
8
+ readonly holdMs: number;
9
+ readonly clock?: () => number;
10
+ }
11
+ /**
12
+ * Applies `ops` from index `opts.from` in one rebuild transaction and stops at the first op boundary past
13
+ * `opts.holdMs`.
14
+ * Returns where the next chunk starts and how many ops were skipped as stale. */
15
+ export declare function applyGraphOps(hippoRoot: string, tenantId: string, ops: readonly GraphOp[], opts: ApplyGraphOpsOptions & {
16
+ readonly busyWaitMs?: number;
17
+ }): ApplyGraphOpsResult;
18
+ /** Reads the stored graph, diffs it with `diff` and applies every op under one lock, so two concurrent rebuilds
19
+ * serialize instead of both inserting a missing row. Returns how many ops were skipped as stale. */
20
+ export declare function rebuildGraphUnderLock(hippoRoot: string, tenantId: string, memoryIds: readonly string[], diff: (stored: StoredGraph) => readonly GraphOp[]): number;
21
+ //# sourceMappingURL=graph-apply.d.ts.map
@@ -1,15 +1,21 @@
1
- // Applies a rebuild's op list on the caller's transaction. The statements and the consolidated-source guard sit in the store's graph writers.
2
- import { assertTenantId } from '../store/tenant.js';
3
1
  import { clock } from '../util/write-budget.js';
4
- import { deleteEntityRow, deleteRelationRow, entityIdBySource, insertEntityRow, insertRelationRow, objectInForce, relationPresent, updateEntityRow } from '../store/graph-writes.js';
2
+ import { storedGraphOn } from './graph-reads.js';
3
+ import { deleteEntityRow, deleteRelationRow, entityIdBySource, insertEntityRow, insertRelationRow, objectInForce, relationPresent, runGraphRebuildTransaction, updateEntityRow, } from './graph-writes.js';
5
4
  function insertDesiredRelation(db, tenantId, rel) {
6
5
  const fromEntityId = entityIdBySource(db, tenantId, rel.from.entityType, rel.from.sourceObject);
7
6
  const toEntityId = entityIdBySource(db, tenantId, rel.to.entityType, rel.to.sourceObject);
8
- if (fromEntityId === undefined || toEntityId === undefined || !objectInForce(db, tenantId, rel.sourceObject))
7
+ if (fromEntityId === undefined || toEntityId === undefined || !objectInForce(db, tenantId, rel.sourceObject)) {
9
8
  return false;
9
+ }
10
10
  if (relationPresent(db, tenantId, fromEntityId, toEntityId, rel.relType))
11
11
  return false;
12
- insertRelationRow(db, tenantId, { fromEntityId, toEntityId, relType: rel.relType, memoryId: rel.memoryId, sourceObject: rel.sourceObject });
12
+ insertRelationRow(db, tenantId, {
13
+ fromEntityId,
14
+ toEntityId,
15
+ relType: rel.relType,
16
+ memoryId: rel.memoryId,
17
+ sourceObject: rel.sourceObject,
18
+ });
13
19
  return true;
14
20
  }
15
21
  /** Applies one op; false when a writer since the diff made it stale, which the next run's diff repairs. */
@@ -27,18 +33,17 @@ function applyGraphOp(db, tenantId, op) {
27
33
  return updateEntityRow(db, tenantId, op.id, op.entity) !== null;
28
34
  case 'insertEntity':
29
35
  // A mirrorless object closed since the load is never enqueued again, so a stale insert would stay for good.
30
- if (!objectInForce(db, tenantId, op.entity.sourceObject) || entityIdBySource(db, tenantId, op.entity.entityType, op.entity.sourceObject) !== undefined)
36
+ if (!objectInForce(db, tenantId, op.entity.sourceObject) ||
37
+ entityIdBySource(db, tenantId, op.entity.entityType, op.entity.sourceObject) !== undefined) {
31
38
  return false;
39
+ }
32
40
  insertEntityRow(db, tenantId, op.entity);
33
41
  return true;
34
42
  case 'insertRelation':
35
43
  return insertDesiredRelation(db, tenantId, op.relation);
36
44
  }
37
45
  }
38
- /** Applies `ops` from index `opts.from` on the caller's open transaction and stops at the first op boundary past `opts.holdMs`.
39
- * Returns where the next chunk starts and how many ops were skipped as stale. */
40
- export function applyGraphOps(db, tenantId, ops, opts) {
41
- assertTenantId('applyGraphOps', tenantId);
46
+ function applyGraphOpsOn(db, tenantId, ops, opts) {
42
47
  const now = opts.clock ?? clock;
43
48
  const begunAt = now();
44
49
  let next = opts.from;
@@ -52,4 +57,19 @@ export function applyGraphOps(db, tenantId, ops, opts) {
52
57
  }
53
58
  return { next, skipped };
54
59
  }
55
- //# sourceMappingURL=write.js.map
60
+ /**
61
+ * Applies `ops` from index `opts.from` in one rebuild transaction and stops at the first op boundary past
62
+ * `opts.holdMs`.
63
+ * Returns where the next chunk starts and how many ops were skipped as stale. */
64
+ export function applyGraphOps(hippoRoot, tenantId, ops, opts) {
65
+ return runGraphRebuildTransaction(hippoRoot, tenantId, (db) => applyGraphOpsOn(db, tenantId, ops, opts), { busyWaitMs: opts.busyWaitMs });
66
+ }
67
+ /** Reads the stored graph, diffs it with `diff` and applies every op under one lock, so two concurrent rebuilds
68
+ * serialize instead of both inserting a missing row. Returns how many ops were skipped as stale. */
69
+ export function rebuildGraphUnderLock(hippoRoot, tenantId, memoryIds, diff) {
70
+ return runGraphRebuildTransaction(hippoRoot, tenantId, (db) => {
71
+ const ops = diff(storedGraphOn(db, tenantId, memoryIds));
72
+ return applyGraphOpsOn(db, tenantId, ops, { from: 0, holdMs: Infinity }).skipped;
73
+ });
74
+ }
75
+ //# sourceMappingURL=graph-apply.js.map
@@ -1,11 +1,14 @@
1
- /** Fail-soft producer hook: mark a tenant dirty for graph re-extraction by enqueuing its consolidated mirror memory. NEVER throws: a failed dirty signal
2
- * must not abort an object write. Call POST-COMMIT from the graph-source save/close mutations; a null memoryId (forgotten mirror) is a no-op. */
1
+ /** Fail-soft producer hook: mark a tenant dirty for graph re-extraction by enqueuing its consolidated mirror memory.
2
+ * NEVER throws: a failed dirty signal must not abort an object write. Call POST-COMMIT from the graph-source save/close
3
+ * mutations; a null memoryId (forgotten mirror) is a no-op. */
3
4
  export declare function markGraphDirty(hippoRoot: string, tenantId: string, memoryId: string | null): void;
4
- /** Mark every pending item for a tenant with `id <= maxId` processed in one UPDATE (status/processed_at only, so the source guard trigger is not involved).
5
- * The watermark excludes items enqueued after the drain snapshot. Returns the count marked. */
5
+ /** Mark every pending item for a tenant with `id <= maxId` processed in one UPDATE (status/processed_at only, so the
6
+ * source guard trigger is not involved). The watermark excludes items enqueued after the drain snapshot. Returns the
7
+ * count marked. */
6
8
  export declare function markPendingProcessedUpTo(hippoRoot: string, tenantId: string, maxId: number): number;
7
- /** Dirty tenants awaiting graph re-extraction, each with the MAX pending queue id at read time (a watermark); host-wide, as sleep is cross-tenant.
8
- * The drain marks only items at or below it processed, so items enqueued DURING the rebuild stay pending (no lost update). */
9
+ /** Dirty tenants awaiting graph re-extraction, each with the MAX pending queue id at read time (a watermark);
10
+ * host-wide, as sleep is cross-tenant. The drain marks only items at or below it processed, so items enqueued DURING
11
+ * the rebuild stay pending (no lost update). */
9
12
  export declare function loadPendingExtractionTenants(hippoRoot: string): {
10
13
  tenantId: string;
11
14
  maxPendingId: number;
@@ -1,10 +1,12 @@
1
- // The graph extraction queue: the consolidated memories that wait for a graph rebuild, and the watermark the sleep drain marks them by.
1
+ // The graph extraction queue: the consolidated memories that wait for a graph rebuild, and the watermark the sleep
2
+ // drain marks them by.
2
3
  import { onHandle } from './open.js';
3
4
  import { assertTenantId } from './tenant.js';
4
- import { errorMessage, log } from '../util/log.js';
5
+ import { errorMessage, log, errorFields } from '../util/log.js';
5
6
  import { rowToQueueItem, QUEUE_COLS } from './graph-rows.js';
6
7
  import { resolveConsolidatedSource } from './graph-writes.js';
7
- /** Enqueue a consolidated memory for later graph extraction; rejects a raw / missing / cross-tenant memory (the DB trigger is the backstop). */
8
+ /** Enqueue a consolidated memory for later graph extraction; rejects a raw / missing / cross-tenant memory (the DB
9
+ * trigger is the backstop). */
8
10
  function enqueueExtraction(hippoRoot, tenantId, memoryId) {
9
11
  assertTenantId('enqueueExtraction', tenantId);
10
12
  const now = new Date().toISOString();
@@ -24,8 +26,9 @@ function enqueueExtraction(hippoRoot, tenantId, memoryId) {
24
26
  return rowToQueueItem(row);
25
27
  });
26
28
  }
27
- /** Fail-soft producer hook: mark a tenant dirty for graph re-extraction by enqueuing its consolidated mirror memory. NEVER throws: a failed dirty signal
28
- * must not abort an object write. Call POST-COMMIT from the graph-source save/close mutations; a null memoryId (forgotten mirror) is a no-op. */
29
+ /** Fail-soft producer hook: mark a tenant dirty for graph re-extraction by enqueuing its consolidated mirror memory.
30
+ * NEVER throws: a failed dirty signal must not abort an object write. Call POST-COMMIT from the graph-source save/close
31
+ * mutations; a null memoryId (forgotten mirror) is a no-op. */
29
32
  export function markGraphDirty(hippoRoot, tenantId, memoryId) {
30
33
  if (!memoryId)
31
34
  return;
@@ -35,11 +38,12 @@ export function markGraphDirty(hippoRoot, tenantId, memoryId) {
35
38
  catch (err) {
36
39
  // Logged (warn) so a SYSTEMATIC enqueue failure surfaces to operators, but
37
40
  // swallowed so the already-committed object write is never rolled back.
38
- log.warn(`markGraphDirty: enqueue failed for tenant=${tenantId} memory=${memoryId}: ${errorMessage(err)}`);
41
+ log.warn(`markGraphDirty: enqueue failed for tenant=${tenantId} memory=${memoryId}: ${errorMessage(err)}`, errorFields(err));
39
42
  }
40
43
  }
41
- /** Mark every pending item for a tenant with `id <= maxId` processed in one UPDATE (status/processed_at only, so the source guard trigger is not involved).
42
- * The watermark excludes items enqueued after the drain snapshot. Returns the count marked. */
44
+ /** Mark every pending item for a tenant with `id <= maxId` processed in one UPDATE (status/processed_at only, so the
45
+ * source guard trigger is not involved). The watermark excludes items enqueued after the drain snapshot. Returns the
46
+ * count marked. */
43
47
  export function markPendingProcessedUpTo(hippoRoot, tenantId, maxId) {
44
48
  assertTenantId('markPendingProcessedUpTo', tenantId);
45
49
  const now = new Date().toISOString();
@@ -52,8 +56,9 @@ export function markPendingProcessedUpTo(hippoRoot, tenantId, maxId) {
52
56
  return Number(res.changes ?? 0);
53
57
  });
54
58
  }
55
- /** Dirty tenants awaiting graph re-extraction, each with the MAX pending queue id at read time (a watermark); host-wide, as sleep is cross-tenant.
56
- * The drain marks only items at or below it processed, so items enqueued DURING the rebuild stay pending (no lost update). */
59
+ /** Dirty tenants awaiting graph re-extraction, each with the MAX pending queue id at read time (a watermark);
60
+ * host-wide, as sleep is cross-tenant. The drain marks only items at or below it processed, so items enqueued DURING
61
+ * the rebuild stay pending (no lost update). */
57
62
  export function loadPendingExtractionTenants(hippoRoot) {
58
63
  return onHandle(hippoRoot, (db) => {
59
64
  // SAFETY: rows' shape matches the two aliased columns (tenant_id, max_id)