hippo-memory 1.71.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
package/dist/doctor.js CHANGED
@@ -3,17 +3,18 @@
3
3
  import * as fs from 'node:fs';
4
4
  import * as os from 'node:os';
5
5
  import * as path from 'node:path';
6
- import { findHippoStoreDir } from './core/project-identity.js';
6
+ import { findHippoStoreDir, isInitialized } from './core/project-identity.js';
7
7
  import { getGlobalRoot } from './sharing/global-store.js';
8
- import { isInitialized } from './store/open.js';
9
8
  import { readStoreHealth } from './store/diagnostics.js';
10
9
  import { loadConfig } from './core/config.js';
11
10
  import { openHippoDbReadOnly, closeHippoDb, getCurrentSchemaVersion, IncompatibleBinaryError } from './db/index.js';
12
- import { REPLAY_AFTER_MS, TRANSCRIPT_FILL_WINDOW_MS } from './capture/compaction-record.js';
11
+ import { REPLAY_AFTER_MS, TRANSCRIPT_FILL_WINDOW_MS } from './core/compaction-timing.js';
13
12
  import { SPOOL_DIR, spoolCounts } from './capture/compaction-spool.js';
14
- import { isEmbeddingAvailable } from './store/embeddings/local.js';
15
- import { CODEX_TRUST_LINE, claudeConfigDir, codexHomeDir, isCodexPresent } from './hooks/shared.js';
13
+ import { isEmbeddingAvailable } from './embeddings/local.js';
14
+ import { CODEX_TRUST_LINE, isCodexPresent } from './hooks/shared.js';
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
18
  import { resolveTenantId } from './store/tenant.js';
18
19
  import { errorMessage, log } from './util/log.js';
19
20
  import { readJsonFile, isJsonObjectLiteral } from './util/json.js';
@@ -104,16 +105,16 @@ function sleepCheck(lastSleep, now) {
104
105
  : { id: 'sleep', status: 'pass', detail: `last sleep ${days === 0 ? 'today' : `${days} day${days === 1 ? '' : 's'} ago`}` };
105
106
  }
106
107
  /** Spool counts in their own try, so a spool that cannot be read never hides the database counts. */
107
- function readSpool(store, now) {
108
+ function readSpool(store, now, spoolFs) {
108
109
  try {
109
- return { counts: spoolCounts(store, now, REPLAY_AFTER_MS), unread: '' };
110
+ return { counts: spoolCounts(store, now, REPLAY_AFTER_MS, spoolFs), unread: '' };
110
111
  }
111
112
  catch (err) {
112
113
  return { counts: { waiting: 0, stale: 0, bad: 0 }, unread: `; spool not read: ${errorMessage(err)}` };
113
114
  }
114
115
  }
115
116
  /** Compaction records the PostCompact hook left unfinished and spool files a replay has not finished, which `hippo sleep` replays. */
116
- function compactionsCheck(compactions, store, now) {
117
+ function compactionsCheck(compactions, store, now, spoolFs) {
117
118
  if (!compactions.ok) {
118
119
  return compactions.message.includes('no such table')
119
120
  ? { id: 'compactions', status: 'info', detail: 'no compaction records yet (hippo creates them on the next write)' }
@@ -121,7 +122,7 @@ function compactionsCheck(compactions, store, now) {
121
122
  }
122
123
  const { total, summarised, started } = compactions.value;
123
124
  const stuck = summarised + started;
124
- const { counts: spool, unread } = readSpool(store, now);
125
+ const { counts: spool, unread } = readSpool(store, now, spoolFs);
125
126
  const spooled = spool.waiting + spool.stale + spool.bad > 0;
126
127
  const recorded = `${total} compaction${total === 1 ? '' : 's'} recorded, none stuck`;
127
128
  if (stuck === 0 && !spooled && unread === '')
@@ -132,7 +133,8 @@ function compactionsCheck(compactions, store, now) {
132
133
  ].filter((s) => s !== '');
133
134
  const unfinished = stuck === 0
134
135
  ? `${recorded} in the store`
135
- : `${stuck} compaction${stuck === 1 ? '' : 's'} unfinished after 10 minutes (${summarised} with a summary whose memories are not saved yet, ${started} with no summary yet)`;
136
+ : `${stuck} compaction${stuck === 1 ? '' : 's'} unfinished after 10 minutes ` +
137
+ `(${summarised} with a summary whose memories are not saved yet, ${started} with no summary yet)`;
136
138
  const note = spooled ? `; spool: ${spool.waiting} waiting, ${spool.stale} left by a replay that stopped, ${spool.bad} .bad` : '';
137
139
  return { id: 'compactions', status: 'warn', detail: `${unfinished}${note}${unread}`, fix: fix.join('; ') };
138
140
  }
@@ -141,7 +143,7 @@ function projectsCheck(globalRoot) {
141
143
  let db = null;
142
144
  try {
143
145
  db = openHippoDbReadOnly(globalRoot);
144
- const r = planProjectRepair(db, globalRoot, resolveTenantId({}));
146
+ const r = planProjectRepair(projectTagReads(db, resolveTenantId({})), globalRoot);
145
147
  const found = [
146
148
  r.copies.length > 0 ? `${r.copies.length} imported notes copied under the wrong project` : '',
147
149
  r.folds.length > 0 ? `old project names that now resolve to another project: ${r.folds.map((f) => `${f.from} -> ${f.into}`).join(', ')}` : '',
@@ -253,11 +255,12 @@ function tokensCheck(tokens) {
253
255
  return {
254
256
  id: 'tokens',
255
257
  status: 'info',
256
- detail: `${tally.injected} memory blocks sent to agents in 7 days, about ${tally.tokensSent} tokens sent and ${tally.tokensReread} re-read by later model calls (hippo tokens for detail)`,
258
+ detail: `${tally.injected} memory blocks sent to agents in 7 days, about ${tally.tokensSent} tokens sent ` +
259
+ `and ${tally.tokensReread} re-read by later model calls (hippo tokens for detail)`,
257
260
  };
258
261
  }
259
262
  /** Checks that read the store's database; a store that cannot be opened becomes one failed schema check. */
260
- function databaseChecks(store, now) {
263
+ function databaseChecks(store, now, spoolFs) {
261
264
  let health;
262
265
  try {
263
266
  health = readStoreHealth(store, {
@@ -281,7 +284,7 @@ function databaseChecks(store, now) {
281
284
  tokensCheck(health.tokens),
282
285
  failuresCheck(health.failures, health.schemaVersion),
283
286
  sleepCheck(health.lastSleep, now),
284
- compactionsCheck(health.compactions, store, now),
287
+ compactionsCheck(health.compactions, store, now, spoolFs),
285
288
  ];
286
289
  }
287
290
  // Each hook and what it does, so a partial install says what is missing.
@@ -331,7 +334,7 @@ export function runDoctor(opts) {
331
334
  const { store, check } = storeCheck(local, globalRoot, hasGlobal);
332
335
  checks.push(check);
333
336
  if (store !== null)
334
- checks.push(...databaseChecks(store, now));
337
+ checks.push(...databaseChecks(store, now, opts.spoolFs));
335
338
  const holdoutRateBp = store === null ? 0 : loadConfig(store).pilot.holdoutRateBp;
336
339
  if (holdoutRateBp > 0) {
337
340
  checks.push({
@@ -0,0 +1,62 @@
1
+ /** The one call this file makes on a Transformers.js feature-extraction pipeline, and the part of its tensor it reads. */
2
+ interface EmbeddingPipeline {
3
+ (input: string, options: {
4
+ pooling: 'cls' | 'mean';
5
+ normalize: boolean;
6
+ }): Promise<{
7
+ data: ArrayLike<number>;
8
+ }>;
9
+ }
10
+ type PipelineFactory = (task: 'feature-extraction', model: string, options: {
11
+ quantized: boolean;
12
+ }) => Promise<EmbeddingPipeline>;
13
+ /** The settings written on the package's `env` object. */
14
+ interface TransformersEnv {
15
+ cacheDir?: string;
16
+ localModelPath?: string;
17
+ allowRemoteModels?: boolean;
18
+ }
19
+ /** The parts of the optional package's module this file reads; either export spelling may carry `pipeline`. */
20
+ interface TransformersModule {
21
+ env?: TransformersEnv;
22
+ pipeline?: PipelineFactory;
23
+ default?: {
24
+ pipeline?: PipelineFactory;
25
+ };
26
+ }
27
+ 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
+ export declare function poolingFor(model: string): 'cls' | 'mean';
30
+ /** `query` is search input, `passage` is a document being indexed; no role means no prefix on any model. */
31
+ export type EmbeddingRole = 'query' | 'passage';
32
+ /** e5 models only match a query to a passage when each side carries its trained prefix. */
33
+ export declare function prefixFor(model: string, role?: EmbeddingRole): string;
34
+ /** The optional package as the local embedder reaches it; tests hand in a stand-in. */
35
+ export interface LocalTransformers {
36
+ /** Whether a package is installed, answered without importing it. */
37
+ installed(): boolean;
38
+ /** The package's module, or null when neither package is installed. */
39
+ load(): Promise<{
40
+ readonly name: string;
41
+ readonly mod: TransformersModule;
42
+ } | null>;
43
+ }
44
+ export interface LocalEmbedder {
45
+ isAvailable(): boolean;
46
+ /** 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. */
48
+ requirePipeline(model: string, signal?: AbortSignal): Promise<void>;
49
+ /** `text`'s vector, or `[]` when the model is missing or fails; `role` adds e5-style prefixes. */
50
+ embed(text: string, model: string, role?: EmbeddingRole): Promise<number[]>;
51
+ }
52
+ /** One pipeline per model for the embedder's life, since a pipeline is expensive to load. */
53
+ export declare function createLocalEmbedder(transformers?: LocalTransformers): LocalEmbedder;
54
+ /** The process's embedder, shared by every provider and caller so each model loads once. */
55
+ export declare const sharedLocalEmbedder: LocalEmbedder;
56
+ /** Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed. */
57
+ export declare function isEmbeddingAvailable(): boolean;
58
+ 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. */
60
+ export declare function getEmbedding(text: string, model?: string, role?: EmbeddingRole): Promise<number[]>;
61
+ export {};
62
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1,146 @@
1
+ // The local Transformers.js embedder, a leaf so provider.ts can wrap it without importing index.ts.
2
+ import { MINUTE_MS } from '../util/time.js';
3
+ import { envModelCache } from '../util/env.js';
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import { loadConfig } from '../core/config.js';
7
+ import { errorFields, errorMessage, log } from '../util/log.js';
8
+ import { createModelLoads, importTransformers, MODEL_LOAD_POLICY, resolveTransformersPackage } from './transformers.js';
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. */
11
+ export function poolingFor(model) {
12
+ return /\bbge\b/i.test(model) ? 'cls' : 'mean';
13
+ }
14
+ /** e5 models only match a query to a passage when each side carries its trained prefix. */
15
+ export function prefixFor(model, role) {
16
+ if (!role)
17
+ return '';
18
+ if (/\be5\b/i.test(model)) {
19
+ return role === 'query' ? 'query: ' : 'passage: ';
20
+ }
21
+ return '';
22
+ }
23
+ const INSTALLED_TRANSFORMERS = {
24
+ installed: () => resolveTransformersPackage() !== null,
25
+ load: () => importTransformers(),
26
+ };
27
+ /** One pipeline per model for the embedder's life, since a pipeline is expensive to load. */
28
+ export function createLocalEmbedder(transformers = INSTALLED_TRANSFORMERS) {
29
+ let available = null;
30
+ const gates = new Map();
31
+ const pipelines = createModelLoads(MODEL_LOAD_POLICY, warnLoadFailure);
32
+ const load = (model) => pipelines.load(model, () => createPipeline(transformers, model, gates));
33
+ const isAvailable = () => (available ??= transformers.installed());
34
+ return {
35
+ isAvailable,
36
+ requirePipeline: (model, signal) => waitForPipeline(load(model), signal && gateOf(gates, model).opened, signal),
37
+ async embed(text, model, role) {
38
+ if (!isAvailable())
39
+ return [];
40
+ try {
41
+ const pipe = await load(model);
42
+ const prefix = prefixFor(model, role);
43
+ const output = await pipe(prefix ? `${prefix}${text}` : text, { pooling: poolingFor(model), normalize: true });
44
+ return Array.from(output.data);
45
+ }
46
+ catch (err) {
47
+ // The caller sees `[]` and names the memory; the first failure per model is told, the repeats go to debug.
48
+ log.warnThenDebug(`local-embed:${model}`, `local embedding with ${model} failed: ${errorMessage(err)}`, errorFields(err));
49
+ return [];
50
+ }
51
+ },
52
+ };
53
+ }
54
+ function warnLoadFailure(model, err) {
55
+ const retry = `the next try is in ${MODEL_LOAD_POLICY.backoffMs / MINUTE_MS} minutes`;
56
+ log.warn(`local embedding model ${model} did not load (${errorMessage(err)}); embeddings stay off and ${retry}`, errorFields(err));
57
+ }
58
+ /** The model's pipeline; throws the reason it cannot load. */
59
+ 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
+ const imported = await transformers.load();
62
+ if (!imported)
63
+ throw new Error('no transformers package is installed');
64
+ const { name, mod } = imported;
65
+ const cache = envModelCache();
66
+ if (cache && mod.env) {
67
+ mod.env.cacheDir = cache;
68
+ mod.env.localModelPath = cache;
69
+ mod.env.allowRemoteModels = false;
70
+ }
71
+ const pipelineFn = mod.pipeline ?? mod.default?.pipeline;
72
+ if (!pipelineFn)
73
+ throw new Error(`${name} exports no pipeline function`);
74
+ // The offline bundle used in egress-blocked sandboxes ships only the FP32 model, so use whichever file is on disk.
75
+ const quantized = !cache || fs.existsSync(path.join(cache, model, 'onnx', 'model_quantized.onnx'));
76
+ if (fetchesWeights(mod.env, model))
77
+ gateOf(gates, model).open();
78
+ try {
79
+ return await pipelineFn('feature-extraction', model, { quantized });
80
+ }
81
+ finally {
82
+ gates.delete(model);
83
+ }
84
+ }
85
+ /** Whether the load will download: remote models are allowed and no folder the package reads holds the model's ONNX files. */
86
+ function fetchesWeights(env, model) {
87
+ if (env?.allowRemoteModels === false)
88
+ return false;
89
+ return ![env?.localModelPath, env?.cacheDir].some((dir) => dir !== undefined && fs.existsSync(path.join(dir, model, 'onnx')));
90
+ }
91
+ function gateOf(gates, model) {
92
+ let gate = gates.get(model);
93
+ if (!gate) {
94
+ let open;
95
+ const opened = new Promise((resolve) => {
96
+ open = resolve;
97
+ });
98
+ gate = { opened, open };
99
+ gates.set(model, gate);
100
+ }
101
+ return gate;
102
+ }
103
+ function rejectOnAbort(signal) {
104
+ return new Promise((_resolve, reject) => {
105
+ if (signal.aborted)
106
+ reject(signal.reason);
107
+ else
108
+ signal.addEventListener('abort', () => reject(signal.reason), { once: true });
109
+ });
110
+ }
111
+ async function waitForPipeline(loading, downloading, signal) {
112
+ try {
113
+ await (downloading && signal ? Promise.race([loading, downloading.then(() => rejectOnAbort(signal))]) : loading);
114
+ }
115
+ catch (err) {
116
+ // The download goes on, and the first call after it lands gets the model.
117
+ if (signal?.aborted && err === signal.reason)
118
+ throw err;
119
+ throw new Error(`local embedding model did not load: ${errorMessage(err)}`, { cause: err });
120
+ }
121
+ }
122
+ /** The process's embedder, shared by every provider and caller so each model loads once. */
123
+ export const sharedLocalEmbedder = createLocalEmbedder();
124
+ /** Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed. */
125
+ export function isEmbeddingAvailable() {
126
+ return sharedLocalEmbedder.isAvailable();
127
+ }
128
+ export function resolveEmbeddingModel(hippoRoot, explicitModel) {
129
+ const direct = explicitModel?.trim();
130
+ if (direct)
131
+ return direct;
132
+ try {
133
+ const configured = loadConfig(hippoRoot).embeddings.model?.trim();
134
+ if (configured)
135
+ return configured;
136
+ }
137
+ catch (err) {
138
+ log.warn(`embedding model config unreadable, using the default model: ${errorMessage(err)}`);
139
+ }
140
+ return DEFAULT_EMBEDDING_MODEL;
141
+ }
142
+ /** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds e5-style prefixes. */
143
+ export function getEmbedding(text, model = DEFAULT_EMBEDDING_MODEL, role) {
144
+ return sharedLocalEmbedder.embed(text, model, role);
145
+ }
146
+ //# sourceMappingURL=local.js.map
@@ -1,11 +1,12 @@
1
1
  /** Pluggable embedding providers; local `@huggingface/transformers` is the zero-dependency default, OpenAI / Voyage / Cohere are opt-in via native `fetch`.
2
2
  * Local `id` is the bare model string, API `id` is `${kind}:${model}`; the stored identity adds `#t<N>` (`embeddingIndexIdentity`), so changes reindex.
3
3
  * `embed()` MAY throw on hard transport/auth failure so a reindex aborts atomically; hot paths wrap it and fall back to BM25. */
4
- import { type EmbeddingRole } from './local.js';
4
+ import { type EmbeddingRole, type LocalTransformers } from './local.js';
5
5
  export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
6
6
  export declare const API_PROVIDER_KINDS: readonly EmbeddingProviderKind[];
7
7
  export interface EmbedCallOptions {
8
- /** Ends the whole call when it aborts, every batch and retry included. The local provider runs in process and ignores it. */
8
+ /** Ends the whole call when it aborts, every batch and retry included. The local provider stops waiting only on a model download,
9
+ * since nothing stops a load from disk or an in-process inference. */
9
10
  signal?: AbortSignal;
10
11
  }
11
12
  export interface EmbeddingProvider {
@@ -28,6 +29,8 @@ export interface ResolveProviderOptions {
28
29
  model?: string;
29
30
  /** Explicit provider override (mainly for tests). */
30
31
  provider?: EmbeddingProviderKind;
32
+ /** The Transformers.js package a local provider loads from, with its own models; the process's shared embedder when unset. */
33
+ transformers?: LocalTransformers;
31
34
  }
32
35
  /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
33
36
  * only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
@@ -1,13 +1,13 @@
1
1
  /** Pluggable embedding providers; local `@huggingface/transformers` is the zero-dependency default, OpenAI / Voyage / Cohere are opt-in via native `fetch`.
2
2
  * Local `id` is the bare model string, API `id` is `${kind}:${model}`; the stored identity adds `#t<N>` (`embeddingIndexIdentity`), so changes reindex.
3
3
  * `embed()` MAY throw on hard transport/auth failure so a reindex aborts atomically; hot paths wrap it and fall back to BM25. */
4
- import { envByName } from '../../util/env.js';
5
- import { getEmbedding, isEmbeddingAvailable, requireLocalPipeline, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './local.js';
6
- import { loadConfig } from '../../core/config.js';
7
- import { errorMessage, log } from '../../util/log.js';
8
- import { redactSecretsStrict } from '../../util/secret-detect.js';
9
- import { fetchWithRetry } from '../../util/http-retry.js';
10
- import { readCappedJson, readCappedText } from '../../util/capped-json.js';
4
+ import { envByName } from '../util/env.js';
5
+ import { createLocalEmbedder, resolveEmbeddingModel, sharedLocalEmbedder, DEFAULT_EMBEDDING_MODEL, } from './local.js';
6
+ import { loadConfig } from '../core/config.js';
7
+ import { errorMessage, log } from '../util/log.js';
8
+ import { redactSecretsStrict } from '../util/secret-detect.js';
9
+ import { fetchWithRetry } from '../util/http-retry.js';
10
+ import { readCappedJson, readCappedText } from '../util/capped-json.js';
11
11
  const ERROR_DETAIL_CHARS = 300;
12
12
  // An error body is read for its first lines only; 4x leaves room for multi-byte text.
13
13
  const ERROR_BODY_MAX_BYTES = ERROR_DETAIL_CHARS * 4;
@@ -27,24 +27,26 @@ const DEADLINE_RETRY_WAIT_CAP_MS = 2_000;
27
27
  class LocalEmbeddingProvider {
28
28
  model;
29
29
  enabled;
30
+ embedder;
30
31
  kind = 'local';
31
- constructor(model, enabled = true) {
32
+ constructor(model, enabled, embedder) {
32
33
  this.model = model;
33
34
  this.enabled = enabled;
35
+ this.embedder = embedder;
34
36
  }
35
37
  get id() {
36
38
  return this.model;
37
39
  }
38
40
  isAvailable() {
39
- return this.enabled && isEmbeddingAvailable();
41
+ return this.enabled && this.embedder.isAvailable();
40
42
  }
41
- async embed(texts, role) {
43
+ async embed(texts, role, call = {}) {
42
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.
43
45
  if (texts.length > 0)
44
- await requireLocalPipeline(this.model);
46
+ await this.embedder.requirePipeline(this.model, call.signal);
45
47
  const out = [];
46
48
  for (const text of texts) {
47
- out.push(await getEmbedding(text, this.model, role));
49
+ out.push(await this.embedder.embed(text, this.model, role));
48
50
  }
49
51
  return out;
50
52
  }
@@ -211,8 +213,8 @@ class ApiEmbeddingProvider {
211
213
  try {
212
214
  detail = await readCappedText(resp, ERROR_BODY_MAX_BYTES);
213
215
  }
214
- catch {
215
- /* ignore body read error */
216
+ catch (err) {
217
+ log.debug(`${this.kind} embeddings error body unreadable: ${errorMessage(err)}`);
216
218
  }
217
219
  throw new Error(redact(`${this.kind} embeddings HTTP ${resp.status}: ${detail.slice(0, ERROR_DETAIL_CHARS)}`, key));
218
220
  }
@@ -227,15 +229,6 @@ class ApiEmbeddingProvider {
227
229
  }
228
230
  }
229
231
  }
230
- function readEmbeddingsConfig(hippoRoot) {
231
- try {
232
- return loadConfig(hippoRoot).embeddings;
233
- }
234
- catch {
235
- // An unreadable config falls back to provider defaults; loadConfig warns on a bad parse.
236
- return {};
237
- }
238
- }
239
232
  /** Validate a user-supplied API base URL: HTTPS only (or explicit localhost). */
240
233
  function validateBaseUrl(url, fallback) {
241
234
  const candidate = url?.trim();
@@ -258,13 +251,14 @@ function validateBaseUrl(url, fallback) {
258
251
  /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
259
252
  * only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
260
253
  export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
261
- const cfg = readEmbeddingsConfig(hippoRoot);
254
+ const cfg = loadConfig(hippoRoot).embeddings;
262
255
  const requested = opts.provider ?? cfg.provider ?? 'local';
263
256
  // An explicit embeddings.enabled=false hard-disables embedding for BOTH local
264
257
  // and API providers — for API this prevents unwanted paid off-box calls.
265
258
  const enabled = cfg.enabled !== false;
266
259
  if (requested === 'local') {
267
- return new LocalEmbeddingProvider(resolveEmbeddingModel(hippoRoot, opts.model), enabled);
260
+ const embedder = opts.transformers ? createLocalEmbedder(opts.transformers) : sharedLocalEmbedder;
261
+ return new LocalEmbeddingProvider(resolveEmbeddingModel(hippoRoot, opts.model), enabled, embedder);
268
262
  }
269
263
  if (!isApiProviderKind(requested)) {
270
264
  // Fail loud on a typo'd provider rather than silently using local (which
@@ -0,0 +1,26 @@
1
+ export interface TransformersPackage {
2
+ readonly name: string;
3
+ /** The ESM entry; a require-style import picks the CommonJS build and puts a second copy of the library, with its own ONNX sessions, in the process. */
4
+ readonly url: string;
5
+ }
6
+ /** The installed package to import, or null when neither is installed. */
7
+ export declare function resolveTransformersPackage(): TransformersPackage | null;
8
+ /** The package's module namespace, typed by the parts the caller reads; null when neither package is installed. */
9
+ export declare function importTransformers<M>(): Promise<{
10
+ readonly name: string;
11
+ readonly mod: M;
12
+ } | null>;
13
+ export interface ModelLoadPolicy {
14
+ /** How long one load may run before it counts as failed; nothing can cancel it, so it keeps running and a late model is still kept. */
15
+ readonly timeoutMs: number;
16
+ /** How long a failure is answered from memory before the next call loads again. */
17
+ readonly backoffMs: number;
18
+ }
19
+ export declare const MODEL_LOAD_POLICY: ModelLoadPolicy;
20
+ export interface ModelLoads<T> {
21
+ /** The model under `key`: the loaded one, the load in flight, the failure inside its backoff window, or a new `start()`. */
22
+ load(key: string, start: () => Promise<T>): Promise<T>;
23
+ }
24
+ /** One load per key at a time, bounded by the policy's timeout; `onFailure` hears each failed attempt, so once per backoff window. */
25
+ export declare function createModelLoads<T>(policy: ModelLoadPolicy, onFailure?: (key: string, err: Error) => void): ModelLoads<T>;
26
+ //# sourceMappingURL=transformers.d.ts.map
@@ -0,0 +1,89 @@
1
+ // The optional Transformers.js package, and a bounded load of a model from it, shared by the local embedder and the cross-encoder.
2
+ import { MINUTE_MS } from '../util/time.js';
3
+ import { createRequire } from 'node:module';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { errorCode, errorMessage } from '../util/log.js';
6
+ const _require = createRequire(import.meta.url);
7
+ // Importing both loads two onnxruntime-node builds whose finalizers can double-free on exit, so one is picked:
8
+ // the maintained package hippo ships, with Xenova only as a fallback a user installed.
9
+ const TRANSFORMERS_PACKAGES = ['@huggingface/transformers', '@xenova/transformers'];
10
+ /** The installed package to import, or null when neither is installed. */
11
+ export function resolveTransformersPackage() {
12
+ for (const name of TRANSFORMERS_PACKAGES) {
13
+ const url = entryUrl(name);
14
+ if (url)
15
+ return { name, url };
16
+ }
17
+ return null;
18
+ }
19
+ function entryUrl(name) {
20
+ try {
21
+ return import.meta.resolve(name);
22
+ }
23
+ catch {
24
+ // import.meta.resolve is missing under some module runners (vitest's included), so the require-based resolve stands in there.
25
+ try {
26
+ return pathToFileURL(_require.resolve(name)).href;
27
+ }
28
+ catch {
29
+ return null; // not installed; the caller tries the next package
30
+ }
31
+ }
32
+ }
33
+ /** The package's module namespace, typed by the parts the caller reads; null when neither package is installed. */
34
+ export async function importTransformers() {
35
+ const pkg = resolveTransformersPackage();
36
+ if (!pkg)
37
+ return null;
38
+ try {
39
+ return { name: pkg.name, mod: await import(/* @vite-ignore */ pkg.url) };
40
+ }
41
+ catch (err) {
42
+ // A Node error's code (ERR_MODULE_NOT_FOUND and the like) says more than its message alone.
43
+ const code = errorCode(err);
44
+ throw new Error(`transformers import failed (${pkg.name}): ${code ? `${code} ` : ''}${errorMessage(err)}`, { cause: err });
45
+ }
46
+ }
47
+ // A quantized MiniLM is about 23 MB, so two minutes is a 1.5 Mbit/s link; a load from disk takes about a second.
48
+ // The backoff matches the reranker outage warning's repeat window, so each window has one attempt and one warning.
49
+ export const MODEL_LOAD_POLICY = { timeoutMs: 2 * MINUTE_MS, backoffMs: 5 * MINUTE_MS };
50
+ /** One load per key at a time, bounded by the policy's timeout; `onFailure` hears each failed attempt, so once per backoff window. */
51
+ export function createModelLoads(policy, onFailure) {
52
+ const loaded = new Map();
53
+ const inFlight = new Map();
54
+ const failed = new Map();
55
+ const attempt = (key, start) => new Promise((resolve, reject) => {
56
+ const timer = setTimeout(() => reject(new Error(`${key} did not load within ${policy.timeoutMs / 1000} s`)), policy.timeoutMs);
57
+ timer.unref();
58
+ Promise.resolve().then(start).then((model) => {
59
+ clearTimeout(timer);
60
+ loaded.set(key, model);
61
+ failed.delete(key);
62
+ resolve(model);
63
+ }, (err) => {
64
+ clearTimeout(timer);
65
+ reject(err instanceof Error ? err : new Error(errorMessage(err)));
66
+ });
67
+ });
68
+ return {
69
+ load(key, start) {
70
+ const model = loaded.get(key);
71
+ if (model !== undefined)
72
+ return Promise.resolve(model);
73
+ const pending = inFlight.get(key);
74
+ if (pending)
75
+ return pending;
76
+ const failure = failed.get(key);
77
+ if (failure && Date.now() < failure.until)
78
+ return Promise.reject(failure.error);
79
+ const next = attempt(key, start).catch((err) => {
80
+ failed.set(key, { error: err, until: Date.now() + policy.backoffMs });
81
+ onFailure?.(key, err);
82
+ throw err;
83
+ }).finally(() => inFlight.delete(key));
84
+ inFlight.set(key, next);
85
+ return next;
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=transformers.js.map
@@ -3,5 +3,5 @@ export { scrubForSharing } from '../capture/share-scrub.js';
3
3
  export { transcriptWorkingState, WORKING_STATE_CAPS } from '../capture/working-state.js';
4
4
  export { lessonFromFailure, failureReport, type FailureReport } from '../capture/failure-reading.js';
5
5
  export { collectHandoffEvidence } from '../capture/handoff-evidence.js';
6
- export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../capture/compaction-items.js';
6
+ export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../util/compaction-items.js';
7
7
  //# sourceMappingURL=session-text.d.ts.map
@@ -5,5 +5,5 @@ export { scrubForSharing } from '../capture/share-scrub.js';
5
5
  export { transcriptWorkingState, WORKING_STATE_CAPS } from '../capture/working-state.js';
6
6
  export { lessonFromFailure, failureReport } from '../capture/failure-reading.js';
7
7
  export { collectHandoffEvidence } from '../capture/handoff-evidence.js';
8
- export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../capture/compaction-items.js';
8
+ export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../util/compaction-items.js';
9
9
  //# sourceMappingURL=session-text.js.map
@@ -0,0 +1,37 @@
1
+ export { hasGroup, sqliteStore, type AmbientCandidateRequest, type ContextReads, type EntryRemoval, type EntryTarget, type EntryWrite, type EntryWrites, type HippoStore, type KeyAudit, type KeyListQuery, type KeyMint, type KeyRevoke, type KeyWrites, type LastRecall, type LastRecallWrites, type OutcomeWrite, type RawArchive, type RecallSearchArgs, type RecallWrites, type SelfKeyMint, type StoreGroup, type StoreGroups, type SupersedeWrite, type VectorReads, type VectorBackfillQuery, type VectorRowWrite, type VectorWrite, type VectorWriteResult, type VectorWrites, } from '../store/index.js';
2
+ export { entryAfterOutcome } from '../core/memory.js';
3
+ export { rejectionDigest } from '../store/rejection.js';
4
+ export { RejectedValueError } from '../core/api-errors.js';
5
+ export { ownScopeTouches } from '../core/recall-scope.js';
6
+ export type { HippoDbContext } from '../api/types.js';
7
+ export type { ApiKeyListItem, ApiKeyListRow, ApiKeyRecord, ListApiKeysOpts, NewApiKey } from '../store/auth.js';
8
+ export type { KeysetPosition } from '../util/keyset.js';
9
+ export type { AppendAuditOpts, AuditEvent, ListAuditAfterOpts } from '../store/audit.js';
10
+ export type { ContinuityBlock } from '../api/recall-types.js';
11
+ export type { ActiveGoals, GetActiveGoalsOpts, Goal, GoalRecallLogRow, RetrievalPolicy } from '../store/goals.js';
12
+ export type { MemoryEntry } from '../core/memory.js';
13
+ export type { ClassResolution, PlanningFallacyEvidence } from '../store/planning-fallacy-evidence.js';
14
+ export type { PredictionBaserate } from '../store/predictions.js';
15
+ export type { RecallTraceInput } from '../store/recall-trace.js';
16
+ export type { StrengthenOptions } from '../store/entry-writes.js';
17
+ export type { OriginFilter, RecallScopeFilter, VectorCandidateSpec } from '../store/search-rows.js';
18
+ export type { ContinuityKey } from '../store/sessions.js';
19
+ export type { SessionEvent, TaskSnapshot } from '../store/rows.js';
20
+ export type { SessionHandoff } from '../core/handoff.js';
21
+ export type { AmbientLoadResult, AmbientRecallRequest, ContextCandidateFilter, RecentOrigins } from '../store/candidates.js';
22
+ export type { AmbientStoreFilter } from '../store/ambient.js';
23
+ export type { AmbientTallies } from '../core/ambient.js';
24
+ export type { TokenUse } from '../store/token-ledger.js';
25
+ export type { EmbeddingIndexState } from '../store/vector-index.js';
26
+ export type { PhysicsParticle } from '../core/physics.js';
27
+ export { StoreBusyError } from '../store/port.js';
28
+ export { decodeVector, EMBEDDING_MODEL_META_KEY, encodeVector, rankVectorRows, type VectorMatch, type VectorRow } from '../db/vector-store.js';
29
+ export { bufferToFloat32, float32ToBuffer } from '../util/vector-codec.js';
30
+ export { replacesIndex } from '../store/vector-index.js';
31
+ export { passesScopeFilterForRecall, RECALL_DEFAULT_DENY_SCOPES } from '../core/recall-scope.js';
32
+ export { SECRET_TAGS } from '../util/secret-detect.js';
33
+ export { tallyAmbientEntries } from '../core/ambient.js';
34
+ export { ftsTermParts, rarestFtsQuery } from '../core/prompt-recall.js';
35
+ export { OTHER_STORE_MARKER } from '../db/index.js';
36
+ export { isSharedStore } from '../core/config.js';
37
+ //# sourceMappingURL=store-kit.d.ts.map
@@ -0,0 +1,25 @@
1
+ // The hippo-memory/store-kit subpath: the contract for a second HippoStore (port types, row types, hippo.db's rule helpers),
2
+ // so a store built on it applies hippo.db's rules with the same code.
3
+ // An add-on serves from another database by passing serve() its own HippoStore.
4
+ export { hasGroup, sqliteStore, } from '../store/index.js';
5
+ // An add-on store's entry writes apply an outcome, guard tombstones and check reach exactly as hippo.db does.
6
+ export { entryAfterOutcome } from '../core/memory.js';
7
+ export { rejectionDigest } from '../store/rejection.js';
8
+ export { RejectedValueError } from '../core/api-errors.js';
9
+ export { ownScopeTouches } from '../core/recall-scope.js';
10
+ export { StoreBusyError } from '../store/port.js';
11
+ // An add-on store encodes, decodes and ranks vectors and particles with hippo.db's own code, and drops the index by its rule,
12
+ // so both stores keep the same bytes and return the same ids in the same order.
13
+ export { decodeVector, EMBEDDING_MODEL_META_KEY, encodeVector, rankVectorRows } from '../db/vector-store.js';
14
+ export { bufferToFloat32, float32ToBuffer } from '../util/vector-codec.js';
15
+ export { replacesIndex } from '../store/vector-index.js';
16
+ // An add-on's ContextReads applies hippo.db's scope, secret, tally and rarest-term rules with the same code.
17
+ export { passesScopeFilterForRecall, RECALL_DEFAULT_DENY_SCOPES } from '../core/recall-scope.js';
18
+ export { SECRET_TAGS } from '../util/secret-detect.js';
19
+ export { tallyAmbientEntries } from '../core/ambient.js';
20
+ export { ftsTermParts, rarestFtsQuery } from '../core/prompt-recall.js';
21
+ // store copy --db writes the marker into the other store's folder.
22
+ export { OTHER_STORE_MARKER } from '../db/index.js';
23
+ // An add-on that serves a team store checks the flag before it starts.
24
+ export { isSharedStore } from '../core/config.js';
25
+ //# sourceMappingURL=store-kit.js.map
@@ -0,0 +1,6 @@
1
+ export { _resetAblationCacheForTests } from '../core/ablation.js';
2
+ export { _resetSharedStoreCacheForTests } from '../core/config.js';
3
+ export { _resetLossAversionRatioCacheForTests } from '../core/memory.js';
4
+ export { _resetSessionRecallHistoryMcpForTests } from '../mcp/session-state.js';
5
+ export { __resetSessionRecallHistoryHttp } from '../server/routes/recall.js';
6
+ //# sourceMappingURL=testing.d.ts.map