hippo-memory 1.60.0 → 1.62.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 (593) hide show
  1. package/README.md +29 -54
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.d.ts +1 -1
  4. package/dist/agent-memories/apply.js +4 -1
  5. package/dist/agent-memories/claude-code.d.ts +3 -1
  6. package/dist/agent-memories/claude-code.js +54 -10
  7. package/dist/agent-memories/codex.js +1 -1
  8. package/dist/agent-memories/gemini.js +1 -1
  9. package/dist/agent-memories/legacy.js +1 -1
  10. package/dist/agent-memories/source.js +1 -1
  11. package/dist/agent-memories/sync.d.ts +3 -3
  12. package/dist/agent-memories/sync.js +22 -9
  13. package/dist/agent-memories/types.d.ts +0 -2
  14. package/dist/ambient-store.d.ts +14 -0
  15. package/dist/ambient-store.js +90 -0
  16. package/dist/ambient.d.ts +23 -0
  17. package/dist/ambient.js +72 -50
  18. package/dist/api/assemble.d.ts +93 -0
  19. package/dist/api/assemble.js +153 -0
  20. package/dist/api/audit.d.ts +17 -0
  21. package/dist/api/audit.js +23 -0
  22. package/dist/api/auth.d.ts +79 -0
  23. package/dist/api/auth.js +178 -0
  24. package/dist/api/context-select.d.ts +49 -0
  25. package/dist/api/context-select.js +344 -0
  26. package/dist/api/context-types.d.ts +105 -0
  27. package/dist/api/context-types.js +3 -0
  28. package/dist/api/context.d.ts +31 -0
  29. package/dist/api/context.js +378 -0
  30. package/dist/api/dormant.d.ts +30 -0
  31. package/dist/api/dormant.js +140 -0
  32. package/dist/api/drill-down.d.ts +84 -0
  33. package/dist/api/drill-down.js +126 -0
  34. package/dist/api/forget.d.ts +57 -0
  35. package/dist/api/forget.js +87 -0
  36. package/dist/api/goals.d.ts +18 -0
  37. package/dist/api/goals.js +33 -0
  38. package/dist/api/learn.d.ts +31 -0
  39. package/dist/api/learn.js +88 -0
  40. package/dist/api/outcome.d.ts +61 -0
  41. package/dist/api/outcome.js +66 -0
  42. package/dist/api/promote.d.ts +54 -0
  43. package/dist/api/promote.js +192 -0
  44. package/dist/api/quarantine.d.ts +24 -0
  45. package/dist/api/quarantine.js +121 -0
  46. package/dist/api/recall-types.d.ts +390 -0
  47. package/dist/api/recall-types.js +3 -0
  48. package/dist/api/recall.d.ts +36 -0
  49. package/dist/api/recall.js +499 -0
  50. package/dist/api/remember.d.ts +35 -0
  51. package/dist/api/remember.js +43 -0
  52. package/dist/api/sleep.d.ts +136 -0
  53. package/dist/api/sleep.js +256 -0
  54. package/dist/api/tokens.d.ts +26 -0
  55. package/dist/api/tokens.js +60 -0
  56. package/dist/api/types.d.ts +56 -0
  57. package/dist/api/types.js +38 -0
  58. package/dist/api.d.ts +20 -1262
  59. package/dist/api.js +25 -2727
  60. package/dist/audit.d.ts +3 -0
  61. package/dist/audit.js +6 -3
  62. package/dist/auth.d.ts +45 -4
  63. package/dist/auth.js +125 -48
  64. package/dist/autolearn.js +2 -2
  65. package/dist/capture/command.d.ts +33 -0
  66. package/dist/capture/command.js +264 -0
  67. package/dist/capture/compact.d.ts +44 -0
  68. package/dist/capture/compact.js +354 -0
  69. package/dist/capture/extract.d.ts +21 -0
  70. package/dist/capture/extract.js +464 -0
  71. package/dist/capture/transcript.d.ts +40 -0
  72. package/dist/capture/transcript.js +193 -0
  73. package/dist/capture-error.js +2 -1
  74. package/dist/churn-git.js +4 -2
  75. package/dist/cli/audit.d.ts +3 -0
  76. package/dist/cli/audit.js +159 -0
  77. package/dist/cli/auth.d.ts +2 -0
  78. package/dist/cli/auth.js +171 -0
  79. package/dist/cli/briefs.d.ts +4 -0
  80. package/dist/cli/briefs.js +453 -0
  81. package/dist/cli/card.d.ts +3 -0
  82. package/dist/cli/card.js +333 -0
  83. package/dist/cli/context.d.ts +15 -0
  84. package/dist/cli/context.js +376 -0
  85. package/dist/cli/continuity.d.ts +6 -0
  86. package/dist/cli/continuity.js +457 -0
  87. package/dist/cli/curate.d.ts +19 -0
  88. package/dist/cli/curate.js +556 -0
  89. package/dist/cli/dag.d.ts +5 -0
  90. package/dist/cli/dag.js +177 -0
  91. package/dist/cli/decisions.d.ts +4 -0
  92. package/dist/cli/decisions.js +528 -0
  93. package/dist/cli/eval.d.ts +5 -0
  94. package/dist/cli/eval.js +213 -0
  95. package/dist/cli/explain.d.ts +4 -0
  96. package/dist/cli/explain.js +156 -0
  97. package/dist/cli/goals.d.ts +2 -0
  98. package/dist/cli/goals.js +196 -0
  99. package/dist/cli/hook-blocks.d.ts +18 -0
  100. package/dist/cli/hook-blocks.js +233 -0
  101. package/dist/cli/init.d.ts +2 -0
  102. package/dist/cli/init.js +305 -0
  103. package/dist/cli/maintenance.d.ts +4 -0
  104. package/dist/cli/maintenance.js +190 -0
  105. package/dist/cli/playbooks.d.ts +4 -0
  106. package/dist/cli/playbooks.js +573 -0
  107. package/dist/cli/projects.js +9 -6
  108. package/dist/cli/recall.d.ts +7 -0
  109. package/dist/cli/recall.js +582 -0
  110. package/dist/cli/remember.d.ts +5 -0
  111. package/dist/cli/remember.js +485 -0
  112. package/dist/cli/serve.d.ts +5 -0
  113. package/dist/cli/serve.js +40 -0
  114. package/dist/cli/session-hooks.d.ts +29 -0
  115. package/dist/cli/session-hooks.js +647 -0
  116. package/dist/cli/setup.d.ts +4 -0
  117. package/dist/cli/setup.js +397 -0
  118. package/dist/cli/shared.d.ts +15 -19
  119. package/dist/cli/shared.js +50 -341
  120. package/dist/cli/slack.d.ts +2 -0
  121. package/dist/cli/slack.js +171 -0
  122. package/dist/cli/status.d.ts +18 -0
  123. package/dist/cli/status.js +409 -0
  124. package/dist/cli/transfer.d.ts +10 -0
  125. package/dist/cli/transfer.js +424 -0
  126. package/dist/cli/usage.d.ts +85 -0
  127. package/dist/cli/usage.js +741 -0
  128. package/dist/cli.d.ts +71 -120
  129. package/dist/cli.js +170 -8469
  130. package/dist/client.js +15 -8
  131. package/dist/compaction-record.d.ts +0 -2
  132. package/dist/compaction-record.js +7 -5
  133. package/dist/connectors/github/backfill.js +94 -87
  134. package/dist/connectors/github/cli-impl.js +4 -3
  135. package/dist/connectors/github/dlq.js +67 -54
  136. package/dist/connectors/github/ingest.js +34 -35
  137. package/dist/connectors/github/tenant-routing.js +3 -2
  138. package/dist/connectors/github/webhook.js +135 -216
  139. package/dist/connectors/slack/dlq.js +49 -61
  140. package/dist/connectors/slack/ingest.js +55 -48
  141. package/dist/connectors/slack/tenant-routing.js +4 -3
  142. package/dist/connectors/slack/webhook.js +72 -74
  143. package/dist/consolidate/conflicts.d.ts +10 -0
  144. package/dist/consolidate/conflicts.js +178 -0
  145. package/dist/consolidate/decay.d.ts +12 -0
  146. package/dist/consolidate/decay.js +145 -0
  147. package/dist/consolidate/llm-passes.d.ts +3 -0
  148. package/dist/consolidate/llm-passes.js +141 -0
  149. package/dist/consolidate/merge.d.ts +7 -0
  150. package/dist/consolidate/merge.js +251 -0
  151. package/dist/consolidate/physics-pass.d.ts +3 -0
  152. package/dist/consolidate/physics-pass.js +60 -0
  153. package/dist/consolidate/run.d.ts +69 -0
  154. package/dist/consolidate/run.js +76 -0
  155. package/dist/consolidate/sleep.d.ts +18 -0
  156. package/dist/consolidate/sleep.js +209 -0
  157. package/dist/consolidate/traces.d.ts +4 -0
  158. package/dist/consolidate/traces.js +178 -0
  159. package/dist/context-auto.js +7 -11
  160. package/dist/context-render.d.ts +1 -1
  161. package/dist/context-render.js +1 -1
  162. package/dist/customer-notes.d.ts +3 -0
  163. package/dist/customer-notes.js +83 -72
  164. package/dist/dag.js +225 -188
  165. package/dist/dashboard-actions.d.ts +20 -0
  166. package/dist/dashboard-actions.js +88 -0
  167. package/dist/dashboard-params.d.ts +45 -0
  168. package/dist/dashboard-params.js +127 -0
  169. package/dist/dashboard-queries.d.ts +15 -0
  170. package/dist/dashboard-queries.js +355 -0
  171. package/dist/dashboard-snapshot.d.ts +138 -0
  172. package/dist/dashboard-snapshot.js +308 -0
  173. package/dist/dashboard-types.d.ts +163 -0
  174. package/dist/dashboard-types.js +3 -0
  175. package/dist/dashboard.d.ts +6 -7
  176. package/dist/dashboard.js +228 -202
  177. package/dist/db/busy.d.ts +5 -0
  178. package/dist/db/busy.js +24 -0
  179. package/dist/db/continuity.d.ts +5 -0
  180. package/dist/db/continuity.js +145 -0
  181. package/dist/db/meta.d.ts +8 -0
  182. package/dist/db/meta.js +35 -0
  183. package/dist/db/migrate.d.ts +9 -0
  184. package/dist/db/migrate.js +138 -0
  185. package/dist/db/migrations/index.d.ts +5 -0
  186. package/dist/db/migrations/index.js +109 -0
  187. package/dist/db/migrations/types.d.ts +14 -0
  188. package/dist/db/migrations/types.js +2 -0
  189. package/dist/db/migrations/v01.d.ts +3 -0
  190. package/dist/db/migrations/v01.js +38 -0
  191. package/dist/db/migrations/v02.d.ts +3 -0
  192. package/dist/db/migrations/v02.js +21 -0
  193. package/dist/db/migrations/v03.d.ts +3 -0
  194. package/dist/db/migrations/v03.js +22 -0
  195. package/dist/db/migrations/v04.d.ts +3 -0
  196. package/dist/db/migrations/v04.js +28 -0
  197. package/dist/db/migrations/v05.d.ts +3 -0
  198. package/dist/db/migrations/v05.js +21 -0
  199. package/dist/db/migrations/v06.d.ts +3 -0
  200. package/dist/db/migrations/v06.js +25 -0
  201. package/dist/db/migrations/v07.d.ts +3 -0
  202. package/dist/db/migrations/v07.js +13 -0
  203. package/dist/db/migrations/v08.d.ts +3 -0
  204. package/dist/db/migrations/v08.js +8 -0
  205. package/dist/db/migrations/v09.d.ts +3 -0
  206. package/dist/db/migrations/v09.js +13 -0
  207. package/dist/db/migrations/v10.d.ts +3 -0
  208. package/dist/db/migrations/v10.js +17 -0
  209. package/dist/db/migrations/v11.d.ts +3 -0
  210. package/dist/db/migrations/v11.js +15 -0
  211. package/dist/db/migrations/v12.d.ts +3 -0
  212. package/dist/db/migrations/v12.js +11 -0
  213. package/dist/db/migrations/v13.d.ts +3 -0
  214. package/dist/db/migrations/v13.js +15 -0
  215. package/dist/db/migrations/v14.d.ts +3 -0
  216. package/dist/db/migrations/v14.js +66 -0
  217. package/dist/db/migrations/v15.d.ts +3 -0
  218. package/dist/db/migrations/v15.js +42 -0
  219. package/dist/db/migrations/v16.d.ts +3 -0
  220. package/dist/db/migrations/v16.js +61 -0
  221. package/dist/db/migrations/v17.d.ts +3 -0
  222. package/dist/db/migrations/v17.js +46 -0
  223. package/dist/db/migrations/v18.d.ts +3 -0
  224. package/dist/db/migrations/v18.js +60 -0
  225. package/dist/db/migrations/v19.d.ts +3 -0
  226. package/dist/db/migrations/v19.js +28 -0
  227. package/dist/db/migrations/v20.d.ts +3 -0
  228. package/dist/db/migrations/v20.js +42 -0
  229. package/dist/db/migrations/v21.d.ts +3 -0
  230. package/dist/db/migrations/v21.js +16 -0
  231. package/dist/db/migrations/v22.d.ts +3 -0
  232. package/dist/db/migrations/v22.js +82 -0
  233. package/dist/db/migrations/v23.d.ts +3 -0
  234. package/dist/db/migrations/v23.js +48 -0
  235. package/dist/db/migrations/v24.d.ts +3 -0
  236. package/dist/db/migrations/v24.js +72 -0
  237. package/dist/db/migrations/v25.d.ts +3 -0
  238. package/dist/db/migrations/v25.js +46 -0
  239. package/dist/db/migrations/v26.d.ts +3 -0
  240. package/dist/db/migrations/v26.js +23 -0
  241. package/dist/db/migrations/v27.d.ts +3 -0
  242. package/dist/db/migrations/v27.js +57 -0
  243. package/dist/db/migrations/v28.d.ts +3 -0
  244. package/dist/db/migrations/v28.js +38 -0
  245. package/dist/db/migrations/v29.d.ts +3 -0
  246. package/dist/db/migrations/v29.js +78 -0
  247. package/dist/db/migrations/v30.d.ts +3 -0
  248. package/dist/db/migrations/v30.js +92 -0
  249. package/dist/db/migrations/v31.d.ts +3 -0
  250. package/dist/db/migrations/v31.js +74 -0
  251. package/dist/db/migrations/v32.d.ts +3 -0
  252. package/dist/db/migrations/v32.js +102 -0
  253. package/dist/db/migrations/v33.d.ts +3 -0
  254. package/dist/db/migrations/v33.js +104 -0
  255. package/dist/db/migrations/v34.d.ts +3 -0
  256. package/dist/db/migrations/v34.js +93 -0
  257. package/dist/db/migrations/v35.d.ts +3 -0
  258. package/dist/db/migrations/v35.js +98 -0
  259. package/dist/db/migrations/v36.d.ts +3 -0
  260. package/dist/db/migrations/v36.js +98 -0
  261. package/dist/db/migrations/v37.d.ts +3 -0
  262. package/dist/db/migrations/v37.js +219 -0
  263. package/dist/db/migrations/v38.d.ts +3 -0
  264. package/dist/db/migrations/v38.js +277 -0
  265. package/dist/db/migrations/v39.d.ts +3 -0
  266. package/dist/db/migrations/v39.js +59 -0
  267. package/dist/db/migrations/v40.d.ts +3 -0
  268. package/dist/db/migrations/v40.js +74 -0
  269. package/dist/db/migrations/v41.d.ts +3 -0
  270. package/dist/db/migrations/v41.js +43 -0
  271. package/dist/db/migrations/v42.d.ts +3 -0
  272. package/dist/db/migrations/v42.js +41 -0
  273. package/dist/db/migrations/v43.d.ts +3 -0
  274. package/dist/db/migrations/v43.js +67 -0
  275. package/dist/db/migrations/v44.d.ts +3 -0
  276. package/dist/db/migrations/v44.js +28 -0
  277. package/dist/db/migrations/v45.d.ts +3 -0
  278. package/dist/db/migrations/v45.js +30 -0
  279. package/dist/db/migrations/v46.d.ts +3 -0
  280. package/dist/db/migrations/v46.js +25 -0
  281. package/dist/db/migrations/v47.d.ts +3 -0
  282. package/dist/db/migrations/v47.js +17 -0
  283. package/dist/db/migrations/v48.d.ts +3 -0
  284. package/dist/db/migrations/v48.js +10 -0
  285. package/dist/db/migrations/v49.d.ts +3 -0
  286. package/dist/db/migrations/v49.js +31 -0
  287. package/dist/db/migrations/v50.d.ts +3 -0
  288. package/dist/db/migrations/v50.js +67 -0
  289. package/dist/db/migrations/v51.d.ts +3 -0
  290. package/dist/db/migrations/v51.js +14 -0
  291. package/dist/db/migrations/v52.d.ts +3 -0
  292. package/dist/db/migrations/v52.js +7 -0
  293. package/dist/db/open.d.ts +23 -0
  294. package/dist/db/open.js +146 -0
  295. package/dist/db/sqlite.d.ts +21 -0
  296. package/dist/db/sqlite.js +8 -0
  297. package/dist/db/tables.d.ts +7 -0
  298. package/dist/db/tables.js +38 -0
  299. package/dist/db.d.ts +6 -46
  300. package/dist/db.js +5 -3049
  301. package/dist/decisions.d.ts +4 -1
  302. package/dist/decisions.js +102 -83
  303. package/dist/dedupe.js +3 -2
  304. package/dist/delivery-recorder.js +4 -1
  305. package/dist/doctor.js +14 -10
  306. package/dist/embedding-provider.d.ts +1 -1
  307. package/dist/embedding-provider.js +4 -3
  308. package/dist/embeddings.d.ts +9 -52
  309. package/dist/embeddings.js +43 -297
  310. package/dist/env.d.ts +75 -0
  311. package/dist/env.js +119 -0
  312. package/dist/eval-suite.js +1 -1
  313. package/dist/eval.js +2 -2
  314. package/dist/extract.js +1 -1
  315. package/dist/gated-write.js +3 -1
  316. package/dist/goals.d.ts +3 -1
  317. package/dist/goals.js +117 -86
  318. package/dist/graph/read.d.ts +73 -0
  319. package/dist/graph/read.js +325 -0
  320. package/dist/graph/rows.d.ts +45 -0
  321. package/dist/graph/rows.js +51 -0
  322. package/dist/graph/types.d.ts +83 -0
  323. package/dist/graph/types.js +11 -0
  324. package/dist/graph/write.d.ts +93 -0
  325. package/dist/{graph.js → graph/write.js} +6 -384
  326. package/dist/graph-extract.js +2 -1
  327. package/dist/graph-recall.d.ts +1 -1
  328. package/dist/graph-recall.js +2 -2
  329. package/dist/graph-stream.js +1 -1
  330. package/dist/graph-view.d.ts +1 -1
  331. package/dist/graph-view.js +1 -1
  332. package/dist/half-life-migration.d.ts +1 -1
  333. package/dist/half-life-migration.js +2 -1
  334. package/dist/hooks/codex-session.d.ts +8 -0
  335. package/dist/hooks/codex-session.js +76 -0
  336. package/dist/hooks/codex-wrapper.d.ts +55 -0
  337. package/dist/hooks/codex-wrapper.js +288 -0
  338. package/dist/hooks/json-hooks.d.ts +63 -0
  339. package/dist/hooks/json-hooks.js +356 -0
  340. package/dist/hooks/opencode.d.ts +50 -0
  341. package/dist/hooks/opencode.js +202 -0
  342. package/dist/hooks/shared.d.ts +54 -0
  343. package/dist/hooks/shared.js +77 -0
  344. package/dist/http-retry.d.ts +2 -0
  345. package/dist/http-retry.js +4 -3
  346. package/dist/http-util.d.ts +3 -0
  347. package/dist/http-util.js +10 -0
  348. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  349. package/dist/importers/core.js +141 -0
  350. package/dist/importers/markdown-parse.d.ts +41 -0
  351. package/dist/importers/markdown-parse.js +132 -0
  352. package/dist/importers/markdown.d.ts +3 -0
  353. package/dist/importers/markdown.js +92 -0
  354. package/dist/importers/sources.d.ts +7 -0
  355. package/dist/importers/sources.js +229 -0
  356. package/dist/importers/vault.d.ts +11 -0
  357. package/dist/importers/vault.js +352 -0
  358. package/dist/incidents.d.ts +3 -0
  359. package/dist/incidents.js +52 -43
  360. package/dist/index.d.ts +25 -6
  361. package/dist/index.js +23 -6
  362. package/dist/invalidation.js +2 -1
  363. package/dist/judgment.js +2 -1
  364. package/dist/keyset.d.ts +13 -0
  365. package/dist/keyset.js +8 -0
  366. package/dist/local-embedding.d.ts +13 -0
  367. package/dist/local-embedding.js +165 -0
  368. package/dist/log.d.ts +7 -0
  369. package/dist/log.js +19 -1
  370. package/dist/mcp/admin-tools.d.ts +8 -0
  371. package/dist/mcp/admin-tools.js +116 -0
  372. package/dist/mcp/format.d.ts +27 -0
  373. package/dist/mcp/format.js +135 -0
  374. package/dist/mcp/memory-tools.d.ts +5 -0
  375. package/dist/mcp/memory-tools.js +83 -0
  376. package/dist/mcp/protocol.d.ts +83 -0
  377. package/dist/mcp/protocol.js +55 -0
  378. package/dist/mcp/recall-tools.d.ts +6 -0
  379. package/dist/mcp/recall-tools.js +320 -0
  380. package/dist/mcp/request.d.ts +10 -0
  381. package/dist/mcp/request.js +163 -0
  382. package/dist/mcp/server.d.ts +4 -75
  383. package/dist/mcp/server.js +7 -1190
  384. package/dist/mcp/session-state.d.ts +11 -0
  385. package/dist/mcp/session-state.js +28 -0
  386. package/dist/mcp/stdio.d.ts +8 -0
  387. package/dist/mcp/stdio.js +79 -0
  388. package/dist/mcp/tools.d.ts +11 -0
  389. package/dist/mcp/tools.js +247 -0
  390. package/dist/memory.d.ts +3 -0
  391. package/dist/memory.js +27 -1
  392. package/dist/multihop.d.ts +1 -1
  393. package/dist/multihop.js +2 -1
  394. package/dist/owner-validation.js +2 -1
  395. package/dist/physics-state.js +10 -7
  396. package/dist/policies.d.ts +3 -0
  397. package/dist/policies.js +93 -74
  398. package/dist/postinstall.js +3 -2
  399. package/dist/predictions/planning-fallacy.d.ts +100 -0
  400. package/dist/predictions/planning-fallacy.js +190 -0
  401. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  402. package/dist/predictions/store.js +434 -0
  403. package/dist/processes.d.ts +3 -0
  404. package/dist/processes.js +94 -76
  405. package/dist/project-briefs.d.ts +3 -0
  406. package/dist/project-briefs.js +142 -113
  407. package/dist/project-identity.js +3 -2
  408. package/dist/project-merge.d.ts +12 -4
  409. package/dist/project-merge.js +132 -45
  410. package/dist/quarantine.d.ts +2 -1
  411. package/dist/quarantine.js +8 -5
  412. package/dist/raw-archive.js +1 -1
  413. package/dist/recall-history.js +3 -2
  414. package/dist/recall-pipeline.d.ts +2 -2
  415. package/dist/recall-pipeline.js +16 -8
  416. package/dist/recall-scope.js +1 -1
  417. package/dist/recall-trace.d.ts +1 -1
  418. package/dist/refine-llm.js +2 -1
  419. package/dist/reject-flow.js +6 -1
  420. package/dist/rerankers/clef.js +6 -5
  421. package/dist/rerankers/jev.d.ts +1 -1
  422. package/dist/rerankers/jev.js +4 -4
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +58 -38
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/scheduler.d.ts +1 -0
  428. package/dist/scheduler.js +26 -4
  429. package/dist/scope.js +4 -3
  430. package/dist/search/as-of.d.ts +10 -0
  431. package/dist/search/as-of.js +22 -0
  432. package/dist/search/bm25-search.d.ts +14 -0
  433. package/dist/search/bm25-search.js +43 -0
  434. package/dist/search/bm25.d.ts +15 -0
  435. package/dist/search/bm25.js +54 -0
  436. package/dist/search/boosts.d.ts +54 -0
  437. package/dist/search/boosts.js +94 -0
  438. package/dist/search/breakdown.d.ts +7 -0
  439. package/dist/search/breakdown.js +20 -0
  440. package/dist/search/explain.d.ts +25 -0
  441. package/dist/search/explain.js +31 -0
  442. package/dist/search/finalize.d.ts +8 -0
  443. package/dist/search/finalize.js +52 -0
  444. package/dist/search/fusion.d.ts +27 -0
  445. package/dist/search/fusion.js +42 -0
  446. package/dist/search/hybrid-score.d.ts +20 -0
  447. package/dist/search/hybrid-score.js +73 -0
  448. package/dist/search/hybrid.d.ts +46 -0
  449. package/dist/search/hybrid.js +64 -0
  450. package/dist/search/physics-search.d.ts +29 -0
  451. package/dist/search/physics-search.js +162 -0
  452. package/dist/search/rerank.d.ts +10 -0
  453. package/dist/search/rerank.js +72 -0
  454. package/dist/search/temporal.d.ts +15 -0
  455. package/dist/search/temporal.js +45 -0
  456. package/dist/search/types.d.ts +91 -0
  457. package/dist/search/types.js +2 -0
  458. package/dist/search/vector.d.ts +30 -0
  459. package/dist/search/vector.js +71 -0
  460. package/dist/secret-detect.d.ts +2 -0
  461. package/dist/secret-detect.js +2 -1
  462. package/dist/server/auth.d.ts +52 -0
  463. package/dist/server/auth.js +221 -0
  464. package/dist/server/client-ip.d.ts +25 -0
  465. package/dist/server/client-ip.js +92 -0
  466. package/dist/server/cursor.d.ts +23 -0
  467. package/dist/server/cursor.js +58 -0
  468. package/dist/server/lifecycle.d.ts +7 -0
  469. package/dist/server/lifecycle.js +29 -0
  470. package/dist/server/mcp-http.d.ts +5 -0
  471. package/dist/server/mcp-http.js +199 -0
  472. package/dist/server/request.d.ts +33 -0
  473. package/dist/server/request.js +103 -0
  474. package/dist/server/routes/admin.d.ts +9 -0
  475. package/dist/server/routes/admin.js +158 -0
  476. package/dist/server/routes/customer-notes.d.ts +7 -0
  477. package/dist/server/routes/customer-notes.js +112 -0
  478. package/dist/server/routes/decisions.d.ts +7 -0
  479. package/dist/server/routes/decisions.js +133 -0
  480. package/dist/server/routes/incidents.d.ts +7 -0
  481. package/dist/server/routes/incidents.js +126 -0
  482. package/dist/server/routes/memories.d.ts +10 -0
  483. package/dist/server/routes/memories.js +179 -0
  484. package/dist/server/routes/policies.d.ts +8 -0
  485. package/dist/server/routes/policies.js +151 -0
  486. package/dist/server/routes/predictions.d.ts +7 -0
  487. package/dist/server/routes/predictions.js +164 -0
  488. package/dist/server/routes/processes.d.ts +7 -0
  489. package/dist/server/routes/processes.js +161 -0
  490. package/dist/server/routes/project-briefs.d.ts +8 -0
  491. package/dist/server/routes/project-briefs.js +136 -0
  492. package/dist/server/routes/recall.d.ts +8 -0
  493. package/dist/server/routes/recall.js +340 -0
  494. package/dist/server/routes/skills.d.ts +8 -0
  495. package/dist/server/routes/skills.js +150 -0
  496. package/dist/server/types.d.ts +56 -0
  497. package/dist/server/types.js +2 -0
  498. package/dist/server/validation.d.ts +14 -0
  499. package/dist/server/validation.js +91 -0
  500. package/dist/server.d.ts +7 -61
  501. package/dist/server.js +69 -2362
  502. package/dist/session-digest.d.ts +1 -1
  503. package/dist/session-digest.js +9 -2
  504. package/dist/shared.d.ts +12 -1
  505. package/dist/shared.js +33 -27
  506. package/dist/skills.d.ts +3 -0
  507. package/dist/skills.js +88 -70
  508. package/dist/stdin.js +2 -2
  509. package/dist/store/audit-event.d.ts +19 -0
  510. package/dist/store/audit-event.js +33 -0
  511. package/dist/store/candidates.d.ts +42 -0
  512. package/dist/store/candidates.js +152 -0
  513. package/dist/store/conflicts.d.ts +44 -0
  514. package/dist/store/conflicts.js +444 -0
  515. package/dist/store/delete-and-batch.d.ts +63 -0
  516. package/dist/store/delete-and-batch.js +310 -0
  517. package/dist/store/entry-reads.d.ts +92 -0
  518. package/dist/store/entry-reads.js +255 -0
  519. package/dist/store/entry-row.d.ts +67 -0
  520. package/dist/store/entry-row.js +208 -0
  521. package/dist/store/entry-writes.d.ts +46 -0
  522. package/dist/store/entry-writes.js +148 -0
  523. package/dist/store/handoffs.d.ts +26 -0
  524. package/dist/store/handoffs.js +184 -0
  525. package/dist/store/index-and-stats.d.ts +52 -0
  526. package/dist/store/index-and-stats.js +214 -0
  527. package/dist/store/markdown.d.ts +10 -0
  528. package/dist/store/markdown.js +108 -0
  529. package/dist/store/mirrors.d.ts +49 -0
  530. package/dist/store/mirrors.js +312 -0
  531. package/dist/store/open.d.ts +15 -0
  532. package/dist/store/open.js +223 -0
  533. package/dist/store/rows.d.ts +178 -0
  534. package/dist/store/rows.js +158 -0
  535. package/dist/store/search-rows.d.ts +86 -0
  536. package/dist/store/search-rows.js +260 -0
  537. package/dist/store/sessions.d.ts +83 -0
  538. package/dist/store/sessions.js +272 -0
  539. package/dist/store/summaries.d.ts +94 -0
  540. package/dist/store/summaries.js +377 -0
  541. package/dist/store/tenant-lookup.d.ts +12 -0
  542. package/dist/store/tenant-lookup.js +16 -0
  543. package/dist/store-cards.js +2 -1
  544. package/dist/summary-dirty.d.ts +4 -0
  545. package/dist/summary-dirty.js +32 -0
  546. package/dist/support-bundle.js +4 -3
  547. package/dist/tenant.js +2 -2
  548. package/dist/tokenize.d.ts +2 -0
  549. package/dist/tokenize.js +16 -0
  550. package/dist/transcript-tail.d.ts +7 -0
  551. package/dist/transcript-tail.js +48 -0
  552. package/dist/vector-store.d.ts +27 -0
  553. package/dist/vector-store.js +210 -0
  554. package/dist/version.d.ts +2 -2
  555. package/dist/version.js +2 -2
  556. package/dist/working-memory.js +1 -1
  557. package/dist/yaml.js +36 -11
  558. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  559. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  560. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  566. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  570. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  571. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  572. package/dist-ui/index.html +3 -25
  573. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  574. package/extensions/openclaw-plugin/package.json +1 -1
  575. package/openclaw.plugin.json +1 -1
  576. package/package.json +1 -1
  577. package/dist/capture.d.ts +0 -155
  578. package/dist/capture.js +0 -1295
  579. package/dist/consolidate.d.ts +0 -58
  580. package/dist/consolidate.js +0 -1124
  581. package/dist/graph.d.ts +0 -245
  582. package/dist/hooks.d.ts +0 -208
  583. package/dist/hooks.js +0 -1076
  584. package/dist/importers.js +0 -900
  585. package/dist/predictions.js +0 -620
  586. package/dist/search.d.ts +0 -320
  587. package/dist/search.js +0 -970
  588. package/dist/store.d.ts +0 -776
  589. package/dist/store.js +0 -3473
  590. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  591. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  592. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  593. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,30 @@
1
+ export const v45 = {
2
+ version: 45,
3
+ up: (db) => {
4
+ // Token ledger (src/token-ledger.ts, ROADMAP TE0): one row per block of
5
+ // memory text hippo hands an agent (hook, CLI, MCP, HTTP). `event` is 'inject'
6
+ // (sent), 'skip' (unchanged since the session's last inject, not sent), 'reset'
7
+ // (compaction dropped earlier injections, so the next one must be sent) or
8
+ // 'reread' (re-read by later calls, booked at session end per call day). block_hash
9
+ // lets the per-prompt hook skip an unchanged block. Rows older than the retention
10
+ // window are pruned on write. Additive only: no min_compatible_binary bump.
11
+ db.exec(`
12
+ CREATE TABLE IF NOT EXISTS token_ledger (
13
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
14
+ ts TEXT NOT NULL,
15
+ tenant_id TEXT NOT NULL DEFAULT 'default',
16
+ session_id TEXT,
17
+ surface TEXT NOT NULL,
18
+ event TEXT NOT NULL,
19
+ items INTEGER NOT NULL DEFAULT 0,
20
+ tokens INTEGER NOT NULL DEFAULT 0,
21
+ block_hash TEXT
22
+ );
23
+ CREATE INDEX IF NOT EXISTS idx_token_ledger_session
24
+ ON token_ledger(tenant_id, session_id, surface, id DESC);
25
+ CREATE INDEX IF NOT EXISTS idx_token_ledger_ts
26
+ ON token_ledger(ts);
27
+ `);
28
+ },
29
+ };
30
+ //# sourceMappingURL=v45.js.map
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './types.js';
2
+ export declare const v46: Migration;
3
+ //# sourceMappingURL=v46.d.ts.map
@@ -0,0 +1,25 @@
1
+ export const v46 = {
2
+ version: 46,
3
+ up: (db) => {
4
+ // CD13 failure log (src/failure-log.ts): hashes only, since failure text can carry paths and secrets.
5
+ // Additive only: no min_compatible_binary bump.
6
+ db.exec(`
7
+ CREATE TABLE IF NOT EXISTS failure_log (
8
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
9
+ ts TEXT NOT NULL,
10
+ tenant_id TEXT NOT NULL DEFAULT 'default',
11
+ session_id TEXT,
12
+ tool TEXT,
13
+ outcome TEXT NOT NULL,
14
+ skip_rule TEXT,
15
+ sig_hash TEXT,
16
+ detail_hash TEXT
17
+ );
18
+ CREATE INDEX IF NOT EXISTS idx_failure_log_tenant
19
+ ON failure_log(tenant_id, id);
20
+ CREATE INDEX IF NOT EXISTS idx_failure_log_ts
21
+ ON failure_log(ts);
22
+ `);
23
+ },
24
+ };
25
+ //# sourceMappingURL=v46.js.map
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './types.js';
2
+ export declare const v47: Migration;
3
+ //# sourceMappingURL=v47.d.ts.map
@@ -0,0 +1,17 @@
1
+ export const v47 = {
2
+ version: 47,
3
+ up: (db) => {
4
+ // Scope grants (src/auth.ts, ROADMAP EI2): a member key reads a
5
+ // restricted scope only by an explicit row here. Additive only: no
6
+ // min_compatible_binary bump.
7
+ db.exec(`
8
+ CREATE TABLE IF NOT EXISTS api_key_scope_grants (
9
+ key_id TEXT NOT NULL,
10
+ scope TEXT NOT NULL,
11
+ granted_at TEXT NOT NULL,
12
+ PRIMARY KEY(key_id, scope)
13
+ );
14
+ `);
15
+ },
16
+ };
17
+ //# sourceMappingURL=v47.js.map
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './types.js';
2
+ export declare const v48: Migration;
3
+ //# sourceMappingURL=v48.d.ts.map
@@ -0,0 +1,10 @@
1
+ import { MEMORY_QUARANTINE_DDL } from '../continuity.js';
2
+ export const v48 = {
3
+ version: 48,
4
+ up: (db) => {
5
+ // Quarantine (src/quarantine.ts, CD5): a poisoned or suspect memory sits here pending
6
+ // admin review instead of being hidden with no record. Additive only: no min_compatible_binary bump.
7
+ db.exec(MEMORY_QUARANTINE_DDL);
8
+ },
9
+ };
10
+ //# sourceMappingURL=v48.js.map
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './types.js';
2
+ export declare const v49: Migration;
3
+ //# sourceMappingURL=v49.d.ts.map
@@ -0,0 +1,31 @@
1
+ export const v49 = {
2
+ version: 49,
3
+ up: (db) => {
4
+ // Compaction record (src/compaction-record.ts): one row per Claude Code compaction, written before it (started)
5
+ // and after it (summarised, done). Not a memory row. Additive only: no min_compatible_binary bump.
6
+ db.exec(`
7
+ CREATE TABLE IF NOT EXISTS compactions (
8
+ tenant_id TEXT NOT NULL DEFAULT 'default',
9
+ id TEXT NOT NULL,
10
+ session_id TEXT NOT NULL,
11
+ origin_project TEXT NOT NULL DEFAULT '',
12
+ compact_trigger TEXT,
13
+ cwd TEXT,
14
+ transcript_path TEXT,
15
+ snapshot_saved INTEGER NOT NULL DEFAULT 0,
16
+ started_at TEXT NOT NULL,
17
+ summarised_at TEXT,
18
+ summary TEXT,
19
+ items_json TEXT,
20
+ items_written INTEGER NOT NULL DEFAULT 0,
21
+ status TEXT NOT NULL DEFAULT 'started' CHECK (status IN ('started','summarised','done','no-summary')),
22
+ PRIMARY KEY (tenant_id, id)
23
+ );
24
+ CREATE INDEX IF NOT EXISTS idx_compactions_session
25
+ ON compactions(tenant_id, session_id, started_at);
26
+ CREATE INDEX IF NOT EXISTS idx_compactions_status
27
+ ON compactions(tenant_id, status);
28
+ `);
29
+ },
30
+ };
31
+ //# sourceMappingURL=v49.js.map
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './types.js';
2
+ export declare const v50: Migration;
3
+ //# sourceMappingURL=v50.d.ts.map
@@ -0,0 +1,67 @@
1
+ export const v50 = {
2
+ version: 50,
3
+ up: (db) => {
4
+ // Per-turn delivery events (src/recall-trace.ts). Additive only: no min_compatible_binary bump; rollback drops both tables
5
+ // and sets schema_version back to 49. No CHECK on enum columns since SQLite cannot alter one; delivery-recorder.ts unions are the allowlist.
6
+ db.exec(`
7
+ CREATE TABLE IF NOT EXISTS delivery_events (
8
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
9
+ ts TEXT NOT NULL,
10
+ ledger_version INTEGER NOT NULL,
11
+ tenant_id TEXT NOT NULL DEFAULT 'default',
12
+ runtime TEXT NOT NULL,
13
+ event_type TEXT NOT NULL,
14
+ surface TEXT NOT NULL,
15
+ store_hash TEXT NOT NULL,
16
+ write_store TEXT NOT NULL,
17
+ project_hash TEXT,
18
+ session_id TEXT,
19
+ session_state TEXT NOT NULL,
20
+ host_turn_id TEXT,
21
+ turn_seq INTEGER,
22
+ duplicate_of INTEGER,
23
+ prompt_hash TEXT,
24
+ prompt_length INTEGER NOT NULL DEFAULT 0,
25
+ query_hash TEXT,
26
+ recall_trace_id INTEGER,
27
+ block_state TEXT NOT NULL,
28
+ prompt_recall INTEGER NOT NULL DEFAULT 0,
29
+ considered_count INTEGER NOT NULL DEFAULT 0,
30
+ filtered_count INTEGER NOT NULL DEFAULT 0,
31
+ selected_count INTEGER NOT NULL DEFAULT 0,
32
+ emitted_count INTEGER NOT NULL DEFAULT 0,
33
+ rejected_count INTEGER NOT NULL DEFAULT 0,
34
+ rejected_unlisted INTEGER NOT NULL DEFAULT 0,
35
+ sections_shown INTEGER NOT NULL DEFAULT 0,
36
+ sections_dropped INTEGER NOT NULL DEFAULT 0,
37
+ budget_tokens INTEGER NOT NULL DEFAULT 0,
38
+ selected_tokens INTEGER NOT NULL DEFAULT 0,
39
+ injected_tokens INTEGER NOT NULL DEFAULT 0,
40
+ static_hash TEXT,
41
+ recall_hash TEXT,
42
+ emitted_hash TEXT,
43
+ elapsed_ms INTEGER NOT NULL DEFAULT 0
44
+ );
45
+ CREATE INDEX IF NOT EXISTS idx_delivery_events_session ON delivery_events(tenant_id, session_id, id);
46
+ CREATE INDEX IF NOT EXISTS idx_delivery_events_ts ON delivery_events(ts);
47
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_delivery_events_turn
48
+ ON delivery_events(tenant_id, session_id, event_type, turn_seq) WHERE turn_seq IS NOT NULL;
49
+
50
+ CREATE TABLE IF NOT EXISTS delivery_candidates (
51
+ event_id INTEGER NOT NULL REFERENCES delivery_events(id) ON DELETE CASCADE,
52
+ tenant_id TEXT NOT NULL DEFAULT 'default',
53
+ memory_id TEXT NOT NULL, -- no FK: events outlive forgotten memories, as recall traces do
54
+ source_store TEXT NOT NULL,
55
+ pool TEXT NOT NULL,
56
+ stage TEXT NOT NULL,
57
+ outcome TEXT NOT NULL,
58
+ reason TEXT,
59
+ cand_rank INTEGER,
60
+ score REAL,
61
+ tokens INTEGER,
62
+ PRIMARY KEY (event_id, memory_id)
63
+ ) WITHOUT ROWID;
64
+ `);
65
+ },
66
+ };
67
+ //# sourceMappingURL=v50.js.map
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './types.js';
2
+ export declare const v51: Migration;
3
+ //# sourceMappingURL=v51.d.ts.map
@@ -0,0 +1,14 @@
1
+ export const v51 = {
2
+ version: 51,
3
+ up: (db) => {
4
+ // Both indexes serve loadAmbientCandidates (src/store.ts); their WHERE text must match its SQL for the planner to pick them.
5
+ // The drift index stays empty on a healthy store, so the drift probe is one index seek instead of a tenant scan. Additive only.
6
+ db.exec(`
7
+ CREATE INDEX IF NOT EXISTS idx_memories_pinned
8
+ ON memories(tenant_id, created, id) WHERE pinned = 1;
9
+ CREATE INDEX IF NOT EXISTS idx_memories_created_drift
10
+ ON memories(tenant_id) WHERE superseded_by IS NULL AND (length(created) <> 24 OR created NOT LIKE '%Z');
11
+ `);
12
+ },
13
+ };
14
+ //# sourceMappingURL=v51.js.map
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './types.js';
2
+ export declare const v52: Migration;
3
+ //# sourceMappingURL=v52.d.ts.map
@@ -0,0 +1,7 @@
1
+ import { MEMORY_VECTORS_DDL } from '../../vector-store.js';
2
+ export const v52 = {
3
+ version: 52,
4
+ // Vectors move out of embeddings.json so hybrid search reads only the rows it ranks. Additive only; the JSON import runs after COMMIT.
5
+ up: (db) => db.exec(MEMORY_VECTORS_DDL),
6
+ };
7
+ //# sourceMappingURL=v52.js.map
@@ -0,0 +1,23 @@
1
+ import { type DatabaseSyncLike } from './sqlite.js';
2
+ export declare function getHippoDbPath(hippoRoot: string): string;
3
+ /** Lock wait for hook commands: under the 5 s prompt-hook budget even after a few skipped writes, and far above a normal write's hold. */
4
+ export declare const HOOK_DB_WAIT_MS = 1000;
5
+ /** A busy store made a command skip work: warn once per process (the holder is usually `hippo sleep`). */
6
+ export declare function noteStoreBusy(skipped: string): void;
7
+ /** Runs `fn` with one handle per store: openHippoDb reuses it and closeHippoDb leaves it open until `fn` settles or the process exits.
8
+ * `busyWaitMs` is the lock wait of every open inside `fn` that does not pass its own. */
9
+ export declare function withSharedStoreHandles<T>(fn: () => T | Promise<T>, opts?: {
10
+ busyWaitMs?: number;
11
+ }): Promise<T>;
12
+ /** Lock wait inside an HTTP request: SQLite waits synchronously, so a long wait would stall every other request on the event loop. */
13
+ export declare const SERVER_DB_WAIT_MS = 250;
14
+ /** Runs `fn` so that every store opened inside it, across awaits, waits at most `busyWaitMs` for a lock unless the open passes its own. */
15
+ export declare function withBusyWait<T>(busyWaitMs: number, fn: () => T): T;
16
+ /** `busyWaitMs` shortens every lock wait of this open, for a hook that must finish inside its own timeout. */
17
+ export declare function openHippoDb(hippoRoot: string, opts?: {
18
+ busyWaitMs?: number;
19
+ }): DatabaseSyncLike;
20
+ /** Open an existing store without changing it: no mkdir, WAL switch, migration or mirror cleanup. Throws when hippo.db is missing. */
21
+ export declare function openHippoDbReadOnly(hippoRoot: string): DatabaseSyncLike;
22
+ export declare function closeHippoDb(db: DatabaseSyncLike): void;
23
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1,146 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { AsyncLocalStorage } from 'node:async_hooks';
4
+ import { cleanupArchivedMirrors } from '../raw-archive-mirror-cleanup.js';
5
+ import { log } from '../log.js';
6
+ import { DatabaseSync } from './sqlite.js';
7
+ import { execWithBusyRetry } from './busy.js';
8
+ import { tableExists } from './tables.js';
9
+ import { assertBinaryCompatible, runMigrations } from './migrate.js';
10
+ export function getHippoDbPath(hippoRoot) {
11
+ return path.join(hippoRoot, 'hippo.db');
12
+ }
13
+ // Hook commands run on every prompt, so inside withSharedStoreHandles each store pays its pragmas, migration check and mirror cleanup once.
14
+ const sharedHandles = new Map();
15
+ const sharedSet = new WeakSet();
16
+ let shareDepth = 0;
17
+ let shareBusyWaitMs;
18
+ /** Lock wait for hook commands: under the 5 s prompt-hook budget even after a few skipped writes, and far above a normal write's hold. */
19
+ export const HOOK_DB_WAIT_MS = 1000;
20
+ /** A busy store made a command skip work: warn once per process (the holder is usually `hippo sleep`). */
21
+ export function noteStoreBusy(skipped) {
22
+ log.once('store-busy', 'warn', `store busy (another hippo process holds the write lock); ${skipped}`);
23
+ // A lock held past one full wait belongs to a long transaction, so the hook's later writes skip at once.
24
+ for (const db of sharedHandles.values()) {
25
+ if (db.isOpen !== false)
26
+ db.exec('PRAGMA busy_timeout = 0');
27
+ }
28
+ }
29
+ function closeSharedStoreHandles() {
30
+ for (const db of sharedHandles.values()) {
31
+ sharedSet.delete(db);
32
+ if (db.isOpen !== false)
33
+ db.close();
34
+ }
35
+ sharedHandles.clear();
36
+ }
37
+ /** Runs `fn` with one handle per store: openHippoDb reuses it and closeHippoDb leaves it open until `fn` settles or the process exits.
38
+ * `busyWaitMs` is the lock wait of every open inside `fn` that does not pass its own. */
39
+ export async function withSharedStoreHandles(fn, opts) {
40
+ if (shareDepth++ === 0) {
41
+ process.once('exit', closeSharedStoreHandles);
42
+ shareBusyWaitMs = opts?.busyWaitMs;
43
+ }
44
+ try {
45
+ return await fn();
46
+ }
47
+ finally {
48
+ if (--shareDepth === 0) {
49
+ process.off('exit', closeSharedStoreHandles);
50
+ closeSharedStoreHandles();
51
+ shareBusyWaitMs = undefined;
52
+ }
53
+ }
54
+ }
55
+ /** Lock wait inside an HTTP request: SQLite waits synchronously, so a long wait would stall every other request on the event loop. */
56
+ export const SERVER_DB_WAIT_MS = 250;
57
+ const scopedBusyWaitMs = new AsyncLocalStorage();
58
+ /** Runs `fn` so that every store opened inside it, across awaits, waits at most `busyWaitMs` for a lock unless the open passes its own. */
59
+ export function withBusyWait(busyWaitMs, fn) {
60
+ return scopedBusyWaitMs.run(busyWaitMs, fn);
61
+ }
62
+ /** `busyWaitMs` shortens every lock wait of this open, for a hook that must finish inside its own timeout. */
63
+ export function openHippoDb(hippoRoot, opts) {
64
+ if (shareDepth === 0)
65
+ return openOwnHippoDb(hippoRoot, { busyWaitMs: opts?.busyWaitMs ?? scopedBusyWaitMs.getStore() });
66
+ const busyWaitMs = opts?.busyWaitMs ?? shareBusyWaitMs ?? scopedBusyWaitMs.getStore();
67
+ const key = `${path.resolve(getHippoDbPath(hippoRoot))}\0${busyWaitMs ?? ''}`;
68
+ const shared = sharedHandles.get(key);
69
+ if (shared?.isOpen && !shared.isTransaction)
70
+ return shared;
71
+ const db = openOwnHippoDb(hippoRoot, { busyWaitMs });
72
+ // An open nested inside a transaction gets its own connection, as it did before sharing.
73
+ if (!shared?.isOpen) {
74
+ sharedHandles.set(key, db);
75
+ sharedSet.add(db);
76
+ }
77
+ return db;
78
+ }
79
+ // Owner-only on create; SQLite gives the WAL and SHM files the db's mode. Existing paths keep theirs.
80
+ function createStoreFilesOwnerOnly(hippoRoot) {
81
+ fs.mkdirSync(hippoRoot, { recursive: true, mode: 0o700 });
82
+ try {
83
+ fs.closeSync(fs.openSync(getHippoDbPath(hippoRoot), 'wx', 0o600));
84
+ }
85
+ catch (err) {
86
+ if (!(err instanceof Error && 'code' in err && err.code === 'EEXIST'))
87
+ throw err;
88
+ }
89
+ }
90
+ function openOwnHippoDb(hippoRoot, opts) {
91
+ createStoreFilesOwnerOnly(hippoRoot);
92
+ const db = new DatabaseSync(getHippoDbPath(hippoRoot));
93
+ const busyWaitMs = opts?.busyWaitMs;
94
+ try {
95
+ db.exec(`PRAGMA busy_timeout = ${busyWaitMs ?? 5000}`);
96
+ execWithBusyRetry(db, 'PRAGMA journal_mode = WAL', busyWaitMs);
97
+ db.exec('PRAGMA synchronous = NORMAL');
98
+ db.exec('PRAGMA wal_autocheckpoint = 100');
99
+ db.exec('PRAGMA foreign_keys = ON');
100
+ runMigrations(db, hippoRoot, busyWaitMs);
101
+ // Path A backfill: delete any orphan markdown mirrors for already-archived
102
+ // raw_archive rows. Idempotent via per-row raw_archive.mirror_cleaned_at
103
+ // (v21). Wrapped in try/catch — a filesystem failure must not prevent DB open.
104
+ try {
105
+ cleanupArchivedMirrors(hippoRoot, db);
106
+ }
107
+ catch (cleanupErr) {
108
+ log.error(`openHippoDb: cleanupArchivedMirrors failed (non-fatal): ${cleanupErr instanceof Error ? cleanupErr.message : String(cleanupErr)}`);
109
+ }
110
+ return db;
111
+ }
112
+ catch (error) {
113
+ try {
114
+ db.close();
115
+ }
116
+ catch {
117
+ // Best effort only.
118
+ }
119
+ throw error;
120
+ }
121
+ }
122
+ /** Open an existing store without changing it: no mkdir, WAL switch, migration or mirror cleanup. Throws when hippo.db is missing. */
123
+ export function openHippoDbReadOnly(hippoRoot) {
124
+ const db = new DatabaseSync(getHippoDbPath(hippoRoot), { readOnly: true });
125
+ try {
126
+ db.exec('PRAGMA busy_timeout = 5000');
127
+ if (tableExists(db, 'meta'))
128
+ assertBinaryCompatible(db);
129
+ return db;
130
+ }
131
+ catch (error) {
132
+ try {
133
+ db.close();
134
+ }
135
+ catch {
136
+ // Best effort only.
137
+ }
138
+ throw error;
139
+ }
140
+ }
141
+ export function closeHippoDb(db) {
142
+ if (sharedSet.has(db))
143
+ return;
144
+ db.close();
145
+ }
146
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1,21 @@
1
+ interface StatementSyncLike {
2
+ run(...params: unknown[]): {
3
+ lastInsertRowid?: number | bigint;
4
+ changes?: number;
5
+ };
6
+ get<T>(...params: unknown[]): T;
7
+ all(...params: unknown[]): unknown[];
8
+ iterate(...params: unknown[]): IterableIterator<unknown>;
9
+ }
10
+ export interface DatabaseSyncLike {
11
+ exec(sql: string): void;
12
+ prepare(sql: string): StatementSyncLike;
13
+ close(): void;
14
+ readonly isOpen?: boolean;
15
+ readonly isTransaction?: boolean;
16
+ }
17
+ declare const DatabaseSync: new (path: string, options?: {
18
+ readOnly?: boolean;
19
+ }) => DatabaseSyncLike;
20
+ export { DatabaseSync };
21
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1,8 @@
1
+ import { createRequire } from 'module';
2
+ const require = createRequire(import.meta.url);
3
+ // SAFETY: node:sqlite's DatabaseSync constructor genuinely has this shape at
4
+ // runtime (Node's built-in synchronous SQLite module); there are no bundled
5
+ // types for it here, so this require + cast is the module's documented boundary.
6
+ const { DatabaseSync } = require('node:sqlite');
7
+ export { DatabaseSync };
8
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1,7 @@
1
+ import type { DatabaseSyncLike } from './sqlite.js';
2
+ export declare function tableHasColumn(db: DatabaseSyncLike, tableName: string, columnName: string): boolean;
3
+ export declare function tableExists(db: DatabaseSyncLike, tableName: string): boolean;
4
+ /** Row count of one table; null when the table is missing or unreadable, which callers show as unknown. */
5
+ export declare function countTableRows(db: DatabaseSyncLike, table: string): number | null;
6
+ export declare function pruneConsolidationRuns(db: DatabaseSyncLike, keep?: number): void;
7
+ //# sourceMappingURL=tables.d.ts.map
@@ -0,0 +1,38 @@
1
+ export function tableHasColumn(db, tableName, columnName) {
2
+ if (!/^[a-z_]+$/i.test(tableName))
3
+ throw new Error(`Invalid table name: ${tableName}`);
4
+ // SAFETY: rows' shape matches PRAGMA table_info's documented `name` column.
5
+ const rows = db.prepare(`PRAGMA table_info(${tableName})`).all();
6
+ return rows.some((row) => row.name === columnName);
7
+ }
8
+ export function tableExists(db, tableName) {
9
+ if (!/^[a-z_]+$/i.test(tableName))
10
+ throw new Error(`Invalid table name: ${tableName}`);
11
+ // SAFETY: row's shape matches the single `name` column named in the
12
+ // SELECT above.
13
+ const row = db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name = ?`).get(tableName);
14
+ return !!row?.name;
15
+ }
16
+ /** Row count of one table; null when the table is missing or unreadable, which callers show as unknown. */
17
+ export function countTableRows(db, table) {
18
+ try {
19
+ // SAFETY: COUNT(*) returns one row with one numeric column.
20
+ const row = db.prepare(`SELECT COUNT(*) AS n FROM "${table.replace(/"/g, '""')}"`).get();
21
+ return Number(row?.n ?? 0);
22
+ }
23
+ catch {
24
+ // Callers treat an uncountable table as unknown; the bundle and doctor still finish.
25
+ return null;
26
+ }
27
+ }
28
+ export function pruneConsolidationRuns(db, keep = 50) {
29
+ db.prepare(`
30
+ DELETE FROM consolidation_runs
31
+ WHERE id NOT IN (
32
+ SELECT id FROM consolidation_runs
33
+ ORDER BY timestamp DESC, id DESC
34
+ LIMIT ?
35
+ )
36
+ `).run(keep);
37
+ }
38
+ //# sourceMappingURL=tables.js.map
package/dist/db.d.ts CHANGED
@@ -1,47 +1,7 @@
1
- interface StatementSyncLike {
2
- run(...params: unknown[]): {
3
- lastInsertRowid?: number | bigint;
4
- changes?: number;
5
- };
6
- get<T>(...params: unknown[]): T;
7
- all(...params: unknown[]): unknown[];
8
- }
9
- export interface DatabaseSyncLike {
10
- exec(sql: string): void;
11
- prepare(sql: string): StatementSyncLike;
12
- close(): void;
13
- readonly isOpen?: boolean;
14
- readonly isTransaction?: boolean;
15
- }
16
- export declare function getHippoDbPath(hippoRoot: string): string;
17
- export declare function getCurrentSchemaVersion(): number;
18
- /** Thrown by {@link assertBinaryCompatible}; doctor uses it to pick the upgrade fix over a generic permissions fix. */
19
- export declare class IncompatibleBinaryError extends Error {
20
- }
21
- export declare function isSqliteBusy(error: unknown): boolean;
22
- export declare function execWithBusyRetry(db: DatabaseSyncLike, sql: string, timeoutMs?: number): void;
23
- /** Lock wait for hook commands: under the 5 s prompt-hook budget even after a few skipped writes, and far above a normal write's hold. */
24
- export declare const HOOK_DB_WAIT_MS = 1000;
25
- /** A busy store made a command skip work: warn once per process (the holder is usually `hippo sleep`). */
26
- export declare function noteStoreBusy(skipped: string): void;
27
- /** Runs `fn` with one handle per store: openHippoDb reuses it and closeHippoDb leaves it open until `fn` settles or the process exits.
28
- * `busyWaitMs` is the lock wait of every open inside `fn` that does not pass its own. */
29
- export declare function withSharedStoreHandles<T>(fn: () => T | Promise<T>, opts?: {
30
- busyWaitMs?: number;
31
- }): Promise<T>;
32
- /** `busyWaitMs` shortens every lock wait of this open, for a hook that must finish inside its own timeout. */
33
- export declare function openHippoDb(hippoRoot: string, opts?: {
34
- busyWaitMs?: number;
35
- }): DatabaseSyncLike;
36
- /** Open an existing store without changing it: no mkdir, WAL switch, migration or mirror cleanup. Throws when hippo.db is missing. */
37
- export declare function openHippoDbReadOnly(hippoRoot: string): DatabaseSyncLike;
38
- export declare function getSchemaVersion(db: DatabaseSyncLike): number;
39
- export declare function closeHippoDb(db: DatabaseSyncLike): void;
40
- export declare function getMeta(db: DatabaseSyncLike, key: string, fallback?: string): string;
41
- export declare function setMeta(db: DatabaseSyncLike, key: string, value: string): void;
42
- /** Row count of one table; null when the table is missing or unreadable, which callers show as unknown. */
43
- export declare function countTableRows(db: DatabaseSyncLike, table: string): number | null;
44
- export declare function isFtsAvailable(db: DatabaseSyncLike): boolean;
45
- export declare function pruneConsolidationRuns(db: DatabaseSyncLike, keep?: number): void;
46
- export {};
1
+ export type { DatabaseSyncLike } from './db/sqlite.js';
2
+ export { isSqliteBusy, STORE_BUSY_MESSAGE, execWithBusyRetry } from './db/busy.js';
3
+ export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './db/meta.js';
4
+ export { countTableRows, pruneConsolidationRuns } from './db/tables.js';
5
+ export { getCurrentSchemaVersion, IncompatibleBinaryError } from './db/migrate.js';
6
+ export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, withBusyWait, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './db/open.js';
47
7
  //# sourceMappingURL=db.d.ts.map