hippo-memory 1.69.0 → 1.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1014) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +5 -5
  5. package/dist/agent-memories/claude-code.js +25 -12
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +26 -14
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/markdown.d.ts +1 -3
  13. package/dist/agent-memories/markdown.js +1 -3
  14. package/dist/agent-memories/report.d.ts +1 -1
  15. package/dist/agent-memories/report.js +3 -2
  16. package/dist/agent-memories/source.d.ts +1 -1
  17. package/dist/agent-memories/source.js +6 -5
  18. package/dist/agent-memories/sync.d.ts +5 -3
  19. package/dist/agent-memories/sync.js +34 -38
  20. package/dist/agent-memories/types.d.ts +1 -1
  21. package/dist/api/assemble.d.ts +9 -46
  22. package/dist/api/assemble.js +44 -54
  23. package/dist/api/audit.d.ts +8 -7
  24. package/dist/api/audit.js +15 -21
  25. package/dist/api/auth.d.ts +17 -39
  26. package/dist/api/auth.js +76 -216
  27. package/dist/api/auto-sleep.d.ts +13 -0
  28. package/dist/api/auto-sleep.js +32 -0
  29. package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
  30. package/dist/{availability.js → api/availability.js} +14 -44
  31. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  32. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  33. package/dist/{context-render.js → api/context-render.js} +7 -6
  34. package/dist/api/context-select.d.ts +5 -5
  35. package/dist/api/context-select.js +39 -48
  36. package/dist/api/context-types.d.ts +15 -40
  37. package/dist/api/context.d.ts +7 -26
  38. package/dist/api/context.js +67 -97
  39. package/dist/api/dormant.d.ts +7 -23
  40. package/dist/api/dormant.js +40 -128
  41. package/dist/api/drill-down.d.ts +9 -48
  42. package/dist/api/drill-down.js +41 -90
  43. package/dist/api/forget.d.ts +5 -33
  44. package/dist/api/forget.js +17 -73
  45. package/dist/api/goals.d.ts +1 -1
  46. package/dist/api/goals.js +2 -2
  47. package/dist/api/graph.d.ts +8 -0
  48. package/dist/api/graph.js +7 -0
  49. package/dist/api/index.d.ts +28 -0
  50. package/dist/api/index.js +31 -0
  51. package/dist/api/instruction-detect.js +85 -0
  52. package/dist/api/learn.js +63 -55
  53. package/dist/api/ledger-db.d.ts +21 -0
  54. package/dist/api/ledger-db.js +81 -0
  55. package/dist/api/memories.d.ts +5 -0
  56. package/dist/api/memories.js +7 -0
  57. package/dist/api/objects.d.ts +9 -0
  58. package/dist/api/objects.js +11 -0
  59. package/dist/api/on-store.d.ts +16 -0
  60. package/dist/api/on-store.js +38 -0
  61. package/dist/api/outcome.d.ts +5 -42
  62. package/dist/api/outcome.js +15 -80
  63. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  64. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  65. package/dist/api/predictions.d.ts +9 -0
  66. package/dist/api/predictions.js +18 -0
  67. package/dist/api/promote.d.ts +16 -31
  68. package/dist/api/promote.js +38 -123
  69. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
  70. package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
  71. package/dist/api/quarantine.d.ts +5 -5
  72. package/dist/api/quarantine.js +30 -106
  73. package/dist/api/recall-cli.d.ts +55 -0
  74. package/dist/api/recall-cli.js +94 -0
  75. package/dist/api/recall-core.d.ts +4 -0
  76. package/dist/api/recall-core.js +120 -0
  77. package/dist/api/recall-finish.d.ts +53 -0
  78. package/dist/api/recall-finish.js +30 -0
  79. package/dist/api/recall-history.d.ts +64 -0
  80. package/dist/api/recall-history.js +159 -0
  81. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
  82. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
  83. package/dist/api/recall-record.d.ts +10 -13
  84. package/dist/api/recall-record.js +10 -30
  85. package/dist/api/recall-request.d.ts +2 -2
  86. package/dist/api/recall-request.js +3 -3
  87. package/dist/api/recall-types.d.ts +101 -316
  88. package/dist/api/recall.d.ts +5 -33
  89. package/dist/api/recall.js +92 -91
  90. package/dist/api/refine.d.ts +7 -0
  91. package/dist/api/refine.js +10 -0
  92. package/dist/api/remember-local.d.ts +57 -0
  93. package/dist/api/remember-local.js +90 -0
  94. package/dist/api/remember.d.ts +27 -12
  95. package/dist/api/remember.js +42 -46
  96. package/dist/api/session-owners.d.ts +4 -0
  97. package/dist/api/session-owners.js +17 -0
  98. package/dist/api/sleep-run.d.ts +7 -9
  99. package/dist/api/sleep-run.js +78 -94
  100. package/dist/api/sleep.d.ts +10 -29
  101. package/dist/api/tokens.d.ts +5 -12
  102. package/dist/api/tokens.js +12 -31
  103. package/dist/api/types.d.ts +8 -31
  104. package/dist/api/types.js +5 -23
  105. package/dist/capture/caller-session.d.ts +2 -2
  106. package/dist/capture/caller-session.js +8 -8
  107. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  108. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  109. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  110. package/dist/capture/command.d.ts +5 -13
  111. package/dist/capture/command.js +57 -60
  112. package/dist/capture/compact-resume-caller.d.ts +1 -1
  113. package/dist/capture/compact-resume-caller.js +7 -7
  114. package/dist/capture/compact.d.ts +8 -16
  115. package/dist/capture/compact.js +56 -47
  116. package/dist/capture/compaction-items-caller.d.ts +1 -1
  117. package/dist/capture/compaction-items-caller.js +7 -5
  118. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  119. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  120. package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
  121. package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
  122. package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
  123. package/dist/capture/copilot-transcript.js +1 -1
  124. package/dist/capture/extract.js +2 -2
  125. package/dist/capture/failure-caller.d.ts +2 -2
  126. package/dist/capture/failure-caller.js +6 -6
  127. package/dist/capture/failure-reading.d.ts +2 -5
  128. package/dist/capture/failure-reading.js +11 -12
  129. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  130. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  131. package/dist/capture/pre-compact-caller.d.ts +1 -1
  132. package/dist/capture/pre-compact-caller.js +2 -2
  133. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
  134. package/dist/{session-digest.js → capture/session-digest.js} +29 -29
  135. package/dist/capture/session-end-caller.d.ts +2 -2
  136. package/dist/capture/session-end-caller.js +1 -1
  137. package/dist/capture/session-texts.d.ts +1 -1
  138. package/dist/capture/session-texts.js +5 -5
  139. package/dist/capture/session-worker.js +6 -4
  140. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  141. package/dist/capture/transcript.d.ts +2 -10
  142. package/dist/capture/transcript.js +72 -92
  143. package/dist/capture/working-state.d.ts +0 -3
  144. package/dist/capture/working-state.js +7 -7
  145. package/dist/cli/api-context.d.ts +3 -0
  146. package/dist/cli/api-context.js +6 -0
  147. package/dist/cli/audit-prune.d.ts +28 -0
  148. package/dist/cli/audit-prune.js +40 -0
  149. package/dist/cli/audit.d.ts +2 -2
  150. package/dist/cli/audit.js +92 -88
  151. package/dist/cli/auth.d.ts +2 -1
  152. package/dist/cli/auth.js +69 -53
  153. package/dist/cli/briefs.d.ts +4 -3
  154. package/dist/cli/briefs.js +76 -202
  155. package/dist/cli/card.d.ts +2 -1
  156. package/dist/cli/card.js +55 -54
  157. package/dist/cli/client.d.ts +28 -0
  158. package/dist/{client.js → cli/client.js} +25 -44
  159. package/dist/cli/compact-resume-payload.d.ts +8 -0
  160. package/dist/cli/compact-resume-payload.js +40 -0
  161. package/dist/cli/context.d.ts +1 -13
  162. package/dist/cli/context.js +51 -77
  163. package/dist/cli/continuity.d.ts +6 -5
  164. package/dist/cli/continuity.js +153 -145
  165. package/dist/cli/correction-latency.d.ts +24 -0
  166. package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
  167. package/dist/cli/curate.d.ts +13 -17
  168. package/dist/cli/curate.js +226 -222
  169. package/dist/cli/dag.d.ts +4 -4
  170. package/dist/cli/dag.js +70 -52
  171. package/dist/cli/decisions.d.ts +4 -3
  172. package/dist/cli/decisions.js +129 -253
  173. package/dist/cli/eval.d.ts +1 -3
  174. package/dist/cli/eval.js +56 -42
  175. package/dist/cli/exit.d.ts +6 -0
  176. package/dist/cli/exit.js +11 -0
  177. package/dist/cli/explain.d.ts +1 -2
  178. package/dist/cli/explain.js +39 -21
  179. package/dist/cli/flag-values.d.ts +30 -0
  180. package/dist/cli/flag-values.js +120 -0
  181. package/dist/cli/flags.d.ts +304 -0
  182. package/dist/cli/flags.js +169 -0
  183. package/dist/cli/github.d.ts +14 -0
  184. package/dist/cli/github.js +184 -0
  185. package/dist/cli/goals.d.ts +2 -1
  186. package/dist/cli/goals.js +76 -75
  187. package/dist/cli/hook-runtime.d.ts +31 -0
  188. package/dist/cli/hook-runtime.js +139 -0
  189. package/dist/cli/init.d.ts +2 -1
  190. package/dist/cli/init.js +153 -126
  191. package/dist/cli/install-steps.d.ts +7 -0
  192. package/dist/cli/install-steps.js +101 -0
  193. package/dist/cli/last-sleep.d.ts +3 -1
  194. package/dist/cli/last-sleep.js +12 -7
  195. package/dist/cli/maintenance.d.ts +5 -4
  196. package/dist/cli/maintenance.js +41 -42
  197. package/dist/cli/object-verbs.d.ts +40 -0
  198. package/dist/cli/object-verbs.js +66 -0
  199. package/dist/cli/owner-validation.d.ts +18 -0
  200. package/dist/cli/owner-validation.js +33 -0
  201. package/dist/cli/playbooks.d.ts +4 -3
  202. package/dist/cli/playbooks.js +98 -306
  203. package/dist/cli/print.d.ts +15 -0
  204. package/dist/cli/print.js +82 -0
  205. package/dist/cli/projects.d.ts +2 -3
  206. package/dist/cli/projects.js +56 -51
  207. package/dist/cli/provenance-coverage.d.ts +14 -0
  208. package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
  209. package/dist/cli/quality-repair-once.js +4 -4
  210. package/dist/cli/recall.d.ts +2 -6
  211. package/dist/cli/recall.js +128 -253
  212. package/dist/cli/refine-llm.d.ts +35 -0
  213. package/dist/cli/refine-llm.js +128 -0
  214. package/dist/cli/remember.d.ts +4 -6
  215. package/dist/cli/remember.js +193 -230
  216. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
  217. package/dist/{scheduler.js → cli/scheduler.js} +22 -22
  218. package/dist/cli/serve.d.ts +1 -1
  219. package/dist/cli/serve.js +46 -7
  220. package/dist/cli/session-hooks.d.ts +11 -19
  221. package/dist/cli/session-hooks.js +263 -258
  222. package/dist/cli/setup.d.ts +4 -3
  223. package/dist/cli/setup.js +55 -37
  224. package/dist/cli/shared.d.ts +14 -118
  225. package/dist/cli/shared.js +26 -400
  226. package/dist/cli/slack.d.ts +2 -1
  227. package/dist/cli/slack.js +46 -74
  228. package/dist/cli/sleep-render.d.ts +4 -0
  229. package/dist/cli/sleep-render.js +61 -0
  230. package/dist/cli/sleep.d.ts +3 -8
  231. package/dist/cli/sleep.js +34 -91
  232. package/dist/cli/status.d.ts +9 -12
  233. package/dist/cli/status.js +86 -131
  234. package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
  235. package/dist/{stdin.js → cli/stdin.js} +8 -9
  236. package/dist/cli/transfer.d.ts +9 -9
  237. package/dist/cli/transfer.js +125 -122
  238. package/dist/cli/usage.js +13 -5
  239. package/dist/cli.d.ts +69 -167
  240. package/dist/cli.js +187 -296
  241. package/dist/connectors/dlq.d.ts +44 -0
  242. package/dist/connectors/dlq.js +30 -0
  243. package/dist/connectors/github/backfill.d.ts +6 -26
  244. package/dist/connectors/github/backfill.js +42 -114
  245. package/dist/connectors/github/deletion.d.ts +6 -21
  246. package/dist/connectors/github/deletion.js +17 -64
  247. package/dist/connectors/github/dlq.d.ts +12 -91
  248. package/dist/connectors/github/dlq.js +23 -140
  249. package/dist/connectors/github/ingest.d.ts +4 -37
  250. package/dist/connectors/github/ingest.js +24 -93
  251. package/dist/connectors/github/octokit-client.d.ts +5 -17
  252. package/dist/connectors/github/octokit-client.js +29 -25
  253. package/dist/connectors/github/ratelimit.d.ts +3 -14
  254. package/dist/connectors/github/ratelimit.js +3 -14
  255. package/dist/connectors/github/scope.d.ts +3 -5
  256. package/dist/connectors/github/scope.js +3 -5
  257. package/dist/connectors/github/signature.d.ts +4 -26
  258. package/dist/connectors/github/signature.js +4 -26
  259. package/dist/connectors/github/tenant-routing.d.ts +4 -26
  260. package/dist/connectors/github/tenant-routing.js +13 -61
  261. package/dist/connectors/github/transform.d.ts +1 -1
  262. package/dist/connectors/github/transform.js +2 -16
  263. package/dist/connectors/github/types.d.ts +4 -16
  264. package/dist/connectors/github/types.js +17 -27
  265. package/dist/connectors/github/webhook.d.ts +5 -18
  266. package/dist/connectors/github/webhook.js +86 -105
  267. package/dist/connectors/slack/backfill.d.ts +5 -18
  268. package/dist/connectors/slack/backfill.js +9 -42
  269. package/dist/connectors/slack/deletion.d.ts +4 -7
  270. package/dist/connectors/slack/deletion.js +20 -49
  271. package/dist/connectors/slack/dlq.d.ts +9 -68
  272. package/dist/connectors/slack/dlq.js +26 -136
  273. package/dist/connectors/slack/ingest.d.ts +4 -18
  274. package/dist/connectors/slack/ingest.js +26 -91
  275. package/dist/connectors/slack/scope.d.ts +2 -8
  276. package/dist/connectors/slack/scope.js +2 -8
  277. package/dist/connectors/slack/signature.d.ts +1 -6
  278. package/dist/connectors/slack/signature.js +2 -1
  279. package/dist/connectors/slack/tenant-routing.d.ts +4 -18
  280. package/dist/connectors/slack/tenant-routing.js +11 -31
  281. package/dist/connectors/slack/transform.d.ts +3 -19
  282. package/dist/connectors/slack/transform.js +2 -18
  283. package/dist/connectors/slack/types.d.ts +4 -10
  284. package/dist/connectors/slack/types.js +5 -16
  285. package/dist/connectors/slack/web-client.js +34 -28
  286. package/dist/connectors/slack/webhook.d.ts +5 -21
  287. package/dist/connectors/slack/webhook.js +80 -108
  288. package/dist/connectors/slack/workspaces.d.ts +8 -41
  289. package/dist/connectors/slack/workspaces.js +8 -58
  290. package/dist/consolidate/conflicts.d.ts +1 -1
  291. package/dist/consolidate/conflicts.js +10 -18
  292. package/dist/consolidate/dag-summary.d.ts +8 -0
  293. package/dist/consolidate/dag-summary.js +41 -0
  294. package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
  295. package/dist/{dag.js → consolidate/dag.js} +49 -131
  296. package/dist/consolidate/decay.d.ts +2 -2
  297. package/dist/consolidate/decay.js +35 -41
  298. package/dist/consolidate/dedupe.d.ts +29 -0
  299. package/dist/consolidate/dedupe.js +103 -0
  300. package/dist/consolidate/flush-units.d.ts +5 -6
  301. package/dist/consolidate/flush-units.js +3 -3
  302. package/dist/consolidate/half-life-migration.d.ts +34 -0
  303. package/dist/consolidate/half-life-migration.js +89 -0
  304. package/dist/consolidate/llm-passes.js +12 -29
  305. package/dist/consolidate/memory-value-weights.d.ts +8 -0
  306. package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
  307. package/dist/consolidate/memory-value.d.ts +45 -0
  308. package/dist/consolidate/memory-value.js +164 -0
  309. package/dist/consolidate/merge.js +65 -83
  310. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  311. package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
  312. package/dist/consolidate/physics-pass.js +46 -48
  313. package/dist/consolidate/replay.d.ts +9 -0
  314. package/dist/consolidate/replay.js +84 -0
  315. package/dist/consolidate/run.d.ts +7 -13
  316. package/dist/consolidate/run.js +6 -37
  317. package/dist/consolidate/sleep.d.ts +2 -9
  318. package/dist/consolidate/sleep.js +69 -151
  319. package/dist/consolidate/trace.d.ts +19 -0
  320. package/dist/{trace.js → consolidate/trace.js} +7 -24
  321. package/dist/consolidate/traces.js +40 -51
  322. package/dist/core/ablation.d.ts +15 -0
  323. package/dist/core/ablation.js +49 -0
  324. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  325. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  326. package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
  327. package/dist/{ambient.js → core/ambient.js} +13 -18
  328. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  329. package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
  330. package/dist/{card.d.ts → core/card.d.ts} +4 -1
  331. package/dist/{card.js → core/card.js} +8 -0
  332. package/dist/core/compare.d.ts +32 -0
  333. package/dist/core/compare.js +70 -0
  334. package/dist/{config.d.ts → core/config.d.ts} +14 -28
  335. package/dist/{config.js → core/config.js} +101 -75
  336. package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
  337. package/dist/core/handoff.js +81 -0
  338. package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
  339. package/dist/core/memory.d.ts +183 -0
  340. package/dist/core/memory.js +380 -0
  341. package/dist/core/package-root.d.ts +3 -0
  342. package/dist/core/package-root.js +5 -0
  343. package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
  344. package/dist/{physics-config.js → core/physics-config.js} +3 -8
  345. package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
  346. package/dist/{physics.js → core/physics.js} +60 -122
  347. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
  348. package/dist/{project-identity.js → core/project-identity.js} +22 -55
  349. package/dist/{project-remote.js → core/project-remote.js} +17 -6
  350. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  351. package/dist/core/raw-append-only.d.ts +5 -0
  352. package/dist/core/raw-append-only.js +7 -0
  353. package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
  354. package/dist/{salience.js → core/salience.js} +36 -27
  355. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  356. package/dist/{search/types.js → core/search-types.js} +1 -1
  357. package/dist/core/session-digest-row.d.ts +5 -0
  358. package/dist/core/session-digest-row.js +6 -0
  359. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  360. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
  361. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  362. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  363. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
  364. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
  365. package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
  366. package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
  367. package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
  368. package/dist/db/backup.js +1 -1
  369. package/dist/db/busy.d.ts +19 -2
  370. package/dist/db/busy.js +88 -14
  371. package/dist/db/connect.d.ts +11 -2
  372. package/dist/db/connect.js +43 -10
  373. package/dist/db/index.d.ts +9 -0
  374. package/dist/db/index.js +8 -0
  375. package/dist/db/meta.d.ts +4 -0
  376. package/dist/db/meta.js +11 -1
  377. package/dist/db/migrate.d.ts +8 -1
  378. package/dist/db/migrate.js +28 -33
  379. package/dist/db/migrations/types.d.ts +2 -5
  380. package/dist/db/migrations/v08.js +1 -1
  381. package/dist/db/migrations/v14.js +39 -36
  382. package/dist/db/migrations/v15.js +2 -8
  383. package/dist/db/migrations/v16.js +31 -29
  384. package/dist/db/migrations/v17.js +2 -3
  385. package/dist/db/migrations/v18.js +6 -5
  386. package/dist/db/migrations/v19.js +2 -5
  387. package/dist/db/migrations/v20.js +5 -8
  388. package/dist/db/migrations/v22.js +28 -38
  389. package/dist/db/migrations/v23.js +3 -14
  390. package/dist/db/migrations/v24.js +25 -22
  391. package/dist/db/migrations/v25.js +3 -8
  392. package/dist/db/migrations/v26.js +2 -13
  393. package/dist/db/migrations/v27.js +3 -11
  394. package/dist/db/migrations/v28.js +2 -14
  395. package/dist/db/migrations/v29.js +23 -32
  396. package/dist/db/migrations/v30.js +4 -16
  397. package/dist/db/migrations/v31.js +23 -31
  398. package/dist/db/migrations/v32.js +4 -22
  399. package/dist/db/migrations/v33.js +2 -15
  400. package/dist/db/migrations/v34.js +2 -11
  401. package/dist/db/migrations/v35.js +2 -11
  402. package/dist/db/migrations/v36.js +2 -11
  403. package/dist/db/migrations/v37.js +8 -33
  404. package/dist/db/migrations/v38.js +5 -38
  405. package/dist/db/migrations/v39.js +10 -21
  406. package/dist/db/migrations/v40.js +8 -14
  407. package/dist/db/migrations/v41.js +2 -24
  408. package/dist/db/migrations/v43.js +7 -6
  409. package/dist/db/migrations/v44.js +2 -8
  410. package/dist/db/migrations/v45.js +2 -7
  411. package/dist/db/migrations/v46.js +1 -1
  412. package/dist/db/migrations/v47.js +2 -3
  413. package/dist/db/migrations/v48.js +1 -1
  414. package/dist/db/migrations/v49.js +1 -1
  415. package/dist/db/migrations/v50.js +8 -7
  416. package/dist/db/migrations/v51.js +1 -1
  417. package/dist/db/migrations/v52.js +1 -1
  418. package/dist/db/open.d.ts +11 -1
  419. package/dist/db/open.js +37 -4
  420. package/dist/db/physics-state.d.ts +23 -0
  421. package/dist/{physics-state.js → db/physics-state.js} +34 -52
  422. package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
  423. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
  424. package/dist/db/request-stores.d.ts +15 -2
  425. package/dist/db/request-stores.js +37 -15
  426. package/dist/db/tables.d.ts +2 -0
  427. package/dist/db/tables.js +6 -0
  428. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
  429. package/dist/{vector-store.js → db/vector-store.js} +83 -51
  430. package/dist/db/wal-checkpointer.d.ts +11 -0
  431. package/dist/db/wal-checkpointer.js +92 -0
  432. package/dist/doctor.js +176 -152
  433. package/dist/entry/json-hooks.d.ts +1 -1
  434. package/dist/entry/json-hooks.js +1 -1
  435. package/dist/entry/project-identity.d.ts +1 -1
  436. package/dist/entry/project-identity.js +1 -1
  437. package/dist/entry/session-text.d.ts +3 -3
  438. package/dist/entry/session-text.js +5 -4
  439. package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
  440. package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
  441. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
  442. package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
  443. package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
  444. package/dist/{eval.js → eval/eval.js} +35 -55
  445. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
  446. package/dist/{judgment.js → eval/judgment.js} +23 -20
  447. package/dist/extensions/openclaw-plugin/index.js +2 -3
  448. package/dist/graph/delta.d.ts +3 -2
  449. package/dist/graph/delta.js +9 -23
  450. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
  451. package/dist/{graph-extract.js → graph/extract.js} +40 -81
  452. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
  453. package/dist/{graph-recall.js → graph/recall.js} +65 -108
  454. package/dist/graph/stream.d.ts +38 -0
  455. package/dist/{graph-stream.js → graph/stream.js} +20 -41
  456. package/dist/graph/view.d.ts +50 -0
  457. package/dist/graph/view.js +265 -0
  458. package/dist/graph/write.d.ts +4 -76
  459. package/dist/graph/write.js +13 -397
  460. package/dist/hooks/codex-session.js +1 -1
  461. package/dist/hooks/codex-wrapper.js +16 -17
  462. package/dist/hooks/copilot.d.ts +1 -8
  463. package/dist/hooks/copilot.js +16 -16
  464. package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
  465. package/dist/{cli → hooks}/hook-blocks.js +38 -125
  466. package/dist/hooks/json-hooks.d.ts +5 -37
  467. package/dist/hooks/json-hooks.js +49 -179
  468. package/dist/hooks/opencode.d.ts +0 -38
  469. package/dist/hooks/opencode.js +44 -103
  470. package/dist/hooks/shared.d.ts +8 -21
  471. package/dist/hooks/shared.js +30 -25
  472. package/dist/importers/core.d.ts +13 -42
  473. package/dist/importers/core.js +48 -64
  474. package/dist/importers/markdown-parse.d.ts +9 -32
  475. package/dist/importers/markdown-parse.js +10 -44
  476. package/dist/importers/markdown.js +5 -13
  477. package/dist/importers/sources.js +57 -81
  478. package/dist/importers/vault.d.ts +2 -8
  479. package/dist/importers/vault.js +95 -172
  480. package/dist/index.d.ts +26 -22
  481. package/dist/index.js +25 -21
  482. package/dist/learn/autolearn.d.ts +29 -0
  483. package/dist/{autolearn.js → learn/autolearn.js} +26 -51
  484. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  485. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  486. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  487. package/dist/learn/extract.js +123 -0
  488. package/dist/learn/forward-claim-detector.d.ts +12 -0
  489. package/dist/learn/forward-claim-detector.js +60 -0
  490. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
  491. package/dist/{invalidation.js → learn/invalidation.js} +92 -125
  492. package/dist/mcp/admin-tools.d.ts +1 -1
  493. package/dist/mcp/admin-tools.js +39 -64
  494. package/dist/mcp/format.d.ts +5 -5
  495. package/dist/mcp/format.js +7 -6
  496. package/dist/mcp/framing.d.ts +6 -0
  497. package/dist/mcp/framing.js +11 -3
  498. package/dist/mcp/memory-tools.js +10 -35
  499. package/dist/mcp/protocol.d.ts +14 -36
  500. package/dist/mcp/protocol.js +10 -19
  501. package/dist/mcp/recall-tools.d.ts +2 -2
  502. package/dist/mcp/recall-tools.js +70 -52
  503. package/dist/mcp/request.d.ts +3 -11
  504. package/dist/mcp/request.js +71 -85
  505. package/dist/mcp/server.d.ts +3 -9
  506. package/dist/mcp/server.js +6 -17
  507. package/dist/mcp/session-state.d.ts +2 -3
  508. package/dist/mcp/session-state.js +7 -13
  509. package/dist/mcp/shared-gate.js +1 -1
  510. package/dist/mcp/stdio.d.ts +2 -6
  511. package/dist/mcp/stdio.js +112 -38
  512. package/dist/mcp/tool-args.js +2 -1
  513. package/dist/mcp/tools.js +7 -5
  514. package/dist/objects/customer-notes.d.ts +44 -0
  515. package/dist/objects/customer-notes.js +71 -0
  516. package/dist/objects/decisions.d.ts +41 -0
  517. package/dist/objects/decisions.js +63 -0
  518. package/dist/objects/descriptor.d.ts +52 -0
  519. package/dist/objects/descriptor.js +4 -0
  520. package/dist/objects/fields.d.ts +15 -0
  521. package/dist/objects/fields.js +21 -0
  522. package/dist/objects/incidents.d.ts +45 -0
  523. package/dist/objects/incidents.js +96 -0
  524. package/dist/objects/lifecycle.d.ts +27 -0
  525. package/dist/objects/lifecycle.js +96 -0
  526. package/dist/objects/policies.d.ts +60 -0
  527. package/dist/objects/policies.js +102 -0
  528. package/dist/objects/processes.d.ts +43 -0
  529. package/dist/objects/processes.js +92 -0
  530. package/dist/objects/project-briefs.d.ts +63 -0
  531. package/dist/objects/project-briefs.js +194 -0
  532. package/dist/objects/skills.d.ts +51 -0
  533. package/dist/objects/skills.js +110 -0
  534. package/dist/postinstall.js +10 -21
  535. package/dist/predictions/planning-fallacy.d.ts +14 -109
  536. package/dist/predictions/planning-fallacy.js +4 -129
  537. package/dist/rerankers/clef.d.ts +2 -6
  538. package/dist/rerankers/clef.js +28 -76
  539. package/dist/rerankers/cross-encoder.d.ts +0 -7
  540. package/dist/rerankers/cross-encoder.js +18 -28
  541. package/dist/rerankers/index.js +8 -7
  542. package/dist/rerankers/jev.d.ts +1 -4
  543. package/dist/rerankers/jev.js +36 -52
  544. package/dist/rerankers/llm.d.ts +2 -13
  545. package/dist/rerankers/llm.js +42 -59
  546. package/dist/rerankers/outage-warning.d.ts +8 -0
  547. package/dist/rerankers/outage-warning.js +32 -0
  548. package/dist/rerankers/remote.d.ts +4 -0
  549. package/dist/rerankers/remote.js +25 -0
  550. package/dist/rerankers/types.d.ts +3 -15
  551. package/dist/search/as-of.d.ts +1 -1
  552. package/dist/search/bm25-search.d.ts +2 -2
  553. package/dist/search/bm25-search.js +7 -7
  554. package/dist/search/bm25.d.ts +1 -1
  555. package/dist/search/bm25.js +1 -1
  556. package/dist/search/boosts.d.ts +5 -3
  557. package/dist/search/boosts.js +36 -15
  558. package/dist/search/breakdown.d.ts +2 -2
  559. package/dist/search/breakdown.js +2 -1
  560. package/dist/search/explain.d.ts +1 -1
  561. package/dist/search/explain.js +3 -2
  562. package/dist/search/finalize.d.ts +2 -2
  563. package/dist/search/finalize.js +4 -3
  564. package/dist/search/fusion.d.ts +1 -1
  565. package/dist/search/fusion.js +3 -3
  566. package/dist/search/goal-boost.d.ts +23 -0
  567. package/dist/search/goal-boost.js +90 -0
  568. package/dist/search/hybrid-score.d.ts +2 -2
  569. package/dist/search/hybrid-score.js +1 -1
  570. package/dist/search/hybrid.d.ts +6 -4
  571. package/dist/search/hybrid.js +11 -8
  572. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  573. package/dist/{multihop.js → search/multihop.js} +9 -8
  574. package/dist/search/path-context.d.ts +11 -0
  575. package/dist/{path-context.js → search/path-context.js} +8 -19
  576. package/dist/search/physics-search.d.ts +4 -4
  577. package/dist/search/physics-search.js +25 -22
  578. package/dist/search/rerank.d.ts +3 -3
  579. package/dist/search/rerank.js +4 -3
  580. package/dist/search/rrf.d.ts +15 -0
  581. package/dist/search/rrf.js +36 -0
  582. package/dist/search/temporal.d.ts +1 -1
  583. package/dist/search/temporal.js +5 -2
  584. package/dist/search/vector.d.ts +10 -3
  585. package/dist/search/vector.js +51 -15
  586. package/dist/server/auth.d.ts +10 -29
  587. package/dist/server/auth.js +57 -42
  588. package/dist/server/boot.d.ts +5 -0
  589. package/dist/server/boot.js +432 -0
  590. package/dist/server/client-ip.d.ts +8 -20
  591. package/dist/server/client-ip.js +23 -34
  592. package/dist/server/cursor.d.ts +1 -1
  593. package/dist/server/cursor.js +2 -3
  594. package/dist/server/deadline.d.ts +13 -0
  595. package/dist/server/deadline.js +45 -0
  596. package/dist/server/defaults.d.ts +3 -0
  597. package/dist/server/defaults.js +4 -0
  598. package/dist/server/key-check-bounds.d.ts +9 -0
  599. package/dist/server/key-check-bounds.js +46 -0
  600. package/dist/server/lifecycle.d.ts +5 -4
  601. package/dist/server/lifecycle.js +20 -5
  602. package/dist/server/mcp-http.d.ts +1 -4
  603. package/dist/server/mcp-http.js +44 -68
  604. package/dist/server/rate-limit.d.ts +21 -0
  605. package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
  606. package/dist/server/ready.d.ts +7 -0
  607. package/dist/server/ready.js +38 -0
  608. package/dist/server/request.d.ts +14 -12
  609. package/dist/server/request.js +71 -28
  610. package/dist/server/route-table.d.ts +15 -0
  611. package/dist/server/route-table.js +202 -0
  612. package/dist/server/routes/admin.js +29 -30
  613. package/dist/server/routes/customer-notes.d.ts +5 -5
  614. package/dist/server/routes/customer-notes.js +35 -105
  615. package/dist/server/routes/decisions.d.ts +5 -5
  616. package/dist/server/routes/decisions.js +45 -115
  617. package/dist/server/routes/incidents.d.ts +5 -5
  618. package/dist/server/routes/incidents.js +44 -105
  619. package/dist/server/routes/memories.js +21 -43
  620. package/dist/server/routes/object-routes.d.ts +35 -0
  621. package/dist/server/routes/object-routes.js +72 -0
  622. package/dist/server/routes/policies.d.ts +6 -6
  623. package/dist/server/routes/policies.js +42 -134
  624. package/dist/server/routes/predictions.js +35 -63
  625. package/dist/server/routes/processes.d.ts +5 -5
  626. package/dist/server/routes/processes.js +44 -134
  627. package/dist/server/routes/project-briefs.d.ts +6 -6
  628. package/dist/server/routes/project-briefs.js +41 -120
  629. package/dist/server/routes/recall.js +21 -44
  630. package/dist/server/routes/skills.d.ts +6 -6
  631. package/dist/server/routes/skills.js +40 -138
  632. package/dist/server/server-detect.d.ts +28 -0
  633. package/dist/server/server-detect.js +156 -0
  634. package/dist/server/sleep-child.d.ts +2 -0
  635. package/dist/server/sleep-child.js +19 -0
  636. package/dist/server/sleep-offload.d.ts +20 -0
  637. package/dist/server/sleep-offload.js +73 -0
  638. package/dist/server/tls.d.ts +6 -0
  639. package/dist/server/tls.js +24 -0
  640. package/dist/server/types.d.ts +35 -14
  641. package/dist/server/validation.d.ts +6 -5
  642. package/dist/server/validation.js +16 -34
  643. package/dist/server.d.ts +39 -61
  644. package/dist/server.js +26 -569
  645. package/dist/sharing/global-store.d.ts +19 -0
  646. package/dist/sharing/global-store.js +75 -0
  647. package/dist/sharing/global-sync.d.ts +6 -0
  648. package/dist/sharing/global-sync.js +80 -0
  649. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
  650. package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
  651. package/dist/sharing/scope.d.ts +7 -0
  652. package/dist/{scope.js → sharing/scope.js} +5 -12
  653. package/dist/sharing/search-both.d.ts +60 -0
  654. package/dist/sharing/search-both.js +138 -0
  655. package/dist/sharing/share.d.ts +38 -0
  656. package/dist/sharing/share.js +226 -0
  657. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  658. package/dist/{ambient-store.js → store/ambient.js} +11 -16
  659. package/dist/store/audit-event.d.ts +15 -17
  660. package/dist/store/audit-event.js +9 -16
  661. package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
  662. package/dist/{audit.js → store/audit.js} +95 -18
  663. package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
  664. package/dist/{auth.js → store/auth.js} +108 -99
  665. package/dist/store/candidates.d.ts +41 -13
  666. package/dist/store/candidates.js +141 -60
  667. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
  668. package/dist/{card-detail.js → store/card-detail.js} +3 -2
  669. package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
  670. package/dist/{store-cards.js → store/cards.js} +133 -248
  671. package/dist/store/compactions.d.ts +78 -0
  672. package/dist/store/compactions.js +93 -0
  673. package/dist/store/conflicts.d.ts +26 -26
  674. package/dist/store/conflicts.js +194 -222
  675. package/dist/store/connectors/github.d.ts +84 -0
  676. package/dist/store/connectors/github.js +180 -0
  677. package/dist/store/connectors/slack.d.ts +69 -0
  678. package/dist/store/connectors/slack.js +177 -0
  679. package/dist/store/dashboard-reads.d.ts +27 -0
  680. package/dist/store/dashboard-reads.js +88 -0
  681. package/dist/store/delete-and-batch.d.ts +27 -51
  682. package/dist/store/delete-and-batch.js +100 -92
  683. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
  684. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
  685. package/dist/store/descendant-page.d.ts +12 -0
  686. package/dist/store/descendant-page.js +99 -0
  687. package/dist/store/diagnostics.d.ts +47 -0
  688. package/dist/store/diagnostics.js +44 -0
  689. package/dist/store/doctor-reads.d.ts +16 -0
  690. package/dist/store/doctor-reads.js +19 -0
  691. package/dist/store/dormant.d.ts +105 -0
  692. package/dist/store/dormant.js +241 -0
  693. package/dist/store/embeddings/index.d.ts +36 -0
  694. package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
  695. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  696. package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
  697. package/dist/store/embeddings/provider.d.ts +40 -0
  698. package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
  699. package/dist/store/entry-reads.d.ts +66 -63
  700. package/dist/store/entry-reads.js +159 -121
  701. package/dist/store/entry-row.d.ts +14 -37
  702. package/dist/store/entry-row.js +37 -45
  703. package/dist/store/entry-writes.d.ts +40 -17
  704. package/dist/store/entry-writes.js +105 -41
  705. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  706. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  707. package/dist/store/goals.d.ts +96 -0
  708. package/dist/store/goals.js +260 -0
  709. package/dist/store/graph-queue.d.ts +13 -0
  710. package/dist/store/graph-queue.js +70 -0
  711. package/dist/store/graph-reads.d.ts +41 -0
  712. package/dist/{graph/read.js → store/graph-reads.js} +72 -162
  713. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
  714. package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
  715. package/dist/store/graph-view-rows.d.ts +13 -0
  716. package/dist/store/graph-view-rows.js +68 -0
  717. package/dist/store/graph-writes.d.ts +33 -0
  718. package/dist/store/graph-writes.js +232 -0
  719. package/dist/store/half-life.d.ts +35 -0
  720. package/dist/store/half-life.js +75 -0
  721. package/dist/store/handoffs.d.ts +6 -12
  722. package/dist/store/handoffs.js +54 -63
  723. package/dist/store/index-and-stats.d.ts +14 -20
  724. package/dist/store/index-and-stats.js +74 -119
  725. package/dist/store/index.d.ts +4 -0
  726. package/dist/store/index.js +3 -0
  727. package/dist/store/key-audit.d.ts +2 -2
  728. package/dist/store/key-audit.js +4 -4
  729. package/dist/store/key-writes.d.ts +12 -5
  730. package/dist/store/key-writes.js +30 -4
  731. package/dist/store/ledger-turn.d.ts +17 -0
  732. package/dist/store/ledger-turn.js +27 -0
  733. package/dist/store/markdown.d.ts +3 -7
  734. package/dist/store/markdown.js +25 -23
  735. package/dist/store/mirrors.d.ts +7 -13
  736. package/dist/store/mirrors.js +52 -47
  737. package/dist/store/object-types.d.ts +189 -0
  738. package/dist/store/object-types.js +4 -0
  739. package/dist/store/open.d.ts +6 -4
  740. package/dist/store/open.js +30 -36
  741. package/dist/store/planning-fallacy-evidence.d.ts +14 -0
  742. package/dist/store/planning-fallacy-evidence.js +52 -0
  743. package/dist/store/port.d.ts +649 -0
  744. package/dist/store/port.js +17 -0
  745. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
  746. package/dist/{predictions/store.js → store/predictions.js} +88 -184
  747. package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
  748. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  749. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  750. package/dist/store/raw-archive.d.ts +14 -0
  751. package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
  752. package/dist/store/recall-scope.d.ts +78 -0
  753. package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
  754. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
  755. package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
  756. package/dist/store/rejected-values.d.ts +55 -0
  757. package/dist/store/rejected-values.js +150 -0
  758. package/dist/store/rejection.d.ts +54 -0
  759. package/dist/{rejection.js → store/rejection.js} +16 -67
  760. package/dist/store/report-reads.d.ts +6 -0
  761. package/dist/store/report-reads.js +29 -0
  762. package/dist/store/rows.d.ts +11 -22
  763. package/dist/store/rows.js +52 -43
  764. package/dist/store/rule-sql.d.ts +5 -0
  765. package/dist/store/rule-sql.js +37 -0
  766. package/dist/store/search-rows.d.ts +22 -42
  767. package/dist/store/search-rows.js +55 -78
  768. package/dist/store/sessions.d.ts +23 -49
  769. package/dist/store/sessions.js +96 -118
  770. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  771. package/dist/store/sqlite/commit-watch.js +29 -0
  772. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  773. package/dist/store/sqlite/connector-events-group.js +50 -0
  774. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  775. package/dist/store/sqlite/connector-writes-group.js +65 -0
  776. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  777. package/dist/store/sqlite/dag-reads-group.js +45 -0
  778. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  779. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  780. package/dist/store/sqlite/error-codec.d.ts +17 -0
  781. package/dist/store/sqlite/error-codec.js +61 -0
  782. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  783. package/dist/store/sqlite/executor-counts.js +11 -0
  784. package/dist/store/sqlite/executor.d.ts +29 -0
  785. package/dist/store/sqlite/executor.js +287 -0
  786. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  787. package/dist/store/sqlite/graph-reads-group.js +18 -0
  788. package/dist/store/sqlite/local.d.ts +21 -0
  789. package/dist/store/sqlite/local.js +39 -0
  790. package/dist/store/sqlite/object-rows.d.ts +102 -0
  791. package/dist/store/sqlite/object-rows.js +221 -0
  792. package/dist/store/sqlite/objects-group.d.ts +20 -0
  793. package/dist/store/sqlite/objects-group.js +316 -0
  794. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  795. package/dist/store/sqlite/predictions-group.js +28 -0
  796. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  797. package/dist/store/sqlite/quarantine-group.js +38 -0
  798. package/dist/store/sqlite/store.d.ts +23 -0
  799. package/dist/store/sqlite/store.js +294 -0
  800. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  801. package/dist/store/sqlite/vector-pack.js +46 -0
  802. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  803. package/dist/store/sqlite/vector-reads-group.js +23 -0
  804. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  805. package/dist/store/sqlite/worker-entry.js +8 -0
  806. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  807. package/dist/store/sqlite/worker-jobs.js +116 -0
  808. package/dist/store/sqlite/worker-ops.d.ts +135 -0
  809. package/dist/store/sqlite/worker-ops.js +93 -0
  810. package/dist/store/sqlite/worker-store.d.ts +8 -0
  811. package/dist/store/sqlite/worker-store.js +79 -0
  812. package/dist/store/summaries.d.ts +11 -72
  813. package/dist/store/summaries.js +47 -186
  814. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  815. package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
  816. package/dist/store/tenant-lookup.d.ts +6 -1
  817. package/dist/store/tenant-lookup.js +7 -0
  818. package/dist/store/tenant.d.ts +11 -0
  819. package/dist/store/tenant.js +28 -0
  820. package/dist/store/token-ledger-rows.d.ts +61 -0
  821. package/dist/store/token-ledger-rows.js +68 -0
  822. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
  823. package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
  824. package/dist/store/tombstone-checks.d.ts +12 -0
  825. package/dist/store/tombstone-checks.js +31 -0
  826. package/dist/store/usage-reports.d.ts +7 -0
  827. package/dist/store/usage-reports.js +18 -0
  828. package/dist/store/vector-index.d.ts +46 -0
  829. package/dist/store/vector-index.js +170 -0
  830. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
  831. package/dist/store/working-memory.js +118 -0
  832. package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
  833. package/dist/{yaml.js → store/yaml.js} +2 -6
  834. package/dist/support-bundle.d.ts +1 -1
  835. package/dist/support-bundle.js +19 -37
  836. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  837. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  838. package/dist/trust/quarantine.d.ts +4 -0
  839. package/dist/trust/quarantine.js +8 -0
  840. package/dist/trust/reject-flow.d.ts +23 -0
  841. package/dist/trust/reject-flow.js +65 -0
  842. package/dist/util/anthropic-messages.d.ts +31 -0
  843. package/dist/util/anthropic-messages.js +58 -0
  844. package/dist/util/atomic-write.d.ts +4 -0
  845. package/dist/util/atomic-write.js +138 -0
  846. package/dist/util/capped-json.d.ts +6 -0
  847. package/dist/util/capped-json.js +46 -0
  848. package/dist/util/crash-handlers.d.ts +12 -0
  849. package/dist/util/crash-handlers.js +72 -0
  850. package/dist/{env.d.ts → util/env.d.ts} +27 -7
  851. package/dist/{env.js → util/env.js} +33 -8
  852. package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
  853. package/dist/util/home-path.js +69 -0
  854. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
  855. package/dist/util/http-retry.js +103 -0
  856. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  857. package/dist/{http-util.js → util/http-util.js} +31 -11
  858. package/dist/util/json.d.ts +17 -0
  859. package/dist/util/json.js +25 -0
  860. package/dist/{log.d.ts → util/log.d.ts} +7 -3
  861. package/dist/{log.js → util/log.js} +36 -11
  862. package/dist/util/real-path.d.ts +3 -0
  863. package/dist/util/real-path.js +15 -0
  864. package/dist/util/request-scope.d.ts +28 -0
  865. package/dist/util/request-scope.js +48 -0
  866. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  867. package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
  868. package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
  869. package/dist/util/stored-json.d.ts +9 -0
  870. package/dist/util/stored-json.js +8 -0
  871. package/dist/util/time.d.ts +2 -0
  872. package/dist/util/time.js +3 -0
  873. package/dist/util/token-text.d.ts +15 -0
  874. package/dist/util/token-text.js +20 -0
  875. package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
  876. package/dist/util/transcript-tail.js +49 -0
  877. package/dist/util/version.d.ts +11 -0
  878. package/dist/util/version.js +26 -0
  879. package/extensions/openclaw-plugin/index.ts +2 -6
  880. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  881. package/extensions/openclaw-plugin/package.json +1 -1
  882. package/openclaw.plugin.json +1 -1
  883. package/package.json +2 -2
  884. package/dist/ablation.d.ts +0 -102
  885. package/dist/ablation.js +0 -136
  886. package/dist/api.d.ts +0 -26
  887. package/dist/api.js +0 -29
  888. package/dist/audit-prune.d.ts +0 -62
  889. package/dist/audit-prune.js +0 -107
  890. package/dist/autolearn.d.ts +0 -56
  891. package/dist/client.d.ts +0 -48
  892. package/dist/compare.d.ts +0 -86
  893. package/dist/compare.js +0 -117
  894. package/dist/connectors/github/cli-impl.d.ts +0 -25
  895. package/dist/connectors/github/cli-impl.js +0 -227
  896. package/dist/connectors/github/idempotency.d.ts +0 -19
  897. package/dist/connectors/github/idempotency.js +0 -27
  898. package/dist/connectors/slack/idempotency.d.ts +0 -17
  899. package/dist/connectors/slack/idempotency.js +0 -31
  900. package/dist/correction-latency.d.ts +0 -36
  901. package/dist/customer-notes.d.ts +0 -96
  902. package/dist/customer-notes.js +0 -336
  903. package/dist/db.d.ts +0 -9
  904. package/dist/db.js +0 -8
  905. package/dist/decisions.d.ts +0 -94
  906. package/dist/decisions.js +0 -326
  907. package/dist/dedupe.d.ts +0 -75
  908. package/dist/dedupe.js +0 -169
  909. package/dist/dormant.d.ts +0 -93
  910. package/dist/dormant.js +0 -137
  911. package/dist/embedding-provider.d.ts +0 -77
  912. package/dist/embeddings.d.ts +0 -101
  913. package/dist/extract.js +0 -133
  914. package/dist/forward-claim-detector.d.ts +0 -36
  915. package/dist/forward-claim-detector.js +0 -112
  916. package/dist/goals.d.ts +0 -173
  917. package/dist/goals.js +0 -448
  918. package/dist/graph/read.d.ts +0 -73
  919. package/dist/graph/rows.d.ts +0 -45
  920. package/dist/graph/types.js +0 -11
  921. package/dist/graph-stream.d.ts +0 -70
  922. package/dist/graph-view.d.ts +0 -73
  923. package/dist/graph-view.js +0 -333
  924. package/dist/half-life-migration.d.ts +0 -63
  925. package/dist/half-life-migration.js +0 -182
  926. package/dist/handoff.js +0 -68
  927. package/dist/home-path.js +0 -24
  928. package/dist/http-retry.js +0 -51
  929. package/dist/incidents.d.ts +0 -103
  930. package/dist/incidents.js +0 -349
  931. package/dist/instruction-detect.js +0 -27
  932. package/dist/json.d.ts +0 -7
  933. package/dist/json.js +0 -11
  934. package/dist/ledger-db.d.ts +0 -10
  935. package/dist/ledger-db.js +0 -42
  936. package/dist/memory-value-weights.d.ts +0 -19
  937. package/dist/memory-value.d.ts +0 -113
  938. package/dist/memory-value.js +0 -250
  939. package/dist/memory.d.ts +0 -294
  940. package/dist/memory.js +0 -522
  941. package/dist/owner-validation.d.ts +0 -42
  942. package/dist/owner-validation.js +0 -56
  943. package/dist/path-context.d.ts +0 -24
  944. package/dist/physics-state.d.ts +0 -39
  945. package/dist/policies.d.ts +0 -151
  946. package/dist/policies.js +0 -434
  947. package/dist/processes.d.ts +0 -108
  948. package/dist/processes.js +0 -371
  949. package/dist/project-briefs.d.ts +0 -128
  950. package/dist/project-briefs.js +0 -523
  951. package/dist/provenance-coverage.d.ts +0 -18
  952. package/dist/rate-limit.d.ts +0 -34
  953. package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
  954. package/dist/raw-archive.d.ts +0 -24
  955. package/dist/recall-history.d.ts +0 -131
  956. package/dist/recall-history.js +0 -227
  957. package/dist/recall-scope.d.ts +0 -138
  958. package/dist/refine-llm.d.ts +0 -61
  959. package/dist/refine-llm.js +0 -167
  960. package/dist/reject-flow.d.ts +0 -69
  961. package/dist/reject-flow.js +0 -260
  962. package/dist/rejection.d.ts +0 -100
  963. package/dist/replay.d.ts +0 -41
  964. package/dist/replay.js +0 -122
  965. package/dist/rrf.d.ts +0 -43
  966. package/dist/rrf.js +0 -61
  967. package/dist/scope.d.ts +0 -14
  968. package/dist/server-detect.d.ts +0 -72
  969. package/dist/server-detect.js +0 -222
  970. package/dist/session-owners.d.ts +0 -7
  971. package/dist/session-owners.js +0 -54
  972. package/dist/shared.d.ts +0 -186
  973. package/dist/shared.js +0 -540
  974. package/dist/skills.d.ts +0 -101
  975. package/dist/skills.js +0 -367
  976. package/dist/store/entry-writes-group.d.ts +0 -9
  977. package/dist/store/vector-writes.d.ts +0 -6
  978. package/dist/store/vector-writes.js +0 -59
  979. package/dist/store-port.d.ts +0 -262
  980. package/dist/store-port.js +0 -178
  981. package/dist/tenant.d.ts +0 -25
  982. package/dist/tenant.js +0 -43
  983. package/dist/trace.d.ts +0 -34
  984. package/dist/transcript-tail.js +0 -48
  985. package/dist/version.d.ts +0 -26
  986. package/dist/version.js +0 -41
  987. package/dist/working-memory.js +0 -154
  988. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  989. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  990. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  991. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  992. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  993. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  994. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  995. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  996. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  997. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  998. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  999. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  1000. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  1001. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  1002. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  1003. /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
  1004. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  1005. /package/dist/{escape.js → util/escape.js} +0 -0
  1006. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  1007. /package/dist/{keyset.js → util/keyset.js} +0 -0
  1008. /package/dist/{same-text.js → util/same-text.js} +0 -0
  1009. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  1010. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  1011. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  1012. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  1013. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  1014. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,13 +1,11 @@
1
1
  // The dashboard's read model: one in-memory snapshot of a tenant's live memories, grouped by origin project.
2
2
  // Pure build functions plus one cache; the queries over it live in dashboard-queries.ts.
3
- import * as fs from 'fs';
4
- import { calculateStrength, confidenceFacets, netWrong, Layer as MemoryLayer } from './memory.js';
5
- import { isQuarantineScope } from './quarantine.js';
6
- import { listMemoryConflicts } from './store/conflicts.js';
7
- import { loadAllEntries } from './store/entry-reads.js';
8
- import { closeHippoDb, getHippoDbPath, openHippoDbReadOnly } from './db.js';
9
- import { storedVectorIds } from './vector-store.js';
10
- export const DAY_MS = 86_400_000;
3
+ import { calculateStrength, facetsOf, netWrong, Layer as MemoryLayer } from '../core/memory.js';
4
+ import { isQuarantineScope } from '../trust/quarantine.js';
5
+ import { listMemoryConflicts } from '../store/conflicts.js';
6
+ import { DashboardConnection, loadDashboardRows } from '../store/dashboard-reads.js';
7
+ import { DAY_MS } from '../util/time.js';
8
+ export { DAY_MS };
11
9
  export const LAYERS = ['buffer', 'episodic', 'semantic', 'trace'];
12
10
  // Wire order of `Band`, and the order the mockup sorts bands in.
13
11
  export const BANDS = ['pinned', 'strong', 'fading', 'atRisk'];
@@ -18,9 +16,9 @@ const BAND_AT_RISK = 3;
18
16
  const CONFIDENCE_ORDER = ['verified', 'observed', 'inferred', 'stale'];
19
17
  const HEAD_CHARS = 240;
20
18
  /** An outside commit rebuilds the snapshot at most this often. */
21
- export const COALESCE_MS = 10_000;
19
+ const COALESCE_MS = 10_000;
22
20
  /** Projected strengths track the clock, so the snapshot is rebuilt at least this often. */
23
- export const TTL_MS = 5 * 60_000;
21
+ const TTL_MS = 5 * 60_000;
24
22
  /** The one predicate for "shown on the dashboard": not superseded, not archived, not quarantined. */
25
23
  export function isLiveMemory(entry) {
26
24
  return !entry.superseded_by && (entry.kind === 'raw' || entry.kind === 'distilled') && !isQuarantineScope(entry.scope);
@@ -52,7 +50,7 @@ export function memoryFacts(entry, nowMs) {
52
50
  const strength = calculateStrength(entry, now);
53
51
  const strength7d = calculateStrength(entry, new Date(nowMs + 7 * DAY_MS));
54
52
  const strength30d = calculateStrength(entry, new Date(nowMs + 30 * DAY_MS));
55
- const facets = confidenceFacets(entry, now);
53
+ const facets = facetsOf(entry, now);
56
54
  const band = entry.pinned ? BAND_PINNED : strength30d < 0.2 ? BAND_AT_RISK : strength >= 0.5 ? BAND_STRONG : BAND_FADING;
57
55
  return {
58
56
  strength,
@@ -144,30 +142,42 @@ function toFact(entry, f, project, embedded, createdMs) {
144
142
  createdMs,
145
143
  };
146
144
  }
145
+ function tallyExcluded(entry, excluded) {
146
+ if (isQuarantineScope(entry.scope))
147
+ excluded.quarantined++;
148
+ else if (entry.superseded_by || entry.kind === 'superseded')
149
+ excluded.superseded++;
150
+ else if (entry.kind === 'archived')
151
+ excluded.archived++;
152
+ }
153
+ function draftIndexFor(identity, projectIndex, drafts) {
154
+ let p = projectIndex.get(identity.key);
155
+ if (p === undefined) {
156
+ p = drafts.length;
157
+ projectIndex.set(identity.key, p);
158
+ drafts.push(newDraft(identity));
159
+ }
160
+ return p;
161
+ }
162
+ function finishProject(d) {
163
+ d.summary.atRisk = d.summary.bands.atRisk;
164
+ d.summary.share = d.summary.live > 0 ? d.summary.atRisk / d.summary.live : 0;
165
+ d.summary.lastRetrievedDays = d.summary.live > 0 ? round1(d.lastDays) : null;
166
+ return { summary: d.summary, members: Int32Array.from(d.members), firstCreatedMs: d.firstCreatedMs };
167
+ }
147
168
  /** Builds the snapshot from already-loaded rows; it touches no store, so tests can feed it directly. */
148
169
  export function buildSnapshot(input) {
149
170
  const { entries, embeddedIds, nowMs } = input;
150
- const excluded = { superseded: 0, archived: 0, quarantined: 0 };
171
+ const excluded = { superseded: 0, archived: 0, quarantined: 0, ...input.excluded };
151
172
  const facts = [];
152
173
  const projectIndex = new Map();
153
174
  const drafts = [];
154
175
  for (const entry of entries) {
155
176
  if (!isLiveMemory(entry)) {
156
- if (isQuarantineScope(entry.scope))
157
- excluded.quarantined++;
158
- else if (entry.superseded_by || entry.kind === 'superseded')
159
- excluded.superseded++;
160
- else if (entry.kind === 'archived')
161
- excluded.archived++;
177
+ tallyExcluded(entry, excluded);
162
178
  continue;
163
179
  }
164
- const identity = projectIdentity(entry.origin_project);
165
- let p = projectIndex.get(identity.key);
166
- if (p === undefined) {
167
- p = drafts.length;
168
- projectIndex.set(identity.key, p);
169
- drafts.push(newDraft(identity));
170
- }
180
+ const p = draftIndexFor(projectIdentity(entry.origin_project), projectIndex, drafts);
171
181
  const f = memoryFacts(entry, nowMs);
172
182
  const embedded = embeddedIds !== null && embeddedIds.has(entry.id);
173
183
  const parsedCreated = Date.parse(entry.created);
@@ -187,12 +197,7 @@ export function buildSnapshot(input) {
187
197
  facts.push(toFact(entry, f, p, embedded, Number.isFinite(parsedCreated) ? parsedCreated : nowMs));
188
198
  }
189
199
  const openConflicts = countOpenConflicts(facts, drafts.map((d) => d.summary), input.openConflicts);
190
- const projects = drafts.map((d) => {
191
- d.summary.atRisk = d.summary.bands.atRisk;
192
- d.summary.share = d.summary.live > 0 ? d.summary.atRisk / d.summary.live : 0;
193
- d.summary.lastRetrievedDays = d.summary.live > 0 ? round1(d.lastDays) : null;
194
- return { summary: d.summary, members: Int32Array.from(d.members), firstCreatedMs: d.firstCreatedMs };
195
- });
200
+ const projects = drafts.map(finishProject);
196
201
  const embeddedTotal = projects.reduce((sum, p) => sum + p.summary.embedded, 0);
197
202
  return {
198
203
  id: input.id,
@@ -227,82 +232,83 @@ function countOpenConflicts(facts, summaries, conflicts) {
227
232
  }
228
233
  return total;
229
234
  }
235
+ function cacheStillServes(hit, want, wallMs) {
236
+ const age = wallMs - hit.builtAtMs;
237
+ return hit.snapshot.tenantId === want.tenantId
238
+ && (hit.dataVersion !== null || want.dataVersion === null)
239
+ && age < TTL_MS
240
+ && (hit.dataVersion === want.dataVersion || age < COALESCE_MS);
241
+ }
230
242
  // Keeps ids rising between two services created in the same millisecond of one process.
231
243
  let highestIssuedId = 0;
232
- /** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
233
- export function createSnapshotService(hippoRoot, now, cacheClock = Date.now) {
234
- let db = null;
235
- let cached = null;
244
+ class SnapshotCacheService {
245
+ hippoRoot;
246
+ now;
247
+ cacheClock;
248
+ connection;
249
+ cached = null;
236
250
  // Wall clock, not `now`, so ids keep rising across server restarts and a client holding an old tab never sees a lower one.
237
- let lastId = Math.max(Date.now(), highestIssuedId);
238
- let lastEmbeddedIds;
239
- const dataVersion = () => {
240
- if (db === null) {
241
- if (!fs.existsSync(getHippoDbPath(hippoRoot)))
242
- return null;
243
- db = openHippoDbReadOnly(hippoRoot);
251
+ lastId = Math.max(Date.now(), highestIssuedId);
252
+ lastEmbeddedIds;
253
+ constructor(hippoRoot, now, cacheClock) {
254
+ this.hippoRoot = hippoRoot;
255
+ this.now = now;
256
+ this.cacheClock = cacheClock;
257
+ this.connection = new DashboardConnection(hippoRoot);
258
+ }
259
+ build(tenantId, dv, nowMs) {
260
+ const rows = dv === null ? null : loadDashboardRows(this.hippoRoot, tenantId);
261
+ const openConflicts = dv === null ? [] : listMemoryConflicts(this.hippoRoot, 'open', tenantId);
262
+ this.lastId += 1;
263
+ highestIssuedId = Math.max(highestIssuedId, this.lastId);
264
+ // After loadDashboardRows, whose writable open has run any pending migration and legacy embeddings.json import.
265
+ this.lastEmbeddedIds = this.connection.embeddedIds();
266
+ return buildSnapshot({
267
+ id: this.lastId,
268
+ tenantId,
269
+ nowMs,
270
+ entries: rows?.live ?? [],
271
+ excluded: rows?.excluded,
272
+ openConflicts,
273
+ embeddedIds: this.lastEmbeddedIds
274
+ });
275
+ }
276
+ get(tenantId, fresh = false) {
277
+ const nowMs = this.now();
278
+ // A frozen eval clock (HIPPO_FAKE_NOW) would never age the cache, so reuse is timed on its own clock.
279
+ const wallMs = this.cacheClock();
280
+ // Read before the build, so a commit that lands during it shows on the next read.
281
+ const dv = this.connection.dataVersion();
282
+ const hit = this.cached;
283
+ if (hit !== null && !fresh) {
284
+ if (cacheStillServes(hit, { tenantId, dataVersion: dv }, wallMs))
285
+ return hit.snapshot;
244
286
  }
245
- // SAFETY: PRAGMA data_version returns one row with that single integer column.
246
- const row = db.prepare('PRAGMA data_version').get();
247
- return row.data_version;
248
- };
249
- // No database means no vectors; a store not yet on schema v52 has no table to count, so coverage is unknown.
250
- const readEmbeddedIds = () => {
251
- if (db === null)
252
- return new Set();
253
- // SAFETY: sqlite_master rows carry a text name; the query only tests presence.
254
- const table = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'memory_vectors'").get();
255
- return table === undefined ? null : storedVectorIds(db);
256
- };
257
- const build = (tenantId, dv, nowMs) => {
258
- const entries = dv === null ? [] : loadAllEntries(hippoRoot, tenantId);
259
- const openConflicts = dv === null ? [] : listMemoryConflicts(hippoRoot, 'open', tenantId);
260
- lastId += 1;
261
- highestIssuedId = Math.max(highestIssuedId, lastId);
262
- // After loadAllEntries, whose writable open has run any pending migration and legacy embeddings.json import.
263
- lastEmbeddedIds = readEmbeddedIds();
264
- return buildSnapshot({ id: lastId, tenantId, nowMs, entries, openConflicts, embeddedIds: lastEmbeddedIds });
265
- };
266
- return {
267
- get(tenantId, fresh = false) {
268
- const nowMs = now();
269
- // A frozen eval clock (HIPPO_FAKE_NOW) would never age the cache, so reuse is timed on its own clock.
270
- const wallMs = cacheClock();
271
- // Read before the build, so a commit that lands during it shows on the next read.
272
- const dv = dataVersion();
273
- const hit = cached;
274
- if (hit !== null && !fresh) {
275
- const age = wallMs - hit.builtAtMs;
276
- const reusable = hit.snapshot.tenantId === tenantId
277
- && (hit.dataVersion !== null || dv === null)
278
- && age < TTL_MS
279
- && (hit.dataVersion === dv || age < COALESCE_MS);
280
- if (reusable)
281
- return hit.snapshot;
282
- }
283
- const snapshot = build(tenantId, dv, nowMs);
284
- cached = { snapshot, dataVersion: dv, builtAtMs: wallMs };
285
- return snapshot;
286
- },
287
- invalidate() {
288
- cached = null;
289
- },
290
- currentId() {
291
- return lastId;
292
- },
293
- embeddedIds() {
294
- if (lastEmbeddedIds !== undefined)
295
- return lastEmbeddedIds;
296
- dataVersion();
297
- return readEmbeddedIds();
298
- },
299
- close() {
300
- if (db !== null)
301
- closeHippoDb(db);
302
- db = null;
303
- cached = null;
304
- lastEmbeddedIds = undefined;
305
- },
306
- };
287
+ const snapshot = this.build(tenantId, dv, nowMs);
288
+ this.cached = { snapshot, dataVersion: dv, builtAtMs: wallMs };
289
+ return snapshot;
290
+ }
291
+ invalidate() {
292
+ this.cached = null;
293
+ }
294
+ currentId() {
295
+ return this.lastId;
296
+ }
297
+ embeddedIds() {
298
+ if (this.lastEmbeddedIds !== undefined)
299
+ return this.lastEmbeddedIds;
300
+ this.connection.dataVersion();
301
+ return this.connection.embeddedIds();
302
+ }
303
+ close() {
304
+ this.connection.close();
305
+ this.cached = null;
306
+ this.lastEmbeddedIds = undefined;
307
+ }
308
+ }
309
+ /** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the
310
+ * snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
311
+ export function createSnapshotService(hippoRoot, now, cacheClock = Date.now) {
312
+ return new SnapshotCacheService(hippoRoot, now, cacheClock);
307
313
  }
308
314
  //# sourceMappingURL=dashboard-snapshot.js.map
@@ -17,7 +17,8 @@ export interface ProjectSummary {
17
17
  bands: Record<Band, number>;
18
18
  layers: Record<Layer, number>;
19
19
  }
20
- /** One KPI card; `series` is 91 daily cumulative points, oldest first (point 0 is the base at the window start, point 90 is now) so `last - first` over any range plus one points is exact; null when hippo recorded no history. */
20
+ /** One KPI card; `series` is 91 daily cumulative points, oldest first (point 0 is the base at the window start,
21
+ * point 90 is now) so `last - first` over any range plus one points is exact; null when hippo recorded no history. */
21
22
  export interface Kpi {
22
23
  id: 'total' | 'projects' | 'atRiskShare' | 'openConflicts' | 'embeddingCoverage';
23
24
  label: string;
@@ -4,5 +4,6 @@ import * as http from 'http';
4
4
  export declare function serveDashboard(hippoRoot: string, port?: number, token?: string, opts?: {
5
5
  now?: () => number;
6
6
  cacheClock?: () => number;
7
+ handleSignals?: boolean;
7
8
  }): http.Server;
8
9
  //# sourceMappingURL=dashboard.d.ts.map
@@ -2,18 +2,23 @@
2
2
  import * as http from 'http';
3
3
  import * as path from 'path';
4
4
  import * as fs from 'fs';
5
- import { randomBytes, timingSafeEqual } from 'crypto';
6
- import { evalNow } from './ablation.js';
7
- import { readEntry } from './store/entry-reads.js';
8
- import { listCards } from './store-cards.js';
9
- import { resolveTenantId } from './tenant.js';
10
- import { loadCardDetail } from './card-detail.js';
11
- import { closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from './http-util.js';
12
- import { log } from './log.js';
5
+ import { createHash, randomBytes, randomUUID, timingSafeEqual } from 'crypto';
6
+ import { evalNow } from '../core/ablation.js';
7
+ import { readEntry } from '../store/entry-reads.js';
8
+ import { listCards } from '../store/cards.js';
9
+ import { resolveTenantId } from '../store/tenant.js';
10
+ import { loadCardDetail } from '../store/card-detail.js';
11
+ import { bodyDeadlineMs, BodyTimeoutError, closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from '../util/http-util.js';
12
+ import { errorFields, errorMessage, log } from '../util/log.js';
13
13
  import { createSnapshotService, isLiveMemory } from './dashboard-snapshot.js';
14
14
  import { buildMemoryDetail, buildMemoryPage, buildOverview, buildProjectDetail, buildSearch, } from './dashboard-queries.js';
15
15
  import { forgetMemory, markWrong, pinMemory, resolveOpenConflict, } from './dashboard-actions.js';
16
16
  import { ParamError, parseActionBody, parseConflictId, parseMemoryId, parseMemoryQuery, parseSearchText, } from './dashboard-params.js';
17
+ import { runWithRequestId } from '../util/request-scope.js';
18
+ import { installSignalHandlers } from '../util/crash-handlers.js';
19
+ import { DEFAULT_SHUTDOWN_DRAIN_MS, drainAndClose, setKeepAliveTimeouts, shutdownBoundMs } from '../server/lifecycle.js';
20
+ import { printError } from '../cli/output.js';
21
+ import { PACKAGE_ROOT } from '../core/package-root.js';
17
22
  const MIME_TYPES = {
18
23
  '.html': 'text/html; charset=utf-8',
19
24
  '.js': 'application/javascript; charset=utf-8',
@@ -72,6 +77,10 @@ function readActionBody(req) {
72
77
  const chunks = [];
73
78
  let size = 0;
74
79
  let aborted = false;
80
+ const deadlineMs = bodyDeadlineMs();
81
+ const timer = setTimeout(() => reject(new BodyTimeoutError(`request body not received within ${deadlineMs} ms`)), deadlineMs);
82
+ // Unref: a request that already failed another way must not hold the process open for the rest of the deadline.
83
+ timer.unref();
75
84
  req.on('data', (chunk) => {
76
85
  size += chunk.length;
77
86
  if (size <= BODY_MAX_BYTES)
@@ -83,6 +92,7 @@ function readActionBody(req) {
83
92
  });
84
93
  req.on('error', reject);
85
94
  req.on('end', () => {
95
+ clearTimeout(timer);
86
96
  if (size > BODY_MAX_BYTES)
87
97
  return reject(new ParamError(`Body must be at most ${BODY_MAX_BYTES} bytes`));
88
98
  try {
@@ -123,7 +133,7 @@ function handleRead(ctx, segments) {
123
133
  return sendOrNotFound(res, null);
124
134
  const snapshotId = snapshots.get(tenantId, fresh).id;
125
135
  const embedded = snapshots.embeddedIds()?.has(entry.id) ?? false;
126
- return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, snapshotId, ctx.now(), embedded));
136
+ return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, { snapshotId, nowMs: ctx.now(), embedded }));
127
137
  }
128
138
  if (head === 'search' && segments.length === 2) {
129
139
  return sendOrNotFound(res, buildSearch(snapshots.get(tenantId, fresh), parseSearchText(url.searchParams)));
@@ -175,7 +185,7 @@ async function handlePost(ctx, segments) {
175
185
  if (result.entry) {
176
186
  // The write is committed, so a rebuild failure must not turn it into a 500: the next read rebuilds.
177
187
  const embedded = snapshots.embeddedIds()?.has(result.entry.id) ?? false;
178
- const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, snapshots.currentId(), ctx.now(), embedded);
188
+ const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, { snapshotId: snapshots.currentId(), nowMs: ctx.now(), embedded });
179
189
  jsonResponse(res, detail, result.status);
180
190
  }
181
191
  else {
@@ -183,21 +193,43 @@ async function handlePost(ctx, segments) {
183
193
  }
184
194
  return true;
185
195
  }
196
+ // One style block, not style attributes, so the policy below can name its hash and allow no other inline style.
197
+ const NOT_BUILT_CSS = "body{font-family:Georgia,'Palatino Linotype',serif;max-width:640px;margin:60px auto;padding:24px;line-height:1.6;background:#f4efe6;color:#3a3228}" +
198
+ 'h1{color:#c45c3c}' +
199
+ 'pre{background:#faf7f2;padding:16px;border:1px solid #c4b9a8;border-radius:3px;font-family:Consolas,monospace}';
200
+ // Memory text is written by other tools and people, so every reply tells the browser to load code only from this server and never to frame, sniff or name the page elsewhere.
201
+ const SECURITY_HEADERS = {
202
+ 'Content-Security-Policy': [
203
+ "default-src 'none'",
204
+ "script-src 'self'",
205
+ `style-src 'self' 'sha256-${createHash('sha256').update(NOT_BUILT_CSS).digest('base64')}'`,
206
+ "img-src 'self' data:",
207
+ "font-src 'self'",
208
+ "connect-src 'self'",
209
+ "base-uri 'none'",
210
+ "form-action 'none'",
211
+ "frame-ancestors 'none'",
212
+ ].join('; '),
213
+ 'X-Content-Type-Options': 'nosniff',
214
+ 'Referrer-Policy': 'no-referrer',
215
+ 'X-Frame-Options': 'DENY',
216
+ };
186
217
  function notBuilt(res) {
187
218
  res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
188
219
  res.end(`<!doctype html>
189
- <html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"></head>
190
- <body style="font-family:Georgia,'Palatino Linotype',serif;max-width:640px;margin:60px auto;padding:24px;line-height:1.6;background:#f4efe6;color:#3a3228">
191
- <h1 style="color:#c45c3c">Hippo Dashboard</h1>
220
+ <html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"><style>${NOT_BUILT_CSS}</style></head>
221
+ <body>
222
+ <h1>Hippo Dashboard</h1>
192
223
  <p>The React UI bundle is not built yet. Run:</p>
193
- <pre style="background:#faf7f2;padding:16px;border:1px solid #c4b9a8;border-radius:3px;font-family:Consolas,monospace">cd ui && npm install && npm run build</pre>
224
+ <pre>cd ui && npm install && npm run build</pre>
194
225
  <p>Then refresh this page. The dashboard server will serve <code>dist-ui/index.html</code> automatically once present.</p>
195
226
  </body></html>`);
196
227
  }
197
228
  function serveSpa(res, distUiDir, pathname) {
198
229
  const safePath = path.normalize(pathname).replace(/^(\.\.[/\\])+/, '');
199
230
  const filePath = path.join(distUiDir, safePath);
200
- if (!filePath.startsWith(distUiDir))
231
+ // The separator matters: a bare prefix also admits a sibling folder whose name starts with this one.
232
+ if (filePath !== distUiDir && !filePath.startsWith(distUiDir + path.sep))
201
233
  return forbidden(res);
202
234
  if (fs.existsSync(filePath) && fs.statSync(filePath).isFile() && serveStaticFile(res, filePath))
203
235
  return;
@@ -221,9 +253,123 @@ function cookieValue(header, name) {
221
253
  }
222
254
  return undefined;
223
255
  }
256
+ /** Where a page load that carried the token goes next, without it; null for an API call or a write, which is answered in place. */
257
+ function tokenFreeLocation(req, url) {
258
+ if ((req.method !== 'GET' && req.method !== 'HEAD') || url.pathname.startsWith('/api/'))
259
+ return null;
260
+ const query = new URLSearchParams(url.searchParams);
261
+ query.delete('token');
262
+ const rest = query.toString();
263
+ // One leading slash only: `//host` would send the browser to another site.
264
+ return `${url.pathname.replace(/^\/+/, '/')}${rest ? `?${rest}` : ''}`;
265
+ }
266
+ /** Moves the browser off the URL that carries the token, so the token stays out of history, bookmarks and copied links; false when the request is answered in place. */
267
+ function leaveTokenUrl(req, res, url) {
268
+ const location = tokenFreeLocation(req, url);
269
+ if (location === null)
270
+ return false;
271
+ if (req.headers['sec-fetch-site'] !== 'cross-site') {
272
+ res.writeHead(303, { Location: location });
273
+ res.end();
274
+ return true;
275
+ }
276
+ // A browser withholds a SameSite=Strict cookie from a redirect another site started; a refresh from this page is same-site.
277
+ const target = location.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
278
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
279
+ res.end(`<!doctype html>\n<html lang="en"><head><meta charset="utf-8"><meta http-equiv="refresh" content="0;url=${target}"><title>Hippo Dashboard</title></head><body></body></html>`);
280
+ return true;
281
+ }
282
+ /** True when the request may proceed; false when this already answered it (redirect off the token URL, or 401). */
283
+ function admitDashboardRequest(req, res, url, access) {
284
+ const { token, port } = access;
285
+ // Cookies ignore the port, so the name carries it: two dashboards on one host keep separate tokens.
286
+ const cookieName = `hippo_dashboard_${req.socket.localPort ?? port}`;
287
+ if (sameToken(url.searchParams.get('token') ?? undefined, token)) {
288
+ res.setHeader('Set-Cookie', `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`);
289
+ if (leaveTokenUrl(req, res, url))
290
+ return false;
291
+ }
292
+ else if (!sameToken(cookieValue(req.headers.cookie, cookieName), token)) {
293
+ res.writeHead(401, { 'Content-Type': 'text/plain' });
294
+ res.end('Unauthorized: open the dashboard with the URL `hippo dashboard` printed; it carries the access token.');
295
+ return false;
296
+ }
297
+ return true;
298
+ }
299
+ function answerDashboardFailure(req, res, err) {
300
+ const clientFault = err instanceof ParamError || err instanceof URIError || err instanceof BodyTimeoutError;
301
+ // A cut-short response is logged even for a client fault; a bare 400 is not.
302
+ if (res.headersSent || !clientFault) {
303
+ log.error('dashboard request failed', { ...errorFields(err), error: errorMessage(err), path: req.url });
304
+ }
305
+ if (res.headersSent) {
306
+ res.end();
307
+ return;
308
+ }
309
+ if (err instanceof BodyDrainExceeded || err instanceof BodyTimeoutError) {
310
+ // No `Connection: close` header: Node then destroys the socket as soon as the reply is written.
311
+ res.writeHead(err instanceof BodyTimeoutError ? 408 : 400, { 'Content-Type': 'application/json; charset=utf-8' });
312
+ res.end(JSON.stringify({ error: err.message }), () => closeAfterReply(req));
313
+ return;
314
+ }
315
+ if (err instanceof ParamError)
316
+ return jsonResponse(res, { error: err.message }, 400);
317
+ if (err instanceof URIError)
318
+ return jsonResponse(res, { error: 'Malformed URL path' }, 400);
319
+ jsonResponse(res, { error: 'Internal error' }, 500);
320
+ }
321
+ function printDashboardBanner(boundPort, token, distUiDir) {
322
+ // The banner is the `hippo dashboard` command's printed result, so it stays on stdout.
323
+ console.log(`Hippo Dashboard running at http://localhost:${boundPort}/?token=${token}`);
324
+ if (distUiDir !== null)
325
+ console.log(`Serving React UI from ${distUiDir}`);
326
+ console.log('Press Ctrl+C to stop.');
327
+ }
328
+ /** A port that will not open is the user's to fix, so it gets one plain line and a failure exit code, not an uncaught error's stack. */
329
+ function reportListenFailure(port, err) {
330
+ const inUse = 'code' in err && err.code === 'EADDRINUSE';
331
+ printError(inUse
332
+ ? `hippo dashboard: port ${port} is already in use. Stop the program that holds it, or choose another port with --port <number>.`
333
+ : `hippo dashboard: could not listen on port ${port}: ${err.message}. Choose another port with --port <number>.`);
334
+ process.exitCode = 1;
335
+ }
336
+ /** Ctrl+C or a stop signal: stop listening, give open requests the API server's drain, and leave within its shutdown bound. */
337
+ function stopOnSignal(server) {
338
+ const inflight = new Set();
339
+ server.on('request', (_req, res) => {
340
+ inflight.add(res);
341
+ res.once('close', () => inflight.delete(res));
342
+ });
343
+ installSignalHandlers('dashboard', {
344
+ run: () => drainAndClose(server, inflight, DEFAULT_SHUTDOWN_DRAIN_MS),
345
+ boundMs: shutdownBoundMs(DEFAULT_SHUTDOWN_DRAIN_MS),
346
+ });
347
+ }
348
+ /** Gives the listener the API server's socket deadlines and one close of the store's connection; with `handleSignals`, a signal stops it too. */
349
+ function superviseListener(server, snapshots, port, handleSignals) {
350
+ setKeepAliveTimeouts(server);
351
+ let storeClosed = false;
352
+ const closeStore = () => {
353
+ if (storeClosed)
354
+ return;
355
+ storeClosed = true;
356
+ snapshots.close();
357
+ };
358
+ server.on('close', closeStore);
359
+ server.on('error', (err) => {
360
+ // Once it listens, an 'error' is a failed accept: logged, as the API server does, and the dashboard keeps serving.
361
+ if (server.listening)
362
+ return log.error(`dashboard: listener error: ${err.message}`, errorFields(err));
363
+ reportListenFailure(port, err);
364
+ // A failed listen emits no 'close', so the store closes here.
365
+ closeStore();
366
+ });
367
+ if (handleSignals)
368
+ stopOnSignal(server);
369
+ }
224
370
  /** Serves the dashboard on 127.0.0.1 behind a per-start `token` (tests pass one), since loopback alone lets any local process read every memory; `opts` sets the projection and cache clocks. */
225
371
  export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).toString('base64url'), opts) {
226
- const distUiDir = path.resolve(import.meta.dirname, '..', 'dist-ui');
372
+ const distUiDir = path.join(PACKAGE_ROOT, 'dist-ui');
227
373
  const hasDistUi = fs.existsSync(path.join(distUiDir, 'index.html'));
228
374
  const now = opts?.now ?? (() => evalNow().getTime());
229
375
  const snapshots = createSnapshotService(hippoRoot, now, opts?.cacheClock);
@@ -232,16 +378,8 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
232
378
  if (host !== undefined && !LOOPBACK_HOST_HEADER.test(host))
233
379
  return forbidden(res);
234
380
  const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
235
- // Cookies ignore the port, so the name carries it: two dashboards on one host keep separate tokens.
236
- const cookieName = `hippo_dashboard_${req.socket.localPort ?? port}`;
237
- if (sameToken(url.searchParams.get('token') ?? undefined, token)) {
238
- res.setHeader('Set-Cookie', `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`);
239
- }
240
- else if (!sameToken(cookieValue(req.headers.cookie, cookieName), token)) {
241
- res.writeHead(401, { 'Content-Type': 'text/plain' });
242
- res.end('Unauthorized: open the dashboard with the URL `hippo dashboard` printed; it carries the access token.');
381
+ if (!admitDashboardRequest(req, res, url, { token, port }))
243
382
  return;
244
- }
245
383
  if (url.pathname.startsWith('/api/')) {
246
384
  // A malformed % sequence throws URIError here; the caller answers 400.
247
385
  const segments = url.pathname.split('/').filter((s) => s !== '').map((s) => decodeURIComponent(s));
@@ -257,39 +395,18 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
257
395
  return serveSpa(res, distUiDir, url.pathname);
258
396
  notBuilt(res);
259
397
  };
260
- const server = http.createServer((req, res) => {
261
- handleRequest(req, res).catch((err) => {
262
- const clientFault = err instanceof ParamError || err instanceof URIError;
263
- // A cut-short response is logged even for a client fault; a bare 400 is not.
264
- if (res.headersSent || !clientFault) {
265
- log.error('dashboard request failed', { error: err instanceof Error ? err.message : String(err), path: req.url });
266
- }
267
- if (res.headersSent) {
268
- res.end();
269
- return;
270
- }
271
- if (err instanceof BodyDrainExceeded) {
272
- // No `Connection: close` header: Node then destroys the socket as soon as the reply is written.
273
- res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });
274
- res.end(JSON.stringify({ error: err.message }), () => closeAfterReply(req));
275
- return;
276
- }
277
- if (err instanceof ParamError)
278
- return jsonResponse(res, { error: err.message }, 400);
279
- if (err instanceof URIError)
280
- return jsonResponse(res, { error: 'Malformed URL path' }, 400);
281
- jsonResponse(res, { error: 'Internal error' }, 500);
282
- });
283
- });
284
- server.on('close', () => snapshots.close());
398
+ const onRequest = (req, res) => {
399
+ for (const [name, value] of Object.entries(SECURITY_HEADERS))
400
+ res.setHeader(name, value);
401
+ handleRequest(req, res).catch((err) => answerDashboardFailure(req, res, err));
402
+ };
403
+ // One id per request, so the lines it logs can be told apart from a concurrent request's.
404
+ const server = http.createServer((req, res) => runWithRequestId(randomUUID(), () => onRequest(req, res)));
405
+ superviseListener(server, snapshots, port, opts?.handleSignals === true);
285
406
  server.listen(port, '127.0.0.1', () => {
286
407
  // SAFETY: listen() was given a TCP port, so address() is AddressInfo, never a pipe name.
287
408
  const boundPort = server.address().port;
288
- // The banner is the `hippo dashboard` command's printed result, so it stays on stdout.
289
- console.log(`Hippo Dashboard running at http://localhost:${boundPort}/?token=${token}`);
290
- if (hasDistUi)
291
- console.log(`Serving React UI from ${distUiDir}`);
292
- console.log('Press Ctrl+C to stop.');
409
+ printDashboardBanner(boundPort, token, hasDistUi ? distUiDir : null);
293
410
  });
294
411
  return server;
295
412
  }
package/dist/db/backup.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as fs from 'node:fs';
2
2
  import * as path from 'node:path';
3
- import { log } from '../log.js';
3
+ import { log } from '../util/log.js';
4
4
  /** Copies the database before a repair writes, so the audit ids plus this file are the way back. */
5
5
  export function backupStore(db, hippoRoot, label, now = new Date()) {
6
6
  const dir = path.join(hippoRoot, 'backups');
package/dist/db/busy.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { DatabaseSyncLike } from './sqlite.js';
2
- export declare function isSqliteBusy(error: unknown): boolean;
2
+ export declare function isSqliteBusy(cause: unknown): boolean;
3
3
  export declare const STORE_BUSY_MESSAGE = "store busy (another hippo process holds the write lock); retry shortly";
4
4
  /** A store behind the port throws this when its lock wait runs out, so the server answers 503 as it does for a busy hippo.db. */
5
5
  export declare class StoreBusyError extends Error {
@@ -8,7 +8,24 @@ export declare class StoreBusyError extends Error {
8
8
  /** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
9
9
  export declare function isStoreBusy<E>(error: E): boolean;
10
10
  export declare function execWithBusyRetry(db: DatabaseSyncLike, sql: string, timeoutMs?: number): void;
11
+ /** Waits for the lock past busy_timeout when given; ignored inside a caller's transaction, which already holds it. */
12
+ export interface WriteScopeOptions {
13
+ readonly busyWaitMs?: number;
14
+ }
11
15
  /** Runs `fn` as one write: BEGIN IMMEDIATE on an idle handle, else SAVEPOINT `name` inside the caller's transaction.
12
16
  * A deferred scope that reads first cannot wait out another writer, while BEGIN IMMEDIATE waits the open's busy_timeout. */
13
- export declare function withWriteScope<T>(db: DatabaseSyncLike, name: string, fn: () => T): T;
17
+ export declare function withWriteScope<T>(db: DatabaseSyncLike, name: string, fn: () => T, opts?: WriteScopeOptions): T;
18
+ /** Runs the reads in `fn` against one snapshot, so two statements cannot straddle another process's write. */
19
+ export declare function withReadSnapshot<T>(db: DatabaseSyncLike, fn: () => T): T;
20
+ /** Runs `fn` and undoes every write it made, throw or not: a dry run that reports what a real run would do. Takes no write lock up front. */
21
+ export declare function withTrialScope<T>(db: DatabaseSyncLike, name: string, fn: () => T): T;
22
+ /** What `withWriteScopeOr` hands its callback's `rollback(value)`; a class so no stored value can pass for one. */
23
+ declare class RolledBack<V> {
24
+ readonly value: V;
25
+ constructor(value: V);
26
+ }
27
+ /** `withWriteScope` for a write that can refuse: a callback that returns `rollback(value)` gets the scope's writes undone
28
+ * and `value` back, with no throw. Any other return commits. */
29
+ export declare function withWriteScopeOr<T, R>(db: DatabaseSyncLike, name: string, fn: (rollback: <V>(value: V) => RolledBack<V>) => T | RolledBack<R>): T | R;
30
+ export {};
14
31
  //# sourceMappingURL=busy.d.ts.map