hippo-memory 1.70.0 → 1.71.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 (629) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/claude-code.d.ts +4 -2
  3. package/dist/agent-memories/claude-code.js +14 -5
  4. package/dist/agent-memories/files.js +23 -12
  5. package/dist/agent-memories/markdown.d.ts +1 -3
  6. package/dist/agent-memories/markdown.js +1 -3
  7. package/dist/agent-memories/report.js +2 -1
  8. package/dist/agent-memories/sync.d.ts +4 -2
  9. package/dist/agent-memories/sync.js +10 -5
  10. package/dist/api/assemble.d.ts +7 -44
  11. package/dist/api/assemble.js +2 -22
  12. package/dist/api/audit.d.ts +5 -1
  13. package/dist/api/audit.js +9 -1
  14. package/dist/api/auth.d.ts +13 -22
  15. package/dist/api/auth.js +34 -24
  16. package/dist/api/auto-sleep.js +2 -2
  17. package/dist/api/availability.d.ts +2 -15
  18. package/dist/api/availability.js +2 -15
  19. package/dist/api/context-select.js +3 -4
  20. package/dist/api/context-types.d.ts +10 -35
  21. package/dist/api/context.d.ts +5 -22
  22. package/dist/api/context.js +21 -38
  23. package/dist/api/dormant.d.ts +5 -21
  24. package/dist/api/dormant.js +7 -26
  25. package/dist/api/drill-down.d.ts +7 -46
  26. package/dist/api/drill-down.js +5 -26
  27. package/dist/api/forget.d.ts +5 -24
  28. package/dist/api/forget.js +5 -28
  29. package/dist/api/graph.d.ts +8 -0
  30. package/dist/api/graph.js +7 -0
  31. package/dist/api/index.d.ts +2 -0
  32. package/dist/api/index.js +2 -0
  33. package/dist/api/instruction-detect.js +16 -5
  34. package/dist/api/ledger-db.d.ts +2 -1
  35. package/dist/api/ledger-db.js +5 -3
  36. package/dist/api/memories.d.ts +5 -0
  37. package/dist/api/memories.js +7 -0
  38. package/dist/api/objects.d.ts +9 -0
  39. package/dist/api/objects.js +11 -0
  40. package/dist/api/on-store.js +5 -3
  41. package/dist/api/predictions.d.ts +9 -0
  42. package/dist/api/predictions.js +18 -0
  43. package/dist/api/promote.d.ts +13 -17
  44. package/dist/api/promote.js +11 -19
  45. package/dist/api/prompt-hook.d.ts +4 -4
  46. package/dist/api/prompt-hook.js +10 -9
  47. package/dist/api/recall-cli.d.ts +55 -0
  48. package/dist/api/recall-cli.js +94 -0
  49. package/dist/api/recall-core.js +14 -6
  50. package/dist/api/recall-finish.d.ts +53 -0
  51. package/dist/api/recall-finish.js +30 -0
  52. package/dist/api/recall-history.d.ts +17 -84
  53. package/dist/api/recall-history.js +15 -88
  54. package/dist/api/recall-pipeline.d.ts +2 -3
  55. package/dist/api/recall-pipeline.js +16 -9
  56. package/dist/api/recall-types.d.ts +64 -304
  57. package/dist/api/recall.d.ts +5 -33
  58. package/dist/api/recall.js +59 -60
  59. package/dist/api/refine.d.ts +7 -0
  60. package/dist/api/refine.js +10 -0
  61. package/dist/api/remember-local.d.ts +57 -0
  62. package/dist/api/remember-local.js +90 -0
  63. package/dist/api/remember.d.ts +18 -1
  64. package/dist/api/remember.js +13 -1
  65. package/dist/api/sleep-run.d.ts +1 -3
  66. package/dist/api/sleep-run.js +17 -21
  67. package/dist/api/sleep.d.ts +9 -28
  68. package/dist/api/tokens.d.ts +3 -10
  69. package/dist/api/tokens.js +3 -10
  70. package/dist/api/types.d.ts +6 -29
  71. package/dist/api/types.js +4 -22
  72. package/dist/capture/command.d.ts +4 -12
  73. package/dist/capture/command.js +6 -22
  74. package/dist/capture/compact.d.ts +4 -15
  75. package/dist/capture/compact.js +16 -25
  76. package/dist/capture/compaction-record.js +101 -69
  77. package/dist/capture/compaction-spool.d.ts +1 -1
  78. package/dist/capture/compaction-spool.js +1 -1
  79. package/dist/capture/session-digest.d.ts +1 -1
  80. package/dist/capture/session-digest.js +13 -7
  81. package/dist/capture/transcript.d.ts +2 -10
  82. package/dist/capture/transcript.js +4 -18
  83. package/dist/cli/api-context.d.ts +3 -0
  84. package/dist/cli/api-context.js +6 -0
  85. package/dist/cli/audit-prune.d.ts +6 -39
  86. package/dist/cli/audit-prune.js +6 -39
  87. package/dist/cli/audit.d.ts +1 -1
  88. package/dist/cli/audit.js +33 -34
  89. package/dist/cli/auth.d.ts +2 -2
  90. package/dist/cli/auth.js +57 -39
  91. package/dist/cli/briefs.d.ts +4 -4
  92. package/dist/cli/briefs.js +18 -22
  93. package/dist/cli/card.d.ts +2 -2
  94. package/dist/cli/card.js +31 -32
  95. package/dist/cli/client.d.ts +7 -27
  96. package/dist/cli/client.js +24 -43
  97. package/dist/cli/compact-resume-payload.js +3 -2
  98. package/dist/cli/context.d.ts +1 -2
  99. package/dist/cli/context.js +12 -8
  100. package/dist/cli/continuity.d.ts +6 -6
  101. package/dist/cli/continuity.js +62 -64
  102. package/dist/cli/correction-latency.d.ts +2 -14
  103. package/dist/cli/correction-latency.js +2 -14
  104. package/dist/cli/curate.d.ts +13 -17
  105. package/dist/cli/curate.js +68 -92
  106. package/dist/cli/dag.d.ts +4 -4
  107. package/dist/cli/dag.js +33 -27
  108. package/dist/cli/decisions.d.ts +4 -4
  109. package/dist/cli/decisions.js +33 -47
  110. package/dist/cli/eval.js +15 -13
  111. package/dist/cli/exit.d.ts +6 -0
  112. package/dist/cli/exit.js +11 -0
  113. package/dist/cli/explain.d.ts +1 -2
  114. package/dist/cli/explain.js +6 -4
  115. package/dist/cli/flag-values.d.ts +6 -1
  116. package/dist/cli/flag-values.js +27 -10
  117. package/dist/cli/flags.d.ts +1 -0
  118. package/dist/cli/flags.js +1 -1
  119. package/dist/cli/github.d.ts +14 -0
  120. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  121. package/dist/cli/goals.d.ts +2 -2
  122. package/dist/cli/goals.js +46 -50
  123. package/dist/cli/hook-runtime.d.ts +9 -27
  124. package/dist/cli/hook-runtime.js +15 -31
  125. package/dist/cli/init.d.ts +2 -2
  126. package/dist/cli/init.js +6 -12
  127. package/dist/cli/install-steps.js +3 -12
  128. package/dist/cli/last-sleep.d.ts +2 -1
  129. package/dist/cli/last-sleep.js +3 -0
  130. package/dist/cli/maintenance.d.ts +4 -4
  131. package/dist/cli/maintenance.js +14 -19
  132. package/dist/cli/object-verbs.js +4 -3
  133. package/dist/cli/owner-validation.d.ts +5 -28
  134. package/dist/cli/owner-validation.js +5 -28
  135. package/dist/cli/playbooks.d.ts +4 -4
  136. package/dist/cli/playbooks.js +23 -28
  137. package/dist/cli/print.d.ts +2 -5
  138. package/dist/cli/print.js +1 -4
  139. package/dist/cli/projects.d.ts +2 -2
  140. package/dist/cli/projects.js +1 -3
  141. package/dist/cli/provenance-coverage.d.ts +2 -6
  142. package/dist/cli/provenance-coverage.js +2 -6
  143. package/dist/cli/quality-repair-once.js +2 -2
  144. package/dist/cli/recall.d.ts +2 -4
  145. package/dist/cli/recall.js +55 -131
  146. package/dist/cli/refine-llm.d.ts +5 -31
  147. package/dist/cli/refine-llm.js +9 -36
  148. package/dist/cli/remember.d.ts +3 -3
  149. package/dist/cli/remember.js +122 -180
  150. package/dist/cli/scheduler.d.ts +2 -17
  151. package/dist/cli/scheduler.js +12 -18
  152. package/dist/cli/serve.js +21 -12
  153. package/dist/cli/session-hooks.d.ts +10 -18
  154. package/dist/cli/session-hooks.js +112 -113
  155. package/dist/cli/setup.d.ts +4 -4
  156. package/dist/cli/setup.js +19 -21
  157. package/dist/cli/shared.d.ts +9 -23
  158. package/dist/cli/shared.js +9 -32
  159. package/dist/cli/slack.d.ts +2 -2
  160. package/dist/cli/slack.js +19 -23
  161. package/dist/cli/sleep.d.ts +3 -2
  162. package/dist/cli/sleep.js +15 -16
  163. package/dist/cli/status.d.ts +9 -12
  164. package/dist/cli/status.js +55 -98
  165. package/dist/cli/stdin.d.ts +4 -6
  166. package/dist/cli/stdin.js +2 -3
  167. package/dist/cli/transfer.d.ts +9 -9
  168. package/dist/cli/transfer.js +66 -89
  169. package/dist/cli/usage.js +11 -5
  170. package/dist/cli.d.ts +66 -448
  171. package/dist/cli.js +87 -263
  172. package/dist/connectors/github/backfill.d.ts +5 -25
  173. package/dist/connectors/github/backfill.js +14 -49
  174. package/dist/connectors/github/deletion.d.ts +4 -18
  175. package/dist/connectors/github/deletion.js +2 -15
  176. package/dist/connectors/github/dlq.d.ts +8 -33
  177. package/dist/connectors/github/dlq.js +12 -29
  178. package/dist/connectors/github/ingest.d.ts +2 -6
  179. package/dist/connectors/github/ingest.js +4 -10
  180. package/dist/connectors/github/octokit-client.d.ts +4 -16
  181. package/dist/connectors/github/octokit-client.js +27 -24
  182. package/dist/connectors/github/ratelimit.d.ts +3 -14
  183. package/dist/connectors/github/ratelimit.js +3 -14
  184. package/dist/connectors/github/scope.d.ts +3 -5
  185. package/dist/connectors/github/scope.js +3 -5
  186. package/dist/connectors/github/signature.d.ts +4 -26
  187. package/dist/connectors/github/signature.js +4 -26
  188. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  189. package/dist/connectors/github/tenant-routing.js +4 -26
  190. package/dist/connectors/github/transform.js +2 -16
  191. package/dist/connectors/github/types.d.ts +3 -15
  192. package/dist/connectors/github/types.js +2 -9
  193. package/dist/connectors/github/webhook.d.ts +2 -16
  194. package/dist/connectors/github/webhook.js +6 -22
  195. package/dist/connectors/slack/backfill.d.ts +4 -17
  196. package/dist/connectors/slack/backfill.js +4 -13
  197. package/dist/connectors/slack/dlq.d.ts +2 -19
  198. package/dist/connectors/slack/dlq.js +2 -19
  199. package/dist/connectors/slack/ingest.d.ts +2 -3
  200. package/dist/connectors/slack/ingest.js +2 -3
  201. package/dist/connectors/slack/scope.d.ts +2 -8
  202. package/dist/connectors/slack/scope.js +2 -8
  203. package/dist/connectors/slack/signature.d.ts +1 -6
  204. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  205. package/dist/connectors/slack/tenant-routing.js +2 -21
  206. package/dist/connectors/slack/transform.d.ts +2 -18
  207. package/dist/connectors/slack/transform.js +2 -18
  208. package/dist/connectors/slack/types.d.ts +3 -9
  209. package/dist/connectors/slack/types.js +2 -4
  210. package/dist/connectors/slack/web-client.js +33 -27
  211. package/dist/connectors/slack/webhook.d.ts +2 -19
  212. package/dist/connectors/slack/webhook.js +5 -26
  213. package/dist/connectors/slack/workspaces.d.ts +4 -24
  214. package/dist/connectors/slack/workspaces.js +4 -24
  215. package/dist/consolidate/conflicts.js +6 -14
  216. package/dist/consolidate/dag-summary.d.ts +8 -0
  217. package/dist/consolidate/dag-summary.js +41 -0
  218. package/dist/consolidate/dag.d.ts +5 -28
  219. package/dist/consolidate/dag.js +14 -75
  220. package/dist/consolidate/decay.js +7 -19
  221. package/dist/consolidate/dedupe.d.ts +6 -52
  222. package/dist/consolidate/dedupe.js +13 -71
  223. package/dist/consolidate/flush-units.d.ts +3 -4
  224. package/dist/consolidate/flush-units.js +3 -3
  225. package/dist/consolidate/half-life-migration.d.ts +3 -26
  226. package/dist/consolidate/half-life-migration.js +11 -28
  227. package/dist/consolidate/llm-passes.js +4 -21
  228. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  229. package/dist/consolidate/memory-value-weights.js +2 -13
  230. package/dist/consolidate/memory-value.d.ts +11 -84
  231. package/dist/consolidate/memory-value.js +16 -104
  232. package/dist/consolidate/merge.js +10 -31
  233. package/dist/consolidate/merged-row.js +2 -1
  234. package/dist/consolidate/physics-pass.js +1 -3
  235. package/dist/consolidate/replay.d.ts +6 -38
  236. package/dist/consolidate/replay.js +14 -52
  237. package/dist/consolidate/run.js +1 -1
  238. package/dist/consolidate/sleep.d.ts +1 -8
  239. package/dist/consolidate/sleep.js +5 -17
  240. package/dist/consolidate/trace.d.ts +3 -18
  241. package/dist/consolidate/trace.js +3 -18
  242. package/dist/consolidate/traces.js +6 -22
  243. package/dist/core/ablation.d.ts +4 -91
  244. package/dist/core/ablation.js +4 -91
  245. package/dist/core/ambient.d.ts +1 -8
  246. package/dist/core/ambient.js +1 -8
  247. package/dist/core/capture-contract.d.ts +4 -2
  248. package/dist/core/capture-contract.js +4 -2
  249. package/dist/core/card.d.ts +4 -1
  250. package/dist/core/card.js +8 -0
  251. package/dist/core/compare.d.ts +11 -67
  252. package/dist/core/compare.js +9 -63
  253. package/dist/core/config.d.ts +10 -24
  254. package/dist/core/config.js +13 -14
  255. package/dist/core/handoff.d.ts +1 -7
  256. package/dist/core/handoff.js +1 -7
  257. package/dist/core/memory-quality.js +1 -1
  258. package/dist/core/memory.d.ts +41 -164
  259. package/dist/core/memory.js +51 -221
  260. package/dist/core/package-root.d.ts +3 -0
  261. package/dist/core/package-root.js +5 -0
  262. package/dist/core/physics-config.d.ts +1 -4
  263. package/dist/core/physics-config.js +3 -8
  264. package/dist/core/physics.d.ts +15 -61
  265. package/dist/core/physics.js +59 -122
  266. package/dist/core/project-identity.d.ts +17 -58
  267. package/dist/core/project-identity.js +17 -38
  268. package/dist/core/project-remote.js +13 -2
  269. package/dist/core/raw-append-only.d.ts +5 -0
  270. package/dist/core/raw-append-only.js +7 -0
  271. package/dist/core/salience.d.ts +1 -7
  272. package/dist/core/salience.js +1 -7
  273. package/dist/dashboard/dashboard-actions.js +2 -2
  274. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  275. package/dist/dashboard/dashboard-snapshot.js +11 -2
  276. package/dist/dashboard/dashboard-types.d.ts +2 -1
  277. package/dist/dashboard/dashboard.d.ts +1 -0
  278. package/dist/dashboard/dashboard.js +50 -4
  279. package/dist/db/busy.d.ts +1 -1
  280. package/dist/db/busy.js +17 -8
  281. package/dist/db/connect.d.ts +1 -0
  282. package/dist/db/connect.js +3 -3
  283. package/dist/db/migrate.js +3 -3
  284. package/dist/db/migrations/types.d.ts +2 -5
  285. package/dist/db/migrations/v14.js +2 -3
  286. package/dist/db/migrations/v15.js +2 -8
  287. package/dist/db/migrations/v16.js +2 -3
  288. package/dist/db/migrations/v17.js +2 -3
  289. package/dist/db/migrations/v19.js +2 -5
  290. package/dist/db/migrations/v20.js +2 -7
  291. package/dist/db/migrations/v22.js +4 -17
  292. package/dist/db/migrations/v23.js +3 -14
  293. package/dist/db/migrations/v24.js +2 -4
  294. package/dist/db/migrations/v25.js +3 -8
  295. package/dist/db/migrations/v26.js +2 -13
  296. package/dist/db/migrations/v27.js +3 -11
  297. package/dist/db/migrations/v28.js +2 -14
  298. package/dist/db/migrations/v29.js +4 -18
  299. package/dist/db/migrations/v30.js +4 -16
  300. package/dist/db/migrations/v31.js +2 -15
  301. package/dist/db/migrations/v32.js +4 -22
  302. package/dist/db/migrations/v33.js +2 -15
  303. package/dist/db/migrations/v34.js +2 -11
  304. package/dist/db/migrations/v35.js +2 -11
  305. package/dist/db/migrations/v36.js +2 -11
  306. package/dist/db/migrations/v37.js +8 -33
  307. package/dist/db/migrations/v38.js +5 -38
  308. package/dist/db/migrations/v39.js +9 -20
  309. package/dist/db/migrations/v40.js +2 -9
  310. package/dist/db/migrations/v41.js +2 -24
  311. package/dist/db/migrations/v43.js +1 -1
  312. package/dist/db/migrations/v44.js +2 -8
  313. package/dist/db/migrations/v45.js +2 -7
  314. package/dist/db/migrations/v47.js +2 -3
  315. package/dist/db/migrations/v51.js +1 -1
  316. package/dist/db/open.d.ts +2 -0
  317. package/dist/db/open.js +17 -1
  318. package/dist/db/physics-state.d.ts +6 -22
  319. package/dist/db/physics-state.js +25 -36
  320. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  321. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  322. package/dist/db/vector-store.d.ts +2 -0
  323. package/dist/db/vector-store.js +8 -1
  324. package/dist/doctor.js +74 -19
  325. package/dist/entry/session-text.js +2 -1
  326. package/dist/eval/eval-stats.d.ts +15 -53
  327. package/dist/eval/eval-stats.js +12 -42
  328. package/dist/eval/eval-suite.d.ts +2 -13
  329. package/dist/eval/eval-suite.js +74 -34
  330. package/dist/eval/eval.d.ts +6 -24
  331. package/dist/eval/eval.js +7 -34
  332. package/dist/eval/judgment.d.ts +0 -3
  333. package/dist/eval/judgment.js +19 -11
  334. package/dist/extensions/openclaw-plugin/index.js +1 -1
  335. package/dist/graph/extract.d.ts +5 -27
  336. package/dist/graph/extract.js +7 -33
  337. package/dist/graph/recall.d.ts +7 -20
  338. package/dist/graph/recall.js +14 -76
  339. package/dist/graph/stream.d.ts +7 -39
  340. package/dist/graph/stream.js +11 -34
  341. package/dist/graph/view.d.ts +9 -35
  342. package/dist/graph/view.js +11 -39
  343. package/dist/hooks/codex-wrapper.js +2 -2
  344. package/dist/hooks/copilot.js +2 -1
  345. package/dist/hooks/hook-blocks.d.ts +6 -2
  346. package/dist/hooks/hook-blocks.js +37 -124
  347. package/dist/hooks/json-hooks.d.ts +4 -36
  348. package/dist/hooks/json-hooks.js +18 -57
  349. package/dist/hooks/opencode.d.ts +0 -38
  350. package/dist/hooks/opencode.js +9 -76
  351. package/dist/hooks/shared.d.ts +8 -17
  352. package/dist/hooks/shared.js +29 -20
  353. package/dist/importers/core.d.ts +12 -37
  354. package/dist/importers/core.js +9 -27
  355. package/dist/importers/markdown-parse.d.ts +8 -22
  356. package/dist/importers/markdown-parse.js +8 -25
  357. package/dist/importers/markdown.js +3 -12
  358. package/dist/importers/sources.js +7 -35
  359. package/dist/importers/vault.d.ts +2 -8
  360. package/dist/importers/vault.js +25 -81
  361. package/dist/index.d.ts +6 -2
  362. package/dist/index.js +6 -2
  363. package/dist/learn/autolearn.d.ts +14 -41
  364. package/dist/learn/autolearn.js +14 -41
  365. package/dist/learn/extract.js +2 -4
  366. package/dist/learn/forward-claim-detector.d.ts +6 -30
  367. package/dist/learn/forward-claim-detector.js +14 -66
  368. package/dist/learn/invalidation.d.ts +6 -18
  369. package/dist/learn/invalidation.js +9 -26
  370. package/dist/mcp/admin-tools.js +3 -5
  371. package/dist/mcp/memory-tools.js +4 -9
  372. package/dist/mcp/protocol.d.ts +8 -26
  373. package/dist/mcp/protocol.js +3 -6
  374. package/dist/mcp/recall-tools.js +3 -3
  375. package/dist/mcp/request.d.ts +3 -11
  376. package/dist/mcp/request.js +10 -26
  377. package/dist/mcp/server.d.ts +3 -9
  378. package/dist/mcp/server.js +5 -16
  379. package/dist/mcp/session-state.d.ts +1 -1
  380. package/dist/mcp/session-state.js +5 -11
  381. package/dist/mcp/stdio.d.ts +2 -6
  382. package/dist/mcp/stdio.js +48 -12
  383. package/dist/mcp/tools.js +5 -3
  384. package/dist/objects/customer-notes.d.ts +7 -42
  385. package/dist/objects/customer-notes.js +7 -48
  386. package/dist/objects/decisions.d.ts +12 -50
  387. package/dist/objects/decisions.js +15 -53
  388. package/dist/objects/incidents.d.ts +7 -38
  389. package/dist/objects/incidents.js +7 -41
  390. package/dist/objects/policies.d.ts +11 -89
  391. package/dist/objects/policies.js +11 -98
  392. package/dist/objects/processes.d.ts +7 -52
  393. package/dist/objects/processes.js +7 -61
  394. package/dist/objects/project-briefs.d.ts +11 -55
  395. package/dist/objects/project-briefs.js +14 -75
  396. package/dist/objects/skills.d.ts +7 -42
  397. package/dist/objects/skills.js +8 -54
  398. package/dist/postinstall.js +6 -19
  399. package/dist/predictions/planning-fallacy.d.ts +11 -34
  400. package/dist/rerankers/clef.js +3 -31
  401. package/dist/rerankers/cross-encoder.js +4 -6
  402. package/dist/rerankers/jev.js +9 -6
  403. package/dist/rerankers/llm.d.ts +2 -11
  404. package/dist/rerankers/llm.js +14 -14
  405. package/dist/rerankers/outage-warning.d.ts +2 -1
  406. package/dist/rerankers/outage-warning.js +2 -1
  407. package/dist/rerankers/remote.d.ts +1 -0
  408. package/dist/rerankers/remote.js +2 -0
  409. package/dist/rerankers/types.d.ts +2 -14
  410. package/dist/search/boosts.d.ts +0 -2
  411. package/dist/search/boosts.js +2 -2
  412. package/dist/search/goal-boost.d.ts +23 -0
  413. package/dist/search/goal-boost.js +90 -0
  414. package/dist/search/hybrid.d.ts +2 -0
  415. package/dist/search/multihop.js +2 -3
  416. package/dist/search/path-context.d.ts +5 -18
  417. package/dist/search/path-context.js +5 -18
  418. package/dist/search/physics-search.js +11 -8
  419. package/dist/search/rrf.d.ts +7 -35
  420. package/dist/search/rrf.js +5 -30
  421. package/dist/search/vector.d.ts +7 -0
  422. package/dist/search/vector.js +35 -5
  423. package/dist/server/auth.d.ts +9 -28
  424. package/dist/server/auth.js +32 -25
  425. package/dist/server/boot.d.ts +2 -21
  426. package/dist/server/boot.js +63 -96
  427. package/dist/server/client-ip.d.ts +3 -19
  428. package/dist/server/client-ip.js +5 -28
  429. package/dist/server/defaults.d.ts +3 -0
  430. package/dist/server/defaults.js +4 -0
  431. package/dist/server/key-check-bounds.d.ts +2 -1
  432. package/dist/server/lifecycle.d.ts +5 -4
  433. package/dist/server/lifecycle.js +19 -4
  434. package/dist/server/mcp-http.js +10 -44
  435. package/dist/server/rate-limit.d.ts +5 -18
  436. package/dist/server/rate-limit.js +4 -13
  437. package/dist/server/request.d.ts +4 -8
  438. package/dist/server/request.js +9 -17
  439. package/dist/server/route-table.js +42 -49
  440. package/dist/server/routes/admin.js +22 -28
  441. package/dist/server/routes/customer-notes.js +7 -12
  442. package/dist/server/routes/decisions.js +10 -17
  443. package/dist/server/routes/incidents.js +12 -20
  444. package/dist/server/routes/memories.js +12 -32
  445. package/dist/server/routes/object-routes.d.ts +0 -5
  446. package/dist/server/routes/object-routes.js +7 -15
  447. package/dist/server/routes/policies.js +10 -18
  448. package/dist/server/routes/predictions.js +13 -25
  449. package/dist/server/routes/processes.js +16 -26
  450. package/dist/server/routes/project-briefs.js +9 -16
  451. package/dist/server/routes/recall.js +10 -35
  452. package/dist/server/routes/skills.js +8 -18
  453. package/dist/server/server-detect.d.ts +9 -53
  454. package/dist/server/server-detect.js +24 -90
  455. package/dist/server/sleep-offload.js +4 -1
  456. package/dist/server/types.d.ts +12 -10
  457. package/dist/server/validation.d.ts +3 -1
  458. package/dist/server/validation.js +10 -23
  459. package/dist/server.d.ts +2 -2
  460. package/dist/server.js +3 -2
  461. package/dist/sharing/global-store.d.ts +19 -0
  462. package/dist/sharing/global-store.js +75 -0
  463. package/dist/sharing/global-sync.d.ts +6 -0
  464. package/dist/sharing/global-sync.js +80 -0
  465. package/dist/sharing/project-merge.d.ts +4 -5
  466. package/dist/sharing/project-merge.js +9 -7
  467. package/dist/sharing/scope.d.ts +4 -11
  468. package/dist/sharing/scope.js +4 -11
  469. package/dist/sharing/search-both.d.ts +60 -0
  470. package/dist/sharing/search-both.js +138 -0
  471. package/dist/sharing/share.d.ts +38 -0
  472. package/dist/sharing/share.js +226 -0
  473. package/dist/store/ambient.js +4 -9
  474. package/dist/store/audit-event.d.ts +4 -12
  475. package/dist/store/audit-event.js +4 -12
  476. package/dist/store/audit.d.ts +2 -5
  477. package/dist/store/audit.js +4 -12
  478. package/dist/store/auth.d.ts +6 -6
  479. package/dist/store/auth.js +10 -9
  480. package/dist/store/candidates.d.ts +20 -3
  481. package/dist/store/candidates.js +77 -48
  482. package/dist/store/card-detail.d.ts +2 -1
  483. package/dist/store/card-detail.js +2 -1
  484. package/dist/store/cards.d.ts +14 -9
  485. package/dist/store/cards.js +72 -126
  486. package/dist/store/conflicts.d.ts +4 -21
  487. package/dist/store/conflicts.js +71 -150
  488. package/dist/store/connectors/github.d.ts +10 -10
  489. package/dist/store/connectors/github.js +10 -10
  490. package/dist/store/dashboard-reads.js +4 -8
  491. package/dist/store/delete-and-batch.d.ts +11 -31
  492. package/dist/store/delete-and-batch.js +48 -64
  493. package/dist/store/delivery-recorder.d.ts +8 -4
  494. package/dist/store/delivery-recorder.js +25 -15
  495. package/dist/store/diagnostics.js +6 -13
  496. package/dist/store/dormant.d.ts +7 -29
  497. package/dist/store/dormant.js +15 -56
  498. package/dist/store/embeddings/index.d.ts +11 -80
  499. package/dist/store/embeddings/index.js +71 -207
  500. package/dist/store/embeddings/local.js +15 -32
  501. package/dist/store/embeddings/provider.d.ts +16 -53
  502. package/dist/store/embeddings/provider.js +41 -69
  503. package/dist/store/entry-reads.d.ts +21 -57
  504. package/dist/store/entry-reads.js +65 -126
  505. package/dist/store/entry-row.d.ts +6 -35
  506. package/dist/store/entry-row.js +9 -37
  507. package/dist/store/entry-writes.d.ts +10 -16
  508. package/dist/store/entry-writes.js +17 -35
  509. package/dist/store/goals.d.ts +3 -40
  510. package/dist/store/goals.js +21 -160
  511. package/dist/store/graph-queue.d.ts +6 -22
  512. package/dist/store/graph-queue.js +14 -45
  513. package/dist/store/graph-reads.d.ts +11 -35
  514. package/dist/store/graph-reads.js +20 -58
  515. package/dist/store/graph-rows.d.ts +3 -6
  516. package/dist/store/graph-rows.js +6 -9
  517. package/dist/store/graph-view-rows.d.ts +2 -1
  518. package/dist/store/graph-view-rows.js +2 -1
  519. package/dist/store/graph-writes.d.ts +6 -31
  520. package/dist/store/graph-writes.js +13 -37
  521. package/dist/store/half-life.d.ts +2 -1
  522. package/dist/store/half-life.js +14 -16
  523. package/dist/store/handoffs.d.ts +5 -11
  524. package/dist/store/handoffs.js +16 -34
  525. package/dist/store/index-and-stats.d.ts +6 -19
  526. package/dist/store/index-and-stats.js +34 -82
  527. package/dist/store/markdown.d.ts +2 -6
  528. package/dist/store/markdown.js +21 -20
  529. package/dist/store/mirrors.d.ts +2 -6
  530. package/dist/store/mirrors.js +14 -23
  531. package/dist/store/open.js +6 -13
  532. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  533. package/dist/store/planning-fallacy-evidence.js +8 -37
  534. package/dist/store/port.d.ts +82 -79
  535. package/dist/store/predictions.d.ts +11 -51
  536. package/dist/store/predictions.js +38 -119
  537. package/dist/{cli → store}/quality-repair.js +15 -31
  538. package/dist/store/raw-archive.d.ts +4 -16
  539. package/dist/store/raw-archive.js +14 -29
  540. package/dist/store/recall-scope.d.ts +19 -79
  541. package/dist/store/recall-scope.js +21 -82
  542. package/dist/store/recall-trace.d.ts +10 -77
  543. package/dist/store/recall-trace.js +19 -95
  544. package/dist/store/rejected-values.js +7 -19
  545. package/dist/store/rejection.d.ts +12 -58
  546. package/dist/store/rejection.js +13 -65
  547. package/dist/store/report-reads.d.ts +6 -0
  548. package/dist/store/report-reads.js +29 -0
  549. package/dist/store/rows.d.ts +9 -19
  550. package/dist/store/rows.js +36 -34
  551. package/dist/store/rule-sql.d.ts +5 -0
  552. package/dist/store/rule-sql.js +37 -0
  553. package/dist/store/search-rows.d.ts +7 -38
  554. package/dist/store/search-rows.js +14 -50
  555. package/dist/store/sessions.d.ts +10 -47
  556. package/dist/store/sessions.js +17 -73
  557. package/dist/store/sqlite/connector-events-group.js +2 -2
  558. package/dist/store/sqlite/entry-writes-group.js +2 -2
  559. package/dist/store/sqlite/error-codec.js +4 -2
  560. package/dist/store/sqlite/executor.d.ts +2 -1
  561. package/dist/store/sqlite/executor.js +2 -1
  562. package/dist/store/sqlite/local.d.ts +3 -3
  563. package/dist/store/sqlite/local.js +1 -0
  564. package/dist/store/sqlite/object-rows.js +6 -3
  565. package/dist/store/sqlite/objects-group.js +4 -2
  566. package/dist/store/sqlite/quarantine-group.js +2 -2
  567. package/dist/store/sqlite/store.d.ts +1 -4
  568. package/dist/store/sqlite/store.js +2 -3
  569. package/dist/store/sqlite/vector-reads-group.js +2 -2
  570. package/dist/store/sqlite/worker-jobs.js +1 -1
  571. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  572. package/dist/store/sqlite/worker-ops.js +13 -2
  573. package/dist/store/sqlite/worker-store.js +5 -2
  574. package/dist/store/summaries.d.ts +10 -62
  575. package/dist/store/summaries.js +34 -146
  576. package/dist/store/summary-dirty.js +1 -1
  577. package/dist/store/tenant-lookup.d.ts +6 -1
  578. package/dist/store/tenant-lookup.js +7 -0
  579. package/dist/store/tenant.d.ts +2 -16
  580. package/dist/store/tenant.js +4 -19
  581. package/dist/store/token-ledger.d.ts +13 -43
  582. package/dist/store/token-ledger.js +19 -50
  583. package/dist/store/usage-reports.js +5 -13
  584. package/dist/store/vector-index.d.ts +46 -0
  585. package/dist/store/vector-index.js +170 -0
  586. package/dist/store/working-memory.d.ts +6 -25
  587. package/dist/store/working-memory.js +18 -52
  588. package/dist/store/yaml.d.ts +1 -5
  589. package/dist/store/yaml.js +2 -6
  590. package/dist/support-bundle.js +7 -5
  591. package/dist/trust/reject-flow.js +1 -3
  592. package/dist/util/anthropic-messages.js +14 -2
  593. package/dist/util/atomic-write.d.ts +2 -1
  594. package/dist/util/atomic-write.js +35 -4
  595. package/dist/util/capped-json.d.ts +6 -0
  596. package/dist/util/capped-json.js +46 -0
  597. package/dist/util/crash-handlers.d.ts +8 -1
  598. package/dist/util/crash-handlers.js +52 -10
  599. package/dist/util/env.d.ts +13 -6
  600. package/dist/util/env.js +14 -7
  601. package/dist/util/home-path.d.ts +2 -1
  602. package/dist/util/home-path.js +4 -2
  603. package/dist/util/http-retry.d.ts +3 -1
  604. package/dist/util/http-retry.js +26 -5
  605. package/dist/util/log.d.ts +3 -2
  606. package/dist/util/log.js +25 -9
  607. package/dist/util/request-scope.d.ts +2 -1
  608. package/dist/util/request-scope.js +2 -1
  609. package/dist/util/secret-detect.d.ts +5 -30
  610. package/dist/util/secret-detect.js +13 -39
  611. package/dist/util/stored-json.d.ts +1 -1
  612. package/dist/util/stored-json.js +1 -1
  613. package/dist/util/token-text.d.ts +1 -4
  614. package/dist/util/token-text.js +1 -4
  615. package/dist/util/transcript-tail.d.ts +2 -0
  616. package/dist/util/transcript-tail.js +24 -23
  617. package/dist/util/version.d.ts +5 -20
  618. package/dist/util/version.js +5 -20
  619. package/extensions/openclaw-plugin/index.ts +1 -1
  620. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  621. package/extensions/openclaw-plugin/package.json +1 -1
  622. package/openclaw.plugin.json +1 -1
  623. package/package.json +1 -1
  624. package/dist/connectors/github/cli-impl.d.ts +0 -25
  625. package/dist/sharing/shared.d.ts +0 -187
  626. package/dist/sharing/shared.js +0 -563
  627. package/dist/store/vector-writes.d.ts +0 -13
  628. package/dist/store/vector-writes.js +0 -89
  629. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
@@ -1,41 +1,17 @@
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
- */
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. */
29
4
  import { type EmbeddingRole } from './local.js';
30
5
  export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
31
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 runs in process and ignores it. */
9
+ signal?: AbortSignal;
10
+ }
32
11
  export interface EmbeddingProvider {
33
12
  readonly kind: EmbeddingProviderKind;
34
13
  readonly model: string;
35
- /**
36
- * Identity recorded in DB meta to drive reindex-on-change.
37
- * local -> bare model string (back-compat); api -> `${kind}:${model}`.
38
- */
14
+ /** Identity recorded in DB meta to drive reindex-on-change: bare model string for local, `${kind}:${model}` for api. */
39
15
  readonly id: string;
40
16
  /** Known fixed output dimension, if any (undefined for local / unknown). */
41
17
  readonly dimensions?: number;
@@ -43,12 +19,9 @@ export interface EmbeddingProvider {
43
19
  readonly keyEnv?: string;
44
20
  /** local -> dependency installed; api -> key present. NEVER throws. */
45
21
  isAvailable(): boolean;
46
- /**
47
- * Batch-embed. Returns one row per input in order; a row is `[]` when that
48
- * single item could not be embedded. MAY throw on a hard transport/auth
49
- * failure (so a reindex aborts before saving a partial index).
50
- */
51
- embed(texts: string[], role?: EmbeddingRole): Promise<number[][]>;
22
+ /** Batch-embed: one row per input in order, `[]` when that item could not be embedded.
23
+ * MAY throw on a hard transport/auth failure so a reindex aborts before saving a partial index. */
24
+ embed(texts: string[], role?: EmbeddingRole, call?: EmbedCallOptions): Promise<number[][]>;
52
25
  }
53
26
  export interface ResolveProviderOptions {
54
27
  /** Explicit model override (mirrors resolveEmbeddingModel's explicitModel). */
@@ -56,22 +29,12 @@ export interface ResolveProviderOptions {
56
29
  /** Explicit provider override (mainly for tests). */
57
30
  provider?: EmbeddingProviderKind;
58
31
  }
59
- /**
60
- * Build the active embedding provider from config (or an explicit override).
61
- * Never throws for a missing key — that surfaces via `isAvailable()` on the hot
62
- * paths and as a hard error only from the explicit `hippo embed` command. The
63
- * only hard throw is an invalid config (e.g. an insecure apiBaseUrl), a
64
- * deliberate loud failure; hot-path callers (search) wrap this in try/catch.
65
- */
32
+ /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
33
+ * only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
66
34
  export declare function resolveEmbeddingProvider(hippoRoot: string, opts?: ResolveProviderOptions): EmbeddingProvider;
67
- /**
68
- * The reindex identity for the active provider. Use this (NOT resolveEmbeddingModel)
69
- * everywhere `embeddingModelRequiresReindex` / stored-model comparisons happen.
70
- */
35
+ /** The reindex identity for the active provider; use it, NOT resolveEmbeddingModel, wherever `embeddingModelRequiresReindex` / stored-model comparisons
36
+ * happen. */
71
37
  export declare function resolveEmbeddingIdentity(hippoRoot: string, opts?: ResolveProviderOptions): string;
72
- /**
73
- * Provider-aware availability for a store: local -> dependency installed;
74
- * api -> key present. Use at the call sites that decide whether to embed.
75
- */
38
+ /** Provider-aware availability for a store (local: dependency installed; api: key present); use where the decision to embed is made. */
76
39
  export declare function isEmbeddingConfigured(hippoRoot: string): boolean;
77
40
  //# 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
- */
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. */
29
4
  import { envByName } from '../../util/env.js';
30
5
  import { getEmbedding, isEmbeddingAvailable, requireLocalPipeline, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './local.js';
31
6
  import { loadConfig } from '../../core/config.js';
32
7
  import { errorMessage, log } from '../../util/log.js';
33
8
  import { redactSecretsStrict } from '../../util/secret-detect.js';
34
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,9 +22,8 @@ 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;
@@ -78,8 +58,7 @@ const API_PROVIDER_SPECS = {
78
58
  // OpenAI has no asymmetric query/passage input type for embeddings.
79
59
  buildBody: (model, texts) => ({ model, input: texts }),
80
60
  extractVectors: (json) => {
81
- // SAFETY: OpenAI's documented embeddings response envelope; embedChunk
82
- // validates vector count/non-emptiness against the request afterward,
61
+ // SAFETY: OpenAI's documented embeddings envelope; embedChunk validates vector count and non-emptiness afterward,
83
62
  // so a malformed response degrades to [] here and throws there.
84
63
  const data = json.data ?? [];
85
64
  return data.map((d) => d.embedding ?? []);
@@ -97,8 +76,7 @@ const API_PROVIDER_SPECS = {
97
76
  return body;
98
77
  },
99
78
  extractVectors: (json) => {
100
- // SAFETY: Voyage's documented embeddings response envelope; embedChunk
101
- // validates vector count/non-emptiness against the request afterward,
79
+ // SAFETY: Voyage's documented embeddings envelope; embedChunk validates vector count and non-emptiness afterward,
102
80
  // so a malformed response degrades to [] here and throws there.
103
81
  const data = json.data ?? [];
104
82
  return data.map((d) => d.embedding ?? []);
@@ -116,10 +94,8 @@ const API_PROVIDER_SPECS = {
116
94
  embedding_types: ['float'],
117
95
  }),
118
96
  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.
97
+ // Cohere v2 shape: { embeddings: { float: number[][] } }
98
+ // SAFETY: documented v2 envelope; embedChunk validates the vectors afterward, so a malformed response degrades to [] here and throws there.
123
99
  const emb = json.embeddings;
124
100
  return emb?.float ?? [];
125
101
  },
@@ -169,7 +145,7 @@ class ApiEmbeddingProvider {
169
145
  isAvailable() {
170
146
  return this.enabled && !!envByName(this.keyEnv)?.trim();
171
147
  }
172
- async embed(texts, role) {
148
+ async embed(texts, role, call = {}) {
173
149
  if (texts.length === 0)
174
150
  return [];
175
151
  const key = envByName(this.keyEnv)?.trim();
@@ -181,21 +157,19 @@ class ApiEmbeddingProvider {
181
157
  const out = [];
182
158
  for (let i = 0; i < texts.length; i += this.batchSize) {
183
159
  const chunk = texts.slice(i, i + this.batchSize);
184
- const vecs = await this.embedChunk(chunk, key, role);
160
+ const vecs = await this.embedChunk(chunk, key, role, call.signal);
185
161
  for (const v of vecs)
186
162
  out.push(v.length > 0 ? l2normalize(v) : v);
187
163
  }
188
164
  return out;
189
165
  }
190
- async embedChunk(chunk, key, role) {
166
+ async embedChunk(chunk, key, role, signal) {
191
167
  const spec = API_PROVIDER_SPECS[this.kind];
192
- const resp = await this.postChunk(chunk, key, role);
193
- const json = await this.responseJson(resp, key);
168
+ const resp = await this.postChunk(chunk, key, role, signal);
169
+ const json = await this.responseJson(resp, key, chunk.length);
194
170
  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.
171
+ // A 200 with the wrong vector count (or any empty/malformed vector) is a provider contract violation, not a per-item miss:
172
+ // throw so a reindex aborts atomically and the explicit backfill surfaces it, instead of saving []-padded rows.
199
173
  if (vectors.length !== chunk.length) {
200
174
  throw new Error(redact(`${this.kind} embeddings returned ${vectors.length} vectors for ${chunk.length} inputs`, key));
201
175
  }
@@ -206,7 +180,7 @@ class ApiEmbeddingProvider {
206
180
  }
207
181
  return vectors;
208
182
  }
209
- async postChunk(chunk, key, role) {
183
+ async postChunk(chunk, key, role, signal) {
210
184
  const spec = API_PROVIDER_SPECS[this.kind];
211
185
  const url = `${this.baseUrl.replace(/\/$/, '')}/${spec.path}`;
212
186
  try {
@@ -217,7 +191,13 @@ class ApiEmbeddingProvider {
217
191
  authorization: `Bearer ${key}`,
218
192
  },
219
193
  body: JSON.stringify(spec.buildBody(this.model, chunk.map(redactSecretsStrict), role)),
220
- }, { timeoutMs: REQUEST_TIMEOUT_MS });
194
+ signal,
195
+ }, {
196
+ timeoutMs: REQUEST_TIMEOUT_MS,
197
+ // Embedding the same text twice changes nothing on the far side, so a dropped connection or a stalled attempt is replayed.
198
+ retryTransport: true,
199
+ maxDelayMs: signal ? DEADLINE_RETRY_WAIT_CAP_MS : undefined,
200
+ });
221
201
  }
222
202
  catch (err) {
223
203
  const msg = errorMessage(err);
@@ -225,11 +205,11 @@ class ApiEmbeddingProvider {
225
205
  }
226
206
  }
227
207
  /** 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) {
208
+ async responseJson(resp, key, inputs) {
229
209
  if (!resp.ok) {
230
210
  let detail = '';
231
211
  try {
232
- detail = await resp.text();
212
+ detail = await readCappedText(resp, ERROR_BODY_MAX_BYTES);
233
213
  }
234
214
  catch {
235
215
  /* ignore body read error */
@@ -237,11 +217,13 @@ class ApiEmbeddingProvider {
237
217
  throw new Error(redact(`${this.kind} embeddings HTTP ${resp.status}: ${detail.slice(0, ERROR_DETAIL_CHARS)}`, key));
238
218
  }
239
219
  try {
240
- return await resp.json();
220
+ return await readCappedJson(resp, EMBED_REPLY_BASE_BYTES + inputs * EMBED_REPLY_BYTES_PER_INPUT);
241
221
  }
242
222
  catch (err) {
243
223
  const msg = errorMessage(err);
244
- throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key), { cause: redactedCause(err, key) });
224
+ throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key), {
225
+ cause: redactedCause(err instanceof Error && err.cause ? err.cause : err, key)
226
+ });
245
227
  }
246
228
  }
247
229
  }
@@ -273,13 +255,8 @@ function validateBaseUrl(url, fallback) {
273
255
  }
274
256
  return candidate;
275
257
  }
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
- */
258
+ /** Build the active embedding provider from config (or an explicit override). A missing key never throws here (it surfaces via `isAvailable()`);
259
+ * only an invalid config (e.g. insecure apiBaseUrl) throws, deliberately loud, so hot-path callers wrap it. */
283
260
  export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
284
261
  const cfg = readEmbeddingsConfig(hippoRoot);
285
262
  const requested = opts.provider ?? cfg.provider ?? 'local';
@@ -306,17 +283,12 @@ export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
306
283
  : DEFAULT_API_BATCH_SIZE;
307
284
  return new ApiEmbeddingProvider(kind, model, baseUrl, batchSize, enabled);
308
285
  }
309
- /**
310
- * The reindex identity for the active provider. Use this (NOT resolveEmbeddingModel)
311
- * everywhere `embeddingModelRequiresReindex` / stored-model comparisons happen.
312
- */
286
+ /** The reindex identity for the active provider; use it, NOT resolveEmbeddingModel, wherever `embeddingModelRequiresReindex` / stored-model comparisons
287
+ * happen. */
313
288
  export function resolveEmbeddingIdentity(hippoRoot, opts = {}) {
314
289
  return resolveEmbeddingProvider(hippoRoot, opts).id;
315
290
  }
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
- */
291
+ /** Provider-aware availability for a store (local: dependency installed; api: key present); use where the decision to embed is made. */
320
292
  export function isEmbeddingConfigured(hippoRoot) {
321
293
  try {
322
294
  return resolveEmbeddingProvider(hippoRoot).isAvailable();
@@ -1,13 +1,7 @@
1
1
  import type { MemoryEntry } from '../core/memory.js';
2
2
  import { type DatabaseSyncLike } from '../db/index.js';
3
3
  export declare const TENANT_IS = "+tenant_id = ?";
4
- /**
5
- * Read a memory entry by ID.
6
- *
7
- * When `tenantId` is provided, the read is scoped to that tenant (cross-tenant
8
- * lookups return null). When omitted, no tenant filter is applied — preserves
9
- * legacy single-tenant callers and the writeEntry/readEntry round-trip.
10
- */
4
+ /** Read a memory entry by ID. With `tenantId` the read is tenant-scoped (cross-tenant returns null); omitted, no tenant filter is applied. */
11
5
  export declare function readEntry(hippoRoot: string, id: string, tenantId?: string): MemoryEntry | null;
12
6
  /** Ids per `IN (...)` list: far under SQLite's bound-parameter limit, with room for the tenant filter. */
13
7
  export declare const ID_CHUNK = 500;
@@ -19,60 +13,29 @@ export declare function heldIdLookup(hippoRoot: string, tenantId: string, ids: r
19
13
  export declare function selectEntriesByIds(db: DatabaseSyncLike, ids: readonly string[], tenantId?: string): Map<string, MemoryEntry>;
20
14
  /** Direct children of each parent, one query per chunk; each list is in `created ASC, id ASC` order. */
21
15
  export declare function selectChildrenByParent(db: DatabaseSyncLike, parentIds: readonly string[], tenantId?: string): Map<string, MemoryEntry[]>;
22
- /**
23
- * Batched lookup. Caps at 500 ids per call to keep the IN(?,?,...) clause
24
- * within SQLite limits. Tenant filter is enforced when `tenantId` is passed.
25
- * Used by DAG-aware recall to fetch parent summaries for a set of overflowed leaves.
26
- */
16
+ /** Batched lookup, capped at 500 ids per call to keep IN(?,?,...) within SQLite limits; tenant filter enforced when `tenantId` is passed. */
27
17
  export declare function loadEntriesByIds(hippoRoot: string, ids: readonly string[], tenantId?: string): MemoryEntry[];
28
- /**
29
- * All `kind='raw'` rows for a given session, tenant-scoped, returned
30
- * oldest-first. Used by `api.assemble` to walk a session's chronological
31
- * context. Excludes superseded rows.
32
- *
33
- * Cap semantics: when `cap` is provided, the NEWEST `cap` rows are loaded (DESC LIMIT server-side,
34
- * reversed client-side); ASC + LIMIT would drop the newest rows and break fresh-tail in assemble.
35
- *
36
- * Returns `[]` for an empty sessionId. Final order: `created ASC, id ASC`.
37
- */
18
+ /** All `kind='raw'` rows for a session, tenant-scoped, oldest-first, excluding superseded; `[]` for an empty sessionId.
19
+ * With `cap`, the NEWEST rows are loaded (DESC LIMIT, reversed client-side); ASC + LIMIT would drop the newest and break fresh-tail in assemble. */
38
20
  export declare function loadSessionRawMemories(hippoRoot: string, sessionId: string, tenantId?: string, cap?: number, origins?: readonly string[]): MemoryEntry[];
39
- /**
40
- * Pre-cap, scope-aware row count for a session. Lets `assemble` report
41
- * the full session size even when `rowCap` truncates the loaded window,
42
- * WITHOUT leaking rows the caller wouldn't have been allowed to load.
43
- *
44
- * An unscoped COUNT would let a no-scope caller infer private rows by comparing `totalRaw`
45
- * against `items.length`, so this SQL-encodes the default-deny rule `passesScopeFilterForRecall` applies in TS:
46
- * - explicit scope passed: exact-match
47
- * - no scope: `scopeAdmitSql`'s default deny, which admits `ownScope`, the caller's personal scope.
48
- *
49
- * `tenantId` is optional for back-compat. Pass `undefined` only when
50
- * intentionally counting cross-tenant; `assemble()` passes `ctx.tenantId`.
51
- */
21
+ /** Pre-cap, scope-aware row count for a session, so `assemble` reports the full size without leaking rows the caller could not load. Mirrors
22
+ * `passesScopeFilterForRecall`'s default-deny: explicit scope matches exactly, none admits only `ownScope`. `tenantId` undefined counts cross-tenant. */
52
23
  export declare function countSessionRawMemories(hippoRoot: string, sessionId: string, tenantId?: string, scope?: string, ownScope?: string, origins?: readonly string[]): number;
53
- /**
54
- * Last N kind='raw' memories by `created` desc. Tenant scoped. When
55
- * `sessionId` is supplied, also constrains to a specific session — that
56
- * is the correct shape for "what did I just see in THIS session."
57
- *
58
- * Without `sessionId`, concurrent sessions in a tenant surface each other's rows as fresh tail;
59
- * pass undefined only for "anything new across the whole tenant".
60
- *
61
- * Bounded count cap at 200 — beyond that the caller should filter via
62
- * tags/scope rather than time-windowed recall.
63
- *
64
- * The tenant-wide shape is the back-compat default but discouraged; `api.recall` throws
65
- * `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1` is set.
66
- */
24
+ /** Last N kind='raw' memories by `created` desc, tenant-scoped, max 200; pass `sessionId` or concurrent sessions show up in each other's fresh tail.
25
+ * The tenant-wide shape is discouraged: `api.recall` throws `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`. */
67
26
  export declare function loadFreshRawMemories(hippoRoot: string, count: number, tenantId?: string, sessionId?: string, origins?: readonly string[]): MemoryEntry[];
68
- /**
69
- * Load all entries from SQLite.
70
- *
71
- * When `tenantId` is provided, results are scoped to that tenant. Omitting it
72
- * yields all rows (legacy behavior used by consolidate/autolearn etc.). Recall
73
- * paths that surface results to a user MUST pass a resolved tenant.
74
- */
27
+ /** Load all entries from SQLite; omitting `tenantId` yields all rows (legacy). Recall paths that surface results to a user MUST pass a resolved tenant. */
75
28
  export declare function loadAllEntries(hippoRoot: string, tenantId?: string): MemoryEntry[];
29
+ /** Every tenant's memory ids in loadAllEntries' order, for a caller that reads the rows a page at a time instead of holding them all. */
30
+ export declare function loadAllEntryIds(hippoRoot: string): string[];
31
+ export interface EntriesWithBase {
32
+ entries: MemoryEntry[];
33
+ base: {
34
+ get(id: string): MemoryEntry | undefined;
35
+ };
36
+ }
37
+ /** Every entry plus a by-id lookup of each as loaded, rebuilt from its row on first use, so no deep copy of the store is kept. */
38
+ export declare function loadAllEntriesWithBase(hippoRoot: string): EntriesWithBase;
76
39
  /** Every memory row on an open connection, so a caller can read inside its own transaction. */
77
40
  export declare function selectAllEntries(db: DatabaseSyncLike, tenantId?: string): MemoryEntry[];
78
41
  /** Live rows whose source starts with `prefix`, on the caller's handle; LIKE folds case, so the prefix is checked again exactly. */
@@ -115,7 +78,8 @@ export declare function selectRowsOutsideSourcePrefixAt(db: DatabaseSyncLike, te
115
78
  content: string;
116
79
  source: string;
117
80
  }>;
118
- /** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced, in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
81
+ /** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced,
82
+ * in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
119
83
  export declare function loadLiveContentsBySourceAndTag(hippoRoot: string, tenantId: string, source: string, tag: string, exceptSessionId: string): string[];
120
84
  /** Every tenant's distilled rows nothing has superseded, in loadAllEntries' order: the rows that can be each other's duplicate. */
121
85
  export declare function loadCurrentDistilledEntries(hippoRoot: string): MemoryEntry[];