hippo-memory 1.71.0 → 2.0.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 (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
package/dist/db/busy.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { errorFields, errorMessage, log } from '../util/log.js';
1
2
  function carriesErrcode(cause) {
2
3
  return typeof cause === 'object' && cause !== null && 'errcode' in cause;
3
4
  }
@@ -5,21 +6,11 @@ export function isSqliteBusy(cause) {
5
6
  const code = carriesErrcode(cause) ? cause.errcode : undefined;
6
7
  return code === 5 || code === 6 || code === 517;
7
8
  }
8
- export const STORE_BUSY_MESSAGE = 'store busy (another hippo process holds the write lock); retry shortly';
9
- /** 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. */
10
- export class StoreBusyError extends Error {
11
- constructor(message = STORE_BUSY_MESSAGE, options) {
12
- super(message, options);
13
- this.name = 'StoreBusyError';
14
- }
15
- }
16
- /** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
17
- export function isStoreBusy(error) {
18
- return error instanceof StoreBusyError || isSqliteBusy(error);
19
- }
9
+ /** The lock wait of an open that names none: its busy_timeout and every explicit wait below. */
10
+ export const DEFAULT_BUSY_WAIT_MS = 5000;
20
11
  // busy_timeout covers neither contended statement here: SQLite skips the busy handler for `PRAGMA journal_mode` and for a write
21
12
  // that upgrades a deferred read snapshot, so both need an explicit wait.
22
- export function execWithBusyRetry(db, sql, timeoutMs = 30000) {
13
+ export function execWithBusyRetry(db, sql, timeoutMs = DEFAULT_BUSY_WAIT_MS) {
23
14
  const deadline = Date.now() + timeoutMs;
24
15
  const idle = new Int32Array(new SharedArrayBuffer(4));
25
16
  for (;;) {
@@ -43,6 +34,17 @@ function undoScope(db, top, name) {
43
34
  db.exec(`RELEASE SAVEPOINT ${name}`);
44
35
  }
45
36
  }
37
+ /** Undo after a failure without letting a failed undo replace the caller's error; an idle handle means SQLite already unwound the scope. */
38
+ function undoAfterFailure(db, top, name) {
39
+ if (db.isTransaction === false)
40
+ return;
41
+ try {
42
+ undoScope(db, top, name);
43
+ }
44
+ catch (undoError) {
45
+ log.error(`rollback of write scope ${name} failed: ${errorMessage(undoError)}`, errorFields(undoError));
46
+ }
47
+ }
46
48
  /** Runs `fn` as one write: BEGIN IMMEDIATE on an idle handle, else SAVEPOINT `name` inside the caller's transaction.
47
49
  * A deferred scope that reads first cannot wait out another writer, while BEGIN IMMEDIATE waits the open's busy_timeout. */
48
50
  export function withWriteScope(db, name, fn, opts) {
@@ -57,10 +59,7 @@ export function withWriteScope(db, name, fn, opts) {
57
59
  return result;
58
60
  }
59
61
  catch (error) {
60
- try {
61
- undoScope(db, top, name);
62
- }
63
- catch { /* already rolled back; keep the original error */ }
62
+ undoAfterFailure(db, top, name);
64
63
  throw error;
65
64
  }
66
65
  }
@@ -77,7 +76,9 @@ export function withReadSnapshot(db, fn) {
77
76
  try {
78
77
  db.exec('COMMIT');
79
78
  }
80
- catch { /* snapshot already gone; keep the original error */ }
79
+ catch (endError) {
80
+ log.error(`ending read snapshot failed: ${errorMessage(endError)}`, errorFields(endError));
81
+ }
81
82
  throw error;
82
83
  }
83
84
  db.exec('COMMIT');
@@ -92,10 +93,7 @@ export function withTrialScope(db, name, fn) {
92
93
  result = fn();
93
94
  }
94
95
  catch (error) {
95
- try {
96
- undoScope(db, top, name);
97
- }
98
- catch { /* already rolled back; keep the original error */ }
96
+ undoAfterFailure(db, top, name);
99
97
  throw error;
100
98
  }
101
99
  undoScope(db, top, name);
@@ -123,10 +121,7 @@ export function withWriteScopeOr(db, name, fn) {
123
121
  return result;
124
122
  }
125
123
  catch (error) {
126
- try {
127
- undoScope(db, top, name);
128
- }
129
- catch { /* already rolled back; keep the original error */ }
124
+ undoAfterFailure(db, top, name);
130
125
  throw error;
131
126
  }
132
127
  }
@@ -1,6 +1,5 @@
1
1
  import { type DatabaseSyncLike } from './sqlite.js';
2
2
  import { type OpenFacts } from './migrate.js';
3
- export declare const DEFAULT_BUSY_WAIT_MS = 5000;
4
3
  export declare function getHippoDbPath(hippoRoot: string): string;
5
4
  /** Runs `step` on this store unless it already ran to the end in this process; a throw leaves it due. */
6
5
  export declare function oncePerStore(hippoRoot: string, name: string, step: () => void): void;
@@ -9,6 +8,7 @@ export interface OpenedDb {
9
8
  readonly db: DatabaseSyncLike;
10
9
  readonly facts: OpenFacts | null;
11
10
  }
12
- /** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it. */
11
+ /** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it.
12
+ * Outside any request scope (CLI start-up, timers) this is the only handle there is; openHippoDb reuses the scope's when one exists. */
13
13
  export declare function connectWithFacts(hippoRoot: string, busyWaitMs?: number): OpenedDb;
14
14
  //# sourceMappingURL=connect.d.ts.map
@@ -3,10 +3,9 @@ import * as path from 'path';
3
3
  import { cleanupArchivedMirrors } from './raw-archive-mirror-cleanup.js';
4
4
  import { errorFields, errorMessage, log } from '../util/log.js';
5
5
  import { DatabaseSync } from './sqlite.js';
6
- import { execWithBusyRetry } from './busy.js';
6
+ import { DEFAULT_BUSY_WAIT_MS, execWithBusyRetry } from './busy.js';
7
7
  import { runMigrations } from './migrate.js';
8
8
  import { autoCheckpointPages } from './wal-checkpointer.js';
9
- export const DEFAULT_BUSY_WAIT_MS = 5000;
10
9
  export function getHippoDbPath(hippoRoot) {
11
10
  return path.join(hippoRoot, 'hippo.db');
12
11
  }
@@ -52,12 +51,13 @@ function archiveTop(db) {
52
51
  const row = db.prepare('SELECT MAX(id) AS top FROM raw_archive').get();
53
52
  return Number(row?.top ?? 0);
54
53
  }
55
- /** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it. */
56
- export function connectWithFacts(hippoRoot, busyWaitMs) {
54
+ /** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it.
55
+ * Outside any request scope (CLI start-up, timers) this is the only handle there is; openHippoDb reuses the scope's when one exists. */
56
+ export function connectWithFacts(hippoRoot, busyWaitMs = DEFAULT_BUSY_WAIT_MS) {
57
57
  createStoreFilesOwnerOnly(hippoRoot);
58
58
  const db = new DatabaseSync(getHippoDbPath(hippoRoot));
59
59
  try {
60
- db.exec(`PRAGMA busy_timeout = ${busyWaitMs ?? DEFAULT_BUSY_WAIT_MS}`);
60
+ db.exec(`PRAGMA busy_timeout = ${busyWaitMs}`);
61
61
  execWithBusyRetry(db, 'PRAGMA journal_mode = WAL', busyWaitMs);
62
62
  db.exec('PRAGMA synchronous = NORMAL');
63
63
  db.exec(`PRAGMA wal_autocheckpoint = ${autoCheckpointPages(getHippoDbPath(hippoRoot))}`);
@@ -76,8 +76,8 @@ export function connectWithFacts(hippoRoot, busyWaitMs) {
76
76
  try {
77
77
  db.close();
78
78
  }
79
- catch {
80
- // Best effort only.
79
+ catch (closeErr) {
80
+ log.error(`openHippoDb: closing the handle after a failed open failed: ${errorMessage(closeErr)}`, errorFields(closeErr));
81
81
  }
82
82
  throw error;
83
83
  }
@@ -1,9 +1,9 @@
1
1
  export type { DatabaseSyncLike } from './sqlite.js';
2
- export { isSqliteBusy, isStoreBusy, StoreBusyError, STORE_BUSY_MESSAGE, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
2
+ export { isSqliteBusy, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
3
3
  export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './meta.js';
4
- export { countTableRows, pruneConsolidationRuns } from './tables.js';
4
+ export { countTableRows, pruneConsolidationRuns, CONSOLIDATION_RUNS_KEPT } from './tables.js';
5
5
  export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './migrate.js';
6
- export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, rethrowIfSqliteBlocked, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
6
+ export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
7
7
  export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './request-stores.js';
8
8
  export { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
9
9
  //# sourceMappingURL=index.d.ts.map
package/dist/db/index.js CHANGED
@@ -1,8 +1,8 @@
1
- export { isSqliteBusy, isStoreBusy, StoreBusyError, STORE_BUSY_MESSAGE, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
1
+ export { isSqliteBusy, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
2
2
  export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './meta.js';
3
- export { countTableRows, pruneConsolidationRuns } from './tables.js';
3
+ export { countTableRows, pruneConsolidationRuns, CONSOLIDATION_RUNS_KEPT } from './tables.js';
4
4
  export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './migrate.js';
5
- export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, rethrowIfSqliteBlocked, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
5
+ export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
6
6
  export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './request-stores.js';
7
7
  export { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
8
8
  //# sourceMappingURL=index.js.map
@@ -1,11 +1,12 @@
1
1
  import { PACKAGE_VERSION, compareSemver } from '../util/version.js';
2
- import { errorMessage, log } from '../util/log.js';
2
+ import { errorFields, errorMessage, log } from '../util/log.js';
3
3
  import { importLegacyEmbeddingIndex } from './vector-store.js';
4
4
  import { execWithBusyRetry, withWriteScope } from './busy.js';
5
5
  import { tableExists } from './tables.js';
6
6
  import { ensureMetaTable, getMeta, getSchemaVersion, setMeta, setSchemaVersion } from './meta.js';
7
7
  import { MEMORIES_FTS_DDL, REQUIRED_SCHEMA_OBJECTS, ensureContinuityIndexes, ensureContinuityTables } from './continuity.js';
8
8
  import { CURRENT_SCHEMA_VERSION, MIGRATIONS } from './migrations/index.js';
9
+ import { placeholders } from '../util/sql.js';
9
10
  export function getCurrentSchemaVersion() {
10
11
  return CURRENT_SCHEMA_VERSION;
11
12
  }
@@ -130,7 +131,7 @@ function ensureMetaDefaults(db) {
130
131
  const keys = META_DEFAULTS.map(([key]) => key);
131
132
  // SAFETY: the statement selects only the `key` column of `meta`, which is TEXT NOT NULL, so each row is { key: string }.
132
133
  const present = new Set(db
133
- .prepare(`SELECT key FROM meta WHERE key IN (${keys.map(() => '?').join(',')})`)
134
+ .prepare(`SELECT key FROM meta WHERE key IN (${placeholders(keys.length)})`)
134
135
  .all(...keys)
135
136
  .map((r) => r.key));
136
137
  if (present.size === META_DEFAULTS.length)
@@ -142,18 +143,24 @@ function ensureMetaDefaults(db) {
142
143
  }
143
144
  }
144
145
  function ensureOptionalFts(db) {
145
- let available = false;
146
146
  try {
147
147
  db.exec(MEMORIES_FTS_DDL);
148
148
  repairFtsDrift(db);
149
- available = true;
150
149
  }
151
150
  catch (err) {
151
+ // A busy or locked open says nothing about fts5, so only a missing module may flip the flag.
152
+ if (!/no such module/i.test(errorMessage(err)) || !/fts5/i.test(errorMessage(err))) {
153
+ log.warn(`full-text index not set up this open (${errorMessage(err)}); the next open retries`, errorFields(err));
154
+ return;
155
+ }
152
156
  log.warn(`full-text index unavailable (${errorMessage(err)}); search falls back to slower LIKE matching`);
157
+ writeFtsFlag(db, '0');
158
+ return;
153
159
  }
154
- // Read-first: only write when the flag actually changed, so a healthy
155
- // store's open doesn't take a write lock for a same-value upsert.
156
- const flag = available ? '1' : '0';
160
+ writeFtsFlag(db, '1');
161
+ }
162
+ // Read-first: only write when the flag actually changed, so a healthy store's open takes no write lock.
163
+ function writeFtsFlag(db, flag) {
157
164
  if (getMeta(db, 'fts5_available') !== flag)
158
165
  setMeta(db, 'fts5_available', flag);
159
166
  }
@@ -1,5 +1,5 @@
1
1
  import type { Migration } from './types.js';
2
- export declare const CURRENT_SCHEMA_VERSION = 54;
2
+ export declare const CURRENT_SCHEMA_VERSION = 55;
3
3
  /** Every schema migration in version order; runMigrations applies each one above the stored version. */
4
4
  export declare const MIGRATIONS: Migration[];
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -52,7 +52,8 @@ import { v51 } from './v51.js';
52
52
  import { v52 } from './v52.js';
53
53
  import { v53 } from './v53.js';
54
54
  import { v54 } from './v54.js';
55
- export const CURRENT_SCHEMA_VERSION = 54;
55
+ import { v55 } from './v55.js';
56
+ export const CURRENT_SCHEMA_VERSION = 55;
56
57
  /** Every schema migration in version order; runMigrations applies each one above the stored version. */
57
58
  export const MIGRATIONS = [
58
59
  v01,
@@ -109,5 +110,6 @@ export const MIGRATIONS = [
109
110
  v52,
110
111
  v53,
111
112
  v54,
113
+ v55,
112
114
  ];
113
115
  //# sourceMappingURL=index.js.map
@@ -9,6 +9,7 @@ export const v11 = {
9
9
  if (!tableHasColumn(db, 'memories', 'superseded_by')) {
10
10
  db.exec(`ALTER TABLE memories ADD COLUMN superseded_by TEXT`);
11
11
  }
12
+ // SHORTCUT: overlaps idx_memories_layer_created (v01); dropping it is held until a schema migration is approved.
12
13
  db.exec(`CREATE INDEX IF NOT EXISTS idx_memories_current ON memories(layer, created) WHERE superseded_by IS NULL`);
13
14
  },
14
15
  };
@@ -48,6 +48,7 @@ export const v14 = {
48
48
  if (!tableHasColumn(db, 'memories', 'owner')) {
49
49
  db.exec(`ALTER TABLE memories ADD COLUMN owner TEXT`);
50
50
  }
51
+ // SHORTCUT: artifact_ref has no index, so connector deletes and vault lookups scan the tenant; the index is held until a schema migration is approved.
51
52
  if (!tableHasColumn(db, 'memories', 'artifact_ref')) {
52
53
  db.exec(`ALTER TABLE memories ADD COLUMN artifact_ref TEXT`);
53
54
  }
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './types.js';
2
+ export declare const v55: Migration;
3
+ //# sourceMappingURL=v55.d.ts.map
@@ -0,0 +1,17 @@
1
+ import { tableHasColumn, tableExists } from '../tables.js';
2
+ export const v55 = {
3
+ version: 55,
4
+ up: (db) => {
5
+ // No backfill and no floor raise: an older binary names its INSERT columns, so it still writes.
6
+ if (!tableExists(db, 'delivery_events'))
7
+ return;
8
+ if (!tableHasColumn(db, 'delivery_events', 'tool_use_id'))
9
+ db.exec('ALTER TABLE delivery_events ADD COLUMN tool_use_id TEXT');
10
+ if (!tableHasColumn(db, 'delivery_events', 'failure_id'))
11
+ db.exec('ALTER TABLE delivery_events ADD COLUMN failure_id INTEGER');
12
+ db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_delivery_events_tool_call
13
+ ON delivery_events(tenant_id, session_id, tool_use_id)
14
+ WHERE tool_use_id IS NOT NULL AND turn_seq IS NOT NULL`);
15
+ },
16
+ };
17
+ //# sourceMappingURL=v55.js.map
package/dist/db/open.d.ts CHANGED
@@ -24,8 +24,6 @@ export declare function withSqliteAllowed<T>(fn: () => T): T;
24
24
  export declare function withSqliteOffLoop<T>(fn: () => T): T;
25
25
  /** Leaves withSqliteOffLoop's block and nothing else: another store's block and the folder marker still refuse, which withSqliteAllowed would waive. */
26
26
  export declare function outsideSqliteOffLoop<T>(fn: () => T): T;
27
- /** First line of a best-effort catch around a hippo.db open: an unported path must fail closed, not fall back silently. */
28
- export declare function rethrowIfSqliteBlocked<E>(err: E): void;
29
27
  /** store init --db, store copy --db and serve --db write this file in the hippo root; its text is the store kind. */
30
28
  export declare const OTHER_STORE_MARKER = "other-store";
31
29
  /** Throws where hippo.db must not open; checked on every open, not cached, since the marker can appear while a process runs. */
package/dist/db/open.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
2
  import { existsSync, readFileSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
- import { errorMessage, log } from '../util/log.js';
4
+ import { errorFields, errorMessage, log } from '../util/log.js';
5
5
  import { DatabaseSync } from './sqlite.js';
6
6
  import { tableExists } from './tables.js';
7
7
  import { assertBinaryCompatible } from './migrate.js';
8
- import { connectWithFacts, DEFAULT_BUSY_WAIT_MS, getHippoDbPath } from './connect.js';
8
+ import { DEFAULT_BUSY_WAIT_MS } from './busy.js';
9
+ import { connectWithFacts, getHippoDbPath } from './connect.js';
9
10
  import { currentRequestStores, isScopedHandle, runWithRequestStores } from './request-stores.js';
10
11
  import { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
11
12
  export { getHippoDbPath };
@@ -49,11 +50,6 @@ export function withSqliteOffLoop(fn) {
49
50
  export function outsideSqliteOffLoop(fn) {
50
51
  return sqliteBlockedBy.getStore() === OFF_LOOP ? sqliteBlockedBy.exit(fn) : fn();
51
52
  }
52
- /** First line of a best-effort catch around a hippo.db open: an unported path must fail closed, not fall back silently. */
53
- export function rethrowIfSqliteBlocked(err) {
54
- if (err instanceof SqliteBlockedError)
55
- throw err;
56
- }
57
53
  /** store init --db, store copy --db and serve --db write this file in the hippo root; its text is the store kind. */
58
54
  export const OTHER_STORE_MARKER = 'other-store';
59
55
  const markerWaived = new AsyncLocalStorage();
@@ -95,7 +91,7 @@ export function openHippoDbReadOnly(hippoRoot) {
95
91
  assertSqliteAllowed(hippoRoot);
96
92
  const db = new DatabaseSync(getHippoDbPath(hippoRoot), { readOnly: true });
97
93
  try {
98
- db.exec('PRAGMA busy_timeout = 5000');
94
+ db.exec(`PRAGMA busy_timeout = ${DEFAULT_BUSY_WAIT_MS}`);
99
95
  if (tableExists(db, 'meta'))
100
96
  assertBinaryCompatible(db);
101
97
  return db;
@@ -104,8 +100,8 @@ export function openHippoDbReadOnly(hippoRoot) {
104
100
  try {
105
101
  db.close();
106
102
  }
107
- catch {
108
- // Best effort only.
103
+ catch (closeErr) {
104
+ log.error(`openHippoDbReadOnly: closing the handle after a failed open failed: ${errorMessage(closeErr)}`, errorFields(closeErr));
109
105
  }
110
106
  throw error;
111
107
  }
@@ -2,8 +2,6 @@
2
2
  import type { DatabaseSyncLike } from './index.js';
3
3
  import type { MemoryEntry } from '../core/memory.js';
4
4
  import type { PhysicsParticle } from '../core/physics.js';
5
- export declare function float32ToBuffer(arr: number[]): Buffer;
6
- export declare function bufferToFloat32(buf: Buffer | Uint8Array): number[];
7
5
  /** Create the memory_physics table (migration v8). */
8
6
  export declare function createPhysicsTable(db: DatabaseSyncLike): void;
9
7
  /**
@@ -14,8 +12,6 @@ export declare function loadPhysicsState(db: DatabaseSyncLike, memoryIds?: strin
14
12
  * Save physics state for multiple particles (batch upsert).
15
13
  */
16
14
  export declare function savePhysicsState(db: DatabaseSyncLike, particles: PhysicsParticle[]): void;
17
- /** Initialize physics state for a memory from its embedding vector; returns the new particle without persisting (the caller must save). */
18
- export declare function initializeParticle(entry: MemoryEntry, embedding: number[], now?: Date): PhysicsParticle;
19
15
  /** Drops every particle, then seeds one per entry that has an embedding; `entries` may be read lazily, as each batch is written before the next is read. */
20
16
  export declare function resetAllPhysicsState(db: DatabaseSyncLike, entries: Iterable<MemoryEntry>, embeddingIndex: Record<string, number[]>, now?: Date): number;
21
17
  /** Refresh mass, charge and temperature for existing particles from current memory attributes (called during consolidation). */
@@ -1,23 +1,11 @@
1
1
  /** Physics state persistence: particle state (position, velocity, mass, charge, temperature) in SQLite, with BLOB columns for 384-dim vectors. */
2
- import { evalNow } from '../core/ablation.js';
2
+ import { evalNow, strengthAblation } from '../core/ablation.js';
3
3
  import { withWriteScope } from './busy.js';
4
- import { computeMass, computeCharge, computeTemperature, vecZero } from '../core/physics.js';
4
+ import { computeMass, computeCharge, computeTemperature, initializeParticle } from '../core/physics.js';
5
5
  import { calculateStrength } from '../core/memory.js';
6
6
  import { DAY_MS } from '../util/time.js';
7
- // Float32Array <-> Buffer serialization
8
- export function float32ToBuffer(arr) {
9
- const f32 = new Float32Array(arr);
10
- return Buffer.from(f32.buffer);
11
- }
12
- export function bufferToFloat32(buf) {
13
- if (buf.byteLength === 0 || buf.byteLength % 4 !== 0)
14
- return [];
15
- // Ensure we have a properly aligned copy (SQLite may return Uint8Array, not Buffer)
16
- const bytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
17
- const aligned = new ArrayBuffer(bytes.length);
18
- new Uint8Array(aligned).set(bytes);
19
- return Array.from(new Float32Array(aligned));
20
- }
7
+ import { placeholders } from '../util/sql.js';
8
+ import { bufferToFloat32, float32ToBuffer } from '../util/vector-codec.js';
21
9
  // Schema migration
22
10
  /** Create the memory_physics table (migration v8). */
23
11
  export function createPhysicsTable(db) {
@@ -48,10 +36,10 @@ export function loadPhysicsState(db, memoryIds) {
48
36
  // Chunked so a whole-store candidate list stays under SQLite's bound-parameter limit.
49
37
  for (let i = 0; i < memoryIds.length; i += PHYSICS_ID_CHUNK) {
50
38
  const chunk = memoryIds.slice(i, i + PHYSICS_ID_CHUNK);
51
- const placeholders = chunk.map(() => '?').join(',');
39
+ const marks = placeholders(chunk.length);
52
40
  // SAFETY: the SELECT projects exactly the PhysicsRow columns, in order.
53
41
  rows = rows.concat(db.prepare(`SELECT memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation
54
- FROM memory_physics WHERE memory_id IN (${placeholders})`).all(...chunk));
42
+ FROM memory_physics WHERE memory_id IN (${marks})`).all(...chunk));
55
43
  }
56
44
  }
57
45
  else {
@@ -97,20 +85,6 @@ export function savePhysicsState(db, particles) {
97
85
  }
98
86
  });
99
87
  }
100
- /** Initialize physics state for a memory from its embedding vector; returns the new particle without persisting (the caller must save). */
101
- export function initializeParticle(entry, embedding, now = evalNow()) {
102
- const strength = calculateStrength(entry, now);
103
- const ageDays = (now.getTime() - new Date(entry.created).getTime()) / DAY_MS;
104
- return {
105
- memoryId: entry.id,
106
- position: [...embedding], // copy — position will diverge from original embedding
107
- velocity: vecZero(embedding.length),
108
- mass: computeMass(strength, entry.retrieval_count),
109
- charge: computeCharge(entry.emotional_valence),
110
- temperature: computeTemperature(ageDays, 1.0),
111
- lastSimulation: now.toISOString(),
112
- };
113
- }
114
88
  const RESET_BATCH = 64;
115
89
  /** Drops every particle, then seeds one per entry that has an embedding; `entries` may be read lazily, as each batch is written before the next is read. */
116
90
  export function resetAllPhysicsState(db, entries, embeddingIndex, now = evalNow()) {
@@ -141,7 +115,7 @@ export function refreshParticleProperties(particles, entries, now = evalNow()) {
141
115
  const entry = entries.get(p.memoryId);
142
116
  if (!entry)
143
117
  continue;
144
- const strength = calculateStrength(entry, now);
118
+ const strength = calculateStrength(entry, now, { ablation: strengthAblation() });
145
119
  const ageDays = (now.getTime() - new Date(entry.created).getTime()) / DAY_MS;
146
120
  p.mass = computeMass(strength, entry.retrieval_count);
147
121
  p.charge = computeCharge(entry.emotional_valence);
@@ -15,6 +15,7 @@ export declare class RequestStores implements RequestScope {
15
15
  readonly busyWaitMs: number | undefined;
16
16
  readonly requestId: string | undefined;
17
17
  readonly deadline: import("../util/request-scope.js").RequestDeadline | undefined;
18
+ readonly signal: AbortSignal | undefined;
18
19
  readonly setupDoneFor: string | undefined;
19
20
  constructor(opts?: RequestStoresOptions);
20
21
  get closed(): boolean;
@@ -1,7 +1,7 @@
1
1
  // One store handle per store for each request (HTTP call, MCP tool call, scoped CLI command), opened lazily and closed with it.
2
2
  import * as path from 'node:path';
3
3
  import { connectWithFacts, getHippoDbPath } from './connect.js';
4
- import { currentDeadline, currentRequestId, requestScopes } from '../util/request-scope.js';
4
+ import { currentDeadline, currentRequestId, currentSignal, requestScopes } from '../util/request-scope.js';
5
5
  // Handles a scope owns, so closeHippoDb leaves them open for the rest of the request.
6
6
  const scopedHandles = new WeakSet();
7
7
  // process.exit skips every finally, so one exit listener closes the handles of scopes still open.
@@ -24,6 +24,7 @@ export class RequestStores {
24
24
  // Taken from the scope this one opens inside, so the request's log lines keep their id.
25
25
  requestId = currentRequestId();
26
26
  deadline = currentDeadline();
27
+ signal = currentSignal();
27
28
  setupDoneFor;
28
29
  #failFastWhenBusy;
29
30
  #handles = new Map();
@@ -7,5 +7,7 @@ export declare function tableExists(db: DatabaseSyncLike, tableName: string): bo
7
7
  export declare function listTableNames(db: DatabaseSyncLike): string[];
8
8
  /** Row count of one table; null when the table is missing or unreadable, which callers show as unknown. */
9
9
  export declare function countTableRows(db: DatabaseSyncLike, table: string): number | null;
10
+ /** Sleep runs a store keeps; stats.json lists exactly these, so a recall's stats rewrite reads a fixed number of rows. */
11
+ export declare const CONSOLIDATION_RUNS_KEPT = 50;
10
12
  export declare function pruneConsolidationRuns(db: DatabaseSyncLike, keep?: number): void;
11
13
  //# sourceMappingURL=tables.d.ts.map
package/dist/db/tables.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { errorCode, log } from '../util/log.js';
1
2
  /** Column names of one table; empty when the table is missing. */
2
3
  export function tableColumns(db, tableName) {
3
4
  if (!/^[a-z_]+$/i.test(tableName))
@@ -30,12 +31,15 @@ export function countTableRows(db, table) {
30
31
  const row = db.prepare(`SELECT COUNT(*) AS n FROM "${table.replace(/"/g, '""')}"`).get();
31
32
  return Number(row?.n ?? 0);
32
33
  }
33
- catch {
34
+ catch (err) {
34
35
  // Callers treat an uncountable table as unknown; the bundle and doctor still finish.
36
+ log.warn(`could not count rows in table ${table}`, { table, code: errorCode(err) || 'unknown' });
35
37
  return null;
36
38
  }
37
39
  }
38
- export function pruneConsolidationRuns(db, keep = 50) {
40
+ /** Sleep runs a store keeps; stats.json lists exactly these, so a recall's stats rewrite reads a fixed number of rows. */
41
+ export const CONSOLIDATION_RUNS_KEPT = 50;
42
+ export function pruneConsolidationRuns(db, keep = CONSOLIDATION_RUNS_KEPT) {
39
43
  db.prepare(`
40
44
  DELETE FROM consolidation_runs
41
45
  WHERE id NOT IN (
@@ -2,7 +2,8 @@
2
2
  import * as fs from 'fs';
3
3
  import * as path from 'path';
4
4
  import { withWriteScope } from './busy.js';
5
- import { log } from '../util/log.js';
5
+ import { errorCode, errorFields, log } from '../util/log.js';
6
+ import { placeholders } from '../util/sql.js';
6
7
  /** Legacy whole-file index; imported once into `memory_vectors`, then kept beside the store as a renamed backup. */
7
8
  const LEGACY_EMBEDDINGS_FILE = 'embeddings.json';
8
9
  export const EMBEDDING_MODEL_META_KEY = 'embedding_model';
@@ -66,7 +67,7 @@ function eachStoredVector(db, ids, take) {
66
67
  const unique = [...new Set(ids)];
67
68
  for (let i = 0; i < unique.length; i += ID_CHUNK) {
68
69
  const chunk = unique.slice(i, i + ID_CHUNK);
69
- read(db.prepare(`SELECT memory_id, vector FROM memory_vectors WHERE memory_id IN (${chunk.map(() => '?').join(', ')})`).all(...chunk));
70
+ read(db.prepare(`SELECT memory_id, vector FROM memory_vectors WHERE memory_id IN (${placeholders(chunk.length)})`).all(...chunk));
70
71
  }
71
72
  }
72
73
  /** Vectors for `ids`, or every stored vector when `ids` is omitted. */
@@ -188,17 +189,30 @@ function insertSorted(top, m, k) {
188
189
  function stamp() {
189
190
  return `${new Date().toISOString().replace(/[:.]/g, '-')}-${process.pid}`;
190
191
  }
191
- /** Rename `fp` to `aside`; a rename blocked by an open handle (Windows) falls back to a copy, so the bytes are kept either way. */
192
+ // The codes a rename gets when another process holds the file open (Windows); any other failure would fail a copy too.
193
+ const RENAME_BLOCKED_CODES = new Set(['EPERM', 'EBUSY', 'EACCES']);
194
+ /** Rename `fp` to `aside`; a rename blocked by an open handle falls back to a copy, so the bytes are kept either way. */
192
195
  function moveAside(fp, aside) {
193
196
  try {
194
197
  fs.renameSync(fp, aside);
195
198
  return true;
196
199
  }
197
200
  catch (err) {
198
- if (err instanceof Error && 'code' in err && err.code === 'ENOENT')
201
+ const code = errorCode(err);
202
+ if (code === 'ENOENT')
199
203
  return false;
204
+ if (!RENAME_BLOCKED_CODES.has(code))
205
+ throw err;
206
+ log.warn(`could not rename ${path.basename(fp)} aside (${code}); copying it instead`, { path: fp, ...errorFields(err) });
200
207
  fs.copyFileSync(fp, aside, fs.constants.COPYFILE_EXCL);
201
- fs.rmSync(fp, { force: true });
208
+ try {
209
+ fs.rmSync(fp, { force: true });
210
+ }
211
+ catch (rmErr) {
212
+ // The original stays for the next open to retry, so a copy left beside it would pile up one per open.
213
+ fs.rmSync(aside, { force: true });
214
+ throw rmErr;
215
+ }
202
216
  return true;
203
217
  }
204
218
  }
@@ -2,6 +2,7 @@
2
2
  import * as path from 'node:path';
3
3
  import { Worker } from 'node:worker_threads';
4
4
  import { errorMessage, log } from '../util/log.js';
5
+ import { DEFAULT_BUSY_WAIT_MS } from './busy.js';
5
6
  // WAL pages at which a connection checkpoints inside its own commit.
6
7
  const INLINE_CHECKPOINT_PAGES = 100;
7
8
  // The same limit while a worker checkpoints the store: SQLite still bounds the WAL when the worker falls behind.
@@ -17,7 +18,7 @@ const WORKER_SOURCE = `
17
18
  const { parentPort, workerData } = require('node:worker_threads');
18
19
  const { DatabaseSync } = require('node:sqlite');
19
20
  const db = new DatabaseSync(workerData.dbPath);
20
- db.exec('PRAGMA busy_timeout = 5000');
21
+ db.exec('PRAGMA busy_timeout = ${DEFAULT_BUSY_WAIT_MS}');
21
22
  db.exec('PRAGMA synchronous = NORMAL');
22
23
  const pass = db.prepare('PRAGMA wal_checkpoint(PASSIVE)');
23
24
  parentPort.on('message', (message) => {
package/dist/doctor.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type SpoolFs } from './capture/compaction-spool.js';
1
2
  /** Outcome of one check. `fail` makes `hippo doctor` exit 1. */
2
3
  export type DoctorStatus = 'pass' | 'warn' | 'fail' | 'info';
3
4
  /** One check in a {@link DoctorReport}. */
@@ -24,6 +25,8 @@ export interface DoctorOpts {
24
25
  version: string;
25
26
  nodeVersion?: string;
26
27
  now?: Date;
28
+ /** Stands in for the fs the spool check reads; a test makes one call fail. */
29
+ spoolFs?: SpoolFs;
27
30
  }
28
31
  /** Minimum Node.js version hippo supports (package.json engines). */
29
32
  export declare const MIN_NODE = "22.16.0";