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
@@ -1,18 +1,6 @@
1
1
  import type { SearchResult } from '../core/search-types.js';
2
- /**
3
- * A reranker reorders (and optionally rescales) the candidate set produced
4
- * by hybridSearch's BM25 + cosine + MMR pipeline. Rerankers run AFTER MMR
5
- * de-duplication and BEFORE token-budget filtering, so the reranker sees
6
- * the full diversity-balanced candidate pool but does not see candidates
7
- * already filtered out by score-zero or supersession.
8
- *
9
- * Rerankers MUST be deterministic for a given (query, results) input
10
- * unless explicitly documented as stochastic (the LLM track, and the
11
- * hosted jev reranker, whose scores move slightly run to run).
12
- * Determinism is required for paired A/B and for the workload-validity gate.
13
- *
14
- * @returns Reordered (and optionally rescaled) results.
15
- */
2
+ /** Reorders hybridSearch's candidates AFTER MMR de-duplication and BEFORE token-budget filtering, so it sees the full diverse pool.
3
+ * MUST be deterministic for a given (query, results) unless documented stochastic (LLM track, hosted jev): paired A/B and the validity gate need it. */
16
4
  export type RerankerFn = (query: string, results: SearchResult[], options?: RerankerOptions) => Promise<RerankResult[]>;
17
5
  /** JSON-serializable value. Per-track reranker config is opaque to the seam
18
6
  * but must still be a concrete, serializable shape rather than `unknown`. */
@@ -2,7 +2,7 @@ import { estimateTokens } from '../util/token-text.js';
2
2
  import { tokenize } from '../util/tokenize.js';
3
3
  import { evalNow } from '../core/ablation.js';
4
4
  import { extractPathTags } from './path-context.js';
5
- import { detectScope } from '../sharing/scope.js';
5
+ import { detectScope } from '../core/active-scope.js';
6
6
  import { compareScoredResults } from '../core/compare.js';
7
7
  import { bm25Score, buildCorpus, entryText } from './bm25.js';
8
8
  import { currentEntries } from './as-of.js';
@@ -1,10 +1,8 @@
1
1
  import { type MemoryEntry } from '../core/memory.js';
2
2
  import { type TemporalDirection, type TemporalRange } from './temporal.js';
3
- export declare const CHURN_STALE_RANK_MULTIPLIER = 0.5;
4
3
  export declare const STRENGTH_RANK_FLOOR = 0.5;
5
4
  export declare const STRENGTH_RANK_SPAN = 0.5;
6
5
  export declare function churnStaleFactor(entry: MemoryEntry): number;
7
- export declare function recencyBoost(entry: MemoryEntry, now: Date): number;
8
6
  /** Retrieval-time outcome nudge in [0.85, 1.15]; the bm25-outcome eval baseline ranks with it too. */
9
7
  export declare function outcomeMultiplier(entry: MemoryEntry): number;
10
8
  /** A DAG summary is a topic summary (level 2) or an entity profile (level 3); both take the same deboost. */
@@ -2,10 +2,10 @@ import { envSummaryDeboost } from '../util/env.js';
2
2
  import { calculateStrength, CHURN_STALE_TAG } from '../core/memory.js';
3
3
  import { isOutcomeFastAblated, isRecencyAblated, evalRecencyScaleDays } from '../core/ablation.js';
4
4
  import { pathBoostMultiplier } from './path-context.js';
5
- import { scopeMatch } from '../sharing/scope.js';
5
+ import { scopeMatch } from '../core/active-scope.js';
6
6
  import { temporalBoost } from './temporal.js';
7
7
  import { DAY_MS } from '../util/time.js';
8
- export const CHURN_STALE_RANK_MULTIPLIER = 0.5; // SHORTCUT: untuned; measure on real recall before any default.
8
+ const CHURN_STALE_RANK_MULTIPLIER = 0.5; // SHORTCUT: untuned; measure on real recall before any default.
9
9
  const DECISION_TAG_BOOST = 1.2;
10
10
  // A memory tagged for the active scope outranks a neutral one; one tagged for another scope is demoted.
11
11
  const SCOPE_MATCH_BOOST = 1.5;
@@ -27,7 +27,7 @@ const FRESHNESS_WINDOW_MS = 7 * DAY_MS;
27
27
  export function churnStaleFactor(entry) {
28
28
  return entry.tags.includes(CHURN_STALE_TAG) ? CHURN_STALE_RANK_MULTIPLIER : 1.0;
29
29
  }
30
- export function recencyBoost(entry, now) {
30
+ function recencyBoost(entry, now) {
31
31
  if (isRecencyAblated())
32
32
  return 1; // EVAL-ONLY ablation (see ablation.ts)
33
33
  const created = new Date(entry.created);
@@ -0,0 +1,9 @@
1
+ import type { MemoryEntry } from '../core/memory.js';
2
+ import { type EmbeddingProvider } from '../embeddings/provider.js';
3
+ import { type HippoStore } from '../store/port.js';
4
+ /** Embed a single memory entry and cache the result in the embedding index; with `store`, through its vectorWrites, never opening hippo.db. */
5
+ export declare function embedMemory(hippoRoot: string, entry: MemoryEntry, model?: string, store?: HippoStore): Promise<void>;
6
+ /** Embeds every entry with no cached vector, prunes vectors of deleted memories, and returns how many it embedded; `provider` defaults to the
7
+ * configured one. With `store`, every tenant's memories with no vector for the provider's model go through its `vectorWrites`, never hippo.db. */
8
+ export declare function embedAll(hippoRoot: string, model?: string, provider?: EmbeddingProvider, store?: HippoStore): Promise<number>;
9
+ //# sourceMappingURL=embed-memories.d.ts.map
@@ -0,0 +1,377 @@
1
+ // Embeds memories into the vector index: picks the configured provider, computes each vector and hands it to the store,
2
+ // which only keeps it (src/store/port.ts VectorWrites).
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import { randomUUID } from 'crypto';
6
+ import { loadConfig } from '../core/config.js';
7
+ import { initializeParticle } from '../db/physics-state.js';
8
+ import { resolveEmbeddingProvider } from '../embeddings/provider.js';
9
+ import { embeddingIndexIdentity, embeddingInputText, embeddingModelRequiresReindex, indexNeedsRebuild, saveStoredEmbeddingModel, } from '../store/embeddings/index.js';
10
+ import { loadAllEntryIds, loadEntriesByIds } from '../store/entry-reads.js';
11
+ import { requireGroup, } from '../store/port.js';
12
+ import { indexedModel, pruneStoredVectors, replacesIndex, resetStoredParticles, saveEmbeddingIndex, saveStoredVectors, seedStoredParticle, } from '../store/vector-index.js';
13
+ import { chunked } from '../util/chunked.js';
14
+ import { envByName } from '../util/env.js';
15
+ import { errorCode, errorMessage, log } from '../util/log.js';
16
+ import { redactSecretsStrict } from '../util/secret-detect.js';
17
+ const STORE_PAGE = 64;
18
+ /** The rows for `ids`, a page at a time and in that order; an id deleted since it was listed is skipped. */
19
+ function* entryPages(hippoRoot, ids) {
20
+ for (const page of chunked(ids, STORE_PAGE)) {
21
+ const byId = new Map(loadEntriesByIds(hippoRoot, page).map((e) => [e.id, e]));
22
+ const entries = page.flatMap((id) => byId.get(id) ?? []);
23
+ if (entries.length > 0)
24
+ yield entries;
25
+ }
26
+ }
27
+ async function rebuildEmbeddingIndex(hippoRoot, ids, provider) {
28
+ const rebuilt = {};
29
+ for (const entries of entryPages(hippoRoot, ids)) {
30
+ // On a hard transport/auth failure provider.embed throws, so the caller aborts WITHOUT saving
31
+ // a partial index (atomic reindex: the old index + stored identity are preserved).
32
+ const vectors = await provider.embed(entries.map((e) => embeddingInputText(e)), 'passage');
33
+ for (let i = 0; i < entries.length; i++) {
34
+ const vec = vectors[i];
35
+ if (vec && vec.length > 0) {
36
+ rebuilt[entries[i].id] = vec;
37
+ }
38
+ else {
39
+ noteSkippedEmbedding(entries[i].id);
40
+ }
41
+ }
42
+ }
43
+ return rebuilt;
44
+ }
45
+ function resetPhysicsFromIndex(hippoRoot, ids, index) {
46
+ try {
47
+ resetStoredParticles(hippoRoot, ids, index);
48
+ }
49
+ catch (err) {
50
+ // Best effort: retrieval still falls back without physics state.
51
+ log.warn(`physics reset after reindex failed: ${errorMessage(err)}`);
52
+ }
53
+ }
54
+ /** A provider's `[]` row is a swallowed per-item failure; name the memory so the gap can be traced. */
55
+ function noteSkippedEmbedding(id) {
56
+ log.warn('memory not embedded; the next embed run retries it', { id });
57
+ }
58
+ const EMBED_LOCK_FILE = 'embeddings.lock';
59
+ const EMBED_LOCK_WAIT_MS = 10_000;
60
+ const EMBED_LOCK_OWNER = `${process.pid}:${randomUUID()}`;
61
+ // In-process mutex plus an O_EXCL "<pid>:<token>" lock file: our token is a lock we leaked; our PID
62
+ // with another token is a live worker thread, unless the lock predates this process (a reused PID).
63
+ let _embedWriteLock = Promise.resolve();
64
+ function embedLockHolderAlive(lockPath) {
65
+ let raw;
66
+ try {
67
+ raw = fs.readFileSync(lockPath, 'utf8');
68
+ }
69
+ catch (err) {
70
+ return !(err instanceof Error && 'code' in err && err.code === 'ENOENT');
71
+ }
72
+ const mtimeMs = fs.statSync(lockPath, { throwIfNoEntry: false })?.mtimeMs ?? 0;
73
+ const pid = Number(raw.split(':')[0]);
74
+ // An empty lock is a holder between create and write; after 5 s it is a crashed one.
75
+ if (!Number.isInteger(pid) || pid <= 0)
76
+ return Date.now() - mtimeMs < 5_000;
77
+ if (raw === EMBED_LOCK_OWNER)
78
+ return false;
79
+ if (pid === process.pid)
80
+ return mtimeMs >= Date.now() - process.uptime() * 1000;
81
+ try {
82
+ process.kill(pid, 0);
83
+ return true;
84
+ }
85
+ catch (err) {
86
+ return err instanceof Error && 'code' in err && err.code === 'EPERM';
87
+ }
88
+ }
89
+ // After the double-break race below the file can be another writer's lock, so remove only our own.
90
+ function releaseEmbedFileLock(lockPath) {
91
+ let raw;
92
+ try {
93
+ raw = fs.readFileSync(lockPath, 'utf8');
94
+ }
95
+ catch (err) {
96
+ if (err instanceof Error && 'code' in err && err.code === 'ENOENT')
97
+ return;
98
+ throw err;
99
+ }
100
+ if (raw === EMBED_LOCK_OWNER)
101
+ fs.rmSync(lockPath, { force: true });
102
+ }
103
+ async function acquireEmbedFileLock(hippoRoot) {
104
+ const lockPath = path.join(hippoRoot, EMBED_LOCK_FILE);
105
+ const deadline = Date.now() + EMBED_LOCK_WAIT_MS;
106
+ for (;;) {
107
+ try {
108
+ fs.writeFileSync(lockPath, EMBED_LOCK_OWNER, { flag: 'wx' });
109
+ return () => releaseEmbedFileLock(lockPath);
110
+ }
111
+ catch (err) {
112
+ if (!(err instanceof Error && 'code' in err && err.code === 'EEXIST'))
113
+ throw err;
114
+ }
115
+ // SHORTCUT: two waiters can both break one dead holder's lock; a vector lost that way is backfilled by the next `hippo embed`.
116
+ if (!embedLockHolderAlive(lockPath)) {
117
+ fs.rmSync(lockPath, { force: true });
118
+ continue;
119
+ }
120
+ if (Date.now() >= deadline)
121
+ throw new Error(`the embedding index is busy: another hippo process holds ${lockPath}`);
122
+ await new Promise((r) => setTimeout(r, 50));
123
+ }
124
+ }
125
+ async function withEmbedLock(hippoRoot, fn) {
126
+ return withProcessEmbedLock(async () => {
127
+ const release = await acquireEmbedFileLock(hippoRoot);
128
+ try {
129
+ return await fn();
130
+ }
131
+ finally {
132
+ release();
133
+ }
134
+ });
135
+ }
136
+ // A store keeps each write whole in its own transaction, and a lock file in hippoRoot would not reach a worker on another host.
137
+ async function withProcessEmbedLock(fn) {
138
+ let resolve;
139
+ const next = new Promise(r => { resolve = r; });
140
+ const prev = _embedWriteLock;
141
+ _embedWriteLock = next;
142
+ await prev;
143
+ try {
144
+ return await fn();
145
+ }
146
+ finally {
147
+ resolve();
148
+ }
149
+ }
150
+ // A bad key fails every write; one full warning per distinct failure tells the user, and a count of the repeats follows at most once per interval.
151
+ const EMBED_WARN_KEY_CAP = 64;
152
+ const EMBED_SUPPRESSED_SUMMARY_INTERVAL_MS = 60_000;
153
+ const embedFailureSeen = new Map();
154
+ function embedFailureKey(source, cause) {
155
+ const kind = errorCode(cause) || (cause instanceof Error ? cause.constructor.name : 'NonError');
156
+ return `${source}:${kind}`;
157
+ }
158
+ function warnEmbedFailureOnce(source, rawMessage, cause) {
159
+ const key = embedFailureKey(source, cause);
160
+ const now = Date.now();
161
+ const seen = embedFailureSeen.get(key);
162
+ if (seen) {
163
+ seen.suppressed += 1;
164
+ if (now - seen.lastNoticeAt >= EMBED_SUPPRESSED_SUMMARY_INTERVAL_MS) {
165
+ log.warn(`${seen.suppressed} more embedding errors from ${source} since the last notice; memories are still stored without embeddings.`);
166
+ seen.suppressed = 0;
167
+ seen.lastNoticeAt = now;
168
+ }
169
+ return;
170
+ }
171
+ // Oldest key out, so a full map still lets a new failure warn.
172
+ if (embedFailureSeen.size >= EMBED_WARN_KEY_CAP) {
173
+ for (const oldest of embedFailureSeen.keys()) {
174
+ embedFailureSeen.delete(oldest);
175
+ break;
176
+ }
177
+ }
178
+ embedFailureSeen.set(key, { lastNoticeAt: now, suppressed: 0 });
179
+ // Strict scrub: this line can land in a hook log file, and an API may echo the key back in its error body.
180
+ const message = redactSecretsStrict(rawMessage).replace(/\s+/g, ' ').replace(/\.+$/, '');
181
+ log.warn(`embedding failed (${source}): ${message}. Memories are stored without embeddings until this is fixed.`);
182
+ }
183
+ function vectorGroups(store) {
184
+ return [requireGroup(store, 'vectors'), requireGroup(store, 'vectorWrites')];
185
+ }
186
+ /** Writes one page's vectors, one writeVectors per tenant, and stops at the first refused write; `withParticles` seeds each memory's particle. */
187
+ async function writeVectorPage(writes, write, page, vectors, withParticles) {
188
+ const byTenant = new Map();
189
+ page.forEach((entry, i) => {
190
+ const vector = vectors[i];
191
+ if (!vector || vector.length === 0)
192
+ return noteSkippedEmbedding(entry.id);
193
+ const row = withParticles ? { memoryId: entry.id, vector, particle: initializeParticle(entry, vector) } : { memoryId: entry.id, vector };
194
+ byTenant.set(entry.tenantId, [...(byTenant.get(entry.tenantId) ?? []), row]);
195
+ });
196
+ let written = 0;
197
+ for (const [tenantId, rows] of byTenant) {
198
+ const result = await writes.writeVectors({ ...write, tenantId, rows });
199
+ if (result.modelMismatch)
200
+ return { written, modelMismatch: true };
201
+ written += result.written;
202
+ }
203
+ return { written, modelMismatch: false };
204
+ }
205
+ const OTHER_MODEL_INDEX = "the vector index was built by another embedding model; run 'hippo embed' to rebuild it";
206
+ /** Embeds every memory with no vector under `model`, page by page, so a provider failure keeps the pages written; a rebuild reseeds the particles it drops. */
207
+ async function backfillInStore(writes, provider, model, rebuild) {
208
+ let count = 0;
209
+ let afterId;
210
+ for (;;) {
211
+ const page = await writes.entriesWithoutVector({ model, afterId, limit: STORE_PAGE });
212
+ if (page.length === 0)
213
+ return count;
214
+ afterId = page[page.length - 1].id;
215
+ const vectors = await provider.embed(page.map((e) => embeddingInputText(e)), 'passage');
216
+ const result = await writeVectorPage(writes, { model, replaceIndex: rebuild }, page, vectors, rebuild);
217
+ // Another process rebuilt the index mid-run; every later page would be refused too, after paying the provider for it.
218
+ if (result.modelMismatch)
219
+ throw new Error(OTHER_MODEL_INDEX);
220
+ count += result.written;
221
+ }
222
+ }
223
+ /** embedAll on a store: a model change re-embeds every memory, and the first page written drops the old index. */
224
+ async function embedAllInStore(store, provider) {
225
+ const [reads, writes] = vectorGroups(store);
226
+ const rebuild = indexNeedsRebuild(indexedModel(await reads.embeddingIndexState()), provider.id);
227
+ return backfillInStore(writes, provider, embeddingIndexIdentity(provider.id), rebuild);
228
+ }
229
+ /** embedMemory on a store; like the hippo.db path it resolves whatever fails. Unlike it, it leaves a model change to embedAll, so a stale
230
+ * read here never drops another process's rebuild; the read only saves a paid embed call, as the write refuses another model itself. */
231
+ function embedMemoryInStore(store, provider, entry) {
232
+ return withProcessEmbedLock(async () => {
233
+ const [reads, writes] = vectorGroups(store);
234
+ const model = embeddingIndexIdentity(provider.id);
235
+ try {
236
+ const refused = replacesIndex(await reads.embeddingIndexState(), model)
237
+ || (await writeVectorPage(writes, { model, replaceIndex: false }, [entry], await provider.embed([embeddingInputText(entry)], 'passage'), true)).modelMismatch;
238
+ if (refused)
239
+ warnEmbedFailureOnce('index', OTHER_MODEL_INDEX);
240
+ }
241
+ catch (err) {
242
+ warnEmbedFailureOnce(provider.kind, errorMessage(err), err);
243
+ }
244
+ }).catch((err) => {
245
+ log.warn(`skipped embedding ${entry.id} (${errorMessage(err)})`);
246
+ });
247
+ }
248
+ /** Embed a single memory entry and cache the result in the embedding index; with `store`, through its vectorWrites, never opening hippo.db. */
249
+ export async function embedMemory(hippoRoot, entry, model, store) {
250
+ let provider;
251
+ try {
252
+ provider = resolveEmbeddingProvider(hippoRoot, { model });
253
+ }
254
+ catch (err) {
255
+ // Callers fire and forget, so this must resolve: a bad config warns once instead of rejecting.
256
+ warnEmbedFailureOnce('config', errorMessage(err), err);
257
+ return;
258
+ }
259
+ if (!provider.isAvailable())
260
+ return;
261
+ if (store)
262
+ return embedMemoryInStore(store, provider, entry);
263
+ return withEmbedLock(hippoRoot, async () => {
264
+ // Best-effort: an embedding failure (API down, bad key, 5xx) must not reject the caller's write; the existing index is left as-is.
265
+ // Failures surface on the explicit `hippo embed` / `embedAll` path.
266
+ try {
267
+ const identity = provider.id;
268
+ if (embeddingModelRequiresReindex(hippoRoot, identity)) {
269
+ await rebuildIndexForProvider(hippoRoot, provider);
270
+ return;
271
+ }
272
+ const text = embeddingInputText(entry);
273
+ const [vector] = await provider.embed([text], 'passage');
274
+ if (!vector || vector.length === 0)
275
+ return;
276
+ saveStoredVectors(hippoRoot, [[entry.id, vector]], embeddingIndexIdentity(identity));
277
+ saveStoredEmbeddingModel(hippoRoot, identity);
278
+ // Initialize physics state for this memory
279
+ initializePhysicsIfMissing(hippoRoot, entry, vector);
280
+ }
281
+ catch (err) {
282
+ // Provider failure (API down / bad key). Best-effort: leave the index as-is, but say so once.
283
+ warnEmbedFailureOnce(provider.kind, errorMessage(err), err);
284
+ }
285
+ }).catch((err) => {
286
+ log.warn(`skipped embedding ${entry.id} (${errorMessage(err)}); run 'hippo embed' to backfill`);
287
+ });
288
+ }
289
+ // Every page is embedded before one transaction replaces the index, and the identity is saved only after that: a provider failure or a crash
290
+ // at any earlier point leaves the old identity, so embeddingModelRequiresReindex has the next run rebuild from the start.
291
+ async function rebuildIndexForProvider(hippoRoot, provider) {
292
+ const identity = provider.id;
293
+ // Host-wide rebuild: one embedding index per hippoRoot, keyed by tenant-scoped entry.id; per-tenant indices would be a larger architecture change.
294
+ const ids = loadAllEntryIds(hippoRoot);
295
+ const rebuiltIndex = await rebuildEmbeddingIndex(hippoRoot, ids, provider);
296
+ saveEmbeddingIndex(hippoRoot, rebuiltIndex, embeddingIndexIdentity(identity));
297
+ saveStoredEmbeddingModel(hippoRoot, identity);
298
+ resetPhysicsFromIndex(hippoRoot, ids, rebuiltIndex);
299
+ return Object.keys(rebuiltIndex).length;
300
+ }
301
+ function initializePhysicsIfMissing(hippoRoot, entry, vector) {
302
+ try {
303
+ seedStoredParticle(hippoRoot, entry, vector);
304
+ }
305
+ catch (err) {
306
+ // Physics init is best-effort and must not fail the embedding that just landed.
307
+ log.debug(`physics state not initialised for ${entry.id}: ${errorMessage(err)}`);
308
+ }
309
+ }
310
+ /** Throws when an unavailable provider is a misconfiguration rather than an intentional no-op. */
311
+ function throwIfProviderKeyMissing(hippoRoot, provider) {
312
+ // A configured API provider with a missing key is a misconfiguration: surface it so callers of the exported embedAll() learn nothing was written.
313
+ // Local-not-installed and an explicit enabled=false stay silent no-ops.
314
+ const cfg = loadConfig(hippoRoot).embeddings;
315
+ if (provider.kind !== 'local' &&
316
+ cfg.enabled !== false &&
317
+ provider.keyEnv &&
318
+ !envByName(provider.keyEnv)?.trim()) {
319
+ throw new Error(`Embedding provider '${provider.kind}' is configured but ${provider.keyEnv} is not set.`);
320
+ }
321
+ }
322
+ // Embeds entries without a cached vector in save-checkpointed chunks; a `[]` row means that item could not be embedded and is retried next run.
323
+ // On a hard provider failure mid-backfill the chunks already embedded are persisted (paid progress), then it stops and resumes next run.
324
+ async function backfillPending(hippoRoot, provider, pending, model) {
325
+ let count = 0;
326
+ // Initialized to `undefined` so it stays a plain `unknown` binding for the arbitrary caught value; falsy either way.
327
+ let backfillError = undefined;
328
+ for (const chunk of entryPages(hippoRoot, pending)) {
329
+ let vectors;
330
+ try {
331
+ vectors = await provider.embed(chunk.map((e) => embeddingInputText(e)), 'passage');
332
+ }
333
+ catch (err) {
334
+ // Preserve the chunks already saved this run, then surface the failure
335
+ // below so the explicit `hippo embed` path never reports a false success.
336
+ backfillError = err;
337
+ break;
338
+ }
339
+ const rows = [];
340
+ for (let j = 0; j < chunk.length; j++) {
341
+ const vec = vectors[j];
342
+ if (vec && vec.length > 0)
343
+ rows.push([chunk[j].id, vec]);
344
+ else
345
+ noteSkippedEmbedding(chunk[j].id);
346
+ }
347
+ count += saveStoredVectors(hippoRoot, rows, model);
348
+ }
349
+ return { count, backfillError };
350
+ }
351
+ /** Embeds every entry with no cached vector, prunes vectors of deleted memories, and returns how many it embedded; `provider` defaults to the
352
+ * configured one. With `store`, every tenant's memories with no vector for the provider's model go through its `vectorWrites`, never hippo.db. */
353
+ export async function embedAll(hippoRoot, model, provider = resolveEmbeddingProvider(hippoRoot, { model }), store) {
354
+ if (!provider.isAvailable()) {
355
+ throwIfProviderKeyMissing(hippoRoot, provider);
356
+ return 0;
357
+ }
358
+ if (store)
359
+ return withProcessEmbedLock(() => embedAllInStore(store, provider));
360
+ return withEmbedLock(hippoRoot, async () => {
361
+ const identity = provider.id;
362
+ if (embeddingModelRequiresReindex(hippoRoot, identity))
363
+ return rebuildIndexForProvider(hippoRoot, provider);
364
+ // Host-wide by design: embedAll backfills all tenants' entries into the per-host index; per-tenant filtering would produce partial indices and break
365
+ // recall.
366
+ const embedded = pruneStoredVectors(hippoRoot);
367
+ const pending = loadAllEntryIds(hippoRoot).filter((id) => !embedded.has(id));
368
+ const { count, backfillError } = await backfillPending(hippoRoot, provider, pending, embeddingIndexIdentity(identity));
369
+ saveStoredEmbeddingModel(hippoRoot, identity);
370
+ // Partial progress is now persisted; surface a hard backfill failure so the
371
+ // explicit embed path reports it (best-effort callers go via embedMemory).
372
+ if (backfillError)
373
+ throw backfillError;
374
+ return count;
375
+ });
376
+ }
377
+ //# sourceMappingURL=embed-memories.js.map
@@ -0,0 +1,23 @@
1
+ import { type MemoryEntry } from '../core/memory.js';
2
+ import type { RerankStep } from '../core/search-types.js';
3
+ import type { ActiveGoals, GoalRecallLogRow } from '../store/goals.js';
4
+ /** Options of {@link boostByGoals}. */
5
+ export interface GoalStackBoostOpts {
6
+ sessionId: string;
7
+ tenantId: string;
8
+ limit: number;
9
+ /** Side-channel: one goal-boost `RerankStep` per boosted row, keyed by `entry.id` (a map because the helper re-spreads rows); only populated when passed. */
10
+ trace?: Map<string, RerankStep>;
11
+ }
12
+ /** The boosted, re-sorted rows and the `goal_recall_log` rows they earn. */
13
+ export interface GoalStackBoost<R> {
14
+ results: R[];
15
+ log: GoalRecallLogRow[];
16
+ }
17
+ /** The goal-stack boost over goals already read, touching no store; a caller skips it under an explicit goal tag. Its log covers the top
18
+ * `limit` rows and keeps those whose memory is global, since only the store can tell them apart; {@link localGoalRecallRows} drops those before the write. */
19
+ export declare function boostByGoals<R extends {
20
+ entry: MemoryEntry;
21
+ score: number;
22
+ }>(results: R[], active: ActiveGoals, opts: GoalStackBoostOpts): GoalStackBoost<R>;
23
+ //# sourceMappingURL=goal-boost.d.ts.map
@@ -0,0 +1,93 @@
1
+ // src/search/goal-boost.ts: the goal-stack boost over goals already read; it ranks rows and touches no store.
2
+ import { compareScoresDesc } from '../core/compare.js';
3
+ import { DEFAULT_SCHEMA_FIT } from '../core/memory.js';
4
+ const MAX_FINAL_MULTIPLIER = 3.0;
5
+ const FIRST_MATCH_BOOST = 2.0;
6
+ const EXTRA_MATCH_BOOST = 0.5;
7
+ /** The capped boost for one row whose tags match `matches` active goals. */
8
+ function goalBoostMultiplier(entry, tags, matches, goalsByTag, policiesByGoalId) {
9
+ // First match boosts by FIRST_MATCH_BOOST, each further one adds EXTRA_MATCH_BOOST, capped at MAX_FINAL_MULTIPLIER.
10
+ let multiplier = Math.min(FIRST_MATCH_BOOST + EXTRA_MATCH_BOOST * (matches.length - 1), MAX_FINAL_MULTIPLIER);
11
+ // Compose per-policy multipliers per matched tag.
12
+ for (const tag of matches) {
13
+ const goal = goalsByTag.get(tag);
14
+ const policy = policiesByGoalId.get(goal.id);
15
+ if (!policy)
16
+ continue;
17
+ if (policy.policyType === 'error-prioritized' && tags.includes('error')) {
18
+ multiplier *= policy.errorPriority;
19
+ }
20
+ else if (policy.policyType === 'schema-fit-biased') {
21
+ // Linearly weight schema_fit in [0,1] up to (weightSchemaFit)x.
22
+ // Default 1.0 is a no-op.
23
+ multiplier *=
24
+ 1.0 +
25
+ Math.max(0, policy.weightSchemaFit - 1.0) *
26
+ (entry.schema_fit ?? DEFAULT_SCHEMA_FIT);
27
+ }
28
+ else if (policy.policyType === 'recency-first') {
29
+ multiplier *= policy.weightRecency;
30
+ }
31
+ else if (policy.policyType === 'hybrid') {
32
+ multiplier *= policy.weightOutcome;
33
+ }
34
+ }
35
+ // Hard cap AFTER all composition.
36
+ return Math.min(multiplier, MAX_FINAL_MULTIPLIER);
37
+ }
38
+ /** Log rows for the top `limit` boosted rows, one per matched goal. */
39
+ function buildGoalRecallLog(boosted, matchesByEntryId, goalsByTag, opts) {
40
+ const { sessionId, tenantId, limit } = opts;
41
+ const recalledAt = new Date().toISOString();
42
+ const log = [];
43
+ for (const r of boosted.slice(0, limit)) {
44
+ const matches = matchesByEntryId.get(r.entry.id);
45
+ if (!matches || matches.length === 0)
46
+ continue;
47
+ for (const tag of matches) {
48
+ const goal = goalsByTag.get(tag);
49
+ if (!goal)
50
+ continue;
51
+ log.push({ goalId: goal.id, memoryId: r.entry.id, tenantId, sessionId, recalledAt, score: r.score });
52
+ }
53
+ }
54
+ return log;
55
+ }
56
+ /** The goal-stack boost over goals already read, touching no store; a caller skips it under an explicit goal tag. Its log covers the top
57
+ * `limit` rows and keeps those whose memory is global, since only the store can tell them apart; {@link localGoalRecallRows} drops those before the write. */
58
+ export function boostByGoals(results, active, opts) {
59
+ const { trace } = opts;
60
+ if (active.goals.length === 0)
61
+ return { results, log: [] };
62
+ const goalsByTag = new Map(active.goals.map((g) => [g.goalName, g]));
63
+ const policiesByGoalId = active.policies;
64
+ // Goal-tag matches per boosted row, keyed by entry id; a side table (not a spread-on marker property) so `boosted` stays exactly R[] with no cast-then-strip.
65
+ const matchesByEntryId = new Map();
66
+ const boosted = results
67
+ .map((r) => {
68
+ const tags = r.entry.tags ?? [];
69
+ const matches = tags.filter((t) => goalsByTag.has(t));
70
+ if (matches.length === 0)
71
+ return r;
72
+ const multiplier = goalBoostMultiplier(r.entry, tags, matches, goalsByTag, policiesByGoalId);
73
+ // Recall-trace side-channel: record the goal-boost step BEFORE the
74
+ // score is mutated, keyed by entry id; a pure read of r.score.
75
+ if (trace) {
76
+ trace.set(r.entry.id, {
77
+ stage: 'goal-boost',
78
+ multiplier,
79
+ scoreBefore: r.score,
80
+ scoreAfter: r.score * multiplier,
81
+ note: matches.join(', '),
82
+ });
83
+ }
84
+ matchesByEntryId.set(r.entry.id, matches);
85
+ // SAFETY: spreading a generic-constrained `r: R` widens to the spread's plain object type; only `score` changes, so the value still satisfies R.
86
+ return { ...r, score: r.score * multiplier };
87
+ })
88
+ // Deliberately a PLAIN stable score sort with no compareEntryIdentity tail: re-sorting an already deterministic ranking inherits its determinism via
89
+ // stability, and ties keep the prior (meaningful) rank instead of reordering by content.
90
+ .sort((a, b) => compareScoresDesc(a.score, b.score));
91
+ return { results: boosted, log: buildGoalRecallLog(boosted, matchesByEntryId, goalsByTag, opts) };
92
+ }
93
+ //# sourceMappingURL=goal-boost.js.map
@@ -1,10 +1,10 @@
1
1
  import type { MemoryEntry } from '../core/memory.js';
2
2
  import type { RerankerFn, RerankerOptions } from '../rerankers/types.js';
3
3
  import { type BM25Corpus } from './bm25.js';
4
- import { type HybridVectorCandidates } from './vector.js';
4
+ import { type HybridVectorCandidates, type VectorSource } from './vector.js';
5
5
  import { type GraphStreamOptions } from './fusion.js';
6
6
  import { type ResultCost, type SearchResult } from '../core/search-types.js';
7
- import type { HippoStore } from '../store/index.js';
7
+ import { type HippoStore } from '../store/index.js';
8
8
  export interface HybridSearchOptions {
9
9
  budget?: number;
10
10
  now?: Date;
@@ -43,7 +43,16 @@ export interface HybridSearchOptions {
43
43
  vectorCandidates?: HybridVectorCandidates;
44
44
  /** Where vectors are read; hippo.db under `hippoRoot` when unset. */
45
45
  store?: HippoStore;
46
+ /** The deadline a caller already started for this recall's query embedding; a fresh budget when unset. */
47
+ queryEmbedDeadline?: AbortSignal;
46
48
  }
49
+ export declare const DEFAULT_EMBEDDING_WEIGHT = 0.6;
50
+ export declare const DEFAULT_MMR_LAMBDA = 0.7;
47
51
  /** BM25 blended with cosine similarity when stored vectors and a provider are available, BM25 * strength * recency otherwise. */
48
52
  export declare function hybridSearch(query: string, entries: MemoryEntry[], options?: HybridSearchOptions): Promise<SearchResult[]>;
53
+ /** hippo.db under `hippoRoot` when the caller passed no store: the default lives on this exported entry, never inside the vector arm. */
54
+ export declare function vectorSourceOf({ hippoRoot, store }: {
55
+ hippoRoot?: string;
56
+ store?: HippoStore;
57
+ }): VectorSource | undefined;
49
58
  //# sourceMappingURL=hybrid.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { tokenize } from '../util/tokenize.js';
2
2
  import { evalNow } from '../core/ablation.js';
3
3
  import { extractPathTags } from './path-context.js';
4
- import { detectScope } from '../sharing/scope.js';
4
+ import { detectScope } from '../core/active-scope.js';
5
5
  import { compareScoredResults } from '../core/compare.js';
6
6
  import { bm25Score, buildCorpus, entryText } from './bm25.js';
7
7
  import { currentEntries } from './as-of.js';
@@ -13,9 +13,10 @@ import { scoreHybridPool } from './hybrid-score.js';
13
13
  import { applyMmrWindow, applyReranker } from './rerank.js';
14
14
  import { dedupeExtracted, fitBudget, withDagChildren } from './finalize.js';
15
15
  import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
16
+ import { sqliteStore } from '../store/index.js';
16
17
  // Share of the blended score that cosine takes, and the relevance side of the MMR relevance-versus-diversity trade.
17
- const DEFAULT_EMBEDDING_WEIGHT = 0.6;
18
- const DEFAULT_MMR_LAMBDA = 0.7;
18
+ export const DEFAULT_EMBEDDING_WEIGHT = 0.6;
19
+ export const DEFAULT_MMR_LAMBDA = 0.7;
19
20
  /** BM25 blended with cosine similarity when stored vectors and a provider are available, BM25 * strength * recency otherwise. */
20
21
  export async function hybridSearch(query, entries, options = {}) {
21
22
  const now = options.now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
@@ -26,7 +27,7 @@ export async function hybridSearch(query, entries, options = {}) {
26
27
  const queryTerms = tokenize(query);
27
28
  if (queryTerms.length === 0)
28
29
  return [];
29
- const arm = await resolveVectorArm(query, pool, options);
30
+ const arm = await resolveVectorArm(query, pool, vectorSourceOf(options), options);
30
31
  // A prepared corpus covers the caller's entries only, so rows the vector arm added force a rebuild.
31
32
  const corpus = (arm.addedRows ? undefined : options.preparedCorpus) ?? buildCorpus(arm.entries.map(entryText));
32
33
  const bm25Scores = arm.entries.map((_, i) => bm25Score(corpus, i, queryTerms));
@@ -48,6 +49,10 @@ export async function hybridSearch(query, entries, options = {}) {
48
49
  const ordered = await orderHybrid(query, withDagChildren(dedupeExtracted(scored), arm.entries), arm, options);
49
50
  return fitBudget(ordered, options.budget ?? DEFAULT_RECALL_BUDGET, options.minResults ?? 1, options.cost);
50
51
  }
52
+ /** hippo.db under `hippoRoot` when the caller passed no store: the default lives on this exported entry, never inside the vector arm. */
53
+ export function vectorSourceOf({ hippoRoot, store }) {
54
+ return hippoRoot ? { root: hippoRoot, store: store ?? sqliteStore(hippoRoot) } : undefined;
55
+ }
51
56
  function hybridBoostContext(query, pool, now, options) {
52
57
  return {
53
58
  now,
@@ -34,9 +34,8 @@ export function multihopSearch(query, entries, options = {}) {
34
34
  merged.set(r.entry.id, r);
35
35
  }
36
36
  }
37
- // PLAIN stable score sort on purpose -- pass1/pass2 inputs are
38
- // deterministically ordered (search() carries the content tail), stability
39
- // inherits that, and ties keep pass-1 results ahead of pass-2 follow-ups.
37
+ // PLAIN stable score sort on purpose: pass1/pass2 inputs are already deterministically ordered (search() carries the content tail),
38
+ // stability inherits that, and ties keep pass-1 results ahead of pass-2 follow-ups.
40
39
  return fit([...merged.values()].sort((a, b) => compareScoresDesc(a.score, b.score)));
41
40
  }
42
41
  //# sourceMappingURL=multihop.js.map