hippo-memory 1.72.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (995) hide show
  1. package/README.md +6 -4
  2. package/dist/agent-memories/apply.d.ts +7 -5
  3. package/dist/agent-memories/apply.js +66 -39
  4. package/dist/agent-memories/claude-code.d.ts +8 -2
  5. package/dist/agent-memories/claude-code.js +26 -7
  6. package/dist/agent-memories/copilot.js +2 -1
  7. package/dist/agent-memories/files.js +2 -1
  8. package/dist/agent-memories/legacy.d.ts +6 -3
  9. package/dist/agent-memories/legacy.js +35 -14
  10. package/dist/agent-memories/markdown.d.ts +3 -1
  11. package/dist/agent-memories/markdown.js +3 -1
  12. package/dist/agent-memories/openclaw.js +5 -2
  13. package/dist/agent-memories/plan.js +11 -1
  14. package/dist/agent-memories/project-folds.js +2 -1
  15. package/dist/agent-memories/report.d.ts +4 -1
  16. package/dist/agent-memories/report.js +43 -9
  17. package/dist/agent-memories/source.d.ts +8 -2
  18. package/dist/agent-memories/source.js +11 -3
  19. package/dist/agent-memories/sync.d.ts +7 -2
  20. package/dist/agent-memories/sync.js +141 -101
  21. package/dist/api/assemble.d.ts +6 -4
  22. package/dist/api/assemble.js +11 -5
  23. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  24. package/dist/api/auth/audit.js +58 -0
  25. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
  26. package/dist/api/{auth.js → auth/auth.js} +66 -54
  27. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  28. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
  29. package/dist/api/auth/session-owners.d.ts +10 -0
  30. package/dist/api/auth/session-owners.js +35 -0
  31. package/dist/api/availability.d.ts +3 -1
  32. package/dist/api/availability.js +3 -1
  33. package/dist/api/busy.d.ts +2 -0
  34. package/dist/api/busy.js +2 -0
  35. package/dist/api/cli-surface.d.ts +6 -0
  36. package/dist/api/cli-surface.js +6 -0
  37. package/dist/api/config-of.d.ts +5 -0
  38. package/dist/api/config-of.js +6 -0
  39. package/dist/api/context-auto.d.ts +4 -1
  40. package/dist/api/context-auto.js +14 -4
  41. package/dist/api/context-render.js +14 -7
  42. package/dist/api/context-select.d.ts +4 -1
  43. package/dist/api/context-select.js +31 -34
  44. package/dist/api/context-types.d.ts +38 -12
  45. package/dist/api/context.d.ts +8 -5
  46. package/dist/api/context.js +120 -63
  47. package/dist/api/continuity.d.ts +24 -21
  48. package/dist/api/continuity.js +18 -20
  49. package/dist/api/correction-latency.d.ts +3 -1
  50. package/dist/api/correction-latency.js +3 -1
  51. package/dist/api/error-reply.d.ts +4 -1
  52. package/dist/api/error-reply.js +12 -3
  53. package/dist/api/index.d.ts +39 -23
  54. package/dist/api/index.js +21 -23
  55. package/dist/api/instruction-detect.d.ts +4 -1
  56. package/dist/api/instruction-detect.js +75 -20
  57. package/dist/api/ledger-db.d.ts +15 -11
  58. package/dist/api/ledger-db.js +21 -23
  59. package/dist/api/memories/conflicts.d.ts +33 -0
  60. package/dist/api/memories/conflicts.js +67 -0
  61. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  62. package/dist/api/{forget.js → memories/forget.js} +23 -17
  63. package/dist/api/memories/memories.d.ts +27 -0
  64. package/dist/api/memories/memories.js +52 -0
  65. package/dist/api/memories/outcome.d.ts +22 -0
  66. package/dist/api/memories/outcome.js +28 -0
  67. package/dist/api/memories/promote.d.ts +40 -0
  68. package/dist/api/memories/promote.js +76 -0
  69. package/dist/api/memories/refine.d.ts +10 -0
  70. package/dist/api/memories/refine.js +12 -0
  71. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
  72. package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
  73. package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
  74. package/dist/api/{remember.js → memories/remember.js} +50 -32
  75. package/dist/api/objects/cards.d.ts +39 -0
  76. package/dist/api/{cards.js → objects/cards.js} +12 -14
  77. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  78. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
  79. package/dist/api/objects/goals.d.ts +18 -0
  80. package/dist/api/{goals.js → objects/goals.js} +12 -12
  81. package/dist/api/objects/graph.d.ts +11 -0
  82. package/dist/api/objects/graph.js +16 -0
  83. package/dist/api/objects/objects.d.ts +9 -0
  84. package/dist/api/{objects.js → objects/objects.js} +2 -3
  85. package/dist/api/objects/predictions.d.ts +11 -0
  86. package/dist/api/{predictions.js → objects/predictions.js} +7 -5
  87. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  88. package/dist/api/{projects.js → objects/projects.js} +8 -4
  89. package/dist/api/pilot-arm.d.ts +8 -4
  90. package/dist/api/pilot-arm.js +5 -4
  91. package/dist/api/prompt-hook.d.ts +35 -20
  92. package/dist/api/prompt-hook.js +66 -44
  93. package/dist/api/provenance-coverage.d.ts +3 -1
  94. package/dist/api/provenance-coverage.js +3 -1
  95. package/dist/api/recall/finish.d.ts +185 -0
  96. package/dist/api/recall/finish.js +301 -0
  97. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  98. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
  99. package/dist/api/recall/recall.d.ts +6 -0
  100. package/dist/api/{recall.js → recall/recall.js} +116 -72
  101. package/dist/api/recall/render.d.ts +39 -0
  102. package/dist/api/recall/render.js +60 -0
  103. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  104. package/dist/api/recall/request.js +261 -0
  105. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  106. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  107. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
  108. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  109. package/dist/api/session-end.d.ts +36 -8
  110. package/dist/api/session-end.js +71 -25
  111. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  112. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  113. package/dist/api/sleep/dormant.d.ts +25 -0
  114. package/dist/api/sleep/dormant.js +64 -0
  115. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  116. package/dist/api/sleep/learn.js +138 -0
  117. package/dist/api/sleep/sleep-run.d.ts +38 -0
  118. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
  119. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  120. package/dist/api/sleep/sleep.js +9 -0
  121. package/dist/api/status.d.ts +3 -1
  122. package/dist/api/status.js +3 -1
  123. package/dist/api/store-init.d.ts +4 -1
  124. package/dist/api/store-init.js +4 -1
  125. package/dist/api/tokens.d.ts +10 -9
  126. package/dist/api/tokens.js +9 -10
  127. package/dist/api/types.d.ts +27 -12
  128. package/dist/api/types.js +13 -4
  129. package/dist/capture/caller-session.d.ts +8 -2
  130. package/dist/capture/caller-session.js +16 -6
  131. package/dist/capture/capture-error.d.ts +3 -1
  132. package/dist/capture/capture-error.js +3 -1
  133. package/dist/capture/codex-patch.js +7 -2
  134. package/dist/capture/command.d.ts +4 -2
  135. package/dist/capture/command.js +34 -15
  136. package/dist/capture/compact-resume-caller.js +15 -8
  137. package/dist/capture/compact.d.ts +8 -5
  138. package/dist/capture/compact.js +34 -23
  139. package/dist/capture/compaction-items-caller.js +9 -3
  140. package/dist/capture/compaction-record.d.ts +4 -3
  141. package/dist/capture/compaction-record.js +20 -12
  142. package/dist/capture/compaction-spool.d.ts +18 -9
  143. package/dist/capture/compaction-spool.js +105 -63
  144. package/dist/capture/copilot-transcript.d.ts +11 -3
  145. package/dist/capture/copilot-transcript.js +16 -6
  146. package/dist/capture/extract.js +20 -8
  147. package/dist/capture/failure-caller.js +23 -12
  148. package/dist/capture/failure-reading.d.ts +10 -3
  149. package/dist/capture/failure-reading.js +24 -7
  150. package/dist/capture/pre-compact-caller.js +11 -4
  151. package/dist/capture/session-digest.d.ts +15 -4
  152. package/dist/capture/session-digest.js +39 -13
  153. package/dist/capture/session-end-caller.d.ts +4 -1
  154. package/dist/capture/session-end-caller.js +20 -8
  155. package/dist/capture/session-texts.d.ts +6 -2
  156. package/dist/capture/session-texts.js +22 -7
  157. package/dist/capture/session-worker.d.ts +4 -2
  158. package/dist/capture/session-worker.js +58 -17
  159. package/dist/capture/transcript.d.ts +13 -4
  160. package/dist/capture/transcript.js +32 -10
  161. package/dist/capture/working-state.d.ts +13 -4
  162. package/dist/capture/working-state.js +50 -56
  163. package/dist/cli/api-context.d.ts +14 -2
  164. package/dist/cli/api-context.js +45 -2
  165. package/dist/cli/audit.js +33 -33
  166. package/dist/cli/auth.js +23 -31
  167. package/dist/cli/briefs.d.ts +1 -1
  168. package/dist/cli/briefs.js +20 -15
  169. package/dist/cli/card.d.ts +1 -1
  170. package/dist/cli/card.js +56 -73
  171. package/dist/cli/client.d.ts +12 -5
  172. package/dist/cli/client.js +53 -23
  173. package/dist/cli/compact-resume-payload.d.ts +4 -1
  174. package/dist/cli/compact-resume-payload.js +12 -5
  175. package/dist/cli/context.js +43 -18
  176. package/dist/cli/continuity.d.ts +5 -5
  177. package/dist/cli/continuity.js +90 -107
  178. package/dist/cli/curate.d.ts +5 -4
  179. package/dist/cli/curate.js +55 -77
  180. package/dist/cli/dag.d.ts +1 -1
  181. package/dist/cli/dag.js +14 -17
  182. package/dist/cli/decisions.js +30 -30
  183. package/dist/cli/eval.js +16 -21
  184. package/dist/cli/exit.d.ts +4 -1
  185. package/dist/cli/exit.js +10 -2
  186. package/dist/cli/explain.js +12 -11
  187. package/dist/cli/flag-values.d.ts +1 -1
  188. package/dist/cli/flag-values.js +9 -18
  189. package/dist/cli/github.d.ts +6 -0
  190. package/dist/cli/github.js +25 -13
  191. package/dist/cli/goals.d.ts +1 -1
  192. package/dist/cli/goals.js +39 -56
  193. package/dist/cli/graph.d.ts +1 -1
  194. package/dist/cli/graph.js +15 -11
  195. package/dist/cli/hook-runtime.d.ts +34 -10
  196. package/dist/cli/hook-runtime.js +41 -16
  197. package/dist/cli/incidents.d.ts +1 -1
  198. package/dist/cli/incidents.js +25 -25
  199. package/dist/cli/init.d.ts +1 -1
  200. package/dist/cli/init.js +35 -20
  201. package/dist/cli/install-steps.d.ts +12 -3
  202. package/dist/cli/install-steps.js +42 -18
  203. package/dist/cli/last-sleep.d.ts +4 -1
  204. package/dist/cli/last-sleep.js +9 -4
  205. package/dist/cli/maintenance.d.ts +1 -1
  206. package/dist/cli/maintenance.js +11 -12
  207. package/dist/cli/notes.d.ts +1 -1
  208. package/dist/cli/notes.js +8 -5
  209. package/dist/cli/object-verbs.d.ts +5 -5
  210. package/dist/cli/object-verbs.js +13 -16
  211. package/dist/cli/open-browser.js +11 -2
  212. package/dist/cli/playbooks.d.ts +3 -3
  213. package/dist/cli/playbooks.js +40 -32
  214. package/dist/cli/predictions.js +17 -22
  215. package/dist/cli/print.js +4 -2
  216. package/dist/cli/projects.js +21 -11
  217. package/dist/cli/quality-repair-once.d.ts +1 -1
  218. package/dist/cli/quality-repair-once.js +7 -6
  219. package/dist/cli/recall.js +129 -93
  220. package/dist/cli/refine-llm.d.ts +15 -4
  221. package/dist/cli/refine-llm.js +17 -7
  222. package/dist/cli/remember.js +51 -55
  223. package/dist/cli/scheduler.d.ts +4 -1
  224. package/dist/cli/scheduler.js +9 -5
  225. package/dist/cli/serve.js +28 -18
  226. package/dist/cli/session-hooks.d.ts +2 -6
  227. package/dist/cli/session-hooks.js +140 -112
  228. package/dist/cli/setup.d.ts +1 -1
  229. package/dist/cli/setup.js +56 -34
  230. package/dist/cli/shared.d.ts +4 -2
  231. package/dist/cli/shared.js +26 -11
  232. package/dist/cli/slack.js +15 -24
  233. package/dist/cli/sleep-render.d.ts +3 -1
  234. package/dist/cli/sleep-render.js +8 -5
  235. package/dist/cli/sleep.js +16 -8
  236. package/dist/cli/status.d.ts +4 -4
  237. package/dist/cli/status.js +32 -27
  238. package/dist/cli/stdin.d.ts +10 -3
  239. package/dist/cli/stdin.js +10 -3
  240. package/dist/cli/transfer.d.ts +4 -4
  241. package/dist/cli/transfer.js +97 -82
  242. package/dist/cli/usage.d.ts +1 -1
  243. package/dist/cli/usage.js +1 -1
  244. package/dist/cli/verb-row.d.ts +2 -0
  245. package/dist/cli/verbs/health.js +2 -0
  246. package/dist/cli/verbs/memory.js +47 -53
  247. package/dist/cli/verbs/objects.js +16 -7
  248. package/dist/cli/verbs/sessions.js +4 -2
  249. package/dist/cli/versioned-verbs.d.ts +8 -7
  250. package/dist/cli/versioned-verbs.js +31 -21
  251. package/dist/cli.js +14 -18
  252. package/dist/connectors/dlq.d.ts +6 -6
  253. package/dist/connectors/dlq.js +12 -7
  254. package/dist/connectors/github/backfill.d.ts +4 -4
  255. package/dist/connectors/github/backfill.js +6 -4
  256. package/dist/connectors/github/deletion.d.ts +6 -4
  257. package/dist/connectors/github/deletion.js +5 -4
  258. package/dist/connectors/github/dlq.d.ts +8 -6
  259. package/dist/connectors/github/dlq.js +11 -5
  260. package/dist/connectors/github/ingest.d.ts +2 -2
  261. package/dist/connectors/github/ingest.js +9 -5
  262. package/dist/connectors/github/octokit-client.d.ts +3 -1
  263. package/dist/connectors/github/octokit-client.js +7 -2
  264. package/dist/connectors/github/ratelimit.d.ts +6 -2
  265. package/dist/connectors/github/ratelimit.js +6 -2
  266. package/dist/connectors/github/signature.d.ts +14 -3
  267. package/dist/connectors/github/signature.js +17 -3
  268. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  269. package/dist/connectors/github/tenant-routing.js +6 -5
  270. package/dist/connectors/github/transform.js +50 -67
  271. package/dist/connectors/github/types.d.ts +10 -3
  272. package/dist/connectors/github/types.js +6 -2
  273. package/dist/connectors/github/webhook.d.ts +5 -5
  274. package/dist/connectors/github/webhook.js +36 -23
  275. package/dist/connectors/ingest.d.ts +5 -3
  276. package/dist/connectors/ingest.js +3 -3
  277. package/dist/connectors/slack/backfill.d.ts +5 -5
  278. package/dist/connectors/slack/backfill.js +3 -3
  279. package/dist/connectors/slack/deletion.d.ts +4 -4
  280. package/dist/connectors/slack/deletion.js +6 -5
  281. package/dist/connectors/slack/dlq.d.ts +4 -4
  282. package/dist/connectors/slack/dlq.js +6 -6
  283. package/dist/connectors/slack/ingest.d.ts +6 -4
  284. package/dist/connectors/slack/ingest.js +5 -4
  285. package/dist/connectors/slack/signature.d.ts +4 -1
  286. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  287. package/dist/connectors/slack/tenant-routing.js +6 -5
  288. package/dist/connectors/slack/transform.d.ts +6 -2
  289. package/dist/connectors/slack/transform.js +6 -2
  290. package/dist/connectors/slack/types.d.ts +3 -1
  291. package/dist/connectors/slack/web-client.js +8 -3
  292. package/dist/connectors/slack/webhook.d.ts +5 -5
  293. package/dist/connectors/slack/webhook.js +19 -11
  294. package/dist/connectors/slack/workspaces.d.ts +7 -3
  295. package/dist/connectors/slack/workspaces.js +7 -3
  296. package/dist/connectors/store.d.ts +8 -0
  297. package/dist/connectors/store.js +2 -0
  298. package/dist/consolidate/conflicts.js +24 -10
  299. package/dist/consolidate/dag-summary.js +2 -1
  300. package/dist/consolidate/dag.d.ts +10 -5
  301. package/dist/consolidate/dag.js +45 -39
  302. package/dist/consolidate/decay.js +19 -6
  303. package/dist/consolidate/dedupe.d.ts +14 -5
  304. package/dist/consolidate/dedupe.js +28 -17
  305. package/dist/consolidate/flush-units.d.ts +4 -1
  306. package/dist/consolidate/flush-units.js +4 -1
  307. package/dist/consolidate/half-life-migration.d.ts +18 -8
  308. package/dist/consolidate/half-life-migration.js +48 -18
  309. package/dist/consolidate/llm-passes.js +27 -11
  310. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  311. package/dist/consolidate/memory-value-weights.js +6 -2
  312. package/dist/consolidate/memory-value.d.ts +30 -10
  313. package/dist/consolidate/memory-value.js +37 -14
  314. package/dist/consolidate/merge.d.ts +4 -1
  315. package/dist/consolidate/merge.js +47 -37
  316. package/dist/consolidate/overlap-index.d.ts +8 -2
  317. package/dist/consolidate/overlap-index.js +11 -4
  318. package/dist/consolidate/physics-pass.d.ts +3 -1
  319. package/dist/consolidate/physics-pass.js +10 -7
  320. package/dist/consolidate/replay.d.ts +11 -4
  321. package/dist/consolidate/replay.js +19 -7
  322. package/dist/consolidate/run.d.ts +13 -5
  323. package/dist/consolidate/run.js +4 -4
  324. package/dist/consolidate/sleep.d.ts +14 -6
  325. package/dist/consolidate/sleep.js +42 -39
  326. package/dist/consolidate/trace.d.ts +7 -2
  327. package/dist/consolidate/trace.js +7 -2
  328. package/dist/consolidate/traces.js +27 -30
  329. package/dist/core/ablation.d.ts +9 -3
  330. package/dist/core/ablation.js +14 -4
  331. package/dist/core/active-scope.d.ts +3 -1
  332. package/dist/core/active-scope.js +3 -1
  333. package/dist/core/agent-memory-tools.d.ts +2 -0
  334. package/dist/core/agent-memory-tools.js +2 -0
  335. package/dist/core/ambient.d.ts +4 -3
  336. package/dist/core/ambient.js +8 -6
  337. package/dist/core/api-errors.d.ts +9 -3
  338. package/dist/core/api-errors.js +9 -3
  339. package/dist/core/capture-contract.d.ts +4 -1
  340. package/dist/core/capture-contract.js +27 -8
  341. package/dist/core/compare.d.ts +24 -8
  342. package/dist/core/compare.js +24 -8
  343. package/dist/core/config.d.ts +18 -9
  344. package/dist/core/config.js +38 -29
  345. package/dist/core/cosine.d.ts +4 -1
  346. package/dist/core/cosine.js +4 -1
  347. package/dist/core/handoff.d.ts +7 -2
  348. package/dist/core/handoff.js +4 -1
  349. package/dist/core/markdown.js +22 -17
  350. package/dist/core/memory-audit.js +14 -3
  351. package/dist/core/memory-quality.d.ts +12 -3
  352. package/dist/core/memory-quality.js +57 -21
  353. package/dist/core/memory.d.ts +87 -30
  354. package/dist/core/memory.js +82 -33
  355. package/dist/core/merged-row.d.ts +8 -2
  356. package/dist/core/merged-row.js +10 -3
  357. package/dist/core/package-root.d.ts +3 -1
  358. package/dist/core/package-root.js +3 -1
  359. package/dist/core/particle-refresh.d.ts +8 -0
  360. package/dist/core/particle-refresh.js +22 -0
  361. package/dist/core/physics-config.d.ts +4 -1
  362. package/dist/core/physics-config.js +6 -2
  363. package/dist/core/physics.d.ts +39 -11
  364. package/dist/core/physics.js +71 -21
  365. package/dist/core/project-identity.d.ts +34 -17
  366. package/dist/core/project-identity.js +35 -18
  367. package/dist/core/project-remote.d.ts +8 -4
  368. package/dist/core/project-remote.js +31 -14
  369. package/dist/core/recall-scope.d.ts +33 -11
  370. package/dist/core/recall-scope.js +42 -15
  371. package/dist/core/rejection-digest.d.ts +7 -0
  372. package/dist/core/rejection-digest.js +13 -0
  373. package/dist/core/salience.d.ts +3 -1
  374. package/dist/core/salience.js +10 -4
  375. package/dist/core/search-types.d.ts +15 -2
  376. package/dist/core/search-types.js +11 -0
  377. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  378. package/dist/dashboard/dashboard-actions.js +18 -7
  379. package/dist/dashboard/dashboard-queries.js +2 -7
  380. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  381. package/dist/dashboard/dashboard-snapshot.js +5 -7
  382. package/dist/dashboard/dashboard.js +22 -8
  383. package/dist/db/backup.js +2 -2
  384. package/dist/db/busy.d.ts +10 -3
  385. package/dist/db/busy.js +27 -5
  386. package/dist/db/connect.d.ts +10 -2
  387. package/dist/db/connect.js +8 -2
  388. package/dist/db/continuity.d.ts +1 -1
  389. package/dist/db/continuity.js +27 -11
  390. package/dist/db/meta.d.ts +4 -1
  391. package/dist/db/meta.js +4 -1
  392. package/dist/db/migrate.d.ts +10 -5
  393. package/dist/db/migrate.js +40 -20
  394. package/dist/db/migrations/index.d.ts +1 -1
  395. package/dist/db/migrations/index.js +3 -1
  396. package/dist/db/migrations/types.d.ts +2 -1
  397. package/dist/db/migrations/v11.js +1 -0
  398. package/dist/db/migrations/v12.js +2 -1
  399. package/dist/db/migrations/v14.js +2 -0
  400. package/dist/db/migrations/v15.js +4 -2
  401. package/dist/db/migrations/v16.js +6 -3
  402. package/dist/db/migrations/v17.js +2 -1
  403. package/dist/db/migrations/v19.js +4 -2
  404. package/dist/db/migrations/v20.js +2 -1
  405. package/dist/db/migrations/v22.js +12 -6
  406. package/dist/db/migrations/v23.js +6 -3
  407. package/dist/db/migrations/v24.js +6 -3
  408. package/dist/db/migrations/v25.js +4 -2
  409. package/dist/db/migrations/v26.js +4 -2
  410. package/dist/db/migrations/v27.js +6 -3
  411. package/dist/db/migrations/v28.js +4 -2
  412. package/dist/db/migrations/v29.js +4 -2
  413. package/dist/db/migrations/v30.js +6 -3
  414. package/dist/db/migrations/v31.js +4 -2
  415. package/dist/db/migrations/v32.js +6 -3
  416. package/dist/db/migrations/v33.js +4 -2
  417. package/dist/db/migrations/v34.js +2 -1
  418. package/dist/db/migrations/v35.js +2 -1
  419. package/dist/db/migrations/v36.js +2 -1
  420. package/dist/db/migrations/v37.js +10 -5
  421. package/dist/db/migrations/v38.js +10 -5
  422. package/dist/db/migrations/v39.js +14 -6
  423. package/dist/db/migrations/v40.js +4 -2
  424. package/dist/db/migrations/v41.js +4 -2
  425. package/dist/db/migrations/v42.js +2 -1
  426. package/dist/db/migrations/v44.js +4 -2
  427. package/dist/db/migrations/v45.js +4 -2
  428. package/dist/db/migrations/v49.js +2 -1
  429. package/dist/db/migrations/v50.js +4 -2
  430. package/dist/db/migrations/v51.js +4 -2
  431. package/dist/db/migrations/v52.js +2 -1
  432. package/dist/db/migrations/v53.js +8 -4
  433. package/dist/db/migrations/v54.js +2 -1
  434. package/dist/db/migrations/v55.js +4 -2
  435. package/dist/db/migrations/v56.d.ts +3 -0
  436. package/dist/db/migrations/v56.js +28 -0
  437. package/dist/db/open.d.ts +24 -12
  438. package/dist/db/open.js +25 -13
  439. package/dist/db/physics-state.d.ts +8 -8
  440. package/dist/db/physics-state.js +17 -50
  441. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  442. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  443. package/dist/db/request-stores.d.ts +20 -5
  444. package/dist/db/request-stores.js +15 -5
  445. package/dist/db/tables.d.ts +2 -1
  446. package/dist/db/tables.js +12 -4
  447. package/dist/db/vector-store.d.ts +13 -4
  448. package/dist/db/vector-store.js +35 -14
  449. package/dist/db/wal-checkpointer.d.ts +2 -1
  450. package/dist/db/wal-checkpointer.js +19 -7
  451. package/dist/doctor.d.ts +7 -1
  452. package/dist/doctor.js +128 -46
  453. package/dist/embeddings/local.d.ts +8 -4
  454. package/dist/embeddings/local.js +11 -7
  455. package/dist/embeddings/provider.d.ts +19 -10
  456. package/dist/embeddings/provider.js +32 -27
  457. package/dist/embeddings/transformers.d.ts +16 -4
  458. package/dist/embeddings/transformers.js +32 -15
  459. package/dist/entry/json-hooks.d.ts +1 -1
  460. package/dist/entry/json-hooks.js +1 -1
  461. package/dist/entry/project-identity.js +2 -1
  462. package/dist/entry/session-text.d.ts +1 -1
  463. package/dist/entry/session-text.js +1 -1
  464. package/dist/entry/sqlite-handles.d.ts +10 -0
  465. package/dist/entry/sqlite-handles.js +9 -0
  466. package/dist/entry/store-kit.d.ts +50 -0
  467. package/dist/entry/store-kit.js +27 -0
  468. package/dist/entry/testing.d.ts +6 -0
  469. package/dist/entry/testing.js +7 -0
  470. package/dist/eval/eval-stats.d.ts +27 -8
  471. package/dist/eval/eval-stats.js +17 -5
  472. package/dist/eval/eval-suite.d.ts +3 -1
  473. package/dist/eval/eval-suite.js +409 -187
  474. package/dist/eval/eval.d.ts +8 -2
  475. package/dist/eval/eval.js +8 -2
  476. package/dist/eval/judgment.js +17 -7
  477. package/dist/graph/delta.d.ts +9 -42
  478. package/dist/graph/delta.js +17 -11
  479. package/dist/graph/extract.d.ts +10 -7
  480. package/dist/graph/extract.js +57 -25
  481. package/dist/graph/recall.d.ts +12 -4
  482. package/dist/graph/recall.js +30 -13
  483. package/dist/graph/stream.d.ts +18 -6
  484. package/dist/graph/stream.js +32 -10
  485. package/dist/graph/view.d.ts +19 -6
  486. package/dist/graph/view.js +42 -17
  487. package/dist/hooks/codex-session.js +2 -2
  488. package/dist/hooks/codex-wrapper.d.ts +3 -1
  489. package/dist/hooks/codex-wrapper.js +9 -4
  490. package/dist/hooks/copilot.d.ts +19 -5
  491. package/dist/hooks/copilot.js +54 -15
  492. package/dist/hooks/hook-blocks.d.ts +4 -1
  493. package/dist/hooks/hook-blocks.js +8 -3
  494. package/dist/hooks/json-hooks.d.ts +9 -5
  495. package/dist/hooks/json-hooks.js +72 -33
  496. package/dist/hooks/opencode.js +15 -5
  497. package/dist/hooks/shared.d.ts +27 -8
  498. package/dist/hooks/shared.js +57 -16
  499. package/dist/importers/core.d.ts +12 -4
  500. package/dist/importers/core.js +11 -10
  501. package/dist/importers/markdown-parse.d.ts +15 -5
  502. package/dist/importers/markdown-parse.js +16 -7
  503. package/dist/importers/markdown.js +6 -9
  504. package/dist/importers/sources.js +10 -23
  505. package/dist/importers/vault.d.ts +3 -3
  506. package/dist/importers/vault.js +61 -45
  507. package/dist/index.d.ts +33 -7
  508. package/dist/index.js +26 -8
  509. package/dist/learn/autolearn.d.ts +21 -6
  510. package/dist/learn/autolearn.js +57 -26
  511. package/dist/learn/churn-git.d.ts +4 -1
  512. package/dist/learn/churn-git.js +29 -5
  513. package/dist/learn/extract.d.ts +4 -1
  514. package/dist/learn/extract.js +17 -10
  515. package/dist/learn/forward-claim-detector.d.ts +17 -5
  516. package/dist/learn/forward-claim-detector.js +34 -15
  517. package/dist/learn/invalidation.d.ts +12 -6
  518. package/dist/learn/invalidation.js +62 -28
  519. package/dist/learn/roots.d.ts +3 -0
  520. package/dist/learn/roots.js +5 -0
  521. package/dist/mcp/admin-tools.d.ts +5 -5
  522. package/dist/mcp/admin-tools.js +28 -23
  523. package/dist/mcp/format.d.ts +1 -1
  524. package/dist/mcp/format.js +4 -2
  525. package/dist/mcp/framing.d.ts +3 -1
  526. package/dist/mcp/framing.js +20 -8
  527. package/dist/mcp/memory-tools.d.ts +3 -3
  528. package/dist/mcp/memory-tools.js +21 -20
  529. package/dist/mcp/protocol.d.ts +32 -16
  530. package/dist/mcp/protocol.js +12 -9
  531. package/dist/mcp/recall-tools.d.ts +3 -3
  532. package/dist/mcp/recall-tools.js +62 -74
  533. package/dist/mcp/request.d.ts +7 -5
  534. package/dist/mcp/request.js +61 -77
  535. package/dist/mcp/server.d.ts +3 -1
  536. package/dist/mcp/server.js +8 -3
  537. package/dist/mcp/session-state.d.ts +1 -1
  538. package/dist/mcp/session-state.js +4 -3
  539. package/dist/mcp/shared-gate.d.ts +3 -2
  540. package/dist/mcp/shared-gate.js +3 -2
  541. package/dist/mcp/stdio.d.ts +6 -3
  542. package/dist/mcp/stdio.js +59 -23
  543. package/dist/mcp/tool-args.d.ts +4 -1
  544. package/dist/mcp/tool-args.js +8 -3
  545. package/dist/mcp/tools.js +76 -32
  546. package/dist/objects/customer-notes.d.ts +12 -10
  547. package/dist/objects/customer-notes.js +21 -15
  548. package/dist/objects/decisions.d.ts +18 -10
  549. package/dist/objects/decisions.js +23 -17
  550. package/dist/objects/descriptor.js +2 -1
  551. package/dist/objects/fields.d.ts +4 -1
  552. package/dist/objects/fields.js +6 -2
  553. package/dist/objects/incidents.d.ts +14 -16
  554. package/dist/objects/incidents.js +29 -30
  555. package/dist/objects/lifecycle.d.ts +0 -4
  556. package/dist/objects/lifecycle.js +21 -24
  557. package/dist/objects/policies.d.ts +12 -16
  558. package/dist/objects/policies.js +17 -21
  559. package/dist/objects/processes.d.ts +16 -10
  560. package/dist/objects/processes.js +20 -15
  561. package/dist/objects/project-briefs.d.ts +13 -14
  562. package/dist/objects/project-briefs.js +33 -39
  563. package/dist/objects/skills.d.ts +10 -12
  564. package/dist/objects/skills.js +17 -22
  565. package/dist/postinstall.js +15 -7
  566. package/dist/predictions/planning-fallacy.d.ts +19 -6
  567. package/dist/predictions/planning-fallacy.js +4 -2
  568. package/dist/rerankers/clef.d.ts +8 -2
  569. package/dist/rerankers/clef.js +14 -9
  570. package/dist/rerankers/cross-encoder.d.ts +2 -1
  571. package/dist/rerankers/cross-encoder.js +19 -9
  572. package/dist/rerankers/index.js +2 -1
  573. package/dist/rerankers/jev.js +2 -1
  574. package/dist/rerankers/llm.d.ts +6 -2
  575. package/dist/rerankers/llm.js +8 -3
  576. package/dist/rerankers/remote.d.ts +3 -1
  577. package/dist/rerankers/remote.js +5 -2
  578. package/dist/rerankers/types.d.ts +6 -2
  579. package/dist/search/bm25-search.d.ts +3 -1
  580. package/dist/search/bm25-search.js +15 -2
  581. package/dist/search/boosts.js +4 -3
  582. package/dist/search/embed-memories.d.ts +12 -4
  583. package/dist/search/embed-memories.js +96 -58
  584. package/dist/search/engine.d.ts +11 -0
  585. package/dist/search/engine.js +14 -0
  586. package/dist/search/goal-boost.d.ts +10 -3
  587. package/dist/search/goal-boost.js +13 -6
  588. package/dist/search/hybrid-score.d.ts +4 -1
  589. package/dist/search/hybrid-score.js +4 -1
  590. package/dist/search/hybrid.d.ts +23 -8
  591. package/dist/search/hybrid.js +12 -7
  592. package/dist/search/multihop.js +14 -13
  593. package/dist/search/path-context.d.ts +10 -3
  594. package/dist/search/path-context.js +10 -3
  595. package/dist/search/physics-search.d.ts +9 -4
  596. package/dist/search/physics-search.js +38 -14
  597. package/dist/search/rerank.d.ts +2 -1
  598. package/dist/search/rerank.js +2 -1
  599. package/dist/search/rrf.d.ts +14 -5
  600. package/dist/search/rrf.js +11 -4
  601. package/dist/search/vector.d.ts +8 -2
  602. package/dist/search/vector.js +14 -8
  603. package/dist/server/auth.d.ts +19 -15
  604. package/dist/server/auth.js +68 -38
  605. package/dist/server/boot.d.ts +4 -1
  606. package/dist/server/boot.js +115 -67
  607. package/dist/server/client-ip.d.ts +17 -5
  608. package/dist/server/client-ip.js +56 -21
  609. package/dist/server/cursor.d.ts +10 -3
  610. package/dist/server/cursor.js +10 -3
  611. package/dist/server/deadline.d.ts +5 -2
  612. package/dist/server/deadline.js +10 -3
  613. package/dist/server/key-check-bounds.js +12 -4
  614. package/dist/server/lifecycle.d.ts +4 -1
  615. package/dist/server/lifecycle.js +10 -4
  616. package/dist/server/mcp-http.d.ts +2 -1
  617. package/dist/server/mcp-http.js +37 -22
  618. package/dist/server/rate-limit.d.ts +17 -5
  619. package/dist/server/rate-limit.js +55 -26
  620. package/dist/server/ready.js +7 -4
  621. package/dist/server/request.d.ts +15 -4
  622. package/dist/server/request.js +42 -15
  623. package/dist/server/route-checks.d.ts +4 -1
  624. package/dist/server/route-checks.js +8 -3
  625. package/dist/server/route-table.d.ts +8 -6
  626. package/dist/server/route-table.js +550 -97
  627. package/dist/server/routes/admin.d.ts +7 -7
  628. package/dist/server/routes/admin.js +36 -15
  629. package/dist/server/routes/customer-notes.d.ts +5 -5
  630. package/dist/server/routes/customer-notes.js +5 -4
  631. package/dist/server/routes/decisions.d.ts +5 -5
  632. package/dist/server/routes/decisions.js +12 -6
  633. package/dist/server/routes/incidents.d.ts +5 -5
  634. package/dist/server/routes/incidents.js +10 -4
  635. package/dist/server/routes/memories.d.ts +8 -8
  636. package/dist/server/routes/memories.js +12 -17
  637. package/dist/server/routes/object-routes.d.ts +8 -5
  638. package/dist/server/routes/object-routes.js +4 -2
  639. package/dist/server/routes/policies.d.ts +6 -6
  640. package/dist/server/routes/policies.js +11 -4
  641. package/dist/server/routes/predictions.d.ts +5 -5
  642. package/dist/server/routes/predictions.js +9 -4
  643. package/dist/server/routes/processes.d.ts +5 -5
  644. package/dist/server/routes/processes.js +15 -6
  645. package/dist/server/routes/project-briefs.d.ts +6 -6
  646. package/dist/server/routes/project-briefs.js +3 -2
  647. package/dist/server/routes/recall.d.ts +3 -3
  648. package/dist/server/routes/recall.js +21 -10
  649. package/dist/server/routes/skills.d.ts +6 -6
  650. package/dist/server/routes/skills.js +12 -4
  651. package/dist/server/server-detect.d.ts +24 -8
  652. package/dist/server/server-detect.js +57 -22
  653. package/dist/server/sleep-child.js +16 -10
  654. package/dist/server/sleep-offload.d.ts +8 -5
  655. package/dist/server/sleep-offload.js +40 -18
  656. package/dist/server/tls.d.ts +10 -2
  657. package/dist/server/tls.js +25 -5
  658. package/dist/server/types.d.ts +41 -24
  659. package/dist/server/validation.d.ts +4 -1
  660. package/dist/server/validation.js +22 -9
  661. package/dist/server.d.ts +17 -49
  662. package/dist/server.js +33 -40
  663. package/dist/sharing/global-store.d.ts +6 -12
  664. package/dist/sharing/global-store.js +8 -48
  665. package/dist/sharing/global-sync.d.ts +3 -1
  666. package/dist/sharing/global-sync.js +17 -7
  667. package/dist/sharing/project-merge.d.ts +25 -7
  668. package/dist/sharing/project-merge.js +49 -17
  669. package/dist/sharing/search-both.d.ts +8 -4
  670. package/dist/sharing/search-both.js +28 -14
  671. package/dist/sharing/share.d.ts +8 -4
  672. package/dist/sharing/share.js +40 -18
  673. package/dist/store/ambient.js +10 -5
  674. package/dist/store/audit-event.d.ts +2 -2
  675. package/dist/store/audit-event.js +8 -3
  676. package/dist/store/audit.d.ts +6 -3
  677. package/dist/store/audit.js +16 -6
  678. package/dist/store/auth.d.ts +4 -2
  679. package/dist/store/auth.js +63 -20
  680. package/dist/store/busy.d.ts +9 -0
  681. package/dist/store/busy.js +16 -0
  682. package/dist/store/candidates.d.ts +12 -5
  683. package/dist/store/candidates.js +90 -41
  684. package/dist/store/capture-write.d.ts +2 -1
  685. package/dist/store/capture-write.js +2 -1
  686. package/dist/store/card-detail.d.ts +4 -4
  687. package/dist/store/card-detail.js +15 -8
  688. package/dist/store/cards.d.ts +24 -10
  689. package/dist/store/cards.js +97 -63
  690. package/dist/store/compaction-caller.d.ts +2 -1
  691. package/dist/store/compaction-caller.js +2 -1
  692. package/dist/store/compactions-record.d.ts +14 -8
  693. package/dist/store/compactions-record.js +101 -37
  694. package/dist/store/compactions.js +35 -15
  695. package/dist/store/conflicts.d.ts +16 -5
  696. package/dist/store/conflicts.js +104 -48
  697. package/dist/store/connectors/dlq.d.ts +17 -5
  698. package/dist/store/connectors/dlq.js +58 -6
  699. package/dist/store/connectors/event-log.d.ts +122 -0
  700. package/dist/store/connectors/event-log.js +25 -0
  701. package/dist/store/connectors/github.d.ts +6 -3
  702. package/dist/store/connectors/github.js +30 -48
  703. package/dist/store/connectors/slack.d.ts +2 -1
  704. package/dist/store/connectors/slack.js +31 -47
  705. package/dist/store/dashboard-reads.d.ts +7 -3
  706. package/dist/store/dashboard-reads.js +32 -10
  707. package/dist/store/delete-and-batch.d.ts +17 -11
  708. package/dist/store/delete-and-batch.js +70 -28
  709. package/dist/store/delivery-recorder.d.ts +10 -7
  710. package/dist/store/delivery-recorder.js +70 -37
  711. package/dist/store/descendant-page.d.ts +2 -1
  712. package/dist/store/descendant-page.js +26 -10
  713. package/dist/store/diagnostics.d.ts +2 -1
  714. package/dist/store/diagnostics.js +2 -1
  715. package/dist/store/doctor-reads.d.ts +2 -1
  716. package/dist/store/doctor-reads.js +13 -5
  717. package/dist/store/dormant.d.ts +19 -11
  718. package/dist/store/dormant.js +45 -19
  719. package/dist/store/embeddings/index.d.ts +13 -9
  720. package/dist/store/embeddings/index.js +19 -12
  721. package/dist/store/entry-reads.d.ts +72 -21
  722. package/dist/store/entry-reads.js +215 -69
  723. package/dist/store/entry-row.d.ts +10 -6
  724. package/dist/store/entry-row.js +26 -14
  725. package/dist/store/entry-writes.d.ts +28 -13
  726. package/dist/store/entry-writes.js +61 -22
  727. package/dist/store/failure-log-at.js +1 -1
  728. package/dist/store/failure-log.d.ts +4 -2
  729. package/dist/store/failure-log.js +13 -6
  730. package/dist/store/gated-write.d.ts +3 -3
  731. package/dist/store/gated-write.js +3 -3
  732. package/dist/store/goals.d.ts +5 -4
  733. package/dist/store/goals.js +11 -12
  734. package/dist/store/graph-apply.d.ts +21 -0
  735. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  736. package/dist/store/graph-queue.d.ts +9 -6
  737. package/dist/store/graph-queue.js +15 -10
  738. package/dist/store/graph-reads.d.ts +16 -11
  739. package/dist/store/graph-reads.js +29 -19
  740. package/dist/store/graph-rows.d.ts +41 -3
  741. package/dist/store/graph-rows.js +10 -7
  742. package/dist/store/graph-view-rows.js +15 -7
  743. package/dist/store/graph-writes.d.ts +16 -10
  744. package/dist/store/graph-writes.js +59 -36
  745. package/dist/store/half-life.js +2 -2
  746. package/dist/store/handoffs.d.ts +13 -7
  747. package/dist/store/handoffs.js +44 -22
  748. package/dist/store/index-and-stats.d.ts +2 -2
  749. package/dist/store/index-and-stats.js +6 -5
  750. package/dist/store/index.d.ts +4 -2
  751. package/dist/store/index.js +2 -1
  752. package/dist/store/key-audit.d.ts +2 -1
  753. package/dist/store/key-audit.js +2 -1
  754. package/dist/store/key-writes.d.ts +2 -1
  755. package/dist/store/key-writes.js +9 -2
  756. package/dist/store/ledger-turn.d.ts +4 -1
  757. package/dist/store/ledger-turn.js +7 -2
  758. package/dist/store/mirrors.d.ts +11 -4
  759. package/dist/store/mirrors.js +96 -19
  760. package/dist/store/narrow.d.ts +6 -0
  761. package/dist/store/narrow.js +11 -0
  762. package/dist/store/open.d.ts +6 -3
  763. package/dist/store/open.js +20 -10
  764. package/dist/store/pilot-arm.d.ts +2 -1
  765. package/dist/store/pilot-arm.js +18 -6
  766. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  767. package/dist/store/planning-fallacy-evidence.js +8 -5
  768. package/dist/store/port/agent-import.d.ts +62 -0
  769. package/dist/store/port/agent-import.js +2 -0
  770. package/dist/store/port/consolidation.d.ts +129 -0
  771. package/dist/store/port/consolidation.js +2 -0
  772. package/dist/store/port/learning.d.ts +19 -0
  773. package/dist/store/port/learning.js +2 -0
  774. package/dist/store/port/local-files.d.ts +18 -0
  775. package/dist/store/port/local-files.js +2 -0
  776. package/dist/store/port/promotion.d.ts +20 -0
  777. package/dist/store/port/promotion.js +3 -0
  778. package/dist/store/port-groups.d.ts +160 -0
  779. package/dist/store/port-groups.js +2 -0
  780. package/dist/store/port.d.ts +261 -219
  781. package/dist/store/port.js +3 -9
  782. package/dist/store/predictions.d.ts +14 -10
  783. package/dist/store/predictions.js +37 -17
  784. package/dist/store/project-tags.d.ts +4 -1
  785. package/dist/store/project-tags.js +16 -5
  786. package/dist/store/quality-repair.d.ts +8 -4
  787. package/dist/store/quality-repair.js +53 -20
  788. package/dist/store/quarantine.d.ts +1 -0
  789. package/dist/store/quarantine.js +23 -9
  790. package/dist/store/raw-archive.d.ts +5 -4
  791. package/dist/store/raw-archive.js +11 -10
  792. package/dist/store/recall-trace.d.ts +22 -17
  793. package/dist/store/recall-trace.js +128 -64
  794. package/dist/store/rejected-values.d.ts +15 -10
  795. package/dist/store/rejected-values.js +46 -20
  796. package/dist/store/rejection.d.ts +12 -11
  797. package/dist/store/rejection.js +18 -19
  798. package/dist/store/report-reads.d.ts +2 -1
  799. package/dist/store/report-reads.js +2 -1
  800. package/dist/store/rows.d.ts +7 -5
  801. package/dist/store/rows.js +20 -13
  802. package/dist/store/rule-sql.d.ts +7 -3
  803. package/dist/store/rule-sql.js +26 -13
  804. package/dist/store/search-rows.d.ts +16 -11
  805. package/dist/store/search-rows.js +54 -32
  806. package/dist/store/sessions.d.ts +12 -10
  807. package/dist/store/sessions.js +40 -21
  808. package/dist/store/set-aside.d.ts +2 -2
  809. package/dist/store/set-aside.js +18 -5
  810. package/dist/store/sqlite/agent-import.d.ts +3 -0
  811. package/dist/store/sqlite/agent-import.js +77 -0
  812. package/dist/store/sqlite/cards-group.d.ts +6 -0
  813. package/dist/store/sqlite/cards-group.js +37 -0
  814. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  815. package/dist/store/sqlite/conflicts-group.js +18 -0
  816. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  817. package/dist/store/sqlite/connector-events-group.js +17 -6
  818. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  819. package/dist/store/sqlite/connector-writes-group.js +12 -5
  820. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  821. package/dist/store/sqlite/consolidation-group.js +64 -0
  822. package/dist/store/sqlite/dag-reads-group.js +1 -1
  823. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  824. package/dist/store/sqlite/dormant-group.js +29 -0
  825. package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
  826. package/dist/store/sqlite/entry-writes-group.js +37 -14
  827. package/dist/store/sqlite/error-codec.d.ts +4 -2
  828. package/dist/store/sqlite/error-codec.js +32 -10
  829. package/dist/store/sqlite/executor-counts.js +2 -1
  830. package/dist/store/sqlite/executor.d.ts +8 -3
  831. package/dist/store/sqlite/executor.js +56 -18
  832. package/dist/store/sqlite/global-promote.d.ts +5 -0
  833. package/dist/store/sqlite/global-promote.js +48 -0
  834. package/dist/store/sqlite/goals-group.d.ts +6 -0
  835. package/dist/store/sqlite/goals-group.js +23 -0
  836. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  837. package/dist/store/sqlite/graph-reads-group.js +2 -1
  838. package/dist/store/sqlite/held-connection.d.ts +8 -0
  839. package/dist/store/sqlite/held-connection.js +34 -7
  840. package/dist/store/sqlite/last-recall-group.d.ts +15 -0
  841. package/dist/store/sqlite/last-recall-group.js +62 -0
  842. package/dist/store/sqlite/learning-group.d.ts +4 -0
  843. package/dist/store/sqlite/learning-group.js +17 -0
  844. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  845. package/dist/store/sqlite/maintenance-groups.js +61 -0
  846. package/dist/store/sqlite/object-rows.d.ts +6 -3
  847. package/dist/store/sqlite/object-rows.js +34 -5
  848. package/dist/store/sqlite/objects-group.d.ts +5 -4
  849. package/dist/store/sqlite/objects-group.js +97 -38
  850. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  851. package/dist/store/sqlite/predictions-group.js +4 -2
  852. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  853. package/dist/store/sqlite/promotion-group.js +10 -0
  854. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  855. package/dist/store/sqlite/quarantine-group.js +4 -2
  856. package/dist/store/sqlite/reports-group.d.ts +6 -0
  857. package/dist/store/sqlite/reports-group.js +33 -0
  858. package/dist/store/sqlite/request-scope.d.ts +6 -0
  859. package/dist/store/sqlite/request-scope.js +18 -0
  860. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  861. package/dist/store/sqlite/sessions-group.js +46 -0
  862. package/dist/store/sqlite/store.d.ts +22 -18
  863. package/dist/store/sqlite/store.js +95 -33
  864. package/dist/store/sqlite/vector-pack.js +2 -1
  865. package/dist/store/sqlite/vector-reads-group.js +2 -1
  866. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  867. package/dist/store/sqlite/worker-jobs.js +19 -7
  868. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  869. package/dist/store/sqlite/worker-ops.js +6 -3
  870. package/dist/store/sqlite/worker-store.d.ts +4 -3
  871. package/dist/store/sqlite/worker-store.js +24 -14
  872. package/dist/store/summaries.d.ts +25 -11
  873. package/dist/store/summaries.js +84 -27
  874. package/dist/store/summary-dirty.d.ts +2 -1
  875. package/dist/store/summary-dirty.js +2 -1
  876. package/dist/store/tenant.d.ts +3 -2
  877. package/dist/store/tenant.js +5 -4
  878. package/dist/store/token-ledger-rows.js +8 -4
  879. package/dist/store/token-ledger.d.ts +19 -13
  880. package/dist/store/token-ledger.js +27 -14
  881. package/dist/store/tombstone-checks.d.ts +4 -1
  882. package/dist/store/tombstone-checks.js +10 -1
  883. package/dist/store/usage-reports.js +2 -1
  884. package/dist/store/vector-index.d.ts +8 -5
  885. package/dist/store/vector-index.js +28 -11
  886. package/dist/store/working-memory.d.ts +6 -4
  887. package/dist/store/working-memory.js +14 -9
  888. package/dist/support-bundle.js +10 -5
  889. package/dist/trust/quarantine.d.ts +1 -2
  890. package/dist/trust/quarantine.js +1 -5
  891. package/dist/trust/reject-flow.d.ts +12 -3
  892. package/dist/trust/reject-flow.js +12 -4
  893. package/dist/util/anthropic-messages.d.ts +7 -2
  894. package/dist/util/anthropic-messages.js +18 -7
  895. package/dist/util/atomic-write.d.ts +8 -3
  896. package/dist/util/atomic-write.js +36 -21
  897. package/dist/util/compaction-items.d.ts +4 -1
  898. package/dist/util/compaction-items.js +8 -2
  899. package/dist/util/crash-handlers.d.ts +7 -2
  900. package/dist/util/crash-handlers.js +13 -4
  901. package/dist/util/env.d.ts +26 -5
  902. package/dist/util/env.js +87 -25
  903. package/dist/util/format.d.ts +2 -0
  904. package/dist/util/format.js +4 -0
  905. package/dist/util/home-path.js +12 -6
  906. package/dist/util/hook-payload.d.ts +3 -1
  907. package/dist/util/hook-payload.js +3 -1
  908. package/dist/util/http-retry.d.ts +12 -6
  909. package/dist/util/http-retry.js +16 -6
  910. package/dist/util/http-util.d.ts +20 -5
  911. package/dist/util/http-util.js +28 -9
  912. package/dist/util/json.d.ts +4 -1
  913. package/dist/util/json.js +4 -1
  914. package/dist/util/keyset.js +2 -1
  915. package/dist/util/limits.js +4 -2
  916. package/dist/util/log.d.ts +13 -5
  917. package/dist/util/log.js +29 -6
  918. package/dist/util/net.d.ts +5 -0
  919. package/dist/util/net.js +19 -0
  920. package/dist/util/real-path.d.ts +2 -1
  921. package/dist/util/real-path.js +4 -3
  922. package/dist/util/request-scope.d.ts +16 -4
  923. package/dist/util/request-scope.js +19 -6
  924. package/dist/util/same-text.d.ts +10 -3
  925. package/dist/util/same-text.js +10 -3
  926. package/dist/util/secret-detect.d.ts +24 -7
  927. package/dist/util/secret-detect.js +49 -14
  928. package/dist/util/spawn-argv.d.ts +11 -0
  929. package/dist/util/spawn-argv.js +66 -0
  930. package/dist/util/sql.d.ts +3 -0
  931. package/dist/util/sql.js +6 -0
  932. package/dist/util/sqlite-blocked.d.ts +15 -4
  933. package/dist/util/sqlite-blocked.js +19 -6
  934. package/dist/util/stored-json.d.ts +4 -1
  935. package/dist/util/stored-json.js +6 -2
  936. package/dist/util/stream-tee.d.ts +2 -1
  937. package/dist/util/stream-tee.js +8 -5
  938. package/dist/util/transcript-tail.d.ts +4 -1
  939. package/dist/util/transcript-tail.js +4 -1
  940. package/dist/util/vector-codec.d.ts +4 -0
  941. package/dist/util/vector-codec.js +15 -0
  942. package/dist/util/version.d.ts +8 -3
  943. package/dist/util/version.js +8 -3
  944. package/dist/util/write-budget.d.ts +7 -2
  945. package/dist/util/write-budget.js +5 -2
  946. package/dist/util/yaml.d.ts +4 -1
  947. package/dist/util/yaml.js +4 -1
  948. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  949. package/extensions/openclaw-plugin/package.json +1 -1
  950. package/openclaw.plugin.json +1 -1
  951. package/package.json +4 -1
  952. package/scripts/postinstall.cjs +3 -1
  953. package/dist/api/audit.js +0 -56
  954. package/dist/api/cards.d.ts +0 -42
  955. package/dist/api/conflicts.d.ts +0 -28
  956. package/dist/api/conflicts.js +0 -61
  957. package/dist/api/dormant.d.ts +0 -14
  958. package/dist/api/dormant.js +0 -58
  959. package/dist/api/goals.d.ts +0 -18
  960. package/dist/api/graph.d.ts +0 -8
  961. package/dist/api/graph.js +0 -7
  962. package/dist/api/learn.js +0 -124
  963. package/dist/api/memories.d.ts +0 -23
  964. package/dist/api/memories.js +0 -46
  965. package/dist/api/objects.d.ts +0 -9
  966. package/dist/api/on-store.d.ts +0 -16
  967. package/dist/api/on-store.js +0 -38
  968. package/dist/api/outcome.d.ts +0 -19
  969. package/dist/api/outcome.js +0 -21
  970. package/dist/api/predictions.d.ts +0 -11
  971. package/dist/api/promote.d.ts +0 -36
  972. package/dist/api/promote.js +0 -65
  973. package/dist/api/recall-core.d.ts +0 -4
  974. package/dist/api/recall-core.js +0 -120
  975. package/dist/api/recall-finish.d.ts +0 -53
  976. package/dist/api/recall-finish.js +0 -30
  977. package/dist/api/recall-history.d.ts +0 -64
  978. package/dist/api/recall-history.js +0 -159
  979. package/dist/api/recall-record.d.ts +0 -43
  980. package/dist/api/recall-record.js +0 -78
  981. package/dist/api/recall-request.js +0 -121
  982. package/dist/api/recall.d.ts +0 -6
  983. package/dist/api/refine.d.ts +0 -7
  984. package/dist/api/refine.js +0 -10
  985. package/dist/api/session-owners.d.ts +0 -4
  986. package/dist/api/session-owners.js +0 -17
  987. package/dist/api/sleep-run.d.ts +0 -26
  988. package/dist/api/sleep.js +0 -10
  989. package/dist/cli/lenient-id.d.ts +0 -2
  990. package/dist/cli/lenient-id.js +0 -13
  991. package/dist/graph/write.d.ts +0 -14
  992. package/dist/store/sqlite/busy.d.ts +0 -3
  993. package/dist/store/sqlite/busy.js +0 -8
  994. package/dist/store/sqlite/local.d.ts +0 -21
  995. package/dist/store/sqlite/local.js +0 -39
package/dist/doctor.js CHANGED
@@ -7,14 +7,14 @@ import { findHippoStoreDir, isInitialized } from './core/project-identity.js';
7
7
  import { getGlobalRoot } from './sharing/global-store.js';
8
8
  import { readStoreHealth } from './store/diagnostics.js';
9
9
  import { loadConfig } from './core/config.js';
10
- import { openHippoDbReadOnly, closeHippoDb, getCurrentSchemaVersion, IncompatibleBinaryError } from './db/index.js';
10
+ import { getCurrentSchemaVersion, IncompatibleBinaryError, } from './db/index.js';
11
11
  import { REPLAY_AFTER_MS, TRANSCRIPT_FILL_WINDOW_MS } from './core/compaction-timing.js';
12
12
  import { SPOOL_DIR, spoolCounts } from './capture/compaction-spool.js';
13
13
  import { isEmbeddingAvailable } from './embeddings/local.js';
14
14
  import { CODEX_TRUST_LINE, isCodexPresent } from './hooks/shared.js';
15
15
  import { claudeConfigDir, codexHomeDir } from './util/agent-homes.js';
16
16
  import { planProjectRepair } from './sharing/project-merge.js';
17
- import { projectTagReads } from './store/project-tags.js';
17
+ import { readProjectTags } from './store/project-tags.js';
18
18
  import { resolveTenantId } from './store/tenant.js';
19
19
  import { errorMessage, log } from './util/log.js';
20
20
  import { readJsonFile, isJsonObjectLiteral } from './util/json.js';
@@ -60,8 +60,9 @@ function codexCheck(home) {
60
60
  ['hippo compact-resume', 'resume after compaction'],
61
61
  ];
62
62
  const missing = codexHooks.filter(([marker]) => !text.includes(marker)).map(([, what]) => what);
63
- if (missing.length === 0)
63
+ if (missing.length === 0) {
64
64
  return { id: 'codex', status: 'pass', detail: `Codex: hippo memory hooks installed. ${CODEX_TRUST_LINE}` };
65
+ }
65
66
  return {
66
67
  id: 'codex',
67
68
  status: 'warn',
@@ -76,14 +77,22 @@ const FAILURE_LOG_SCHEMA = 46;
76
77
  /** The failed-tool-call count over the last 7 days, or why it could not be read. */
77
78
  function failuresCheck(failures, schemaVersion) {
78
79
  if (failures.ok) {
79
- return { id: 'failures', status: 'info', detail: `${failures.value} failed tool calls logged in 7 days (hippo failures for detail)` };
80
+ return {
81
+ id: 'failures',
82
+ status: 'info',
83
+ detail: `${failures.value} failed tool calls logged in 7 days (hippo failures for detail)`,
84
+ };
80
85
  }
81
86
  if (!failures.message.includes('no such table')) {
82
87
  return { id: 'failures', status: 'warn', detail: `cannot read the failure log: ${failures.message}` };
83
88
  }
84
89
  return schemaVersion < FAILURE_LOG_SCHEMA
85
90
  ? { id: 'failures', status: 'info', detail: 'no failure log yet (hippo creates it on the next write)' }
86
- : { id: 'failures', status: 'warn', detail: 'the failure_log table is missing, so failed tool calls are not being logged' };
91
+ : {
92
+ id: 'failures',
93
+ status: 'warn',
94
+ detail: 'the failure_log table is missing, so failed tool calls are not being logged',
95
+ };
87
96
  }
88
97
  /** How long ago the store last slept (consolidated), or why that history could not be read. */
89
98
  function sleepCheck(lastSleep, now) {
@@ -101,56 +110,81 @@ function sleepCheck(lastSleep, now) {
101
110
  }
102
111
  const days = Math.floor((now.getTime() - when) / DAY_MS);
103
112
  return days > 7
104
- ? { id: 'sleep', status: 'warn', detail: `last sleep ${days} days ago`, fix: 'hippo sleep, and check the session-end hook is installed' }
105
- : { id: 'sleep', status: 'pass', detail: `last sleep ${days === 0 ? 'today' : `${days} day${days === 1 ? '' : 's'} ago`}` };
113
+ ? {
114
+ id: 'sleep',
115
+ status: 'warn',
116
+ detail: `last sleep ${days} days ago`,
117
+ fix: 'hippo sleep, and check the session-end hook is installed',
118
+ }
119
+ : {
120
+ id: 'sleep',
121
+ status: 'pass',
122
+ detail: `last sleep ${days === 0 ? 'today' : `${days} day${days === 1 ? '' : 's'} ago`}`,
123
+ };
106
124
  }
107
125
  /** Spool counts in their own try, so a spool that cannot be read never hides the database counts. */
108
- function readSpool(store, now) {
126
+ function readSpool(store, now, spoolFs) {
109
127
  try {
110
- return { counts: spoolCounts(store, now, REPLAY_AFTER_MS), unread: '' };
128
+ return { counts: spoolCounts(store, now, REPLAY_AFTER_MS, spoolFs), unread: '' };
111
129
  }
112
130
  catch (err) {
113
131
  return { counts: { waiting: 0, stale: 0, bad: 0 }, unread: `; spool not read: ${errorMessage(err)}` };
114
132
  }
115
133
  }
116
- /** Compaction records the PostCompact hook left unfinished and spool files a replay has not finished, which `hippo sleep` replays. */
117
- function compactionsCheck(compactions, store, now) {
134
+ /**
135
+ * Compaction records the PostCompact hook left unfinished and spool files a replay has not finished, which `hippo
136
+ * sleep` replays.
137
+ */
138
+ function compactionsCheck(compactions, store, now, spoolFs) {
118
139
  if (!compactions.ok) {
119
140
  return compactions.message.includes('no such table')
120
- ? { id: 'compactions', status: 'info', detail: 'no compaction records yet (hippo creates them on the next write)' }
141
+ ? {
142
+ id: 'compactions',
143
+ status: 'info',
144
+ detail: 'no compaction records yet (hippo creates them on the next write)',
145
+ }
121
146
  : { id: 'compactions', status: 'warn', detail: `cannot read the compaction records: ${compactions.message}` };
122
147
  }
123
148
  const { total, summarised, started } = compactions.value;
124
149
  const stuck = summarised + started;
125
- const { counts: spool, unread } = readSpool(store, now);
150
+ const { counts: spool, unread } = readSpool(store, now, spoolFs);
126
151
  const spooled = spool.waiting + spool.stale + spool.bad > 0;
127
152
  const recorded = `${total} compaction${total === 1 ? '' : 's'} recorded, none stuck`;
128
153
  if (stuck === 0 && !spooled && unread === '')
129
154
  return { id: 'compactions', status: 'pass', detail: recorded };
130
155
  const fix = [
131
156
  stuck + spool.waiting + spool.stale > 0 ? 'hippo sleep (replays them)' : '',
132
- spool.bad > 0 ? `open the .bad files in ${path.join(store, SPOOL_DIR)}, save what you still need with hippo remember, then delete them` : '',
157
+ spool.bad > 0
158
+ ? `open the .bad files in ${path.join(store, SPOOL_DIR)}, save what you still need with hippo remember, then ` +
159
+ `delete them`
160
+ : '',
133
161
  ].filter((s) => s !== '');
134
162
  const unfinished = stuck === 0
135
163
  ? `${recorded} in the store`
136
164
  : `${stuck} compaction${stuck === 1 ? '' : 's'} unfinished after 10 minutes ` +
137
165
  `(${summarised} with a summary whose memories are not saved yet, ${started} with no summary yet)`;
138
- const note = spooled ? `; spool: ${spool.waiting} waiting, ${spool.stale} left by a replay that stopped, ${spool.bad} .bad` : '';
166
+ const note = spooled
167
+ ? `; spool: ${spool.waiting} waiting, ${spool.stale} left by a replay that stopped, ${spool.bad} .bad`
168
+ : '';
139
169
  return { id: 'compactions', status: 'warn', detail: `${unfinished}${note}${unread}`, fix: fix.join('; ') };
140
170
  }
141
171
  /** Old project tags in the global store, counted by the repair's own plan so a truly user-global merge never warns. */
142
172
  function projectsCheck(globalRoot) {
143
- let db = null;
144
173
  try {
145
- db = openHippoDbReadOnly(globalRoot);
146
- const r = planProjectRepair(projectTagReads(db, resolveTenantId({})), globalRoot);
174
+ const r = readProjectTags(globalRoot, resolveTenantId({}), (reads) => planProjectRepair(reads, globalRoot));
147
175
  const found = [
148
176
  r.copies.length > 0 ? `${r.copies.length} imported notes copied under the wrong project` : '',
149
- r.folds.length > 0 ? `old project names that now resolve to another project: ${r.folds.map((f) => `${f.from} -> ${f.into}`).join(', ')}` : '',
177
+ r.folds.length > 0
178
+ ? `old project names that now resolve to another project: ` +
179
+ `${r.folds.map((f) => `${f.from} -> ${f.into}`).join(', ')}`
180
+ : '',
150
181
  r.collisions.length > 0
151
- ? `old project names shared by several projects, folded by hand only: ${r.collisions.map((c) => `${c.name} (${c.ids.join(', ')})`).join('; ')}`
182
+ ? `old project names shared by several projects, folded by hand only: ` +
183
+ `${r.collisions.map((c) => `${c.name} (${c.ids.join(', ')})`).join('; ')}`
184
+ : '',
185
+ r.toProject.length + r.setAside.length > 0
186
+ ? `${r.toProject.length + r.setAside.length} merged memories tagged user-global`
152
187
  : '',
153
- r.toProject.length + r.setAside.length > 0 ? `${r.toProject.length + r.setAside.length} merged memories tagged user-global` : '',
154
188
  ].filter((s) => s !== '');
155
189
  return found.length === 0
156
190
  ? { id: 'projects', status: 'pass', detail: 'no duplicate or out-of-date project tags in the global store' }
@@ -164,22 +198,27 @@ function projectsCheck(globalRoot) {
164
198
  catch (err) {
165
199
  return { id: 'projects', status: 'info', detail: `project tags not checked (${errorMessage(err)})` };
166
200
  }
167
- finally {
168
- if (db !== null)
169
- closeHippoDb(db);
170
- }
171
201
  }
172
202
  function nodeCheck(node) {
173
203
  return versionAtLeast(node, MIN_NODE)
174
204
  ? { id: 'node', status: 'pass', detail: `Node.js ${node}` }
175
- : { id: 'node', status: 'fail', detail: `Node.js ${node} is older than ${MIN_NODE}`, fix: `Install Node.js ${MIN_NODE} or newer` };
205
+ : {
206
+ id: 'node',
207
+ status: 'fail',
208
+ detail: `Node.js ${node} is older than ${MIN_NODE}`,
209
+ fix: `Install Node.js ${MIN_NODE} or newer`,
210
+ };
176
211
  }
177
212
  /** The store the checks run against (project first, then global), and the check that says which. */
178
213
  function storeCheck(local, globalRoot, hasGlobal) {
179
214
  if (local !== null && isInitialized(local)) {
180
215
  return {
181
216
  store: local,
182
- check: { id: 'store', status: 'pass', detail: `project store at ${local}${hasGlobal ? ` (global store at ${globalRoot} too)` : ''}` }
217
+ check: {
218
+ id: 'store',
219
+ status: 'pass',
220
+ detail: `project store at ${local}${hasGlobal ? ` (global store at ${globalRoot} too)` : ''}`,
221
+ },
183
222
  };
184
223
  }
185
224
  if (local !== null) {
@@ -219,30 +258,49 @@ function schemaCheck(have, want) {
219
258
  return have === want
220
259
  ? { id: 'schema', status: 'pass', detail: `database schema v${have}` }
221
260
  : have > want
222
- ? { id: 'schema', status: 'fail', detail: `database schema v${have} is newer than this hippo (v${want})`, fix: 'npm install -g hippo-memory@latest' }
223
- : { id: 'schema', status: 'info', detail: `database schema v${have}; hippo migrates it to v${want} on the next write` };
261
+ ? {
262
+ id: 'schema',
263
+ status: 'fail',
264
+ detail: `database schema v${have} is newer than this hippo (v${want})`,
265
+ fix: 'npm install -g hippo-memory@latest',
266
+ }
267
+ : {
268
+ id: 'schema',
269
+ status: 'info',
270
+ detail: `database schema v${have}; hippo migrates it to v${want} on the next write`,
271
+ };
224
272
  }
225
273
  function memoriesCheck(memories, dormant) {
226
- const memoryCheck = { id: 'memories', status: 'info', detail: `${memories ?? '?'} memories${dormant !== null ? `, ${dormant} dormant` : ''}` };
274
+ const memoryCheck = {
275
+ id: 'memories',
276
+ status: 'info',
277
+ detail: `${memories ?? '?'} memories${dormant !== null ? `, ${dormant} dormant` : ''}`,
278
+ };
227
279
  if (memories === 0) {
228
280
  memoryCheck.status = 'warn';
229
281
  memoryCheck.fix = 'hippo learn --git (seed lessons from git history)';
230
282
  }
231
283
  return memoryCheck;
232
284
  }
233
- /** Whether the full-text index still matches `memories`; opening a current store no longer checks, so doctor reports and sleep repairs. */
285
+ /**
286
+ * Whether the full-text index still matches `memories`; opening a current store no longer checks, so doctor reports and
287
+ * sleep repairs.
288
+ */
234
289
  function ftsCheck(fts) {
235
290
  if (!fts.ok)
236
291
  return { id: 'fts', status: 'warn', detail: `cannot read the full-text index: ${fts.message}` };
237
292
  const counts = fts.value;
238
- if (counts === null)
293
+ if (counts === null) {
239
294
  return { id: 'fts', status: 'info', detail: 'no full-text index; search uses slower LIKE matching' };
240
- if (counts.memories === counts.fts)
295
+ }
296
+ if (counts.memories === counts.fts) {
241
297
  return { id: 'fts', status: 'pass', detail: `full-text index in sync (${counts.fts} rows)` };
298
+ }
242
299
  return {
243
300
  id: 'fts',
244
301
  status: 'warn',
245
- detail: `full-text index out of sync: ${counts.fts} indexed rows for ${counts.memories} memories, so search can miss memories or match removed ones`,
302
+ detail: `full-text index out of sync: ${counts.fts} indexed rows for ${counts.memories} memories, so search can ` +
303
+ `miss memories or match removed ones`,
246
304
  fix: 'hippo sleep (re-syncs the index)',
247
305
  };
248
306
  }
@@ -260,7 +318,7 @@ function tokensCheck(tokens) {
260
318
  };
261
319
  }
262
320
  /** Checks that read the store's database; a store that cannot be opened becomes one failed schema check. */
263
- function databaseChecks(store, now) {
321
+ function databaseChecks(store, now, spoolFs) {
264
322
  let health;
265
323
  try {
266
324
  health = readStoreHealth(store, {
@@ -270,12 +328,16 @@ function databaseChecks(store, now) {
270
328
  });
271
329
  }
272
330
  catch (err) {
273
- return [{
331
+ return [
332
+ {
274
333
  id: 'schema',
275
334
  status: 'fail',
276
335
  detail: `cannot open the database: ${errorMessage(err)}`,
277
- fix: err instanceof IncompatibleBinaryError ? 'npm install -g hippo-memory@latest' : 'check file permissions on the .hippo folder',
278
- }];
336
+ fix: err instanceof IncompatibleBinaryError
337
+ ? 'npm install -g hippo-memory@latest'
338
+ : 'check file permissions on the .hippo folder',
339
+ },
340
+ ];
279
341
  }
280
342
  return [
281
343
  schemaCheck(health.schemaVersion, getCurrentSchemaVersion()),
@@ -284,7 +346,7 @@ function databaseChecks(store, now) {
284
346
  tokensCheck(health.tokens),
285
347
  failuresCheck(health.failures, health.schemaVersion),
286
348
  sleepCheck(health.lastSleep, now),
287
- compactionsCheck(health.compactions, store, now),
349
+ compactionsCheck(health.compactions, store, now, spoolFs),
288
350
  ];
289
351
  }
290
352
  // Each hook and what it does, so a partial install says what is missing.
@@ -299,20 +361,37 @@ const CLAUDE_CODE_HOOKS = [
299
361
  function claudeCodeCheck(home) {
300
362
  const claudeDir = claudeConfigDir(home);
301
363
  if (!fs.existsSync(claudeDir)) {
302
- return { id: 'claude-code', status: 'info', detail: 'Claude Code not found; other agents can use hippo over MCP (hippo mcp)' };
364
+ return {
365
+ id: 'claude-code',
366
+ status: 'info',
367
+ detail: 'Claude Code not found; other agents can use hippo over MCP (hippo mcp)',
368
+ };
303
369
  }
304
370
  const settings = readJson(path.join(claudeDir, 'settings.json'));
305
371
  const text = settings === null ? '' : JSON.stringify(settings);
306
372
  const viaPlugin = /hippo-memory@/.test(text);
307
373
  const missing = CLAUDE_CODE_HOOKS.filter(([marker]) => !text.includes(marker)).map(([, what]) => what);
308
374
  if (viaPlugin) {
309
- return { id: 'claude-code', status: 'pass', detail: 'Claude Code: hippo plugin enabled (all hooks, including compaction and failed-tool capture)' };
375
+ return {
376
+ id: 'claude-code',
377
+ status: 'pass',
378
+ detail: 'Claude Code: hippo plugin enabled (all hooks, including compaction and failed-tool capture)',
379
+ };
310
380
  }
311
381
  if (missing.length === 0) {
312
- return { id: 'claude-code', status: 'pass', detail: 'Claude Code: all hippo hooks installed, including compaction and failed-tool capture' };
382
+ return {
383
+ id: 'claude-code',
384
+ status: 'pass',
385
+ detail: 'Claude Code: all hippo hooks installed, including compaction and failed-tool capture',
386
+ };
313
387
  }
314
388
  if (missing.length === CLAUDE_CODE_HOOKS.length) {
315
- return { id: 'claude-code', status: 'warn', detail: 'Claude Code found, but no hippo hooks are installed', fix: 'hippo hook install claude-code' };
389
+ return {
390
+ id: 'claude-code',
391
+ status: 'warn',
392
+ detail: 'Claude Code found, but no hippo hooks are installed',
393
+ fix: 'hippo hook install claude-code',
394
+ };
316
395
  }
317
396
  return {
318
397
  id: 'claude-code',
@@ -334,13 +413,14 @@ export function runDoctor(opts) {
334
413
  const { store, check } = storeCheck(local, globalRoot, hasGlobal);
335
414
  checks.push(check);
336
415
  if (store !== null)
337
- checks.push(...databaseChecks(store, now));
416
+ checks.push(...databaseChecks(store, now, opts.spoolFs));
338
417
  const holdoutRateBp = store === null ? 0 : loadConfig(store).pilot.holdoutRateBp;
339
418
  if (holdoutRateBp > 0) {
340
419
  checks.push({
341
420
  id: 'pilot',
342
421
  status: 'info',
343
- detail: `pilot holdout on: about ${holdoutRateBp / 100}% of sessions get no memories pushed by hippo (pilot.holdoutRateBp=${holdoutRateBp})`
422
+ detail: `pilot holdout on: about ${holdoutRateBp / 100}% of sessions get no memories pushed by hippo ` +
423
+ `(pilot.holdoutRateBp=${holdoutRateBp})`,
344
424
  });
345
425
  }
346
426
  if (hasGlobal)
@@ -351,7 +431,9 @@ export function runDoctor(opts) {
351
431
  checks.push({
352
432
  id: 'embeddings',
353
433
  status: 'info',
354
- detail: isEmbeddingAvailable() ? 'local embeddings available (hybrid search)' : 'embeddings not installed; recall uses BM25 (optional: hippo embed --help)'
434
+ detail: isEmbeddingAvailable()
435
+ ? 'local embeddings available (hybrid search)'
436
+ : 'embeddings not installed; recall uses BM25 (optional: hippo embed --help)',
355
437
  });
356
438
  return { ok: !checks.some((c) => c.status === 'fail'), version: opts.version, store, checks };
357
439
  }
@@ -1,4 +1,5 @@
1
- /** The one call this file makes on a Transformers.js feature-extraction pipeline, and the part of its tensor it reads. */
1
+ /** The one call this file makes on a Transformers.js feature-extraction pipeline, and the part of its tensor it
2
+ * reads. */
2
3
  interface EmbeddingPipeline {
3
4
  (input: string, options: {
4
5
  pooling: 'cls' | 'mean';
@@ -25,7 +26,8 @@ interface TransformersModule {
25
26
  };
26
27
  }
27
28
  export declare const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
28
- /** BGE was trained with CLS pooling; everything else gets mean, the sentence-transformers default, since CLS degrades mean-trained models. */
29
+ /** BGE was trained with CLS pooling; everything else gets mean, the sentence-transformers default, since CLS
30
+ * degrades mean-trained models. */
29
31
  export declare function poolingFor(model: string): 'cls' | 'mean';
30
32
  /** `query` is search input, `passage` is a document being indexed; no role means no prefix on any model. */
31
33
  export type EmbeddingRole = 'query' | 'passage';
@@ -44,7 +46,8 @@ export interface LocalTransformers {
44
46
  export interface LocalEmbedder {
45
47
  isAvailable(): boolean;
46
48
  /** Throws, with the reason, when the model's pipeline cannot load: a provider-level failure, not a per-item skip.
47
- * `signal` ends the wait, never the load, and only once the load is downloading: a load from disk ends soon on its own, a download may not. */
49
+ * `signal` ends the wait, never the load, and only once the load is downloading: a load from disk ends soon on its
50
+ * own, a download may not. */
48
51
  requirePipeline(model: string, signal?: AbortSignal): Promise<void>;
49
52
  /** `text`'s vector, or `[]` when the model is missing or fails; `role` adds e5-style prefixes. */
50
53
  embed(text: string, model: string, role?: EmbeddingRole): Promise<number[]>;
@@ -56,7 +59,8 @@ export declare const sharedLocalEmbedder: LocalEmbedder;
56
59
  /** Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed. */
57
60
  export declare function isEmbeddingAvailable(): boolean;
58
61
  export declare function resolveEmbeddingModel(hippoRoot: string, explicitModel?: string): string;
59
- /** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds e5-style prefixes. */
62
+ /** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds
63
+ * e5-style prefixes. */
60
64
  export declare function getEmbedding(text: string, model?: string, role?: EmbeddingRole): Promise<number[]>;
61
65
  export {};
62
66
  //# sourceMappingURL=local.d.ts.map
@@ -7,7 +7,8 @@ import { loadConfig } from '../core/config.js';
7
7
  import { errorFields, errorMessage, log } from '../util/log.js';
8
8
  import { createModelLoads, importTransformers, MODEL_LOAD_POLICY, resolveTransformersPackage } from './transformers.js';
9
9
  export const DEFAULT_EMBEDDING_MODEL = 'Xenova/all-MiniLM-L6-v2';
10
- /** BGE was trained with CLS pooling; everything else gets mean, the sentence-transformers default, since CLS degrades mean-trained models. */
10
+ /** BGE was trained with CLS pooling; everything else gets mean, the sentence-transformers default, since CLS
11
+ * degrades mean-trained models. */
11
12
  export function poolingFor(model) {
12
13
  return /\bbge\b/i.test(model) ? 'cls' : 'mean';
13
14
  }
@@ -44,8 +45,8 @@ export function createLocalEmbedder(transformers = INSTALLED_TRANSFORMERS) {
44
45
  return Array.from(output.data);
45
46
  }
46
47
  catch (err) {
47
- // The caller sees `[]` and names the memory; a failed load already warned once for its backoff window.
48
- log.debug(`local embedding failed: ${errorMessage(err)}`);
48
+ // The caller sees `[]` and names the memory; the first failure per model is told, the repeats go to debug.
49
+ log.warnThenDebug(`local-embed:${model}`, `local embedding with ${model} failed: ${errorMessage(err)}`, errorFields(err));
49
50
  return [];
50
51
  }
51
52
  },
@@ -57,7 +58,8 @@ function warnLoadFailure(model, err) {
57
58
  }
58
59
  /** The model's pipeline; throws the reason it cannot load. */
59
60
  async function createPipeline(transformers, model, gates) {
60
- // The package is an optional peer, so the dynamic import is typed by what this file reads; a missing export throws below.
61
+ // The package is an optional peer, so the dynamic import is typed by what this file reads; a missing export throws
62
+ // below.
61
63
  const imported = await transformers.load();
62
64
  if (!imported)
63
65
  throw new Error('no transformers package is installed');
@@ -82,7 +84,8 @@ async function createPipeline(transformers, model, gates) {
82
84
  gates.delete(model);
83
85
  }
84
86
  }
85
- /** Whether the load will download: remote models are allowed and no folder the package reads holds the model's ONNX files. */
87
+ /** Whether the load will download: remote models are allowed and no folder the package reads holds the model's ONNX
88
+ * files. */
86
89
  function fetchesWeights(env, model) {
87
90
  if (env?.allowRemoteModels === false)
88
91
  return false;
@@ -135,11 +138,12 @@ export function resolveEmbeddingModel(hippoRoot, explicitModel) {
135
138
  return configured;
136
139
  }
137
140
  catch (err) {
138
- log.warn(`embedding model config unreadable, using the default model: ${errorMessage(err)}`);
141
+ log.warn(`embedding model config unreadable, using the default model: ${errorMessage(err)}`, errorFields(err));
139
142
  }
140
143
  return DEFAULT_EMBEDDING_MODEL;
141
144
  }
142
- /** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds e5-style prefixes. */
145
+ /** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds
146
+ * e5-style prefixes. */
143
147
  export function getEmbedding(text, model = DEFAULT_EMBEDDING_MODEL, role) {
144
148
  return sharedLocalEmbedder.embed(text, model, role);
145
149
  }
@@ -1,18 +1,23 @@
1
- /** Pluggable embedding providers; local `@huggingface/transformers` is the zero-dependency default, OpenAI / Voyage / Cohere are opt-in via native `fetch`.
2
- * Local `id` is the bare model string, API `id` is `${kind}:${model}`; the stored identity adds `#t<N>` (`embeddingIndexIdentity`), so changes reindex.
3
- * `embed()` MAY throw on hard transport/auth failure so a reindex aborts atomically; hot paths wrap it and fall back to BM25. */
1
+ /** Pluggable embedding providers; local `@huggingface/transformers` is the
2
+ * zero-dependency default, OpenAI / Voyage / Cohere are opt-in via native
3
+ * `fetch`. Local `id` is the bare model string, API `id` is `${kind}:${model}`;
4
+ * the stored identity adds `#t<N>` (`embeddingIndexIdentity`), so changes
5
+ * reindex. `embed()` MAY throw on hard transport/auth failure so a reindex
6
+ * aborts atomically; hot paths wrap it and fall back to BM25. */
4
7
  import { type EmbeddingRole, type LocalTransformers } from './local.js';
5
8
  export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
6
9
  export declare const API_PROVIDER_KINDS: readonly EmbeddingProviderKind[];
7
10
  export interface EmbedCallOptions {
8
- /** Ends the whole call when it aborts, every batch and retry included. The local provider stops waiting only on a model download,
11
+ /** Ends the whole call when it aborts, every batch and retry included. The local provider stops waiting only on a
12
+ * model download,
9
13
  * since nothing stops a load from disk or an in-process inference. */
10
14
  signal?: AbortSignal;
11
15
  }
12
16
  export interface EmbeddingProvider {
13
17
  readonly kind: EmbeddingProviderKind;
14
18
  readonly model: string;
15
- /** Identity recorded in DB meta to drive reindex-on-change: bare model string for local, `${kind}:${model}` for api. */
19
+ /** Identity recorded in DB meta to drive reindex-on-change:
20
+ * bare model string for local, `${kind}:${model}` for api. */
16
21
  readonly id: string;
17
22
  /** Known fixed output dimension, if any (undefined for local / unknown). */
18
23
  readonly dimensions?: number;
@@ -29,15 +34,19 @@ export interface ResolveProviderOptions {
29
34
  model?: string;
30
35
  /** Explicit provider override (mainly for tests). */
31
36
  provider?: EmbeddingProviderKind;
32
- /** The Transformers.js package a local provider loads from, with its own models; the process's shared embedder when unset. */
37
+ /** The Transformers.js package a local provider loads from, with
38
+ * its own models; the process's shared embedder when unset. */
33
39
  transformers?: LocalTransformers;
34
40
  }
35
- /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
41
+ /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it
42
+ * surfaces via `isAvailable()`);
36
43
  * only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
37
44
  export declare function resolveEmbeddingProvider(hippoRoot: string, opts?: ResolveProviderOptions): EmbeddingProvider;
38
- /** The reindex identity for the active provider; use it, NOT resolveEmbeddingModel, wherever `embeddingModelRequiresReindex` / stored-model comparisons
39
- * happen. */
45
+ /** The reindex identity for the active provider; use it, NOT
46
+ * resolveEmbeddingModel, wherever `embeddingModelRequiresReindex`
47
+ * / stored-model comparisons happen. */
40
48
  export declare function resolveEmbeddingIdentity(hippoRoot: string, opts?: ResolveProviderOptions): string;
41
- /** Provider-aware availability for a store (local: dependency installed; api: key present); use where the decision to embed is made. */
49
+ /** Provider-aware availability for a store (local: dependency installed; api: key present); use where the decision
50
+ * to embed is made. */
42
51
  export declare function isEmbeddingConfigured(hippoRoot: string): boolean;
43
52
  //# sourceMappingURL=provider.d.ts.map
@@ -1,10 +1,13 @@
1
- /** Pluggable embedding providers; local `@huggingface/transformers` is the zero-dependency default, OpenAI / Voyage / Cohere are opt-in via native `fetch`.
2
- * Local `id` is the bare model string, API `id` is `${kind}:${model}`; the stored identity adds `#t<N>` (`embeddingIndexIdentity`), so changes reindex.
3
- * `embed()` MAY throw on hard transport/auth failure so a reindex aborts atomically; hot paths wrap it and fall back to BM25. */
1
+ /** Pluggable embedding providers; local `@huggingface/transformers` is the
2
+ * zero-dependency default, OpenAI / Voyage / Cohere are opt-in via native
3
+ * `fetch`. Local `id` is the bare model string, API `id` is `${kind}:${model}`;
4
+ * the stored identity adds `#t<N>` (`embeddingIndexIdentity`), so changes
5
+ * reindex. `embed()` MAY throw on hard transport/auth failure so a reindex
6
+ * aborts atomically; hot paths wrap it and fall back to BM25. */
4
7
  import { envByName } from '../util/env.js';
5
8
  import { createLocalEmbedder, resolveEmbeddingModel, sharedLocalEmbedder, DEFAULT_EMBEDDING_MODEL, } from './local.js';
6
9
  import { loadConfig } from '../core/config.js';
7
- import { errorMessage, log } from '../util/log.js';
10
+ import { errorMessage, log, errorFields } from '../util/log.js';
8
11
  import { redactSecretsStrict } from '../util/secret-detect.js';
9
12
  import { fetchWithRetry } from '../util/http-retry.js';
10
13
  import { readCappedJson, readCappedText } from '../util/capped-json.js';
@@ -41,7 +44,8 @@ class LocalEmbeddingProvider {
41
44
  return this.enabled && this.embedder.isAvailable();
42
45
  }
43
46
  async embed(texts, role, call = {}) {
44
- // A model that cannot load fails the call, as an API outage does; items then run one at a time on the shared pipeline.
47
+ // A model that cannot load fails the call, as an API outage
48
+ // does; items then run one at a time on the shared pipeline.
45
49
  if (texts.length > 0)
46
50
  await this.embedder.requirePipeline(this.model, call.signal);
47
51
  const out = [];
@@ -97,7 +101,8 @@ const API_PROVIDER_SPECS = {
97
101
  }),
98
102
  extractVectors: (json) => {
99
103
  // Cohere v2 shape: { embeddings: { float: number[][] } }
100
- // SAFETY: documented v2 envelope; embedChunk validates the vectors afterward, so a malformed response degrades to [] here and throws there.
104
+ // SAFETY: documented v2 envelope; embedChunk validates the vectors afterward, so a malformed response degrades to
105
+ // [] here and throws there.
101
106
  const emb = json.embeddings;
102
107
  return emb?.float ?? [];
103
108
  },
@@ -170,7 +175,8 @@ class ApiEmbeddingProvider {
170
175
  const resp = await this.postChunk(chunk, key, role, signal);
171
176
  const json = await this.responseJson(resp, key, chunk.length);
172
177
  const vectors = spec.extractVectors(json);
173
- // A 200 with the wrong vector count (or any empty/malformed vector) is a provider contract violation, not a per-item miss:
178
+ // A 200 with the wrong vector count (or any empty/malformed vector) is a provider contract violation, not a
179
+ // per-item miss:
174
180
  // throw so a reindex aborts atomically and the explicit backfill surfaces it, instead of saving []-padded rows.
175
181
  if (vectors.length !== chunk.length) {
176
182
  throw new Error(redact(`${this.kind} embeddings returned ${vectors.length} vectors for ${chunk.length} inputs`, key));
@@ -196,14 +202,17 @@ class ApiEmbeddingProvider {
196
202
  signal,
197
203
  }, {
198
204
  timeoutMs: REQUEST_TIMEOUT_MS,
199
- // Embedding the same text twice changes nothing on the far side, so a dropped connection or a stalled attempt is replayed.
205
+ // Embedding the same text twice changes nothing on the far side,
206
+ // so a dropped connection or a stalled attempt is replayed.
200
207
  retryTransport: true,
201
208
  maxDelayMs: signal ? DEADLINE_RETRY_WAIT_CAP_MS : undefined,
202
209
  });
203
210
  }
204
211
  catch (err) {
205
212
  const msg = errorMessage(err);
206
- throw new Error(redact(`embedding request to ${this.kind} failed: ${msg}`, key), { cause: redactedCause(err, key) });
213
+ throw new Error(redact(`embedding request to ${this.kind} failed: ${msg}`, key), {
214
+ cause: redactedCause(err, key),
215
+ });
207
216
  }
208
217
  }
209
218
  /** The body of an OK reply; any other status, or a body that is not JSON, throws with the key cut out. */
@@ -214,7 +223,8 @@ class ApiEmbeddingProvider {
214
223
  detail = await readCappedText(resp, ERROR_BODY_MAX_BYTES);
215
224
  }
216
225
  catch (err) {
217
- log.debug(`${this.kind} embeddings error body unreadable: ${errorMessage(err)}`);
226
+ // The error thrown below already carries the status; the body is only extra detail.
227
+ log.debug(`${this.kind} embeddings error body unreadable: ${errorMessage(err)}`, errorFields(err));
218
228
  }
219
229
  throw new Error(redact(`${this.kind} embeddings HTTP ${resp.status}: ${detail.slice(0, ERROR_DETAIL_CHARS)}`, key));
220
230
  }
@@ -224,20 +234,11 @@ class ApiEmbeddingProvider {
224
234
  catch (err) {
225
235
  const msg = errorMessage(err);
226
236
  throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key), {
227
- cause: redactedCause(err instanceof Error && err.cause ? err.cause : err, key)
237
+ cause: redactedCause(err instanceof Error && err.cause ? err.cause : err, key),
228
238
  });
229
239
  }
230
240
  }
231
241
  }
232
- function readEmbeddingsConfig(hippoRoot) {
233
- try {
234
- return loadConfig(hippoRoot).embeddings;
235
- }
236
- catch {
237
- // An unreadable config falls back to provider defaults; loadConfig warns on a bad parse.
238
- return {};
239
- }
240
- }
241
242
  /** Validate a user-supplied API base URL: HTTPS only (or explicit localhost). */
242
243
  function validateBaseUrl(url, fallback) {
243
244
  const candidate = url?.trim();
@@ -257,10 +258,11 @@ function validateBaseUrl(url, fallback) {
257
258
  }
258
259
  return candidate;
259
260
  }
260
- /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
261
+ /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it
262
+ * surfaces via `isAvailable()`);
261
263
  * only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
262
264
  export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
263
- const cfg = readEmbeddingsConfig(hippoRoot);
265
+ const cfg = loadConfig(hippoRoot).embeddings;
264
266
  const requested = opts.provider ?? cfg.provider ?? 'local';
265
267
  // An explicit embeddings.enabled=false hard-disables embedding for BOTH local
266
268
  // and API providers — for API this prevents unwanted paid off-box calls.
@@ -272,7 +274,8 @@ export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
272
274
  if (!isApiProviderKind(requested)) {
273
275
  // Fail loud on a typo'd provider rather than silently using local (which
274
276
  // would reindex with the local model and clobber the intended identity).
275
- throw new Error(`Unknown embeddings.provider '${requested}'. Valid values: local, ${API_PROVIDER_KINDS.filter((k) => k !== 'local').join(', ')}.`);
277
+ throw new Error(`Unknown embeddings.provider '${requested}'. Valid values: local, ` +
278
+ `${API_PROVIDER_KINDS.filter((k) => k !== 'local').join(', ')}.`);
276
279
  }
277
280
  const kind = requested;
278
281
  const spec = API_PROVIDER_SPECS[kind];
@@ -286,19 +289,21 @@ export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
286
289
  : DEFAULT_API_BATCH_SIZE;
287
290
  return new ApiEmbeddingProvider(kind, model, baseUrl, batchSize, enabled);
288
291
  }
289
- /** The reindex identity for the active provider; use it, NOT resolveEmbeddingModel, wherever `embeddingModelRequiresReindex` / stored-model comparisons
290
- * happen. */
292
+ /** The reindex identity for the active provider; use it, NOT
293
+ * resolveEmbeddingModel, wherever `embeddingModelRequiresReindex`
294
+ * / stored-model comparisons happen. */
291
295
  export function resolveEmbeddingIdentity(hippoRoot, opts = {}) {
292
296
  return resolveEmbeddingProvider(hippoRoot, opts).id;
293
297
  }
294
- /** Provider-aware availability for a store (local: dependency installed; api: key present); use where the decision to embed is made. */
298
+ /** Provider-aware availability for a store (local: dependency installed; api: key present); use where the decision
299
+ * to embed is made. */
295
300
  export function isEmbeddingConfigured(hippoRoot) {
296
301
  try {
297
302
  return resolveEmbeddingProvider(hippoRoot).isAvailable();
298
303
  }
299
304
  catch (err) {
300
305
  // An invalid embedding config must not crash the best-effort ingestion guard, so it reads as not configured.
301
- log.debug(`embedding config unusable: ${errorMessage(err)}`);
306
+ log.warnThenDebug(`embedding-config-unusable:${hippoRoot}`, `embedding config unusable: ${errorMessage(err)}`, errorFields(err));
302
307
  return false;
303
308
  }
304
309
  }