hippo-memory 1.70.0 → 1.72.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 (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -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; a failed load already warned once for its backoff window.
48
+ log.debug(`local embedding failed: ${errorMessage(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
@@ -0,0 +1,43 @@
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. */
4
+ import { type EmbeddingRole, type LocalTransformers } from './local.js';
5
+ export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
6
+ export declare const API_PROVIDER_KINDS: readonly EmbeddingProviderKind[];
7
+ 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,
9
+ * since nothing stops a load from disk or an in-process inference. */
10
+ signal?: AbortSignal;
11
+ }
12
+ export interface EmbeddingProvider {
13
+ readonly kind: EmbeddingProviderKind;
14
+ readonly model: string;
15
+ /** Identity recorded in DB meta to drive reindex-on-change: bare model string for local, `${kind}:${model}` for api. */
16
+ readonly id: string;
17
+ /** Known fixed output dimension, if any (undefined for local / unknown). */
18
+ readonly dimensions?: number;
19
+ /** Env var holding this provider's API key (undefined for the local provider). */
20
+ readonly keyEnv?: string;
21
+ /** local -> dependency installed; api -> key present. NEVER throws. */
22
+ isAvailable(): boolean;
23
+ /** Batch-embed: one row per input in order, `[]` when that item could not be embedded.
24
+ * MAY throw on a hard transport/auth failure so a reindex aborts before saving a partial index. */
25
+ embed(texts: string[], role?: EmbeddingRole, call?: EmbedCallOptions): Promise<number[][]>;
26
+ }
27
+ export interface ResolveProviderOptions {
28
+ /** Explicit model override (mirrors resolveEmbeddingModel's explicitModel). */
29
+ model?: string;
30
+ /** Explicit provider override (mainly for tests). */
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;
34
+ }
35
+ /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
36
+ * only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
37
+ 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. */
40
+ 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. */
42
+ export declare function isEmbeddingConfigured(hippoRoot: string): boolean;
43
+ //# sourceMappingURL=provider.d.ts.map
@@ -1,38 +1,19 @@
1
- /**
2
- * Pluggable embedding providers for Hippo.
3
- *
4
- * The local `@huggingface/transformers` path stays the zero-DEPENDENCY DEFAULT. Opt-in
5
- * API providers (OpenAI / Voyage / Cohere) let a user bring a frontier embedder
6
- * (e.g. text-embedding-3-large) for frontier-class retrieval. They use the native
7
- * `fetch` global (Node >= 22.16, see package.json engines; NO new dependency) and
8
- * read their key from a conventional env var. The provider is selected by
9
- * `config.embeddings.provider` (default `'local'`).
10
- *
11
- * Design contract:
12
- * - Local provider `id` is the BARE model string; the STORED identity adds a `#t<N>`
13
- * embed-text-format suffix (`embeddingIndexIdentity`), so older stores reindex once:
14
- * their vectors were computed over path-contaminated text.
15
- * - API provider `id` is `${kind}:${model}`; switching to/from an API embedder
16
- * (or a dimension change) flips the identity and triggers the existing
17
- * reindex-on-change path.
18
- * - `resolveEmbeddingProvider` throws on an invalid config (unknown provider,
19
- * bad apiBaseUrl); `embedMemory` turns that into a warning. `isAvailable()` is provider-aware
20
- * (local -> dependency installed; api -> key present). `embed()` MAY throw on
21
- * a hard transport/auth failure so a reindex can abort atomically; hot paths
22
- * wrap it and fall back to BM25.
23
- *
24
- * The exact request/response shapes for the API providers are documented from each
25
- * vendor's public embeddings API; they are unit-tested here against a mocked
26
- * `fetch` and are integration-verified in Workstream C (real API calls are
27
- * egress-blocked in the build sandbox).
28
- */
29
- import { envByName } from '../../util/env.js';
30
- import { getEmbedding, isEmbeddingAvailable, requireLocalPipeline, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './local.js';
31
- import { loadConfig } from '../../core/config.js';
32
- import { errorMessage, log } from '../../util/log.js';
33
- import { redactSecretsStrict } from '../../util/secret-detect.js';
34
- import { fetchWithRetry } from '../../util/http-retry.js';
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. */
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';
35
11
  const ERROR_DETAIL_CHARS = 300;
12
+ // An error body is read for its first lines only; 4x leaves room for multi-byte text.
13
+ const ERROR_BODY_MAX_BYTES = ERROR_DETAIL_CHARS * 4;
14
+ // 16,384 dimensions at 32 bytes a number: four times a 4,096-dimension model.
15
+ const EMBED_REPLY_BYTES_PER_INPUT = 512 * 1024;
16
+ const EMBED_REPLY_BASE_BYTES = 64 * 1024;
36
17
  export const API_PROVIDER_KINDS = ['openai', 'voyage', 'cohere'];
37
18
  function isApiProviderKind(x) {
38
19
  return x === 'openai' || x === 'voyage' || x === 'cohere';
@@ -41,30 +22,31 @@ const DEFAULT_API_BATCH_SIZE = 64;
41
22
  /** Per-request timeout for API embedding calls. A provider/proxy that accepts
42
23
  * the connection but never responds must not hang embed/recall indefinitely. */
43
24
  const REQUEST_TIMEOUT_MS = 30_000;
44
- // ---------------------------------------------------------------------------
45
- // Local provider — wraps the existing zero-dep transformers.js path.
46
- // ---------------------------------------------------------------------------
25
+ // Under a caller's deadline a longer Retry-After hands the reply back at once; the remote rerankers use the same cap.
26
+ const DEADLINE_RETRY_WAIT_CAP_MS = 2_000;
47
27
  class LocalEmbeddingProvider {
48
28
  model;
49
29
  enabled;
30
+ embedder;
50
31
  kind = 'local';
51
- constructor(model, enabled = true) {
32
+ constructor(model, enabled, embedder) {
52
33
  this.model = model;
53
34
  this.enabled = enabled;
35
+ this.embedder = embedder;
54
36
  }
55
37
  get id() {
56
38
  return this.model;
57
39
  }
58
40
  isAvailable() {
59
- return this.enabled && isEmbeddingAvailable();
41
+ return this.enabled && this.embedder.isAvailable();
60
42
  }
61
- async embed(texts, role) {
43
+ async embed(texts, role, call = {}) {
62
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.
63
45
  if (texts.length > 0)
64
- await requireLocalPipeline(this.model);
46
+ await this.embedder.requirePipeline(this.model, call.signal);
65
47
  const out = [];
66
48
  for (const text of texts) {
67
- out.push(await getEmbedding(text, this.model, role));
49
+ out.push(await this.embedder.embed(text, this.model, role));
68
50
  }
69
51
  return out;
70
52
  }
@@ -78,8 +60,7 @@ const API_PROVIDER_SPECS = {
78
60
  // OpenAI has no asymmetric query/passage input type for embeddings.
79
61
  buildBody: (model, texts) => ({ model, input: texts }),
80
62
  extractVectors: (json) => {
81
- // SAFETY: OpenAI's documented embeddings response envelope; embedChunk
82
- // validates vector count/non-emptiness against the request afterward,
63
+ // SAFETY: OpenAI's documented embeddings envelope; embedChunk validates vector count and non-emptiness afterward,
83
64
  // so a malformed response degrades to [] here and throws there.
84
65
  const data = json.data ?? [];
85
66
  return data.map((d) => d.embedding ?? []);
@@ -97,8 +78,7 @@ const API_PROVIDER_SPECS = {
97
78
  return body;
98
79
  },
99
80
  extractVectors: (json) => {
100
- // SAFETY: Voyage's documented embeddings response envelope; embedChunk
101
- // validates vector count/non-emptiness against the request afterward,
81
+ // SAFETY: Voyage's documented embeddings envelope; embedChunk validates vector count and non-emptiness afterward,
102
82
  // so a malformed response degrades to [] here and throws there.
103
83
  const data = json.data ?? [];
104
84
  return data.map((d) => d.embedding ?? []);
@@ -116,10 +96,8 @@ const API_PROVIDER_SPECS = {
116
96
  embedding_types: ['float'],
117
97
  }),
118
98
  extractVectors: (json) => {
119
- // Cohere v2: { embeddings: { float: number[][] } }
120
- // SAFETY: matches Cohere's documented v2 response envelope; embedChunk
121
- // validates vector count/non-emptiness against the request afterward,
122
- // so a malformed response degrades to [] here and throws there.
99
+ // 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.
123
101
  const emb = json.embeddings;
124
102
  return emb?.float ?? [];
125
103
  },
@@ -169,7 +147,7 @@ class ApiEmbeddingProvider {
169
147
  isAvailable() {
170
148
  return this.enabled && !!envByName(this.keyEnv)?.trim();
171
149
  }
172
- async embed(texts, role) {
150
+ async embed(texts, role, call = {}) {
173
151
  if (texts.length === 0)
174
152
  return [];
175
153
  const key = envByName(this.keyEnv)?.trim();
@@ -181,21 +159,19 @@ class ApiEmbeddingProvider {
181
159
  const out = [];
182
160
  for (let i = 0; i < texts.length; i += this.batchSize) {
183
161
  const chunk = texts.slice(i, i + this.batchSize);
184
- const vecs = await this.embedChunk(chunk, key, role);
162
+ const vecs = await this.embedChunk(chunk, key, role, call.signal);
185
163
  for (const v of vecs)
186
164
  out.push(v.length > 0 ? l2normalize(v) : v);
187
165
  }
188
166
  return out;
189
167
  }
190
- async embedChunk(chunk, key, role) {
168
+ async embedChunk(chunk, key, role, signal) {
191
169
  const spec = API_PROVIDER_SPECS[this.kind];
192
- const resp = await this.postChunk(chunk, key, role);
193
- const json = await this.responseJson(resp, key);
170
+ const resp = await this.postChunk(chunk, key, role, signal);
171
+ const json = await this.responseJson(resp, key, chunk.length);
194
172
  const vectors = spec.extractVectors(json);
195
- // A 200 response with the wrong number of vectors (or any empty/malformed
196
- // vector) is a provider/proxy contract violation, NOT a per-item miss. Throw
197
- // so a reindex aborts atomically (preserving the prior usable index) and the
198
- // explicit backfill surfaces it, instead of silently saving []-padded rows.
173
+ // A 200 with the wrong vector count (or any empty/malformed vector) is a provider contract violation, not a per-item miss:
174
+ // throw so a reindex aborts atomically and the explicit backfill surfaces it, instead of saving []-padded rows.
199
175
  if (vectors.length !== chunk.length) {
200
176
  throw new Error(redact(`${this.kind} embeddings returned ${vectors.length} vectors for ${chunk.length} inputs`, key));
201
177
  }
@@ -206,7 +182,7 @@ class ApiEmbeddingProvider {
206
182
  }
207
183
  return vectors;
208
184
  }
209
- async postChunk(chunk, key, role) {
185
+ async postChunk(chunk, key, role, signal) {
210
186
  const spec = API_PROVIDER_SPECS[this.kind];
211
187
  const url = `${this.baseUrl.replace(/\/$/, '')}/${spec.path}`;
212
188
  try {
@@ -217,7 +193,13 @@ class ApiEmbeddingProvider {
217
193
  authorization: `Bearer ${key}`,
218
194
  },
219
195
  body: JSON.stringify(spec.buildBody(this.model, chunk.map(redactSecretsStrict), role)),
220
- }, { timeoutMs: REQUEST_TIMEOUT_MS });
196
+ signal,
197
+ }, {
198
+ 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.
200
+ retryTransport: true,
201
+ maxDelayMs: signal ? DEADLINE_RETRY_WAIT_CAP_MS : undefined,
202
+ });
221
203
  }
222
204
  catch (err) {
223
205
  const msg = errorMessage(err);
@@ -225,23 +207,25 @@ class ApiEmbeddingProvider {
225
207
  }
226
208
  }
227
209
  /** The body of an OK reply; any other status, or a body that is not JSON, throws with the key cut out. */
228
- async responseJson(resp, key) {
210
+ async responseJson(resp, key, inputs) {
229
211
  if (!resp.ok) {
230
212
  let detail = '';
231
213
  try {
232
- detail = await resp.text();
214
+ detail = await readCappedText(resp, ERROR_BODY_MAX_BYTES);
233
215
  }
234
- catch {
235
- /* ignore body read error */
216
+ catch (err) {
217
+ log.debug(`${this.kind} embeddings error body unreadable: ${errorMessage(err)}`);
236
218
  }
237
219
  throw new Error(redact(`${this.kind} embeddings HTTP ${resp.status}: ${detail.slice(0, ERROR_DETAIL_CHARS)}`, key));
238
220
  }
239
221
  try {
240
- return await resp.json();
222
+ return await readCappedJson(resp, EMBED_REPLY_BASE_BYTES + inputs * EMBED_REPLY_BYTES_PER_INPUT);
241
223
  }
242
224
  catch (err) {
243
225
  const msg = errorMessage(err);
244
- throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key), { cause: redactedCause(err, key) });
226
+ throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key), {
227
+ cause: redactedCause(err instanceof Error && err.cause ? err.cause : err, key)
228
+ });
245
229
  }
246
230
  }
247
231
  }
@@ -273,13 +257,8 @@ function validateBaseUrl(url, fallback) {
273
257
  }
274
258
  return candidate;
275
259
  }
276
- /**
277
- * Build the active embedding provider from config (or an explicit override).
278
- * Never throws for a missing key — that surfaces via `isAvailable()` on the hot
279
- * paths and as a hard error only from the explicit `hippo embed` command. The
280
- * only hard throw is an invalid config (e.g. an insecure apiBaseUrl), a
281
- * deliberate loud failure; hot-path callers (search) wrap this in try/catch.
282
- */
260
+ /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
261
+ * only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
283
262
  export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
284
263
  const cfg = readEmbeddingsConfig(hippoRoot);
285
264
  const requested = opts.provider ?? cfg.provider ?? 'local';
@@ -287,7 +266,8 @@ export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
287
266
  // and API providers — for API this prevents unwanted paid off-box calls.
288
267
  const enabled = cfg.enabled !== false;
289
268
  if (requested === 'local') {
290
- return new LocalEmbeddingProvider(resolveEmbeddingModel(hippoRoot, opts.model), enabled);
269
+ const embedder = opts.transformers ? createLocalEmbedder(opts.transformers) : sharedLocalEmbedder;
270
+ return new LocalEmbeddingProvider(resolveEmbeddingModel(hippoRoot, opts.model), enabled, embedder);
291
271
  }
292
272
  if (!isApiProviderKind(requested)) {
293
273
  // Fail loud on a typo'd provider rather than silently using local (which
@@ -306,17 +286,12 @@ export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
306
286
  : DEFAULT_API_BATCH_SIZE;
307
287
  return new ApiEmbeddingProvider(kind, model, baseUrl, batchSize, enabled);
308
288
  }
309
- /**
310
- * The reindex identity for the active provider. Use this (NOT resolveEmbeddingModel)
311
- * everywhere `embeddingModelRequiresReindex` / stored-model comparisons happen.
312
- */
289
+ /** The reindex identity for the active provider; use it, NOT resolveEmbeddingModel, wherever `embeddingModelRequiresReindex` / stored-model comparisons
290
+ * happen. */
313
291
  export function resolveEmbeddingIdentity(hippoRoot, opts = {}) {
314
292
  return resolveEmbeddingProvider(hippoRoot, opts).id;
315
293
  }
316
- /**
317
- * Provider-aware availability for a store: local -> dependency installed;
318
- * api -> key present. Use at the call sites that decide whether to embed.
319
- */
294
+ /** Provider-aware availability for a store (local: dependency installed; api: key present); use where the decision to embed is made. */
320
295
  export function isEmbeddingConfigured(hippoRoot) {
321
296
  try {
322
297
  return resolveEmbeddingProvider(hippoRoot).isAvailable();
@@ -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
@@ -1,8 +1,9 @@
1
- // The hippo-memory/session-text subpath: what a hook reads from a session (turns, working state, failures, git state, compaction items) and the sharing scrub, with no store, database or server in its imports.
1
+ // The hippo-memory/session-text subpath: what a hook reads from a session (turns, working state, failures,
2
+ // git state, compaction items) and the sharing scrub, with no store, database or server in its imports.
2
3
  export { collectSessionTurns, sessionTail } from '../capture/transcript.js';
3
4
  export { scrubForSharing } from '../capture/share-scrub.js';
4
5
  export { transcriptWorkingState, WORKING_STATE_CAPS } from '../capture/working-state.js';
5
6
  export { lessonFromFailure, failureReport } from '../capture/failure-reading.js';
6
7
  export { collectHandoffEvidence } from '../capture/handoff-evidence.js';
7
- 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';
8
9
  //# sourceMappingURL=session-text.js.map