hippo-memory 2.0.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 (965) hide show
  1. package/dist/agent-memories/apply.d.ts +7 -5
  2. package/dist/agent-memories/apply.js +66 -39
  3. package/dist/agent-memories/claude-code.d.ts +8 -2
  4. package/dist/agent-memories/claude-code.js +26 -7
  5. package/dist/agent-memories/copilot.js +2 -1
  6. package/dist/agent-memories/files.js +2 -1
  7. package/dist/agent-memories/legacy.d.ts +6 -3
  8. package/dist/agent-memories/legacy.js +35 -14
  9. package/dist/agent-memories/markdown.d.ts +3 -1
  10. package/dist/agent-memories/markdown.js +3 -1
  11. package/dist/agent-memories/openclaw.js +5 -2
  12. package/dist/agent-memories/plan.js +11 -1
  13. package/dist/agent-memories/project-folds.js +2 -1
  14. package/dist/agent-memories/report.d.ts +4 -1
  15. package/dist/agent-memories/report.js +43 -9
  16. package/dist/agent-memories/source.d.ts +8 -2
  17. package/dist/agent-memories/source.js +11 -3
  18. package/dist/agent-memories/sync.d.ts +7 -2
  19. package/dist/agent-memories/sync.js +141 -101
  20. package/dist/api/assemble.d.ts +6 -4
  21. package/dist/api/assemble.js +11 -6
  22. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  23. package/dist/api/{audit.js → auth/audit.js} +11 -11
  24. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
  25. package/dist/api/{auth.js → auth/auth.js} +46 -29
  26. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  27. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
  28. package/dist/api/auth/session-owners.d.ts +10 -0
  29. package/dist/api/auth/session-owners.js +35 -0
  30. package/dist/api/availability.d.ts +3 -1
  31. package/dist/api/availability.js +3 -1
  32. package/dist/api/busy.d.ts +2 -0
  33. package/dist/api/busy.js +2 -0
  34. package/dist/api/cli-surface.d.ts +6 -0
  35. package/dist/api/cli-surface.js +6 -0
  36. package/dist/api/config-of.d.ts +5 -0
  37. package/dist/api/config-of.js +6 -0
  38. package/dist/api/context-auto.d.ts +4 -1
  39. package/dist/api/context-auto.js +10 -2
  40. package/dist/api/context-render.js +14 -7
  41. package/dist/api/context-select.d.ts +4 -1
  42. package/dist/api/context-select.js +23 -14
  43. package/dist/api/context-types.d.ts +38 -12
  44. package/dist/api/context.d.ts +8 -5
  45. package/dist/api/context.js +112 -57
  46. package/dist/api/continuity.d.ts +24 -21
  47. package/dist/api/continuity.js +18 -20
  48. package/dist/api/correction-latency.d.ts +3 -1
  49. package/dist/api/correction-latency.js +3 -1
  50. package/dist/api/error-reply.d.ts +4 -1
  51. package/dist/api/error-reply.js +12 -3
  52. package/dist/api/index.d.ts +39 -23
  53. package/dist/api/index.js +21 -23
  54. package/dist/api/instruction-detect.d.ts +4 -1
  55. package/dist/api/instruction-detect.js +75 -20
  56. package/dist/api/ledger-db.d.ts +15 -11
  57. package/dist/api/ledger-db.js +21 -23
  58. package/dist/api/memories/conflicts.d.ts +33 -0
  59. package/dist/api/memories/conflicts.js +67 -0
  60. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  61. package/dist/api/{forget.js → memories/forget.js} +22 -15
  62. package/dist/api/memories/memories.d.ts +27 -0
  63. package/dist/api/{memories.js → memories/memories.js} +16 -21
  64. package/dist/api/memories/outcome.d.ts +22 -0
  65. package/dist/api/{outcome.js → memories/outcome.js} +14 -8
  66. package/dist/api/memories/promote.d.ts +40 -0
  67. package/dist/api/{promote.js → memories/promote.js} +35 -22
  68. package/dist/api/memories/refine.d.ts +10 -0
  69. package/dist/api/memories/refine.js +12 -0
  70. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
  71. package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
  72. package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
  73. package/dist/api/{remember.js → memories/remember.js} +42 -26
  74. package/dist/api/objects/cards.d.ts +39 -0
  75. package/dist/api/{cards.js → objects/cards.js} +12 -14
  76. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  77. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
  78. package/dist/api/objects/goals.d.ts +18 -0
  79. package/dist/api/{goals.js → objects/goals.js} +12 -12
  80. package/dist/api/objects/graph.d.ts +11 -0
  81. package/dist/api/objects/graph.js +16 -0
  82. package/dist/api/objects/objects.d.ts +9 -0
  83. package/dist/api/{objects.js → objects/objects.js} +2 -4
  84. package/dist/api/objects/predictions.d.ts +11 -0
  85. package/dist/api/{predictions.js → objects/predictions.js} +7 -6
  86. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  87. package/dist/api/{projects.js → objects/projects.js} +8 -4
  88. package/dist/api/pilot-arm.d.ts +8 -4
  89. package/dist/api/pilot-arm.js +5 -4
  90. package/dist/api/prompt-hook.d.ts +32 -19
  91. package/dist/api/prompt-hook.js +65 -44
  92. package/dist/api/provenance-coverage.d.ts +3 -1
  93. package/dist/api/provenance-coverage.js +3 -1
  94. package/dist/api/recall/finish.d.ts +185 -0
  95. package/dist/api/recall/finish.js +301 -0
  96. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  97. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
  98. package/dist/api/recall/recall.d.ts +6 -0
  99. package/dist/api/{recall.js → recall/recall.js} +101 -60
  100. package/dist/api/recall/render.d.ts +39 -0
  101. package/dist/api/recall/render.js +60 -0
  102. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  103. package/dist/api/recall/request.js +261 -0
  104. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  105. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  106. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
  107. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  108. package/dist/api/session-end.d.ts +16 -12
  109. package/dist/api/session-end.js +46 -30
  110. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  111. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  112. package/dist/api/sleep/dormant.d.ts +25 -0
  113. package/dist/api/sleep/dormant.js +64 -0
  114. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  115. package/dist/api/sleep/learn.js +138 -0
  116. package/dist/api/sleep/sleep-run.d.ts +38 -0
  117. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
  118. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  119. package/dist/api/sleep/sleep.js +9 -0
  120. package/dist/api/status.d.ts +3 -1
  121. package/dist/api/status.js +3 -1
  122. package/dist/api/store-init.d.ts +4 -1
  123. package/dist/api/store-init.js +4 -1
  124. package/dist/api/tokens.d.ts +10 -9
  125. package/dist/api/tokens.js +9 -10
  126. package/dist/api/types.d.ts +28 -7
  127. package/dist/api/types.js +13 -4
  128. package/dist/capture/caller-session.d.ts +8 -2
  129. package/dist/capture/caller-session.js +16 -6
  130. package/dist/capture/capture-error.d.ts +3 -1
  131. package/dist/capture/capture-error.js +3 -1
  132. package/dist/capture/codex-patch.js +7 -2
  133. package/dist/capture/command.d.ts +4 -2
  134. package/dist/capture/command.js +33 -14
  135. package/dist/capture/compact-resume-caller.js +15 -8
  136. package/dist/capture/compact.d.ts +8 -5
  137. package/dist/capture/compact.js +34 -23
  138. package/dist/capture/compaction-items-caller.js +9 -3
  139. package/dist/capture/compaction-record.d.ts +4 -3
  140. package/dist/capture/compaction-record.js +20 -12
  141. package/dist/capture/compaction-spool.d.ts +15 -4
  142. package/dist/capture/compaction-spool.js +64 -17
  143. package/dist/capture/copilot-transcript.d.ts +11 -3
  144. package/dist/capture/copilot-transcript.js +16 -6
  145. package/dist/capture/extract.js +20 -8
  146. package/dist/capture/failure-caller.js +23 -12
  147. package/dist/capture/failure-reading.d.ts +10 -3
  148. package/dist/capture/failure-reading.js +24 -7
  149. package/dist/capture/pre-compact-caller.js +11 -4
  150. package/dist/capture/session-digest.d.ts +15 -4
  151. package/dist/capture/session-digest.js +39 -13
  152. package/dist/capture/session-end-caller.d.ts +4 -1
  153. package/dist/capture/session-end-caller.js +20 -8
  154. package/dist/capture/session-texts.d.ts +6 -2
  155. package/dist/capture/session-texts.js +22 -7
  156. package/dist/capture/session-worker.d.ts +4 -2
  157. package/dist/capture/session-worker.js +45 -17
  158. package/dist/capture/transcript.d.ts +13 -4
  159. package/dist/capture/transcript.js +32 -10
  160. package/dist/capture/working-state.d.ts +13 -4
  161. package/dist/capture/working-state.js +50 -56
  162. package/dist/cli/api-context.d.ts +14 -2
  163. package/dist/cli/api-context.js +45 -2
  164. package/dist/cli/audit.js +23 -23
  165. package/dist/cli/auth.js +19 -27
  166. package/dist/cli/briefs.d.ts +1 -1
  167. package/dist/cli/briefs.js +20 -15
  168. package/dist/cli/card.d.ts +1 -1
  169. package/dist/cli/card.js +56 -73
  170. package/dist/cli/client.d.ts +12 -4
  171. package/dist/cli/client.js +43 -13
  172. package/dist/cli/compact-resume-payload.d.ts +4 -1
  173. package/dist/cli/compact-resume-payload.js +12 -5
  174. package/dist/cli/context.js +42 -17
  175. package/dist/cli/continuity.d.ts +5 -5
  176. package/dist/cli/continuity.js +90 -107
  177. package/dist/cli/curate.d.ts +4 -3
  178. package/dist/cli/curate.js +46 -68
  179. package/dist/cli/dag.d.ts +1 -1
  180. package/dist/cli/dag.js +14 -17
  181. package/dist/cli/decisions.js +27 -26
  182. package/dist/cli/eval.js +16 -21
  183. package/dist/cli/exit.d.ts +4 -1
  184. package/dist/cli/exit.js +10 -2
  185. package/dist/cli/explain.js +12 -11
  186. package/dist/cli/flag-values.d.ts +1 -1
  187. package/dist/cli/flag-values.js +9 -18
  188. package/dist/cli/github.d.ts +6 -0
  189. package/dist/cli/github.js +25 -13
  190. package/dist/cli/goals.d.ts +1 -1
  191. package/dist/cli/goals.js +39 -56
  192. package/dist/cli/graph.d.ts +1 -1
  193. package/dist/cli/graph.js +15 -11
  194. package/dist/cli/hook-runtime.d.ts +31 -9
  195. package/dist/cli/hook-runtime.js +40 -15
  196. package/dist/cli/incidents.d.ts +1 -1
  197. package/dist/cli/incidents.js +25 -25
  198. package/dist/cli/init.js +26 -11
  199. package/dist/cli/install-steps.d.ts +12 -3
  200. package/dist/cli/install-steps.js +42 -18
  201. package/dist/cli/last-sleep.d.ts +4 -1
  202. package/dist/cli/last-sleep.js +9 -4
  203. package/dist/cli/maintenance.d.ts +1 -1
  204. package/dist/cli/maintenance.js +11 -12
  205. package/dist/cli/notes.d.ts +1 -1
  206. package/dist/cli/notes.js +8 -5
  207. package/dist/cli/object-verbs.d.ts +4 -4
  208. package/dist/cli/object-verbs.js +10 -13
  209. package/dist/cli/open-browser.js +11 -2
  210. package/dist/cli/playbooks.d.ts +3 -3
  211. package/dist/cli/playbooks.js +40 -32
  212. package/dist/cli/predictions.js +15 -19
  213. package/dist/cli/print.js +4 -2
  214. package/dist/cli/projects.js +21 -11
  215. package/dist/cli/quality-repair-once.js +5 -4
  216. package/dist/cli/recall.js +129 -93
  217. package/dist/cli/refine-llm.d.ts +15 -4
  218. package/dist/cli/refine-llm.js +16 -7
  219. package/dist/cli/remember.js +46 -50
  220. package/dist/cli/scheduler.d.ts +4 -1
  221. package/dist/cli/scheduler.js +9 -5
  222. package/dist/cli/serve.js +22 -17
  223. package/dist/cli/session-hooks.d.ts +2 -2
  224. package/dist/cli/session-hooks.js +87 -50
  225. package/dist/cli/setup.js +54 -32
  226. package/dist/cli/shared.d.ts +3 -1
  227. package/dist/cli/shared.js +24 -9
  228. package/dist/cli/slack.js +15 -24
  229. package/dist/cli/sleep-render.d.ts +3 -1
  230. package/dist/cli/sleep-render.js +8 -5
  231. package/dist/cli/sleep.js +14 -6
  232. package/dist/cli/status.d.ts +4 -4
  233. package/dist/cli/status.js +32 -27
  234. package/dist/cli/stdin.d.ts +10 -3
  235. package/dist/cli/stdin.js +10 -3
  236. package/dist/cli/transfer.d.ts +1 -1
  237. package/dist/cli/transfer.js +71 -75
  238. package/dist/cli/verbs/memory.js +8 -6
  239. package/dist/cli/verbs/objects.js +10 -4
  240. package/dist/cli/versioned-verbs.d.ts +8 -7
  241. package/dist/cli/versioned-verbs.js +31 -21
  242. package/dist/cli.js +13 -16
  243. package/dist/connectors/dlq.d.ts +6 -6
  244. package/dist/connectors/dlq.js +12 -8
  245. package/dist/connectors/github/backfill.d.ts +4 -4
  246. package/dist/connectors/github/backfill.js +6 -4
  247. package/dist/connectors/github/deletion.d.ts +6 -4
  248. package/dist/connectors/github/deletion.js +5 -5
  249. package/dist/connectors/github/dlq.d.ts +8 -6
  250. package/dist/connectors/github/dlq.js +11 -5
  251. package/dist/connectors/github/ingest.d.ts +2 -2
  252. package/dist/connectors/github/ingest.js +9 -6
  253. package/dist/connectors/github/octokit-client.d.ts +3 -1
  254. package/dist/connectors/github/octokit-client.js +7 -2
  255. package/dist/connectors/github/ratelimit.d.ts +6 -2
  256. package/dist/connectors/github/ratelimit.js +6 -2
  257. package/dist/connectors/github/signature.d.ts +14 -3
  258. package/dist/connectors/github/signature.js +17 -3
  259. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  260. package/dist/connectors/github/tenant-routing.js +6 -6
  261. package/dist/connectors/github/transform.js +50 -67
  262. package/dist/connectors/github/types.d.ts +10 -3
  263. package/dist/connectors/github/types.js +6 -2
  264. package/dist/connectors/github/webhook.d.ts +5 -5
  265. package/dist/connectors/github/webhook.js +34 -23
  266. package/dist/connectors/ingest.d.ts +5 -3
  267. package/dist/connectors/ingest.js +3 -4
  268. package/dist/connectors/slack/backfill.d.ts +5 -5
  269. package/dist/connectors/slack/backfill.js +3 -3
  270. package/dist/connectors/slack/deletion.d.ts +4 -4
  271. package/dist/connectors/slack/deletion.js +6 -6
  272. package/dist/connectors/slack/dlq.d.ts +4 -4
  273. package/dist/connectors/slack/dlq.js +6 -6
  274. package/dist/connectors/slack/ingest.d.ts +6 -4
  275. package/dist/connectors/slack/ingest.js +5 -5
  276. package/dist/connectors/slack/signature.d.ts +4 -1
  277. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  278. package/dist/connectors/slack/tenant-routing.js +6 -6
  279. package/dist/connectors/slack/transform.d.ts +6 -2
  280. package/dist/connectors/slack/transform.js +6 -2
  281. package/dist/connectors/slack/types.d.ts +3 -1
  282. package/dist/connectors/slack/web-client.js +8 -3
  283. package/dist/connectors/slack/webhook.d.ts +5 -5
  284. package/dist/connectors/slack/webhook.js +19 -11
  285. package/dist/connectors/slack/workspaces.d.ts +7 -3
  286. package/dist/connectors/slack/workspaces.js +7 -3
  287. package/dist/connectors/store.d.ts +8 -0
  288. package/dist/connectors/store.js +2 -0
  289. package/dist/consolidate/conflicts.js +23 -9
  290. package/dist/consolidate/dag-summary.js +2 -1
  291. package/dist/consolidate/dag.d.ts +10 -5
  292. package/dist/consolidate/dag.js +37 -36
  293. package/dist/consolidate/decay.js +19 -6
  294. package/dist/consolidate/dedupe.d.ts +14 -5
  295. package/dist/consolidate/dedupe.js +27 -16
  296. package/dist/consolidate/flush-units.d.ts +4 -1
  297. package/dist/consolidate/flush-units.js +4 -1
  298. package/dist/consolidate/half-life-migration.d.ts +18 -8
  299. package/dist/consolidate/half-life-migration.js +48 -18
  300. package/dist/consolidate/llm-passes.js +27 -11
  301. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  302. package/dist/consolidate/memory-value-weights.js +6 -2
  303. package/dist/consolidate/memory-value.d.ts +30 -10
  304. package/dist/consolidate/memory-value.js +36 -13
  305. package/dist/consolidate/merge.d.ts +4 -1
  306. package/dist/consolidate/merge.js +42 -32
  307. package/dist/consolidate/overlap-index.d.ts +8 -2
  308. package/dist/consolidate/overlap-index.js +11 -4
  309. package/dist/consolidate/physics-pass.d.ts +3 -1
  310. package/dist/consolidate/physics-pass.js +10 -7
  311. package/dist/consolidate/replay.d.ts +11 -4
  312. package/dist/consolidate/replay.js +19 -7
  313. package/dist/consolidate/run.d.ts +13 -5
  314. package/dist/consolidate/run.js +4 -4
  315. package/dist/consolidate/sleep.d.ts +14 -6
  316. package/dist/consolidate/sleep.js +41 -38
  317. package/dist/consolidate/trace.d.ts +7 -2
  318. package/dist/consolidate/trace.js +7 -2
  319. package/dist/consolidate/traces.js +26 -29
  320. package/dist/core/ablation.d.ts +9 -3
  321. package/dist/core/ablation.js +14 -4
  322. package/dist/core/active-scope.d.ts +3 -1
  323. package/dist/core/active-scope.js +3 -1
  324. package/dist/core/agent-memory-tools.d.ts +2 -0
  325. package/dist/core/agent-memory-tools.js +2 -0
  326. package/dist/core/ambient.d.ts +4 -3
  327. package/dist/core/ambient.js +8 -6
  328. package/dist/core/api-errors.d.ts +9 -3
  329. package/dist/core/api-errors.js +9 -3
  330. package/dist/core/capture-contract.d.ts +4 -1
  331. package/dist/core/capture-contract.js +27 -8
  332. package/dist/core/compare.d.ts +24 -8
  333. package/dist/core/compare.js +24 -8
  334. package/dist/core/config.d.ts +18 -9
  335. package/dist/core/config.js +24 -14
  336. package/dist/core/cosine.d.ts +4 -1
  337. package/dist/core/cosine.js +4 -1
  338. package/dist/core/handoff.d.ts +7 -2
  339. package/dist/core/handoff.js +4 -1
  340. package/dist/core/markdown.js +21 -16
  341. package/dist/core/memory-audit.js +14 -3
  342. package/dist/core/memory-quality.d.ts +12 -3
  343. package/dist/core/memory-quality.js +57 -21
  344. package/dist/core/memory.d.ts +84 -27
  345. package/dist/core/memory.js +73 -29
  346. package/dist/core/merged-row.d.ts +8 -2
  347. package/dist/core/merged-row.js +10 -3
  348. package/dist/core/package-root.d.ts +3 -1
  349. package/dist/core/package-root.js +3 -1
  350. package/dist/core/particle-refresh.d.ts +8 -0
  351. package/dist/core/particle-refresh.js +22 -0
  352. package/dist/core/physics-config.d.ts +4 -1
  353. package/dist/core/physics-config.js +6 -2
  354. package/dist/core/physics.d.ts +37 -11
  355. package/dist/core/physics.js +55 -20
  356. package/dist/core/project-identity.d.ts +34 -17
  357. package/dist/core/project-identity.js +33 -17
  358. package/dist/core/project-remote.d.ts +8 -4
  359. package/dist/core/project-remote.js +31 -14
  360. package/dist/core/recall-scope.d.ts +33 -11
  361. package/dist/core/recall-scope.js +42 -15
  362. package/dist/core/rejection-digest.d.ts +7 -0
  363. package/dist/core/rejection-digest.js +13 -0
  364. package/dist/core/salience.d.ts +3 -1
  365. package/dist/core/salience.js +10 -4
  366. package/dist/core/search-types.d.ts +15 -2
  367. package/dist/core/search-types.js +11 -0
  368. package/dist/dashboard/dashboard-actions.js +13 -2
  369. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  370. package/dist/dashboard/dashboard-snapshot.js +4 -4
  371. package/dist/dashboard/dashboard.js +6 -3
  372. package/dist/db/backup.js +2 -2
  373. package/dist/db/busy.d.ts +10 -3
  374. package/dist/db/busy.js +27 -5
  375. package/dist/db/connect.d.ts +10 -3
  376. package/dist/db/connect.js +8 -3
  377. package/dist/db/continuity.d.ts +1 -1
  378. package/dist/db/continuity.js +27 -11
  379. package/dist/db/meta.d.ts +4 -1
  380. package/dist/db/meta.js +4 -1
  381. package/dist/db/migrate.d.ts +10 -5
  382. package/dist/db/migrate.js +26 -13
  383. package/dist/db/migrations/index.d.ts +1 -1
  384. package/dist/db/migrations/index.js +3 -1
  385. package/dist/db/migrations/types.d.ts +2 -1
  386. package/dist/db/migrations/v12.js +2 -1
  387. package/dist/db/migrations/v14.js +2 -1
  388. package/dist/db/migrations/v15.js +4 -2
  389. package/dist/db/migrations/v16.js +6 -3
  390. package/dist/db/migrations/v17.js +2 -1
  391. package/dist/db/migrations/v19.js +4 -2
  392. package/dist/db/migrations/v20.js +2 -1
  393. package/dist/db/migrations/v22.js +12 -6
  394. package/dist/db/migrations/v23.js +6 -3
  395. package/dist/db/migrations/v24.js +6 -3
  396. package/dist/db/migrations/v25.js +4 -2
  397. package/dist/db/migrations/v26.js +4 -2
  398. package/dist/db/migrations/v27.js +6 -3
  399. package/dist/db/migrations/v28.js +4 -2
  400. package/dist/db/migrations/v29.js +4 -2
  401. package/dist/db/migrations/v30.js +6 -3
  402. package/dist/db/migrations/v31.js +4 -2
  403. package/dist/db/migrations/v32.js +6 -3
  404. package/dist/db/migrations/v33.js +4 -2
  405. package/dist/db/migrations/v34.js +2 -1
  406. package/dist/db/migrations/v35.js +2 -1
  407. package/dist/db/migrations/v36.js +2 -1
  408. package/dist/db/migrations/v37.js +10 -5
  409. package/dist/db/migrations/v38.js +10 -5
  410. package/dist/db/migrations/v39.js +14 -6
  411. package/dist/db/migrations/v40.js +4 -2
  412. package/dist/db/migrations/v41.js +4 -2
  413. package/dist/db/migrations/v42.js +2 -1
  414. package/dist/db/migrations/v44.js +4 -2
  415. package/dist/db/migrations/v45.js +4 -2
  416. package/dist/db/migrations/v49.js +2 -1
  417. package/dist/db/migrations/v50.js +4 -2
  418. package/dist/db/migrations/v51.js +4 -2
  419. package/dist/db/migrations/v52.js +2 -1
  420. package/dist/db/migrations/v53.js +8 -4
  421. package/dist/db/migrations/v54.js +2 -1
  422. package/dist/db/migrations/v55.js +4 -2
  423. package/dist/db/migrations/v56.d.ts +3 -0
  424. package/dist/db/migrations/v56.js +28 -0
  425. package/dist/db/open.d.ts +24 -12
  426. package/dist/db/open.js +25 -13
  427. package/dist/db/physics-state.d.ts +8 -4
  428. package/dist/db/physics-state.js +13 -20
  429. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  430. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  431. package/dist/db/request-stores.d.ts +19 -5
  432. package/dist/db/request-stores.js +14 -5
  433. package/dist/db/tables.d.ts +2 -1
  434. package/dist/db/tables.js +12 -4
  435. package/dist/db/vector-store.d.ts +13 -4
  436. package/dist/db/vector-store.js +34 -14
  437. package/dist/db/wal-checkpointer.d.ts +2 -1
  438. package/dist/db/wal-checkpointer.js +19 -7
  439. package/dist/doctor.d.ts +4 -1
  440. package/dist/doctor.js +121 -39
  441. package/dist/embeddings/local.d.ts +8 -4
  442. package/dist/embeddings/local.js +9 -5
  443. package/dist/embeddings/provider.d.ts +19 -10
  444. package/dist/embeddings/provider.js +31 -17
  445. package/dist/embeddings/transformers.d.ts +16 -4
  446. package/dist/embeddings/transformers.js +32 -15
  447. package/dist/entry/json-hooks.d.ts +1 -1
  448. package/dist/entry/json-hooks.js +1 -1
  449. package/dist/entry/project-identity.js +2 -1
  450. package/dist/entry/session-text.d.ts +1 -1
  451. package/dist/entry/session-text.js +1 -1
  452. package/dist/entry/sqlite-handles.d.ts +10 -0
  453. package/dist/entry/sqlite-handles.js +9 -0
  454. package/dist/entry/store-kit.d.ts +19 -6
  455. package/dist/entry/store-kit.js +6 -4
  456. package/dist/eval/eval-stats.d.ts +27 -8
  457. package/dist/eval/eval-stats.js +17 -5
  458. package/dist/eval/eval-suite.d.ts +3 -1
  459. package/dist/eval/eval-suite.js +409 -187
  460. package/dist/eval/eval.d.ts +8 -2
  461. package/dist/eval/eval.js +8 -2
  462. package/dist/eval/judgment.js +16 -6
  463. package/dist/graph/delta.d.ts +9 -42
  464. package/dist/graph/delta.js +17 -11
  465. package/dist/graph/extract.d.ts +10 -7
  466. package/dist/graph/extract.js +57 -25
  467. package/dist/graph/recall.d.ts +12 -4
  468. package/dist/graph/recall.js +30 -13
  469. package/dist/graph/stream.d.ts +18 -6
  470. package/dist/graph/stream.js +32 -10
  471. package/dist/graph/view.d.ts +19 -6
  472. package/dist/graph/view.js +42 -17
  473. package/dist/hooks/codex-session.js +2 -2
  474. package/dist/hooks/codex-wrapper.d.ts +3 -1
  475. package/dist/hooks/codex-wrapper.js +9 -4
  476. package/dist/hooks/copilot.d.ts +19 -5
  477. package/dist/hooks/copilot.js +54 -15
  478. package/dist/hooks/hook-blocks.d.ts +4 -1
  479. package/dist/hooks/hook-blocks.js +8 -3
  480. package/dist/hooks/json-hooks.d.ts +9 -5
  481. package/dist/hooks/json-hooks.js +69 -34
  482. package/dist/hooks/opencode.js +15 -5
  483. package/dist/hooks/shared.d.ts +27 -8
  484. package/dist/hooks/shared.js +57 -16
  485. package/dist/importers/core.d.ts +12 -4
  486. package/dist/importers/core.js +8 -7
  487. package/dist/importers/markdown-parse.d.ts +15 -5
  488. package/dist/importers/markdown-parse.js +16 -7
  489. package/dist/importers/markdown.js +6 -9
  490. package/dist/importers/sources.js +10 -23
  491. package/dist/importers/vault.d.ts +2 -2
  492. package/dist/importers/vault.js +43 -27
  493. package/dist/index.d.ts +32 -6
  494. package/dist/index.js +25 -7
  495. package/dist/learn/autolearn.d.ts +17 -6
  496. package/dist/learn/autolearn.js +53 -24
  497. package/dist/learn/churn-git.d.ts +4 -1
  498. package/dist/learn/churn-git.js +29 -5
  499. package/dist/learn/extract.d.ts +4 -1
  500. package/dist/learn/extract.js +16 -9
  501. package/dist/learn/forward-claim-detector.d.ts +17 -5
  502. package/dist/learn/forward-claim-detector.js +34 -15
  503. package/dist/learn/invalidation.d.ts +12 -7
  504. package/dist/learn/invalidation.js +56 -27
  505. package/dist/learn/roots.d.ts +3 -0
  506. package/dist/learn/roots.js +5 -0
  507. package/dist/mcp/admin-tools.d.ts +5 -5
  508. package/dist/mcp/admin-tools.js +28 -23
  509. package/dist/mcp/format.d.ts +1 -1
  510. package/dist/mcp/format.js +4 -2
  511. package/dist/mcp/framing.d.ts +3 -1
  512. package/dist/mcp/framing.js +20 -8
  513. package/dist/mcp/memory-tools.d.ts +3 -3
  514. package/dist/mcp/memory-tools.js +18 -14
  515. package/dist/mcp/protocol.d.ts +32 -16
  516. package/dist/mcp/protocol.js +12 -9
  517. package/dist/mcp/recall-tools.d.ts +3 -3
  518. package/dist/mcp/recall-tools.js +62 -74
  519. package/dist/mcp/request.d.ts +7 -5
  520. package/dist/mcp/request.js +57 -74
  521. package/dist/mcp/server.d.ts +3 -1
  522. package/dist/mcp/server.js +8 -3
  523. package/dist/mcp/session-state.d.ts +1 -1
  524. package/dist/mcp/session-state.js +4 -3
  525. package/dist/mcp/shared-gate.d.ts +3 -2
  526. package/dist/mcp/shared-gate.js +3 -2
  527. package/dist/mcp/stdio.d.ts +6 -3
  528. package/dist/mcp/stdio.js +52 -21
  529. package/dist/mcp/tool-args.d.ts +4 -1
  530. package/dist/mcp/tool-args.js +8 -3
  531. package/dist/mcp/tools.js +76 -32
  532. package/dist/objects/customer-notes.d.ts +12 -10
  533. package/dist/objects/customer-notes.js +21 -15
  534. package/dist/objects/decisions.d.ts +18 -10
  535. package/dist/objects/decisions.js +23 -17
  536. package/dist/objects/descriptor.js +2 -1
  537. package/dist/objects/fields.d.ts +4 -1
  538. package/dist/objects/fields.js +6 -2
  539. package/dist/objects/incidents.d.ts +14 -16
  540. package/dist/objects/incidents.js +29 -30
  541. package/dist/objects/lifecycle.d.ts +0 -4
  542. package/dist/objects/lifecycle.js +21 -24
  543. package/dist/objects/policies.d.ts +12 -16
  544. package/dist/objects/policies.js +17 -21
  545. package/dist/objects/processes.d.ts +16 -10
  546. package/dist/objects/processes.js +20 -15
  547. package/dist/objects/project-briefs.d.ts +13 -14
  548. package/dist/objects/project-briefs.js +33 -39
  549. package/dist/objects/skills.d.ts +10 -12
  550. package/dist/objects/skills.js +17 -22
  551. package/dist/postinstall.js +15 -7
  552. package/dist/predictions/planning-fallacy.d.ts +19 -6
  553. package/dist/predictions/planning-fallacy.js +4 -2
  554. package/dist/rerankers/clef.d.ts +8 -2
  555. package/dist/rerankers/clef.js +14 -9
  556. package/dist/rerankers/cross-encoder.d.ts +2 -1
  557. package/dist/rerankers/cross-encoder.js +9 -6
  558. package/dist/rerankers/index.js +2 -1
  559. package/dist/rerankers/jev.js +2 -1
  560. package/dist/rerankers/llm.d.ts +6 -2
  561. package/dist/rerankers/llm.js +8 -3
  562. package/dist/rerankers/remote.d.ts +3 -1
  563. package/dist/rerankers/remote.js +5 -2
  564. package/dist/rerankers/types.d.ts +6 -2
  565. package/dist/search/bm25-search.d.ts +3 -1
  566. package/dist/search/bm25-search.js +15 -2
  567. package/dist/search/boosts.js +4 -3
  568. package/dist/search/embed-memories.d.ts +10 -5
  569. package/dist/search/embed-memories.js +62 -36
  570. package/dist/search/engine.d.ts +4 -1
  571. package/dist/search/engine.js +6 -2
  572. package/dist/search/goal-boost.d.ts +10 -3
  573. package/dist/search/goal-boost.js +13 -6
  574. package/dist/search/hybrid-score.d.ts +4 -1
  575. package/dist/search/hybrid-score.js +4 -1
  576. package/dist/search/hybrid.d.ts +23 -8
  577. package/dist/search/hybrid.js +12 -7
  578. package/dist/search/multihop.js +14 -13
  579. package/dist/search/path-context.d.ts +10 -3
  580. package/dist/search/path-context.js +10 -3
  581. package/dist/search/physics-search.d.ts +9 -4
  582. package/dist/search/physics-search.js +38 -14
  583. package/dist/search/rerank.d.ts +2 -1
  584. package/dist/search/rerank.js +2 -1
  585. package/dist/search/rrf.d.ts +14 -5
  586. package/dist/search/rrf.js +11 -4
  587. package/dist/search/vector.d.ts +8 -2
  588. package/dist/search/vector.js +9 -3
  589. package/dist/server/auth.d.ts +18 -14
  590. package/dist/server/auth.js +69 -38
  591. package/dist/server/boot.d.ts +3 -1
  592. package/dist/server/boot.js +95 -56
  593. package/dist/server/client-ip.d.ts +11 -4
  594. package/dist/server/client-ip.js +27 -10
  595. package/dist/server/cursor.d.ts +10 -3
  596. package/dist/server/cursor.js +10 -3
  597. package/dist/server/deadline.d.ts +5 -2
  598. package/dist/server/deadline.js +10 -3
  599. package/dist/server/key-check-bounds.js +12 -4
  600. package/dist/server/lifecycle.d.ts +4 -1
  601. package/dist/server/lifecycle.js +10 -4
  602. package/dist/server/mcp-http.d.ts +2 -1
  603. package/dist/server/mcp-http.js +37 -22
  604. package/dist/server/rate-limit.d.ts +17 -5
  605. package/dist/server/rate-limit.js +55 -26
  606. package/dist/server/ready.js +7 -4
  607. package/dist/server/request.d.ts +15 -4
  608. package/dist/server/request.js +42 -15
  609. package/dist/server/route-checks.d.ts +4 -1
  610. package/dist/server/route-checks.js +8 -3
  611. package/dist/server/route-table.d.ts +8 -6
  612. package/dist/server/route-table.js +547 -93
  613. package/dist/server/routes/admin.d.ts +7 -7
  614. package/dist/server/routes/admin.js +36 -15
  615. package/dist/server/routes/customer-notes.d.ts +5 -5
  616. package/dist/server/routes/customer-notes.js +5 -4
  617. package/dist/server/routes/decisions.d.ts +5 -5
  618. package/dist/server/routes/decisions.js +12 -6
  619. package/dist/server/routes/incidents.d.ts +5 -5
  620. package/dist/server/routes/incidents.js +10 -4
  621. package/dist/server/routes/memories.d.ts +8 -8
  622. package/dist/server/routes/memories.js +12 -19
  623. package/dist/server/routes/object-routes.d.ts +8 -5
  624. package/dist/server/routes/object-routes.js +4 -2
  625. package/dist/server/routes/policies.d.ts +6 -6
  626. package/dist/server/routes/policies.js +11 -4
  627. package/dist/server/routes/predictions.d.ts +5 -5
  628. package/dist/server/routes/predictions.js +9 -4
  629. package/dist/server/routes/processes.d.ts +5 -5
  630. package/dist/server/routes/processes.js +15 -6
  631. package/dist/server/routes/project-briefs.d.ts +6 -6
  632. package/dist/server/routes/project-briefs.js +3 -2
  633. package/dist/server/routes/recall.d.ts +3 -3
  634. package/dist/server/routes/recall.js +21 -10
  635. package/dist/server/routes/skills.d.ts +6 -6
  636. package/dist/server/routes/skills.js +12 -4
  637. package/dist/server/server-detect.d.ts +24 -8
  638. package/dist/server/server-detect.js +57 -22
  639. package/dist/server/sleep-child.js +16 -10
  640. package/dist/server/sleep-offload.d.ts +8 -5
  641. package/dist/server/sleep-offload.js +41 -19
  642. package/dist/server/tls.d.ts +4 -1
  643. package/dist/server/tls.js +13 -5
  644. package/dist/server/types.d.ts +38 -26
  645. package/dist/server/validation.d.ts +4 -1
  646. package/dist/server/validation.js +22 -9
  647. package/dist/server.d.ts +15 -10
  648. package/dist/server.js +32 -12
  649. package/dist/sharing/global-store.d.ts +5 -10
  650. package/dist/sharing/global-store.js +8 -43
  651. package/dist/sharing/global-sync.d.ts +3 -1
  652. package/dist/sharing/global-sync.js +16 -6
  653. package/dist/sharing/project-merge.d.ts +25 -7
  654. package/dist/sharing/project-merge.js +49 -17
  655. package/dist/sharing/search-both.d.ts +8 -4
  656. package/dist/sharing/search-both.js +19 -12
  657. package/dist/sharing/share.d.ts +8 -4
  658. package/dist/sharing/share.js +39 -15
  659. package/dist/store/ambient.js +9 -5
  660. package/dist/store/audit-event.d.ts +2 -2
  661. package/dist/store/audit-event.js +8 -3
  662. package/dist/store/audit.d.ts +6 -3
  663. package/dist/store/audit.js +16 -6
  664. package/dist/store/auth.d.ts +4 -2
  665. package/dist/store/auth.js +63 -20
  666. package/dist/store/busy.d.ts +9 -0
  667. package/dist/store/busy.js +16 -0
  668. package/dist/store/candidates.d.ts +12 -5
  669. package/dist/store/candidates.js +75 -36
  670. package/dist/store/capture-write.d.ts +2 -1
  671. package/dist/store/capture-write.js +2 -1
  672. package/dist/store/card-detail.d.ts +4 -4
  673. package/dist/store/card-detail.js +15 -8
  674. package/dist/store/cards.d.ts +24 -10
  675. package/dist/store/cards.js +93 -60
  676. package/dist/store/compaction-caller.d.ts +2 -1
  677. package/dist/store/compaction-caller.js +2 -1
  678. package/dist/store/compactions-record.d.ts +14 -8
  679. package/dist/store/compactions-record.js +95 -32
  680. package/dist/store/compactions.js +35 -15
  681. package/dist/store/conflicts.d.ts +9 -4
  682. package/dist/store/conflicts.js +100 -45
  683. package/dist/store/connectors/dlq.d.ts +17 -5
  684. package/dist/store/connectors/dlq.js +56 -5
  685. package/dist/store/connectors/event-log.d.ts +111 -2
  686. package/dist/store/connectors/event-log.js +2 -1
  687. package/dist/store/connectors/github.d.ts +6 -3
  688. package/dist/store/connectors/github.js +24 -40
  689. package/dist/store/connectors/slack.d.ts +2 -1
  690. package/dist/store/connectors/slack.js +25 -37
  691. package/dist/store/dashboard-reads.d.ts +7 -3
  692. package/dist/store/dashboard-reads.js +32 -11
  693. package/dist/store/delete-and-batch.d.ts +17 -11
  694. package/dist/store/delete-and-batch.js +67 -26
  695. package/dist/store/delivery-recorder.d.ts +8 -5
  696. package/dist/store/delivery-recorder.js +70 -32
  697. package/dist/store/descendant-page.d.ts +2 -1
  698. package/dist/store/descendant-page.js +24 -9
  699. package/dist/store/diagnostics.d.ts +2 -1
  700. package/dist/store/diagnostics.js +2 -1
  701. package/dist/store/doctor-reads.d.ts +2 -1
  702. package/dist/store/doctor-reads.js +13 -5
  703. package/dist/store/dormant.d.ts +19 -11
  704. package/dist/store/dormant.js +40 -18
  705. package/dist/store/embeddings/index.d.ts +13 -9
  706. package/dist/store/embeddings/index.js +19 -12
  707. package/dist/store/entry-reads.d.ts +49 -20
  708. package/dist/store/entry-reads.js +181 -66
  709. package/dist/store/entry-row.d.ts +10 -6
  710. package/dist/store/entry-row.js +17 -12
  711. package/dist/store/entry-writes.d.ts +22 -10
  712. package/dist/store/entry-writes.js +41 -14
  713. package/dist/store/failure-log-at.js +1 -1
  714. package/dist/store/failure-log.d.ts +4 -2
  715. package/dist/store/failure-log.js +13 -6
  716. package/dist/store/gated-write.d.ts +3 -3
  717. package/dist/store/gated-write.js +3 -3
  718. package/dist/store/goals.d.ts +5 -4
  719. package/dist/store/goals.js +8 -10
  720. package/dist/store/graph-apply.d.ts +21 -0
  721. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  722. package/dist/store/graph-queue.d.ts +9 -6
  723. package/dist/store/graph-queue.js +15 -10
  724. package/dist/store/graph-reads.d.ts +16 -11
  725. package/dist/store/graph-reads.js +24 -15
  726. package/dist/store/graph-rows.d.ts +41 -3
  727. package/dist/store/graph-rows.js +10 -7
  728. package/dist/store/graph-view-rows.js +14 -7
  729. package/dist/store/graph-writes.d.ts +16 -10
  730. package/dist/store/graph-writes.js +59 -36
  731. package/dist/store/handoffs.d.ts +4 -4
  732. package/dist/store/handoffs.js +40 -19
  733. package/dist/store/index-and-stats.d.ts +2 -2
  734. package/dist/store/index-and-stats.js +6 -5
  735. package/dist/store/index.d.ts +3 -1
  736. package/dist/store/index.js +1 -0
  737. package/dist/store/key-audit.d.ts +2 -1
  738. package/dist/store/key-audit.js +2 -1
  739. package/dist/store/key-writes.d.ts +2 -1
  740. package/dist/store/key-writes.js +9 -2
  741. package/dist/store/ledger-turn.d.ts +4 -1
  742. package/dist/store/ledger-turn.js +7 -2
  743. package/dist/store/mirrors.d.ts +11 -4
  744. package/dist/store/mirrors.js +88 -16
  745. package/dist/store/narrow.d.ts +6 -0
  746. package/dist/store/narrow.js +11 -0
  747. package/dist/store/open.d.ts +4 -2
  748. package/dist/store/open.js +18 -9
  749. package/dist/store/pilot-arm.d.ts +2 -1
  750. package/dist/store/pilot-arm.js +18 -6
  751. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  752. package/dist/store/planning-fallacy-evidence.js +8 -5
  753. package/dist/store/port/agent-import.d.ts +62 -0
  754. package/dist/store/port/agent-import.js +2 -0
  755. package/dist/store/port/consolidation.d.ts +129 -0
  756. package/dist/store/port/consolidation.js +2 -0
  757. package/dist/store/port/learning.d.ts +19 -0
  758. package/dist/store/port/learning.js +2 -0
  759. package/dist/store/port/local-files.d.ts +18 -0
  760. package/dist/store/port/local-files.js +2 -0
  761. package/dist/store/port/promotion.d.ts +20 -0
  762. package/dist/store/port/promotion.js +3 -0
  763. package/dist/store/port-groups.d.ts +160 -0
  764. package/dist/store/port-groups.js +2 -0
  765. package/dist/store/port.d.ts +215 -229
  766. package/dist/store/port.js +3 -9
  767. package/dist/store/predictions.d.ts +14 -10
  768. package/dist/store/predictions.js +37 -17
  769. package/dist/store/project-tags.d.ts +4 -1
  770. package/dist/store/project-tags.js +16 -5
  771. package/dist/store/quality-repair.d.ts +8 -4
  772. package/dist/store/quality-repair.js +53 -20
  773. package/dist/store/quarantine.d.ts +1 -0
  774. package/dist/store/quarantine.js +23 -9
  775. package/dist/store/raw-archive.d.ts +5 -4
  776. package/dist/store/raw-archive.js +11 -10
  777. package/dist/store/recall-trace.d.ts +22 -17
  778. package/dist/store/recall-trace.js +126 -63
  779. package/dist/store/rejected-values.d.ts +15 -10
  780. package/dist/store/rejected-values.js +33 -12
  781. package/dist/store/rejection.d.ts +12 -11
  782. package/dist/store/rejection.js +18 -19
  783. package/dist/store/report-reads.d.ts +2 -1
  784. package/dist/store/report-reads.js +2 -1
  785. package/dist/store/rows.d.ts +7 -5
  786. package/dist/store/rows.js +18 -11
  787. package/dist/store/rule-sql.d.ts +6 -4
  788. package/dist/store/rule-sql.js +16 -9
  789. package/dist/store/search-rows.d.ts +14 -9
  790. package/dist/store/search-rows.js +48 -23
  791. package/dist/store/sessions.d.ts +12 -10
  792. package/dist/store/sessions.js +40 -21
  793. package/dist/store/set-aside.d.ts +2 -2
  794. package/dist/store/set-aside.js +18 -5
  795. package/dist/store/sqlite/agent-import.d.ts +3 -0
  796. package/dist/store/sqlite/agent-import.js +77 -0
  797. package/dist/store/sqlite/cards-group.d.ts +6 -0
  798. package/dist/store/sqlite/cards-group.js +37 -0
  799. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  800. package/dist/store/sqlite/conflicts-group.js +18 -0
  801. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  802. package/dist/store/sqlite/connector-events-group.js +17 -6
  803. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  804. package/dist/store/sqlite/connector-writes-group.js +9 -4
  805. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  806. package/dist/store/sqlite/consolidation-group.js +64 -0
  807. package/dist/store/sqlite/dag-reads-group.js +1 -1
  808. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  809. package/dist/store/sqlite/dormant-group.js +29 -0
  810. package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
  811. package/dist/store/sqlite/entry-writes-group.js +37 -14
  812. package/dist/store/sqlite/error-codec.d.ts +4 -2
  813. package/dist/store/sqlite/error-codec.js +32 -10
  814. package/dist/store/sqlite/executor-counts.js +2 -1
  815. package/dist/store/sqlite/executor.d.ts +8 -3
  816. package/dist/store/sqlite/executor.js +56 -18
  817. package/dist/store/sqlite/global-promote.d.ts +5 -0
  818. package/dist/store/sqlite/global-promote.js +48 -0
  819. package/dist/store/sqlite/goals-group.d.ts +6 -0
  820. package/dist/store/sqlite/goals-group.js +23 -0
  821. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  822. package/dist/store/sqlite/graph-reads-group.js +2 -1
  823. package/dist/store/sqlite/held-connection.d.ts +7 -1
  824. package/dist/store/sqlite/held-connection.js +34 -7
  825. package/dist/store/sqlite/last-recall-group.d.ts +4 -2
  826. package/dist/store/sqlite/last-recall-group.js +9 -4
  827. package/dist/store/sqlite/learning-group.d.ts +4 -0
  828. package/dist/store/sqlite/learning-group.js +17 -0
  829. package/dist/store/sqlite/maintenance-groups.js +2 -1
  830. package/dist/store/sqlite/object-rows.d.ts +6 -3
  831. package/dist/store/sqlite/object-rows.js +34 -5
  832. package/dist/store/sqlite/objects-group.d.ts +5 -4
  833. package/dist/store/sqlite/objects-group.js +84 -33
  834. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  835. package/dist/store/sqlite/predictions-group.js +4 -2
  836. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  837. package/dist/store/sqlite/promotion-group.js +10 -0
  838. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  839. package/dist/store/sqlite/quarantine-group.js +4 -2
  840. package/dist/store/sqlite/reports-group.d.ts +6 -0
  841. package/dist/store/sqlite/reports-group.js +33 -0
  842. package/dist/store/sqlite/request-scope.d.ts +6 -0
  843. package/dist/store/sqlite/request-scope.js +18 -0
  844. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  845. package/dist/store/sqlite/sessions-group.js +46 -0
  846. package/dist/store/sqlite/store.d.ts +22 -11
  847. package/dist/store/sqlite/store.js +84 -11
  848. package/dist/store/sqlite/vector-pack.js +2 -1
  849. package/dist/store/sqlite/vector-reads-group.js +2 -1
  850. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  851. package/dist/store/sqlite/worker-jobs.js +19 -7
  852. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  853. package/dist/store/sqlite/worker-ops.js +6 -3
  854. package/dist/store/sqlite/worker-store.d.ts +4 -3
  855. package/dist/store/sqlite/worker-store.js +24 -14
  856. package/dist/store/summaries.d.ts +19 -12
  857. package/dist/store/summaries.js +36 -21
  858. package/dist/store/summary-dirty.d.ts +2 -1
  859. package/dist/store/summary-dirty.js +2 -1
  860. package/dist/store/tenant.d.ts +3 -2
  861. package/dist/store/tenant.js +5 -4
  862. package/dist/store/token-ledger-rows.js +6 -3
  863. package/dist/store/token-ledger.d.ts +19 -13
  864. package/dist/store/token-ledger.js +27 -14
  865. package/dist/store/tombstone-checks.d.ts +4 -1
  866. package/dist/store/tombstone-checks.js +10 -1
  867. package/dist/store/usage-reports.js +2 -1
  868. package/dist/store/vector-index.d.ts +8 -5
  869. package/dist/store/vector-index.js +24 -10
  870. package/dist/store/working-memory.d.ts +6 -4
  871. package/dist/store/working-memory.js +14 -9
  872. package/dist/support-bundle.js +10 -5
  873. package/dist/trust/quarantine.d.ts +1 -2
  874. package/dist/trust/quarantine.js +1 -5
  875. package/dist/trust/reject-flow.d.ts +12 -3
  876. package/dist/trust/reject-flow.js +12 -4
  877. package/dist/util/anthropic-messages.d.ts +4 -1
  878. package/dist/util/anthropic-messages.js +14 -5
  879. package/dist/util/atomic-write.d.ts +4 -2
  880. package/dist/util/atomic-write.js +25 -14
  881. package/dist/util/compaction-items.d.ts +4 -1
  882. package/dist/util/compaction-items.js +8 -2
  883. package/dist/util/crash-handlers.d.ts +7 -2
  884. package/dist/util/crash-handlers.js +13 -4
  885. package/dist/util/env.d.ts +16 -4
  886. package/dist/util/env.js +78 -25
  887. package/dist/util/home-path.js +12 -6
  888. package/dist/util/hook-payload.d.ts +3 -1
  889. package/dist/util/hook-payload.js +3 -1
  890. package/dist/util/http-retry.d.ts +12 -6
  891. package/dist/util/http-retry.js +16 -6
  892. package/dist/util/http-util.d.ts +20 -5
  893. package/dist/util/http-util.js +28 -9
  894. package/dist/util/json.d.ts +4 -1
  895. package/dist/util/json.js +4 -1
  896. package/dist/util/keyset.js +2 -1
  897. package/dist/util/limits.js +4 -2
  898. package/dist/util/log.d.ts +13 -5
  899. package/dist/util/log.js +29 -6
  900. package/dist/util/net.d.ts +5 -0
  901. package/dist/util/net.js +19 -0
  902. package/dist/util/real-path.d.ts +2 -1
  903. package/dist/util/real-path.js +4 -3
  904. package/dist/util/request-scope.d.ts +11 -3
  905. package/dist/util/request-scope.js +13 -4
  906. package/dist/util/same-text.d.ts +10 -3
  907. package/dist/util/same-text.js +10 -3
  908. package/dist/util/secret-detect.d.ts +24 -7
  909. package/dist/util/secret-detect.js +49 -14
  910. package/dist/util/spawn-argv.d.ts +3 -1
  911. package/dist/util/spawn-argv.js +13 -4
  912. package/dist/util/sqlite-blocked.d.ts +15 -4
  913. package/dist/util/sqlite-blocked.js +19 -6
  914. package/dist/util/stored-json.d.ts +4 -1
  915. package/dist/util/stored-json.js +6 -2
  916. package/dist/util/stream-tee.d.ts +2 -1
  917. package/dist/util/stream-tee.js +8 -5
  918. package/dist/util/transcript-tail.d.ts +4 -1
  919. package/dist/util/transcript-tail.js +4 -1
  920. package/dist/util/version.d.ts +8 -3
  921. package/dist/util/version.js +8 -3
  922. package/dist/util/write-budget.d.ts +7 -2
  923. package/dist/util/write-budget.js +5 -2
  924. package/dist/util/yaml.d.ts +4 -1
  925. package/dist/util/yaml.js +4 -1
  926. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  927. package/extensions/openclaw-plugin/package.json +1 -1
  928. package/openclaw.plugin.json +1 -1
  929. package/package.json +2 -1
  930. package/scripts/postinstall.cjs +3 -1
  931. package/dist/api/cards.d.ts +0 -42
  932. package/dist/api/conflicts.d.ts +0 -28
  933. package/dist/api/conflicts.js +0 -61
  934. package/dist/api/dormant.d.ts +0 -14
  935. package/dist/api/dormant.js +0 -58
  936. package/dist/api/goals.d.ts +0 -18
  937. package/dist/api/graph.d.ts +0 -8
  938. package/dist/api/graph.js +0 -8
  939. package/dist/api/learn.js +0 -125
  940. package/dist/api/memories.d.ts +0 -25
  941. package/dist/api/objects.d.ts +0 -9
  942. package/dist/api/outcome.d.ts +0 -19
  943. package/dist/api/predictions.d.ts +0 -11
  944. package/dist/api/promote.d.ts +0 -36
  945. package/dist/api/recall-core.d.ts +0 -4
  946. package/dist/api/recall-core.js +0 -125
  947. package/dist/api/recall-finish.d.ts +0 -53
  948. package/dist/api/recall-finish.js +0 -30
  949. package/dist/api/recall-history.d.ts +0 -64
  950. package/dist/api/recall-history.js +0 -159
  951. package/dist/api/recall-record.d.ts +0 -43
  952. package/dist/api/recall-record.js +0 -78
  953. package/dist/api/recall-request.js +0 -121
  954. package/dist/api/recall.d.ts +0 -6
  955. package/dist/api/refine.d.ts +0 -7
  956. package/dist/api/refine.js +0 -10
  957. package/dist/api/session-owners.d.ts +0 -4
  958. package/dist/api/session-owners.js +0 -17
  959. package/dist/api/sleep-run.d.ts +0 -26
  960. package/dist/api/sleep.js +0 -11
  961. package/dist/graph/write.d.ts +0 -14
  962. package/dist/store/sqlite/busy.d.ts +0 -3
  963. package/dist/store/sqlite/busy.js +0 -8
  964. package/dist/store/sqlite/local.d.ts +0 -4
  965. package/dist/store/sqlite/local.js +0 -8
@@ -7,21 +7,38 @@ import { RejectedValueError } from '../core/api-errors.js';
7
7
  import { markSummaryDirtyInTx } from './summary-dirty.js';
8
8
  import { errorMessage, log } from '../util/log.js';
9
9
  import { auditRejectionRefusal, audit } from './audit-event.js';
10
+ import { appendAuditEvent } from './audit.js';
10
11
  import { selectEntriesByIds } from './entry-reads.js';
11
12
  import { stampOriginProject, upsertEntryRow, syncFtsRow, deleteFtsRow } from './entry-row.js';
12
13
  import { mirrorBestEffort, writeMarkdownMirror } from './mirrors.js';
13
14
  import { onHandle, openStore } from './open.js';
14
- /** Write an entry to SQLite and refresh mirrors. `opts.actor` defaults to 'cli'; the api layer passes the resolved actor,
15
- * 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. */
16
17
  export function writeEntry(hippoRoot, entry, opts) {
17
18
  writeEntryWithHook(hippoRoot, entry, opts);
18
19
  }
19
20
  /** writeEntry for store code that needs the write's own handle: `opts.afterWrite` shares the INSERT's SAVEPOINT. */
20
- export function writeEntryWithHook(hippoRoot, entry, opts) {
21
+ function writeEntryWithHook(hippoRoot, entry, opts) {
21
22
  onHandle(hippoRoot, (db) => {
22
23
  writeEntryOn(db, hippoRoot, entry, opts);
23
24
  }, openStore);
24
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
+ }
25
42
  /** writeEntry for each of `entries` in one transaction, so all land or none; each
26
43
  * keeps its audit row, and mirrors follow the commit. Returns how many were written; an empty list opens no store. */
27
44
  export function writeEntriesTogether(hippoRoot, entries) {
@@ -49,7 +66,8 @@ export function writeEntriesTogether(hippoRoot, entries) {
49
66
  return stamped.length;
50
67
  }
51
68
  /** Runs `fill` in one transaction; each `put` writes one entry and returns false when the store rejects its value,
52
- * 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. */
53
71
  export function writeEntriesSkippingRejected(hippoRoot, fill, actor = 'cli') {
54
72
  const written = [];
55
73
  onHandle(hippoRoot, (db) => {
@@ -104,8 +122,9 @@ function writeEntryOn(db, hippoRoot, entry, opts) {
104
122
  throw error;
105
123
  }
106
124
  }
107
- /** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must call `writeEntryMirrors` after any
108
- * 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. */
109
128
  export function writeEntryDbOnly(db, entry, opts) {
110
129
  // Inside a caller's transaction (e.g. supersede's BEGIN IMMEDIATE) the scope is a SAVEPOINT,
111
130
  // so a throw here rolls back only this write and leaves the outer open.
@@ -117,7 +136,8 @@ export function writeEntryDbOnly(db, entry, opts) {
117
136
  auditEntryWrite(db, entry, opts?.actor ?? 'cli');
118
137
  });
119
138
  }
120
- /** 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. */
121
141
  export function auditEntryWrite(db, entry, actor) {
122
142
  audit(db, 'remember', { targetId: entry.id, metadata: {
123
143
  kind: entry.kind ?? 'distilled',
@@ -154,7 +174,8 @@ export function strengthenRetrieved(hippoRoot, ids, opts) {
154
174
  closeHippoDb(db);
155
175
  }
156
176
  }
157
- /** 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. */
158
179
  export function strengthenRetrievedInOwnTx(db, ids, opts) {
159
180
  if (ids.length === 0 || opts.recallBoostAblated)
160
181
  return new Set();
@@ -196,7 +217,8 @@ export function setEntryTagsInTx(db, entry) {
196
217
  .run(JSON.stringify(entry.tags), entry.id, entry.tenant_id);
197
218
  syncFtsRow(db, entry);
198
219
  }
199
- /** 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. */
200
222
  export function deleteEntryRowInTx(db, entry, actor) {
201
223
  db.prepare('DELETE FROM memories WHERE id = ? AND tenant_id = ?').run(entry.id, entry.tenant_id);
202
224
  deleteFtsRow(db, entry.id);
@@ -211,8 +233,7 @@ export function setHalfLivesAt(db, rows) {
211
233
  }
212
234
  /** Moves every row of `from` in a tenant to project `into`. */
213
235
  export function restampOriginProjectAt(db, tenantId, from, into) {
214
- db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND origin_project = ?`)
215
- .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);
216
237
  }
217
238
  /** Stamps each id with its project. */
218
239
  export function stampOriginProjectsAt(db, tenantId, rows) {
@@ -222,18 +243,24 @@ export function stampOriginProjectsAt(db, tenantId, rows) {
222
243
  }
223
244
  /** Renames a live row's source from `from` to `to`; the count is 0 when another writer moved or superseded it first. */
224
245
  export function renameEntrySourceAt(db, tenantId, id, from, to) {
225
- 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);
226
249
  return Number(moved.changes ?? 0);
227
250
  }
228
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. */
229
252
  export function renameEntrySourceAndOriginAt(db, tenantId, id, options) {
230
253
  const { from, to, origin } = options;
231
- 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);
232
258
  return Number(done.changes ?? 0);
233
259
  }
234
260
  /** Marks `id` superseded by `newId`; false when another writer superseded it first. */
235
261
  export function supersedeEntryAt(db, tenantId, id, newId) {
236
- 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`)
237
264
  .run(newId, id, tenantId);
238
265
  return Number(result.changes ?? 0) !== 0;
239
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;
@@ -25,8 +25,8 @@ export function pushGoal(hippoRoot, opts) {
25
25
  return pushGoalWithDb(db, opts);
26
26
  });
27
27
  }
28
- /** Depth-cap enforcer for pushGoalWithDb and resumeGoal: suspends the oldest `overflow` goals; **caller MUST be inside a `BEGIN IMMEDIATE` transaction**.
29
- * @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. */
30
30
  function enforceDepthCapWithinTx(db, tenantId, sessionId) {
31
31
  // SAFETY: the row comes from the SELECT above, which projects exactly one
32
32
  // column, `c`, as a COUNT(*).
@@ -106,11 +106,6 @@ function insertRetrievalPolicy(db, goalId, policy) {
106
106
  db.prepare(`UPDATE goal_stack SET retrieval_policy_id = ? WHERE id = ?`).run(policyId, goalId);
107
107
  return policyId;
108
108
  }
109
- export function getActiveGoals(hippoRoot, opts) {
110
- return onHandle(hippoRoot, (db) => {
111
- return getActiveGoalsWithDb(db, opts);
112
- });
113
- }
114
109
  /** The active goals and their policies on one handle, so a goal and its policy never disagree. */
115
110
  export function activeGoalsWithPolicies(hippoRoot, opts) {
116
111
  return onHandle(hippoRoot, (db) => {
@@ -144,7 +139,8 @@ function getActiveGoalsWithDb(db, opts) {
144
139
  `).all(opts.tenantId, opts.sessionId);
145
140
  return rows.map(rowToGoal);
146
141
  }
147
- // 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.
148
144
  function loadGoalPolicies(db, active) {
149
145
  const policiesByGoalId = new Map();
150
146
  const policyIds = [...new Set(active.flatMap((g) => (g.retrievalPolicyId ? [g.retrievalPolicyId] : [])))];
@@ -183,7 +179,8 @@ export function localGoalRecallRows(db, rows) {
183
179
  const localIds = new Set(local.map((r) => r.id));
184
180
  return rows.filter((r) => localIds.has(r.memoryId));
185
181
  }
186
- /** 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. */
187
184
  export function writeGoalRecallLog(db, rows) {
188
185
  if (rows.length === 0)
189
186
  return;
@@ -226,7 +223,8 @@ export function completeGoal(hippoRoot, goalId, opts) {
226
223
  else if (score < NEGATIVE_OUTCOME_THRESHOLD)
227
224
  multiplier = STRENGTH_DECAY;
228
225
  if (multiplier !== 1) {
229
- // 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.
230
228
  db.prepare(`
231
229
  UPDATE memories
232
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)
@@ -1,7 +1,7 @@
1
1
  import { type DatabaseSyncLike } from '../db/index.js';
2
2
  import { type EntityType, type Entity, type Relation, type StoredGraph } from './graph-rows.js';
3
- /** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds `--entity NAME` directly
4
- * without materializing every same-name row. */
3
+ /** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds
4
+ * `--entity NAME` directly without materializing every same-name row. */
5
5
  export declare function loadEntitiesByName(hippoRoot: string, tenantId: string, name: string, opts?: {
6
6
  limit?: number;
7
7
  }, txDb?: DatabaseSyncLike): Entity[];
@@ -16,26 +16,31 @@ export declare function loadRelations(hippoRoot: string, tenantId: string, opts?
16
16
  /** Chunk size for IN-list queries: well under SQLite's 999-bound-variable default
17
17
  * (leaves headroom for the tenant_id param + the doubled list in neighbour lookups). */
18
18
  export declare const IN_LIST_CHUNK = 400;
19
- /** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped, read-only. */
19
+ /** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped,
20
+ * read-only. */
20
21
  export declare function loadEntitiesByIds(hippoRoot: string, tenantId: string, ids: number[], txDb?: DatabaseSyncLike): Entity[];
21
- /** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal, one query for the whole frontier
22
- * (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?` rejects a fraction). */
22
+ /** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal,
23
+ * one query for the whole frontier (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?`
24
+ * rejects a fraction). */
23
25
  export declare function loadNeighborRelations(hippoRoot: string, tenantId: string, entityIds: number[], opts?: {
24
26
  limit?: number;
25
27
  }, txDb?: DatabaseSyncLike): Relation[];
26
- /** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps only intra-union edges,
27
- * so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so a single query is safe. */
28
+ /** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps
29
+ * only intra-union edges, so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so
30
+ * a single query is safe. */
28
31
  export declare function loadRelationsAmong(hippoRoot: string, tenantId: string, entityIds: number[], opts?: {
29
32
  limit?: number;
30
33
  }, txDb?: DatabaseSyncLike): Relation[];
31
- /** 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
32
- * SQLite variable cap. */
34
+ /** Map consolidated source memory ids to their graph entities: the SEED step of multi-hop recall. Tenant-scoped,
35
+ * read-only; chunks the IN-list under the SQLite variable cap. */
33
36
  export declare function loadEntitiesByMemoryId(hippoRoot: string, tenantId: string, memoryIds: string[]): Entity[];
34
- /** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write lock. */
37
+ /** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write
38
+ * lock. */
35
39
  export declare function storedGraphOn(db: DatabaseSyncLike, tenantId: string, memoryIds: readonly string[]): StoredGraph;
36
40
  /** storedGraphOn on its own connection, outside any write lock. */
37
41
  export declare function loadStoredGraph(hippoRoot: string, tenantId: string, memoryIds: readonly string[]): StoredGraph;
38
42
  /** Run `fn` in ONE read transaction (a single WAL snapshot) so every `load*` read via `txDb` sees a consistent view
39
- * even if a rebuild commits concurrently (it clears and reinserts entities, so separate reads could mix old entity ids with new relation ids). */
43
+ * even if a rebuild commits concurrently (it clears and reinserts entities, so separate reads could mix old entity ids
44
+ * with new relation ids). */
40
45
  export declare function withGraphReadSnapshot<T>(hippoRoot: string, fn: (txDb: DatabaseSyncLike) => T): T;
41
46
  //# sourceMappingURL=graph-reads.d.ts.map
@@ -1,4 +1,5 @@
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.
1
+ // The graph reads a view and a traversal share. Each opens hippo.db itself unless the caller hands it the handle its
2
+ // snapshot runs on.
2
3
  import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
3
4
  import { openHippoDb, closeHippoDb, withReadSnapshot } from '../db/index.js';
4
5
  import { onHandle } from './open.js';
@@ -7,8 +8,8 @@ import { GRAPH_ENTITY_TYPES, rowToEntity, rowToRelation, ENTITY_COLS, RELATION_C
7
8
  import { placeholders } from '../util/sql.js';
8
9
  const DEFAULT_GRAPH_PAGE_SIZE = DEFAULT_LIST_LIMIT;
9
10
  const DEFAULT_GRAPH_SCAN_LIMIT = 1000;
10
- /** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds `--entity NAME` directly
11
- * without materializing every same-name row. */
11
+ /** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds
12
+ * `--entity NAME` directly without materializing every same-name row. */
12
13
  export function loadEntitiesByName(hippoRoot, tenantId, name, opts = {}, txDb) {
13
14
  assertTenantId('loadEntitiesByName', tenantId);
14
15
  const limit = opts.limit ?? DEFAULT_GRAPH_PAGE_SIZE;
@@ -90,7 +91,8 @@ export function loadRelations(hippoRoot, tenantId, opts = {}, txDb) {
90
91
  /** Chunk size for IN-list queries: well under SQLite's 999-bound-variable default
91
92
  * (leaves headroom for the tenant_id param + the doubled list in neighbour lookups). */
92
93
  export const IN_LIST_CHUNK = 400;
93
- /** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped, read-only. */
94
+ /** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped,
95
+ * read-only. */
94
96
  export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
95
97
  assertTenantId('loadEntitiesByIds', tenantId);
96
98
  if (ids.length === 0)
@@ -116,8 +118,9 @@ export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
116
118
  closeHippoDb(ownDb);
117
119
  }
118
120
  }
119
- /** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal, one query for the whole frontier
120
- * (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?` rejects a fraction). */
121
+ /** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal,
122
+ * one query for the whole frontier (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?`
123
+ * rejects a fraction). */
121
124
  export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
122
125
  assertTenantId('loadNeighborRelations', tenantId);
123
126
  if (entityIds.length === 0)
@@ -129,8 +132,8 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
129
132
  const ownDb = txDb ? null : openHippoDb(hippoRoot);
130
133
  const db = txDb ?? ownDb;
131
134
  try {
132
- // `limit` applies PER CHUNK, so a frontier over IN_LIST_CHUNK ids could return limit*chunks rows before the dedup below;
133
- // harmless today (frontier <= maxNeighbors 200, one chunk, BFS re-enforces the fanout cap).
135
+ // `limit` applies PER CHUNK, so a frontier over IN_LIST_CHUNK ids could return limit*chunks rows before the dedup
136
+ // below; harmless today (frontier <= maxNeighbors 200, one chunk, BFS re-enforces the fanout cap).
134
137
  const byId = new Map();
135
138
  for (let i = 0; i < entityIds.length; i += IN_LIST_CHUNK) {
136
139
  const slice = entityIds.slice(i, i + IN_LIST_CHUNK);
@@ -152,8 +155,9 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
152
155
  closeHippoDb(ownDb);
153
156
  }
154
157
  }
155
- /** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps only intra-union edges,
156
- * so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so a single query is safe. */
158
+ /** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps
159
+ * only intra-union edges, so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so
160
+ * a single query is safe. */
157
161
  export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
158
162
  assertTenantId('loadRelationsAmong', tenantId);
159
163
  if (entityIds.length === 0)
@@ -180,8 +184,8 @@ export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, tx
180
184
  closeHippoDb(ownDb);
181
185
  }
182
186
  }
183
- /** 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
184
- * SQLite variable cap. */
187
+ /** Map consolidated source memory ids to their graph entities: the SEED step of multi-hop recall. Tenant-scoped,
188
+ * read-only; chunks the IN-list under the SQLite variable cap. */
185
189
  export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
186
190
  assertTenantId('loadEntitiesByMemoryId', tenantId);
187
191
  if (memoryIds.length === 0)
@@ -203,11 +207,15 @@ export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
203
207
  return out;
204
208
  });
205
209
  }
206
- /** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write lock. */
210
+ /** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write
211
+ * lock. */
207
212
  export function storedGraphOn(db, tenantId, memoryIds) {
208
213
  const kinds = memoryKindsOn(db, memoryIds);
209
214
  // SAFETY: the SELECT names exactly the columns of StoredEntity.
210
- 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);
215
+ const entities = db
216
+ .prepare(`SELECT id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id FROM entities ` +
217
+ `WHERE tenant_id = ? ORDER BY id`)
218
+ .all(tenantId);
211
219
  // SAFETY: the SELECT names exactly the columns of StoredRelation.
212
220
  const relations = db.prepare(`SELECT id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id ` +
213
221
  `FROM relations WHERE tenant_id = ? ORDER BY id`).all(tenantId);
@@ -228,7 +236,8 @@ export function loadStoredGraph(hippoRoot, tenantId, memoryIds) {
228
236
  });
229
237
  }
230
238
  /** Run `fn` in ONE read transaction (a single WAL snapshot) so every `load*` read via `txDb` sees a consistent view
231
- * even if a rebuild commits concurrently (it clears and reinserts entities, so separate reads could mix old entity ids with new relation ids). */
239
+ * even if a rebuild commits concurrently (it clears and reinserts entities, so separate reads could mix old entity ids
240
+ * with new relation ids). */
232
241
  export function withGraphReadSnapshot(hippoRoot, fn) {
233
242
  return onHandle(hippoRoot, (db) => {
234
243
  return withReadSnapshot(db, () => fn(db));