hippo-memory 1.70.0 → 1.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -1,13 +1,13 @@
1
1
  // The graph reads a view and a traversal share. Each opens hippo.db itself unless the caller hands it the handle its snapshot runs on.
2
+ import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
2
3
  import { openHippoDb, closeHippoDb, withReadSnapshot } from '../db/index.js';
4
+ import { onHandle } from './open.js';
3
5
  import { assertTenantId } from './tenant.js';
4
6
  import { GRAPH_ENTITY_TYPES, rowToEntity, rowToRelation, ENTITY_COLS, RELATION_COLS } from './graph-rows.js';
5
- const DEFAULT_GRAPH_PAGE_SIZE = 100;
7
+ const DEFAULT_GRAPH_PAGE_SIZE = DEFAULT_LIST_LIMIT;
6
8
  const DEFAULT_GRAPH_SCAN_LIMIT = 1000;
7
- /** Entities with an exact `name` (read), bounded by `limit` in SQL with a
8
- * deterministic order. Lets the graph-view focus query find the `--entity NAME`
9
- * entity DIRECTLY (not from a globally-capped list) WITHOUT materializing every
10
- * same-name row when a name maps to many entities. */
9
+ /** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds `--entity NAME` directly
10
+ * without materializing every same-name row. */
11
11
  export function loadEntitiesByName(hippoRoot, tenantId, name, opts = {}, txDb) {
12
12
  assertTenantId('loadEntitiesByName', tenantId);
13
13
  const limit = opts.limit ?? DEFAULT_GRAPH_PAGE_SIZE;
@@ -89,10 +89,7 @@ export function loadRelations(hippoRoot, tenantId, opts = {}, txDb) {
89
89
  /** Chunk size for IN-list queries: well under SQLite's 999-bound-variable default
90
90
  * (leaves headroom for the tenant_id param + the doubled list in neighbour lookups). */
91
91
  export const IN_LIST_CHUNK = 400;
92
- /**
93
- * Load entities by their primary ids. Resolves the entity rows reached during the BFS
94
- * (whose `memory_id` maps back to a recall result). Tenant-scoped, read-only.
95
- */
92
+ /** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped, read-only. */
96
93
  export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
97
94
  assertTenantId('loadEntitiesByIds', tenantId);
98
95
  if (ids.length === 0)
@@ -118,13 +115,8 @@ export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
118
115
  closeHippoDb(ownDb);
119
116
  }
120
117
  }
121
- /**
122
- * All relations touching ANY of `entityIds` in EITHER direction (from OR to): the
123
- * per-hop neighbour query for multi-hop traversal. ONE query for the whole frontier
124
- * (not one per node): this is the bidirectional read `loadRelations` (from-only) lacks,
125
- * and avoids an N+1 across BFS frontier nodes. `limit` caps rows for the frontier and
126
- * must be a non-negative integer (the raw `LIMIT ?` rejects a fractional value).
127
- */
118
+ /** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal, one query for the whole frontier
119
+ * (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?` rejects a fraction). */
128
120
  export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
129
121
  assertTenantId('loadNeighborRelations', tenantId);
130
122
  if (entityIds.length === 0)
@@ -136,11 +128,8 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
136
128
  const ownDb = txDb ? null : openHippoDb(hippoRoot);
137
129
  const db = txDb ?? ownDb;
138
130
  try {
139
- // `limit` is applied PER CHUNK; a frontier spanning >IN_LIST_CHUNK ids could return
140
- // up to limit*chunks rows before the by-id dedup below. Harmless for multi-hop recall (the
141
- // frontier is bounded by maxNeighbors <= 200 << IN_LIST_CHUNK, so a single chunk,
142
- // and the BFS re-enforces the per-hop fanout cap), but note the semantics if a
143
- // tighter total cap is ever needed.
131
+ // `limit` applies PER CHUNK, so a frontier over IN_LIST_CHUNK ids could return limit*chunks rows before the dedup below;
132
+ // harmless today (frontier <= maxNeighbors 200, one chunk, BFS re-enforces the fanout cap).
144
133
  const byId = new Map();
145
134
  for (let i = 0; i < entityIds.length; i += IN_LIST_CHUNK) {
146
135
  const slice = entityIds.slice(i, i + IN_LIST_CHUNK);
@@ -162,13 +151,8 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
162
151
  closeHippoDb(ownDb);
163
152
  }
164
153
  }
165
- /**
166
- * Relations with BOTH endpoints in `entityIds` (edges AMONG the set, not merely
167
- * touching it). Read. Used by the graph-view focus subgraph so the displayed
168
- * edges are exactly the intra-union edges: the `LIMIT` only caps genuinely-many
169
- * intra-union edges: no out-of-union row can evict a valid in-set edge. The
170
- * caller bounds `entityIds` (<= the view limit), so a single query is safe.
171
- */
154
+ /** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps only intra-union edges,
155
+ * so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so a single query is safe. */
172
156
  export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
173
157
  assertTenantId('loadRelationsAmong', tenantId);
174
158
  if (entityIds.length === 0)
@@ -195,17 +179,13 @@ export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, tx
195
179
  closeHippoDb(ownDb);
196
180
  }
197
181
  }
198
- /**
199
- * Map consolidated source memory ids -> their graph entities. The SEED step of
200
- * multi-hop recall (recall result memory ids -> entities to traverse from). Tenant-
201
- * scoped, read-only; chunks the IN-list under the SQLite variable cap.
202
- */
182
+ /** Map consolidated source memory ids to their graph entities: the SEED step of multi-hop recall. Tenant-scoped, read-only; chunks the IN-list under the
183
+ * SQLite variable cap. */
203
184
  export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
204
185
  assertTenantId('loadEntitiesByMemoryId', tenantId);
205
186
  if (memoryIds.length === 0)
206
187
  return [];
207
- const db = openHippoDb(hippoRoot);
208
- try {
188
+ return onHandle(hippoRoot, (db) => {
209
189
  const out = [];
210
190
  for (let i = 0; i < memoryIds.length; i += IN_LIST_CHUNK) {
211
191
  const slice = memoryIds.slice(i, i + IN_LIST_CHUNK);
@@ -220,10 +200,7 @@ export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
220
200
  out.push(...rows.map(rowToEntity));
221
201
  }
222
202
  return out;
223
- }
224
- finally {
225
- closeHippoDb(db);
226
- }
203
+ });
227
204
  }
228
205
  /** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write lock. */
229
206
  export function storedGraphOn(db, tenantId, memoryIds) {
@@ -231,7 +208,8 @@ export function storedGraphOn(db, tenantId, memoryIds) {
231
208
  // SAFETY: the SELECT names exactly the columns of StoredEntity.
232
209
  const entities = db.prepare(`SELECT id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id FROM entities WHERE tenant_id = ? ORDER BY id`).all(tenantId);
233
210
  // SAFETY: the SELECT names exactly the columns of StoredRelation.
234
- const relations = db.prepare(`SELECT id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id FROM relations WHERE tenant_id = ? ORDER BY id`).all(tenantId);
211
+ const relations = db.prepare(`SELECT id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id ` +
212
+ `FROM relations WHERE tenant_id = ? ORDER BY id`).all(tenantId);
235
213
  return { kinds, entities, relations };
236
214
  }
237
215
  function memoryKindsOn(db, memoryIds) {
@@ -244,29 +222,15 @@ function memoryKindsOn(db, memoryIds) {
244
222
  }
245
223
  /** storedGraphOn on its own connection, outside any write lock. */
246
224
  export function loadStoredGraph(hippoRoot, tenantId, memoryIds) {
247
- const db = openHippoDb(hippoRoot);
248
- try {
225
+ return onHandle(hippoRoot, (db) => {
249
226
  return storedGraphOn(db, tenantId, memoryIds);
250
- }
251
- finally {
252
- closeHippoDb(db);
253
- }
227
+ });
254
228
  }
255
- /**
256
- * Run `fn` inside ONE read transaction (a single WAL snapshot) so every graph read
257
- * it performs (pass the supplied `txDb` to the `load*` functions) sees a consistent
258
- * view, even if a `graph extract` / sleep-drain rebuild commits concurrently between
259
- * reads (the rebuild clears + reinserts entities, so separate reads could otherwise
260
- * mix old entity ids with new relation ids). Reads only; the connection is opened
261
- * once and closed after.
262
- */
229
+ /** Run `fn` in ONE read transaction (a single WAL snapshot) so every `load*` read via `txDb` sees a consistent view
230
+ * even if a rebuild commits concurrently (it clears and reinserts entities, so separate reads could mix old entity ids with new relation ids). */
263
231
  export function withGraphReadSnapshot(hippoRoot, fn) {
264
- const db = openHippoDb(hippoRoot);
265
- try {
232
+ return onHandle(hippoRoot, (db) => {
266
233
  return withReadSnapshot(db, () => fn(db));
267
- }
268
- finally {
269
- closeHippoDb(db);
270
- }
234
+ });
271
235
  }
272
236
  //# sourceMappingURL=graph-reads.js.map
@@ -6,9 +6,8 @@ export type SourceKind = 'distilled' | 'superseded';
6
6
  * provenance path, alongside the memory path). Maps to source_object_type. */
7
7
  export type SourceObjectType = 'decision' | 'policy' | 'customer' | 'project';
8
8
  export declare const GRAPH_ENTITY_TYPES: ReadonlySet<EntityType>;
9
- /** A soft (type,id) pointer to the authoritative object row a graph row descends from.
10
- * Survives a mirror memory forget/prune (memory_id may go NULL); the rebuild
11
- * re-validates it (it is not a hard FK). */
9
+ /** A soft (type,id) pointer to the authoritative object row a graph row descends from; survives a mirror forget/prune
10
+ * (memory_id may go NULL) and is re-validated by the rebuild, not a hard FK. */
12
11
  export interface SourceObjectRef {
13
12
  type: SourceObjectType;
14
13
  id: number;
@@ -22,9 +21,7 @@ export interface Entity {
22
21
  tenantId: string;
23
22
  entityType: EntityType;
24
23
  name: string;
25
- /** The consolidated source memory this entity was extracted from. NULL once the
26
- * mirror is forgotten/pruned (ON DELETE SET NULL) - the entity then survives via
27
- * its source_object provenance. */
24
+ /** The consolidated source memory this entity came from; NULL once the mirror is forgotten/pruned (ON DELETE SET NULL), then provenance is source_object. */
28
25
  memoryId: string | null;
29
26
  sourceKind: SourceKind;
30
27
  /** The authoritative object this entity is anchored to (object-provenance path).
@@ -10,9 +10,8 @@ export const VALID_QUEUE_STATES = new Set([
10
10
  ]);
11
11
  export const MAX_ENTITY_NAME_LEN = 512;
12
12
  export function rowToEntity(row) {
13
- // SAFETY: entity_type/source_kind/source_object_type are DB CHECK-constrained
14
- // (see db.ts CREATE TABLE entities) to exactly the EntityType/SourceKind/
15
- // SourceObjectType enum values, so the row's column values match those types.
13
+ // SAFETY: entity_type/source_kind/source_object_type are DB CHECK-constrained to exactly the EntityType/SourceKind/SourceObjectType enum values,
14
+ // so the row's column values match those types.
16
15
  return {
17
16
  id: row.id,
18
17
  tenantId: row.tenant_id,
@@ -26,9 +25,8 @@ export function rowToEntity(row) {
26
25
  };
27
26
  }
28
27
  export function rowToRelation(row) {
29
- // SAFETY: rel_type/source_kind/source_object_type are DB CHECK-constrained
30
- // (see db.ts CREATE TABLE relations) to exactly the RelationType/SourceKind/
31
- // SourceObjectType enum values, so the row's column values match those types.
28
+ // SAFETY: rel_type/source_kind/source_object_type are DB CHECK-constrained to exactly the RelationType/SourceKind/SourceObjectType enum values,
29
+ // so the row's column values match those types.
32
30
  return {
33
31
  id: row.id,
34
32
  tenantId: row.tenant_id,
@@ -45,9 +43,8 @@ export function rowToRelation(row) {
45
43
  export const ENTITY_COLS = `id, tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at`;
46
44
  export const RELATION_COLS = `id, tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at`;
47
45
  export function rowToQueueItem(row) {
48
- // SAFETY: kind/status are DB CHECK-constrained (see db.ts CREATE TABLE
49
- // graph_extraction_queue) to exactly the SourceKind/GraphQueueStatus enum
50
- // values, so the row's column values match those types.
46
+ // SAFETY: kind/status are DB CHECK-constrained to exactly the SourceKind/GraphQueueStatus enum values,
47
+ // so the row's column values match those types.
51
48
  return {
52
49
  id: row.id,
53
50
  tenantId: row.tenant_id,
@@ -6,7 +6,8 @@ export interface GraphViewSpec {
6
6
  readonly limit: number;
7
7
  readonly canRead?: CanRead;
8
8
  }
9
- /** What `GraphReads.graphRows` answers, read on `db`: the caller opens the one snapshot that keeps entity ids and relation ids from two different rebuilds apart. */
9
+ /** What `GraphReads.graphRows` answers, read on `db`: the caller opens the one
10
+ * snapshot that keeps entity ids and relation ids from two different rebuilds apart. */
10
11
  export declare function graphViewRows(hippoRoot: string, db: DatabaseSyncLike, tenantId: string, spec: GraphViewSpec): GraphRows;
11
12
  export {};
12
13
  //# sourceMappingURL=graph-view-rows.d.ts.map
@@ -52,7 +52,8 @@ function focusRows({ hippoRoot, db, tenantId }, name, limit, canRead) {
52
52
  relations.length >= limit;
53
53
  return { entities, relations, truncated };
54
54
  }
55
- /** What `GraphReads.graphRows` answers, read on `db`: the caller opens the one snapshot that keeps entity ids and relation ids from two different rebuilds apart. */
55
+ /** What `GraphReads.graphRows` answers, read on `db`: the caller opens the one
56
+ * snapshot that keeps entity ids and relation ids from two different rebuilds apart. */
56
57
  export function graphViewRows(hippoRoot, db, tenantId, spec) {
57
58
  const source = { hippoRoot, db, tenantId };
58
59
  const raw = spec.entity !== undefined ? focusRows(source, spec.entity, spec.limit, spec.canRead) : wholeGraphRows(source, spec.limit);
@@ -1,34 +1,19 @@
1
1
  import { type DatabaseSyncLike } from '../db/index.js';
2
2
  import { type EntityType, type RelationType, type SourceKind, type SourceObjectType, type SourceObjectRef, type Entity, type Relation, type InsertEntityOpts, type InsertRelationOpts, type UpdateEntityOpts } from './graph-rows.js';
3
- /**
4
- * Resolve the `source_kind` for a graph row from AT LEAST ONE valid provenance path,
5
- * with the no-raw invariant intact. The code-level mirror of the DB trigger guard (the
6
- * trigger is the unbypassable backstop). Two paths:
7
- * - MEMORY path (`memoryId` not null): the memory must exist, be same-tenant, and be
8
- * consolidated (distilled/superseded); raw is rejected. Returns its kind.
9
- * - OBJECT path (`memoryId` null, `sourceObject` set): the object row must exist, be
10
- * same-tenant, and have status active|superseded (4-way per object table). Objects are
11
- * consolidated BY CONSTRUCTION, so this returns 'distilled'.
12
- * All-null (no memory AND no source object) is rejected.
13
- */
3
+ /** Resolve `source_kind` for a graph row from AT LEAST ONE valid provenance path, mirroring the DB trigger guard; raw is rejected.
4
+ * MEMORY path: exists, same-tenant, consolidated. OBJECT path (`memoryId` null): same-tenant, active|superseded, yields 'distilled'. All-null is rejected. */
14
5
  interface ResolvedGraphSource {
15
6
  sourceKind: SourceKind;
16
7
  memoryId: string | null;
17
8
  }
18
9
  export declare function resolveConsolidatedSource(db: DatabaseSyncLike, tenantId: string, memoryId: string | null, sourceObject: SourceObjectRef | null, label: string): ResolvedGraphSource;
19
- /**
20
- * Insert a graph entity extracted from a consolidated memory. Throws if the source
21
- * memory is missing / cross-tenant / raw (the DB trigger is the backstop).
22
- */
23
- export declare function insertEntity(hippoRoot: string, tenantId: string, opts: InsertEntityOpts, txDb?: DatabaseSyncLike): Entity;
24
- /** Renames an entity or moves its memory provenance in place, keeping id and created_at; null when the row is gone.
10
+ /** Insert a graph entity on the caller's handle; throws if the source memory is missing / cross-tenant / raw (the DB trigger is the backstop). */
11
+ export declare function insertEntityRow(db: DatabaseSyncLike, tenantId: string, opts: InsertEntityOpts): Entity;
12
+ /** Renames an entity or moves its memory provenance in place on the caller's handle, keeping id and created_at; null when the row is gone.
25
13
  * A delete plus an insert would cascade away every relation that points at it. */
26
- export declare function updateEntity(hippoRoot: string, tenantId: string, id: number, opts: UpdateEntityOpts, txDb?: DatabaseSyncLike): Entity | null;
27
- /**
28
- * Insert a graph relation between two entities, sourced from a consolidated memory.
29
- * Both entities must exist in the same tenant; the source memory must be consolidated.
30
- */
31
- export declare function insertRelation(hippoRoot: string, tenantId: string, opts: InsertRelationOpts, txDb?: DatabaseSyncLike): Relation;
14
+ export declare function updateEntityRow(db: DatabaseSyncLike, tenantId: string, id: number, opts: UpdateEntityOpts): Entity | null;
15
+ /** Insert a graph relation between two same-tenant entities on the caller's handle, sourced from a consolidated memory. */
16
+ export declare function insertRelationRow(db: DatabaseSyncLike, tenantId: string, opts: InsertRelationOpts): Relation;
32
17
  /** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph row. */
33
18
  export declare function objectInForce(db: DatabaseSyncLike, tenantId: string, ref: SourceObjectRef): boolean;
34
19
  /** The lowest-id entity of this type anchored to the source object, which is the row a rebuild keeps. */
@@ -41,18 +26,8 @@ export declare function deleteRelationRow(db: DatabaseSyncLike, tenantId: string
41
26
  export declare function runGraphRebuildTransaction<T>(hippoRoot: string, tenantId: string, fn: (txDb: DatabaseSyncLike) => T, opts?: {
42
27
  busyWaitMs?: number;
43
28
  }): T;
44
- /**
45
- * Remove the graph rows sourced from one first-class object, by its (type, id). Used when a
46
- * MIRRORLESS object is closed: it has no mirror memory, so `markGraphDirty` cannot
47
- * enqueue a rebuild (the queue is memory-keyed). Closing must still drop the object's
48
- * now-stale entity + edges from the graph, so we remove them directly here. Fail-soft
49
- * like `markGraphDirty` (never throws into the object close caller; graph staleness is
50
- * recoverable). Deleting the entity cascade-deletes any relation where it is an endpoint
51
- * (relations FK entities ON DELETE CASCADE); the explicit relations DELETE also covers a
52
- * relation whose OWN provenance is this object (defensive — every such edge has the object
53
- * as an endpoint today, so the cascade already covers it). DELETE fires no BEFORE
54
- * INSERT/UPDATE guard trigger.
55
- */
29
+ /** Remove graph rows sourced from one MIRRORLESS object by (type, id) on close: with no mirror memory `markGraphDirty` cannot enqueue a rebuild.
30
+ * Fail-soft like `markGraphDirty`; the explicit relations DELETE also covers a relation whose OWN provenance is this object. */
56
31
  export declare function removeGraphEntitiesForObject(hippoRoot: string, tenantId: string, sourceObjectType: SourceObjectType, sourceObjectId: number): void;
57
32
  export {};
58
33
  //# sourceMappingURL=graph-writes.d.ts.map
@@ -1,6 +1,7 @@
1
1
  // The writer of the entities and relations tables. Every row resolves a consolidated source first, never a raw memory;
2
2
  // the schema triggers are the backstop for a write that skips this module.
3
3
  import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
4
+ import { onHandle } from './open.js';
4
5
  import { assertTenantId } from './tenant.js';
5
6
  import { errorMessage, log } from '../util/log.js';
6
7
  import { GRAPH_ENTITY_TYPES, GRAPH_RELATION_TYPES, MAX_ENTITY_NAME_LEN, rowToEntity, rowToRelation, ENTITY_COLS, RELATION_COLS } from './graph-rows.js';
@@ -29,10 +30,8 @@ function checkSourceMemory(db, tenantId, memoryId, sourceObject, label) {
29
30
  // the SELECT above.
30
31
  const row = db.prepare(`SELECT kind, tenant_id FROM memories WHERE id = ?`).get(memoryId);
31
32
  if (!row) {
32
- // Stale / forgotten mirror. Tolerate it IFF a valid source object provides provenance:
33
- // graph-extract reads object rows then inserts, and a mirror forgotten/pruned in that window
34
- // must NOT roll back the whole tenant rebuild - the active object survives mirror loss.
35
- // Anchor to the object; drop the dead memory pointer.
33
+ // Stale/forgotten mirror: tolerate it IFF a valid source object gives provenance, so a mirror pruned mid graph-extract does not roll back the tenant
34
+ // rebuild; anchor to the object and drop the dead memory pointer.
36
35
  if (sourceObject == null) {
37
36
  throw new Error(`${label}: source memory ${memoryId} not found`);
38
37
  }
@@ -54,18 +53,15 @@ function checkSourceMemory(db, tenantId, memoryId, sourceObject, label) {
54
53
  return { memKind, effectiveMemoryId };
55
54
  }
56
55
  function assertSourceObjectUsable(db, tenantId, sourceObject, label) {
57
- // Validate the object pointer WHENEVER it is provided, not only when memory is null:
58
- // a dual-set row whose object is wrong/closed/cross-tenant would become
59
- // the active provenance after ON DELETE SET NULL and could then block the memory delete.
56
+ // Validate the object pointer WHENEVER provided: a dual-set row with a bad object would become the provenance after ON DELETE SET NULL and could block
57
+ // the memory delete.
60
58
  if (sourceObject != null) {
61
59
  const table = SOURCE_OBJECT_TABLE[sourceObject.type];
62
60
  if (!table) {
63
61
  throw new Error(`${label}: unsupported source_object_type '${sourceObject.type}'`);
64
62
  }
65
- // `table` is a fixed value from the SOURCE_OBJECT_TABLE map (never user-supplied), so
66
- // this string interpolation is safe; `id`/`tenant_id` stay parametrized.
67
- // SAFETY: row's shape matches the single `status` column named in the
68
- // SELECT above.
63
+ // `table` is a fixed SOURCE_OBJECT_TABLE value (never user-supplied), so interpolation is safe; `id`/`tenant_id` stay parametrized.
64
+ // SAFETY: row's shape matches the single `status` column named in the SELECT above.
69
65
  const row = db.prepare(`SELECT status FROM ${table} WHERE id = ? AND tenant_id = ?`).get(sourceObject.id, tenantId);
70
66
  if (!row) {
71
67
  throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} not found for tenant ${tenantId}`);
@@ -75,11 +71,8 @@ function assertSourceObjectUsable(db, tenantId, sourceObject, label) {
75
71
  }
76
72
  }
77
73
  }
78
- /**
79
- * Insert a graph entity extracted from a consolidated memory. Throws if the source
80
- * memory is missing / cross-tenant / raw (the DB trigger is the backstop).
81
- */
82
- export function insertEntity(hippoRoot, tenantId, opts, txDb) {
74
+ /** Insert a graph entity on the caller's handle; throws if the source memory is missing / cross-tenant / raw (the DB trigger is the backstop). */
75
+ export function insertEntityRow(db, tenantId, opts) {
83
76
  assertTenantId('insertEntity', tenantId);
84
77
  if (!GRAPH_ENTITY_TYPES.has(opts.entityType)) {
85
78
  throw new Error(`insertEntity: entityType must be one of ${Array.from(GRAPH_ENTITY_TYPES).join('|')}; got ${opts.entityType}`);
@@ -88,25 +81,17 @@ export function insertEntity(hippoRoot, tenantId, opts, txDb) {
88
81
  const now = new Date().toISOString();
89
82
  const memoryId = opts.memoryId ?? null;
90
83
  const sourceObject = opts.sourceObject ?? null;
91
- const ownDb = txDb ? null : openHippoDb(hippoRoot);
92
- const db = txDb ?? ownDb;
93
- try {
94
- const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertEntity');
95
- const result = db.prepare(`
96
- INSERT INTO entities(tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at)
97
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
98
- `).run(tenantId, opts.entityType, name, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
99
- const id = Number(result.lastInsertRowid ?? 0);
100
- // SAFETY: row's shape matches the columns named in ENTITY_COLS above.
101
- const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ?`).get(id);
102
- if (!row)
103
- throw new Error('insertEntity: failed to reload inserted entity');
104
- return rowToEntity(row);
105
- }
106
- finally {
107
- if (ownDb)
108
- closeHippoDb(ownDb);
109
- }
84
+ const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertEntity');
85
+ const result = db.prepare(`
86
+ INSERT INTO entities(tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at)
87
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
88
+ `).run(tenantId, opts.entityType, name, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
89
+ const id = Number(result.lastInsertRowid ?? 0);
90
+ // SAFETY: row's shape matches the columns named in ENTITY_COLS above.
91
+ const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ?`).get(id);
92
+ if (!row)
93
+ throw new Error('insertEntity: failed to reload inserted entity');
94
+ return rowToEntity(row);
110
95
  }
111
96
  function checkedName(label, raw) {
112
97
  const name = (raw ?? '').trim();
@@ -117,36 +102,26 @@ function checkedName(label, raw) {
117
102
  }
118
103
  return name;
119
104
  }
120
- /** Renames an entity or moves its memory provenance in place, keeping id and created_at; null when the row is gone.
105
+ /** Renames an entity or moves its memory provenance in place on the caller's handle, keeping id and created_at; null when the row is gone.
121
106
  * A delete plus an insert would cascade away every relation that points at it. */
122
- export function updateEntity(hippoRoot, tenantId, id, opts, txDb) {
107
+ export function updateEntityRow(db, tenantId, id, opts) {
123
108
  assertTenantId('updateEntity', tenantId);
124
109
  const name = checkedName('updateEntity', opts.name);
125
- const db = txDb ?? openHippoDb(hippoRoot);
126
- try {
127
- // SAFETY: row's shape matches the columns named in ENTITY_COLS above.
128
- const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
129
- if (!row)
130
- return null;
131
- const entity = rowToEntity(row);
132
- const sourceObject = entity.sourceObjectType === undefined || entity.sourceObjectId === undefined
133
- ? null
134
- : { type: entity.sourceObjectType, id: entity.sourceObjectId };
135
- const resolved = resolveConsolidatedSource(db, tenantId, opts.memoryId ?? null, sourceObject, 'updateEntity');
136
- db.prepare(`UPDATE entities SET name = ?, memory_id = ?, source_kind = ? WHERE id = ? AND tenant_id = ?`)
137
- .run(name, resolved.memoryId, resolved.sourceKind, id, tenantId);
138
- return { ...entity, name, memoryId: resolved.memoryId, sourceKind: resolved.sourceKind };
139
- }
140
- finally {
141
- if (db !== txDb)
142
- closeHippoDb(db);
143
- }
110
+ // SAFETY: row's shape matches the columns named in ENTITY_COLS above.
111
+ const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
112
+ if (!row)
113
+ return null;
114
+ const entity = rowToEntity(row);
115
+ const sourceObject = entity.sourceObjectType === undefined || entity.sourceObjectId === undefined
116
+ ? null
117
+ : { type: entity.sourceObjectType, id: entity.sourceObjectId };
118
+ const resolved = resolveConsolidatedSource(db, tenantId, opts.memoryId ?? null, sourceObject, 'updateEntity');
119
+ db.prepare(`UPDATE entities SET name = ?, memory_id = ?, source_kind = ? WHERE id = ? AND tenant_id = ?`)
120
+ .run(name, resolved.memoryId, resolved.sourceKind, id, tenantId);
121
+ return { ...entity, name, memoryId: resolved.memoryId, sourceKind: resolved.sourceKind };
144
122
  }
145
- /**
146
- * Insert a graph relation between two entities, sourced from a consolidated memory.
147
- * Both entities must exist in the same tenant; the source memory must be consolidated.
148
- */
149
- export function insertRelation(hippoRoot, tenantId, opts, txDb) {
123
+ /** Insert a graph relation between two same-tenant entities on the caller's handle, sourced from a consolidated memory. */
124
+ export function insertRelationRow(db, tenantId, opts) {
150
125
  assertTenantId('insertRelation', tenantId);
151
126
  if (!GRAPH_RELATION_TYPES.has(opts.relType)) {
152
127
  throw new Error(`insertRelation: relType must be one of ${Array.from(GRAPH_RELATION_TYPES).join('|')}; got ${opts.relType}`);
@@ -154,35 +129,27 @@ export function insertRelation(hippoRoot, tenantId, opts, txDb) {
154
129
  const now = new Date().toISOString();
155
130
  const memoryId = opts.memoryId ?? null;
156
131
  const sourceObject = opts.sourceObject ?? null;
157
- const ownDb = txDb ? null : openHippoDb(hippoRoot);
158
- const db = txDb ?? ownDb;
159
- try {
160
- for (const [eid, role] of [[opts.fromEntityId, 'from'], [opts.toEntityId, 'to']]) {
161
- // SAFETY: ent's shape matches the single `tenant_id` column named in
162
- // the SELECT above.
163
- const ent = db.prepare(`SELECT tenant_id FROM entities WHERE id = ?`).get(eid);
164
- if (!ent)
165
- throw new Error(`insertRelation: ${role}_entity ${eid} not found`);
166
- if (ent.tenant_id !== tenantId) {
167
- throw new Error(`insertRelation: ${role}_entity ${eid} belongs to another tenant (no cross-tenant edges)`);
168
- }
132
+ for (const [eid, role] of [[opts.fromEntityId, 'from'], [opts.toEntityId, 'to']]) {
133
+ // SAFETY: ent's shape matches the single `tenant_id` column named in
134
+ // the SELECT above.
135
+ const ent = db.prepare(`SELECT tenant_id FROM entities WHERE id = ?`).get(eid);
136
+ if (!ent)
137
+ throw new Error(`insertRelation: ${role}_entity ${eid} not found`);
138
+ if (ent.tenant_id !== tenantId) {
139
+ throw new Error(`insertRelation: ${role}_entity ${eid} belongs to another tenant (no cross-tenant edges)`);
169
140
  }
170
- const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertRelation');
171
- const result = db.prepare(`
172
- INSERT INTO relations(tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at)
173
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
174
- `).run(tenantId, opts.fromEntityId, opts.toEntityId, opts.relType, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
175
- const id = Number(result.lastInsertRowid ?? 0);
176
- // SAFETY: row's shape matches the columns named in RELATION_COLS above.
177
- const row = db.prepare(`SELECT ${RELATION_COLS} FROM relations WHERE id = ?`).get(id);
178
- if (!row)
179
- throw new Error('insertRelation: failed to reload inserted relation');
180
- return rowToRelation(row);
181
- }
182
- finally {
183
- if (ownDb)
184
- closeHippoDb(ownDb);
185
141
  }
142
+ const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertRelation');
143
+ const result = db.prepare(`
144
+ INSERT INTO relations(tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at)
145
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
146
+ `).run(tenantId, opts.fromEntityId, opts.toEntityId, opts.relType, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
147
+ const id = Number(result.lastInsertRowid ?? 0);
148
+ // SAFETY: row's shape matches the columns named in RELATION_COLS above.
149
+ const row = db.prepare(`SELECT ${RELATION_COLS} FROM relations WHERE id = ?`).get(id);
150
+ if (!row)
151
+ throw new Error('insertRelation: failed to reload inserted relation');
152
+ return rowToRelation(row);
186
153
  }
187
154
  /** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph row. */
188
155
  export function objectInForce(db, tenantId, ref) {
@@ -221,33 +188,19 @@ export function runGraphRebuildTransaction(hippoRoot, tenantId, fn, opts) {
221
188
  closeHippoDb(db);
222
189
  }
223
190
  }
224
- /**
225
- * Remove the graph rows sourced from one first-class object, by its (type, id). Used when a
226
- * MIRRORLESS object is closed: it has no mirror memory, so `markGraphDirty` cannot
227
- * enqueue a rebuild (the queue is memory-keyed). Closing must still drop the object's
228
- * now-stale entity + edges from the graph, so we remove them directly here. Fail-soft
229
- * like `markGraphDirty` (never throws into the object close caller; graph staleness is
230
- * recoverable). Deleting the entity cascade-deletes any relation where it is an endpoint
231
- * (relations FK entities ON DELETE CASCADE); the explicit relations DELETE also covers a
232
- * relation whose OWN provenance is this object (defensive — every such edge has the object
233
- * as an endpoint today, so the cascade already covers it). DELETE fires no BEFORE
234
- * INSERT/UPDATE guard trigger.
235
- */
191
+ /** Remove graph rows sourced from one MIRRORLESS object by (type, id) on close: with no mirror memory `markGraphDirty` cannot enqueue a rebuild.
192
+ * Fail-soft like `markGraphDirty`; the explicit relations DELETE also covers a relation whose OWN provenance is this object. */
236
193
  export function removeGraphEntitiesForObject(hippoRoot, tenantId, sourceObjectType, sourceObjectId) {
237
194
  try {
238
195
  assertTenantId('removeGraphEntitiesForObject', tenantId);
239
- const db = openHippoDb(hippoRoot);
240
- try {
196
+ onHandle(hippoRoot, (db) => {
241
197
  withWriteScope(db, 'remove_graph_entities', () => {
242
198
  db.prepare(`DELETE FROM relations WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
243
199
  .run(tenantId, sourceObjectType, sourceObjectId);
244
200
  db.prepare(`DELETE FROM entities WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
245
201
  .run(tenantId, sourceObjectType, sourceObjectId);
246
202
  });
247
- }
248
- finally {
249
- closeHippoDb(db);
250
- }
203
+ });
251
204
  }
252
205
  catch (err) {
253
206
  log.warn(`removeGraphEntitiesForObject: failed for tenant=${tenantId} ${sourceObjectType}#${sourceObjectId}: ${errorMessage(err)}`);
@@ -20,7 +20,8 @@ export interface HalfLifeMove {
20
20
  }
21
21
  /** The base this store's memories are on: 7 days when none was ever recorded. */
22
22
  export declare function recordedHalfLifeBase(hippoRoot: string): number;
23
- /** Moves the store's half-lives to base `to` as `plan` decides from the rows read here, then records the base. `outcome` is null when no move is due; a dry run plans and writes nothing. */
23
+ /** Moves the store's half-lives to base `to` as `plan` decides from the rows read here, then
24
+ * records the base. `outcome` is null when no move is due; a dry run plans and writes nothing. */
24
25
  export declare function moveHalfLives<R>(hippoRoot: string, to: number, opts: {
25
26
  dryRun: boolean;
26
27
  actor: string;
@@ -1,10 +1,10 @@
1
1
  // A half-life move reads, writes, audits and records its base on one handle, so it commits whole or not at all.
2
- import { closeHippoDb, getMeta, openHippoDb, setMeta, withWriteScope } from '../db/index.js';
2
+ import { getMeta, setMeta, withWriteScope } from '../db/index.js';
3
3
  import { appendAuditEvent } from './audit.js';
4
4
  import { conflictResolveAuditsAt, resolvedConflictsAt } from './conflicts.js';
5
5
  import { objectMemoryRowsAt, selectAllEntries } from './entry-reads.js';
6
6
  import { setHalfLivesAt } from './entry-writes.js';
7
- import { HALF_LIFE_BASE_META_KEY, TYPED_HALF_LIFE_META_KEY, openStore } from './open.js';
7
+ import { onHandle, HALF_LIFE_BASE_META_KEY, TYPED_HALF_LIFE_META_KEY, openStore } from './open.js';
8
8
  /** The base every store used before the base was recorded. */
9
9
  const LEGACY_HALF_LIFE_BASE = 7;
10
10
  function readBase(db) {
@@ -13,13 +13,9 @@ function readBase(db) {
13
13
  }
14
14
  /** The base this store's memories are on: 7 days when none was ever recorded. */
15
15
  export function recordedHalfLifeBase(hippoRoot) {
16
- const db = openHippoDb(hippoRoot);
17
- try {
16
+ return onHandle(hippoRoot, (db) => {
18
17
  return readBase(db);
19
- }
20
- finally {
21
- closeHippoDb(db);
22
- }
18
+ });
23
19
  }
24
20
  function readRows(db, from, typedPending) {
25
21
  const all = selectAllEntries(db);
@@ -44,13 +40,18 @@ function writeMove(db, move, old, actor) {
44
40
  record[e.id] = old.get(e.id);
45
41
  }
46
42
  for (const [tenantId, oldHalfLives] of byTenant) {
47
- appendAuditEvent(db, { tenantId, actor, op: 'half_life_migrate', metadata: { from: move.from, to: move.to, ids: Object.keys(oldHalfLives), oldHalfLives } });
43
+ appendAuditEvent(db, {
44
+ tenantId,
45
+ actor,
46
+ op: 'half_life_migrate',
47
+ metadata: { from: move.from, to: move.to, ids: Object.keys(oldHalfLives), oldHalfLives }
48
+ });
48
49
  }
49
50
  }
50
- /** Moves the store's half-lives to base `to` as `plan` decides from the rows read here, then records the base. `outcome` is null when no move is due; a dry run plans and writes nothing. */
51
+ /** Moves the store's half-lives to base `to` as `plan` decides from the rows read here, then
52
+ * records the base. `outcome` is null when no move is due; a dry run plans and writes nothing. */
51
53
  export function moveHalfLives(hippoRoot, to, opts, plan) {
52
- const db = openStore(hippoRoot);
53
- try {
54
+ return onHandle(hippoRoot, (db) => {
54
55
  const run = () => {
55
56
  const from = readBase(db);
56
57
  const typedPending = getMeta(db, TYPED_HALF_LIFE_META_KEY, '') === '';
@@ -69,9 +70,6 @@ export function moveHalfLives(hippoRoot, to, opts, plan) {
69
70
  };
70
71
  // Plan, write, audit and record the base under one write lock, so a concurrent write or sleep cannot interleave.
71
72
  return opts.dryRun ? run() : withWriteScope(db, 'migrate_half_life', run);
72
- }
73
- finally {
74
- closeHippoDb(db);
75
- }
73
+ }, openStore);
76
74
  }
77
75
  //# sourceMappingURL=half-life.js.map