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
@@ -3,15 +3,14 @@ import * as fs from 'node:fs';
3
3
  import * as os from 'node:os';
4
4
  import * as path from 'node:path';
5
5
  import { detectRealCodexPath, isCodexWrapperInstalled, repairCodexWrapperIfInstalled } from './hooks/codex-wrapper.js';
6
- import { claudeConfigDir } from './hooks/shared.js';
6
+ import { claudeConfigDir } from './util/agent-homes.js';
7
7
  import { errorMessage, log } from './util/log.js';
8
8
  function main() {
9
9
  if (envSkipPostinstall())
10
10
  return;
11
11
  try {
12
- // Repair-only, for users who opted in (a Codex update can restore the real binary over our shim).
13
- // Swapping the binary from postinstall is a consent violation that supply-chain scanners read as
14
- // hijacking, so first install is `hippo hook install codex` only.
12
+ // Repair-only, for users who opted in (a Codex update can restore the real binary over our shim): swapping the binary from postinstall
13
+ // is a consent violation that supply-chain scanners read as hijacking, so first install is `hippo hook install codex` only.
15
14
  repairCodexWrapperIfInstalled();
16
15
  }
17
16
  catch (err) {
@@ -31,16 +30,8 @@ function main() {
31
30
  // Never fail package install because the install hint could not be printed.
32
31
  }
33
32
  }
34
- /**
35
- * Read-only nudge: if Claude Code is detected on the machine and the Hippo
36
- * UserPromptSubmit hook is NOT yet installed, print a short message pointing
37
- * the user at `hippo init`. No config writes. Silent otherwise.
38
- *
39
- * We avoid aggressively auto-patching ~/.claude/settings.json from a package
40
- * postinstall — that's surprising, breaks the principle of least authority,
41
- * and trips security scanners. A one-line visible prompt is the friendly
42
- * middle ground.
43
- */
33
+ /** Read-only nudge: if Claude Code is detected and the Hippo UserPromptSubmit hook is not installed, point the user at `hippo init`.
34
+ * It never patches ~/.claude/settings.json from a package postinstall: surprising, against least authority, and trips security scanners. */
44
35
  function printClaudeCodeNudge() {
45
36
  const claudeDir = claudeConfigDir(os.homedir());
46
37
  if (!fs.existsSync(claudeDir))
@@ -76,12 +67,8 @@ function printClaudeCodeNudge() {
76
67
  line('To skip this message on future installs: export HIPPO_SKIP_POSTINSTALL=1');
77
68
  line('');
78
69
  }
79
- /**
80
- * Read-only nudge: if the Codex CLI is on PATH and the Hippo session-capture
81
- * wrapper is NOT installed, print the opt-in command. Mirrors the Claude Code
82
- * nudge above — same least-authority reasoning: we tell the user what to run,
83
- * we never swap their binary for them.
84
- */
70
+ /** Read-only nudge: if the Codex CLI is on PATH and the session-capture wrapper is not installed, print the opt-in command;
71
+ * same least-authority reasoning as the Claude Code nudge, we never swap the user's binary. */
85
72
  function printCodexNudge() {
86
73
  if (isCodexWrapperInstalled())
87
74
  return;
@@ -1,15 +1,8 @@
1
1
  import type { AppendAuditOpts } from '../store/audit.js';
2
2
  import { type ForwardClaimMatch } from '../learn/forward-claim-detector.js';
3
3
  import type { PlanningFallacyEvidence } from '../store/planning-fallacy-evidence.js';
4
- /**
5
- * Surface delivered on `RecallResult.planningFallacyHint` when an
6
- * agent's recall query carries a forward-prediction phrase AND the closest
7
- * matching prediction class has closed historical data.
8
- *
9
- * The agent sees its track record at the moment of forecasting, anchoring
10
- * on the outside view (Lovallo-Kahneman 2003) rather than the inside-view
11
- * inside the planning fallacy.
12
- */
4
+ /** Surface delivered on `RecallResult.planningFallacyHint` when a recall query carries a forward-prediction phrase and the closest class has closed history,
5
+ * so the agent sees its own track record at the moment of forecasting. */
13
6
  export interface PlanningFallacyHint {
14
7
  classTag: string;
15
8
  /** Verbatim PredictionBaserate.summary, e.g.
@@ -17,50 +10,34 @@ export interface PlanningFallacyHint {
17
10
  baserateSummary: string;
18
11
  /** Discriminator vs hypothetical future manual-override hints. */
19
12
  source: 'j3.2-auto';
20
- /** The regex match snippet that triggered detection. Lets the agent
21
- * see WHY the hint appeared and self-correct if detection misfires
22
- * (e.g. "I wasn't predicting; ignore"). */
13
+ /** The regex match snippet that triggered detection, so the agent sees WHY the hint appeared and can self-correct if detection misfired. */
23
14
  detectedPhrase: string;
24
15
  nClosed: number;
25
16
  /** Null only when every closed-row had estimate_value=0 (ratio undefined). */
26
17
  meanRatio: number | null;
27
18
  }
28
- /**
29
- * "Watching" variant emitted when the forward-claim regex matched but no
30
- * PlanningFallacyHint baserate was returned. Silence was the most common
31
- * real-world failure: a natural-language query carries a
32
- * forward-claim phrase but its non-stopword tokens don't overlap with
33
- * any prediction class tag, so hippo emitted nothing despite
34
- * the regex match. The watching variant surfaces the detection event
35
- * + a one-line suggestion so the agent can either re-tag the prediction
36
- * or pass the suggestion through to the user.
37
- */
19
+ /** "Watching" variant emitted when the forward-claim regex matched but no baserate hint was returned (no prediction class tag overlaps the query's tokens).
20
+ * It surfaces the detection plus a one-line suggestion so the agent can re-tag the prediction or pass the suggestion to the user. */
38
21
  export interface PlanningFallacyWatching {
39
22
  /** The forward-claim phrase the detector matched (verbatim regex match snippet). */
40
23
  detectedPhrase: string;
41
- /** Why hippo couldn't produce a baserate hint despite the match.
42
- * - 'no_class_match': no class scored >=1 on token overlap.
43
- * - 'tiebreak': >=2 classes tied at the same best score (silent on ambiguity). */
24
+ /** Why hippo could not produce a baserate hint despite the match: 'no_class_match' (no class scored >=1 on token overlap)
25
+ * or 'tiebreak' (>=2 classes tied at the best score; silent on ambiguity). */
44
26
  reason: 'no_class_match' | 'tiebreak';
45
27
  /** One-line agent-facing suggestion for how the user can give hippo
46
28
  * enough signal to produce a baserate next time. */
47
29
  suggestion: string;
48
30
  }
49
- /**
50
- * What `decidePlanningFallacy` hands to recall. Carries EITHER `hint` (baserate
51
- * available) OR `watching` (regex fired, no baserate), or NEITHER (mode=off,
52
- * no queryText, no regex match, or nClosed=0 silent path). Never both.
53
- */
31
+ /** What `decidePlanningFallacy` hands to recall: EITHER `hint` (baserate available) OR `watching` (regex fired, no baserate), or NEITHER (mode=off,
32
+ * no queryText, no regex match, or nClosed=0). Never both. */
54
33
  export interface PlanningFallacyOutput {
55
34
  hint?: PlanningFallacyHint;
56
35
  watching?: PlanningFallacyWatching;
57
36
  }
58
37
  export type AutodebiasMode = 'off' | 'regex';
59
38
  export interface ComputePlanningFallacyHintOpts {
60
- /** Override env. When undefined, reads process.env.HIPPO_AUTODEBIAS at
61
- * call time (per-call to allow test-time env toggling without module
62
- * reload). 'off' short-circuits to null BEFORE the regex gate so the
63
- * AUTODEBIAS=off path pays zero work. */
39
+ /** Override env; undefined reads process.env.HIPPO_AUTODEBIAS per call (so tests can toggle it).
40
+ * 'off' short-circuits to null before the regex gate. */
64
41
  mode?: AutodebiasMode;
65
42
  }
66
43
  /** The output a claim earns from its evidence, and the audit row that records the decision when there is one. */
@@ -1,15 +1,14 @@
1
1
  import { envClefEndpoint, envClefEndpointToken, envClefTimeoutMs, envCloudflareAccountId, envCloudflareApiToken } from '../util/env.js';
2
2
  import { buildRelevanceRequest, JEV_DEFAULT_TOP_K, rankByScores } from './jev.js';
3
3
  import { createOutageWarning } from './outage-warning.js';
4
- import { rerankerPost } from './remote.js';
5
- import { isJsonObject } from '../util/json.js';
4
+ import { rerankerPost, RERANKER_MAX_REPLY_BYTES } from './remote.js';
5
+ import { readCappedJson } from '../util/capped-json.js';
6
+ import { isJsonObject, isJsonString } from '../util/json.js';
6
7
  import { errorMessage } from '../util/log.js';
7
8
  const RAY_ID_MAX_CHARS = 64;
8
9
  const CLEF_MODELS = ['clef-flash', 'clef'];
9
10
  const DEFAULT_TIMEOUT_MS = 15_000;
10
11
  const MAX_TIMEOUT_MS = 120_000;
11
- // 64 answers fit in a few KB; 1 MiB leaves room for a verbose envelope.
12
- const MAX_REPLY_BYTES = 1024 * 1024;
13
12
  // Workers AI rejects a request with more than 64 questions, one per candidate here.
14
13
  const MAX_CANDIDATES = 64;
15
14
  const ACCOUNT_ID = /^[0-9a-f]{32}$/i;
@@ -24,9 +23,6 @@ function isLoopback(hostname) {
24
23
  function isNumber(v) {
25
24
  return Number.isFinite(v);
26
25
  }
27
- function isString(v) {
28
- return v !== undefined && v !== null && v.constructor === String;
29
- }
30
26
  function isRejection(v) {
31
27
  return v.constructor === String;
32
28
  }
@@ -84,7 +80,7 @@ export function parseClefReply(body, n, model, requireModel) {
84
80
  if (!isJsonObject(reply))
85
81
  return 'reply has no result object';
86
82
  const actual = reply.model;
87
- if (actual !== undefined && (!isString(actual) || actual.trim() !== model))
83
+ if (actual !== undefined && (!isJsonString(actual) || actual.trim() !== model))
88
84
  return 'reply names a different model';
89
85
  if (actual === undefined && requireModel)
90
86
  return 'reply does not name its model';
@@ -106,38 +102,11 @@ export function parseClefReply(body, n, model, requireModel) {
106
102
  const usage = isJsonObject(reply.usage) ? reply.usage : {};
107
103
  return {
108
104
  scores,
109
- actualModel: isString(actual) ? actual.trim() : undefined,
105
+ actualModel: isJsonString(actual) ? actual.trim() : undefined,
110
106
  inputTokens: isNumber(usage.input_tokens) ? usage.input_tokens : undefined,
111
107
  outputTokens: isNumber(usage.output_tokens) ? usage.output_tokens : undefined,
112
108
  };
113
109
  }
114
- // The timeout bounds time, not bytes: a hostile endpoint could stream a huge 2xx body into memory.
115
- async function readCappedJson(resp) {
116
- if (!resp.body)
117
- throw new Error('reply has no body');
118
- const reader = resp.body.getReader();
119
- const decoder = new TextDecoder();
120
- let raw = '';
121
- let received = 0;
122
- for (;;) {
123
- const { done, value } = await reader.read();
124
- if (done)
125
- break;
126
- received += value.byteLength;
127
- if (received > MAX_REPLY_BYTES) {
128
- await reader.cancel();
129
- throw new Error(`reply over ${MAX_REPLY_BYTES} bytes`);
130
- }
131
- raw += decoder.decode(value, { stream: true });
132
- }
133
- raw += decoder.decode();
134
- try {
135
- return JSON.parse(raw);
136
- }
137
- catch {
138
- throw new Error('reply is not JSON');
139
- }
140
- }
141
110
  async function requestScores(model, query, head, route) {
142
111
  const { state, questions } = buildRelevanceRequest(query, head);
143
112
  // Strict parse: parseInt would read "15s" as 15 ms, and Node clamps a delay past 2^31-1 to 1 ms.
@@ -153,7 +122,7 @@ async function requestScores(model, query, head, route) {
153
122
  await resp.body?.cancel();
154
123
  throw new Error(`HTTP ${resp.status}${ray ? `, ray ${ray}` : ''}`);
155
124
  }
156
- const body = await readCappedJson(resp);
125
+ const body = await readCappedJson(resp, RERANKER_MAX_REPLY_BYTES);
157
126
  const parsed = parseClefReply(body, head.length, model, route.backend === 'cloudflare');
158
127
  if (isRejection(parsed))
159
128
  throw new Error(parsed);
@@ -1,4 +1,33 @@
1
1
  import type { RerankerFn } from './types.js';
2
- /** Track 2 reranker: MS-MARCO MiniLM cross-encoder, identity fallback if the model will not load. */
3
- export declare const crossEncoderReranker: RerankerFn;
2
+ interface Tokenized {
3
+ readonly input_ids: object;
4
+ readonly attention_mask: object;
5
+ }
6
+ type TokenizerFn = (text: string, opts: {
7
+ text_pair: string;
8
+ padding: boolean;
9
+ truncation: boolean;
10
+ }) => Promise<Tokenized>;
11
+ type SeqClsModel = (inputs: Tokenized) => Promise<{
12
+ logits: {
13
+ data: ArrayLike<number>;
14
+ };
15
+ }>;
16
+ interface FromPretrained<T> {
17
+ from_pretrained: (model: string) => Promise<T>;
18
+ }
19
+ interface TransformersExports {
20
+ AutoTokenizer?: FromPretrained<TokenizerFn>;
21
+ AutoModelForSequenceClassification?: FromPretrained<SeqClsModel>;
22
+ }
23
+ interface TransformersModuleNamespace extends TransformersExports {
24
+ default?: TransformersExports;
25
+ }
26
+ type ImportModule = () => Promise<{
27
+ readonly name: string;
28
+ readonly mod: TransformersModuleNamespace;
29
+ } | null>;
30
+ /** Track 2 reranker: MS-MARCO MiniLM cross-encoder, identity fallback if the model will not load. Each instance owns its model and outage warning. */
31
+ export declare function createCrossEncoderReranker(importModule?: ImportModule): RerankerFn;
32
+ export {};
4
33
  //# sourceMappingURL=cross-encoder.d.ts.map
@@ -1,110 +1,53 @@
1
- import { createRequire } from 'node:module';
2
- import { pathToFileURL } from 'node:url';
3
1
  import { createOutageWarning } from './outage-warning.js';
4
2
  import { compareScoresDesc } from '../core/compare.js';
5
- import { errorMessage, log } from '../util/log.js';
3
+ import { createModelLoads, importTransformers, MODEL_LOAD_POLICY } from '../embeddings/transformers.js';
4
+ import { errorFields, errorMessage, log } from '../util/log.js';
6
5
  const DEFAULT_CROSS_ENCODER_TOP_K = 50;
7
6
  const MODEL_NAME = 'Xenova/ms-marco-MiniLM-L-6-v2';
8
- const _require = createRequire(import.meta.url);
9
- const TRANSFORMERS_PACKAGES = ['@huggingface/transformers', '@xenova/transformers'];
10
- // Returns the ESM entry URL, the same build src/store/embeddings/index.ts imports. A
11
- // require-style resolve picks the CommonJS build and puts a second copy of
12
- // the library, with its own ONNX sessions, in the process.
13
- function resolveTransformersPackage() {
14
- for (const name of TRANSFORMERS_PACKAGES) {
15
- try {
16
- return import.meta.resolve(name);
17
- }
18
- catch {
19
- // import.meta.resolve is missing under some module runners (vitest's
20
- // included); fall through to the require-based resolve there.
21
- try {
22
- return pathToFileURL(_require.resolve(name)).href;
23
- }
24
- catch {
25
- // Try the legacy fallback only when the preferred package is not installed.
26
- }
27
- }
28
- }
29
- return null;
7
+ async function importModelClasses(importModule) {
8
+ const imported = await importModule();
9
+ if (!imported)
10
+ throw new Error('no Transformers.js package is installed');
11
+ const { name, mod } = imported;
12
+ const tok = mod.AutoTokenizer ?? mod.default?.AutoTokenizer;
13
+ const seq = mod.AutoModelForSequenceClassification ?? mod.default?.AutoModelForSequenceClassification;
14
+ if (!tok || !seq)
15
+ throw new Error(`${name} exports no AutoTokenizer or AutoModelForSequenceClassification`);
16
+ return { AutoTokenizer: tok, AutoModelForSequenceClassification: seq };
30
17
  }
31
- async function loadTransformersModule() {
32
- // Import one backend only. Loading both native ONNX runtimes in one process
33
- // can abort during finalization; Hugging Face is the maintained default.
34
- const url = resolveTransformersPackage();
35
- if (!url)
36
- return null;
37
- try {
38
- const mod = await import(/* @vite-ignore */ url);
39
- const tok = mod.AutoTokenizer ?? mod.default?.AutoTokenizer;
40
- const seq = mod.AutoModelForSequenceClassification ?? mod.default?.AutoModelForSequenceClassification;
41
- return tok && seq ? { AutoTokenizer: tok, AutoModelForSequenceClassification: seq } : null;
42
- }
43
- catch (err) {
44
- log.debug(`cross-encoder: transformers import failed: ${errorMessage(err)}`);
45
- return null;
46
- }
18
+ // NOT the text-classification pipeline: this is a num_labels=1 regression head and that pipeline softmaxes a length-1 logit vector (always 1.0).
19
+ // Read the logit, then squash it.
20
+ async function buildPipeline(importModule) {
21
+ const mod = await importModelClasses(importModule);
22
+ const [tokenizer, model] = await Promise.all([
23
+ mod.AutoTokenizer.from_pretrained(MODEL_NAME),
24
+ mod.AutoModelForSequenceClassification.from_pretrained(MODEL_NAME),
25
+ ]);
26
+ return async (query, candidate) => {
27
+ const inputs = await tokenizer(query, {
28
+ text_pair: candidate,
29
+ padding: true,
30
+ truncation: true,
31
+ });
32
+ const { logits } = await model(inputs);
33
+ const score = 1 / (1 + Math.exp(-Number(logits.data[0])));
34
+ // NaN would make the sort comparator a no-op; throwing hands this
35
+ // candidate to the per-candidate fallback instead.
36
+ if (!Number.isFinite(score))
37
+ throw new Error('cross-encoder returned a non-finite score');
38
+ return score;
39
+ };
47
40
  }
48
- let pipelineLoading = null;
49
- const outage = createOutageWarning('cross-encoder', 'falling back to identity ordering');
50
- // NOT the text-classification pipeline: this model is a num_labels=1
51
- // regression head, and that pipeline softmaxes a length-1 logit vector, which
52
- // is identically 1.0 for every input. Read the logit, then squash it.
53
- async function buildPipeline() {
54
- try {
55
- const mod = await loadTransformersModule();
56
- if (!mod)
57
- return null;
58
- const [tokenizer, model] = await Promise.all([
59
- mod.AutoTokenizer.from_pretrained(MODEL_NAME),
60
- mod.AutoModelForSequenceClassification.from_pretrained(MODEL_NAME),
61
- ]);
62
- return async (query, candidate) => {
63
- const inputs = await tokenizer(query, {
64
- text_pair: candidate,
65
- padding: true,
66
- truncation: true,
67
- });
68
- const { logits } = await model(inputs);
69
- const score = 1 / (1 + Math.exp(-Number(logits.data[0])));
70
- // NaN would make the sort comparator a no-op; throwing hands this
71
- // candidate to the per-candidate fallback instead.
72
- if (!Number.isFinite(score))
73
- throw new Error('cross-encoder returned a non-finite score');
74
- return score;
75
- };
76
- }
77
- catch (err) {
78
- log.debug(`cross-encoder: model load failed: ${errorMessage(err)}`);
79
- return null;
80
- }
81
- }
82
- // One shared in-flight load: two first calls must not fetch the model twice.
83
- // A failed load clears the slot so a later call can try again.
84
- function loadPipeline() {
85
- pipelineLoading ??= buildPipeline().then((pipe) => {
86
- if (!pipe)
87
- pipelineLoading = null;
88
- return pipe;
89
- });
90
- return pipelineLoading;
41
+ /** The head in its input order, scored as it came. */
42
+ function identityOrder(head) {
43
+ return head.map((r, i) => ({
44
+ ...r,
45
+ rerankScore: r.score,
46
+ preRerankRank: r.preRerankRank ?? i + 1,
47
+ postRerankRank: i + 1,
48
+ }));
91
49
  }
92
- /** Track 2 reranker: MS-MARCO MiniLM cross-encoder, identity fallback if the model will not load. */
93
- export const crossEncoderReranker = async (query, results, options) => {
94
- const topK = options?.topK ?? DEFAULT_CROSS_ENCODER_TOP_K;
95
- const head = results.slice(0, topK);
96
- const pipe = await loadPipeline();
97
- if (!pipe) {
98
- // A silent identity fallback otherwise reads as a working reranker.
99
- outage.failed('no Transformers.js backend, or model fetch blocked');
100
- return head.map((r, i) => ({
101
- ...r,
102
- rerankScore: r.score,
103
- preRerankRank: r.preRerankRank ?? i + 1,
104
- postRerankRank: i + 1,
105
- }));
106
- }
107
- outage.answered();
50
+ async function scoreHead(pipe, query, head) {
108
51
  const scored = await Promise.all(head.map(async (r, i) => {
109
52
  let ceScore;
110
53
  try {
@@ -127,5 +70,26 @@ export const crossEncoderReranker = async (query, results, options) => {
127
70
  scored.sort((a, b) => compareScoresDesc(a.rerankScore, b.rerankScore));
128
71
  scored.forEach((r, i) => (r.postRerankRank = i + 1));
129
72
  return scored;
130
- };
73
+ }
74
+ /** Track 2 reranker: MS-MARCO MiniLM cross-encoder, identity fallback if the model will not load. Each instance owns its model and outage warning. */
75
+ export function createCrossEncoderReranker(importModule = importTransformers) {
76
+ const outage = createOutageWarning('cross-encoder', 'falling back to identity ordering');
77
+ // The outage warning already says each failure, at most once per window, so the loads report nothing themselves.
78
+ const pipelines = createModelLoads(MODEL_LOAD_POLICY);
79
+ return async (query, results, options) => {
80
+ const head = results.slice(0, options?.topK ?? DEFAULT_CROSS_ENCODER_TOP_K);
81
+ let pipe;
82
+ try {
83
+ // One shared load per backoff window: two first calls fetch the model once, and a failure is not fetched again on every recall.
84
+ pipe = await pipelines.load(MODEL_NAME, () => buildPipeline(importModule));
85
+ }
86
+ catch (err) {
87
+ // A silent identity fallback otherwise reads as a working reranker.
88
+ outage.failed(errorMessage(err), errorFields(err));
89
+ return identityOrder(head);
90
+ }
91
+ outage.answered();
92
+ return scoreHead(pipe, query, head);
93
+ };
94
+ }
131
95
  //# sourceMappingURL=cross-encoder.js.map
@@ -1,13 +1,14 @@
1
1
  import { createClefReranker } from './clef.js';
2
- import { crossEncoderReranker } from './cross-encoder.js';
2
+ import { createCrossEncoderReranker } from './cross-encoder.js';
3
3
  import { createJevReranker } from './jev.js';
4
4
  import { createLlmReranker } from './llm.js';
5
- // Each hosted reranker is built once here, so its outage warning lasts the process.
5
+ // Each reranker is built once here, so its outage warning lasts the process; jev falls back to the same cross-encoder, so one model loads.
6
+ const crossEncoder = createCrossEncoderReranker();
6
7
  const REGISTRY = {
7
8
  clef: createClefReranker('clef'),
8
9
  'clef-flash': createClefReranker('clef-flash'),
9
- 'cross-encoder': crossEncoderReranker,
10
- jev: createJevReranker(crossEncoderReranker),
10
+ 'cross-encoder': crossEncoder,
11
+ jev: createJevReranker(crossEncoder),
11
12
  llm: createLlmReranker(),
12
13
  };
13
14
  function isRegisteredRerankerName(name) {
@@ -1,7 +1,10 @@
1
+ import { truncateWithEllipsis } from '../util/ellipsize.js';
1
2
  import { envJevModel, envJevTimeoutMs, envTypesafeApiKey } from '../util/env.js';
2
3
  import { redactSecretsStrict } from '../util/secret-detect.js';
3
4
  import { createOutageWarning } from './outage-warning.js';
4
- import { rerankerPost } from './remote.js';
5
+ import { rerankerPost, RERANKER_MAX_REPLY_BYTES } from './remote.js';
6
+ import { readCappedJson } from '../util/capped-json.js';
7
+ import { isJsonNumber, isJsonObject } from '../util/json.js';
5
8
  import { compareScoresDesc } from '../core/compare.js';
6
9
  import { errorMessage } from '../util/log.js';
7
10
  const REQUEST_ID_MAX_CHARS = 64;
@@ -13,20 +16,19 @@ const TRUNCATE_CHARS = 1200;
13
16
  const DEFAULT_MODEL = 'jev-1.13.0';
14
17
  // The pool size the eval numbers were measured at.
15
18
  export const JEV_DEFAULT_TOP_K = 40;
16
- function truncate(s, n) {
17
- return s.length <= n ? s : `${s.slice(0, n)}...`;
18
- }
19
19
  // Number.isFinite rejects a string or null without coercing it, which the
20
20
  // declared type cannot promise about a third-party payload.
21
21
  function isProbability(v) {
22
- return v !== undefined && Number.isFinite(v) && v >= 0 && v <= 1;
22
+ return isJsonNumber(v) && Number.isFinite(v) && v >= 0 && v <= 1;
23
23
  }
24
24
  // A half-scored list ranks worse than the order it would replace, so one bad
25
25
  // answer voids the whole response.
26
- function parseScores(answers, n) {
26
+ function parseScores(body, n) {
27
+ const answers = isJsonObject(body) ? body.answers : undefined;
27
28
  const out = [];
28
29
  for (let i = 1; i <= n; i++) {
29
- const v = answers?.[`c${i}`]?.noul;
30
+ const answer = isJsonObject(answers) ? answers[`c${i}`] : undefined;
31
+ const v = isJsonObject(answer) ? answer.noul : undefined;
30
32
  if (!isProbability(v))
31
33
  return null;
32
34
  out.push(v);
@@ -36,7 +38,7 @@ function parseScores(answers, n) {
36
38
  /** Redacted query plus numbered, redacted, truncated candidates. Shared with CLEF so both arms see matched input. */
37
39
  export function buildRelevanceRequest(query, head) {
38
40
  // Strict: this text leaves the machine, so Bearer, Basic-auth and JWT shapes go too.
39
- const lines = head.map((r, i) => `[${i + 1}] ${truncate(redactSecretsStrict(r.entry.content), TRUNCATE_CHARS)}`);
41
+ const lines = head.map((r, i) => `[${i + 1}] ${truncateWithEllipsis(redactSecretsStrict(r.entry.content), TRUNCATE_CHARS)}`);
40
42
  const state = `Query: ${redactSecretsStrict(query)}\n\nNumbered candidate memories from an AI coding agent's project store:\n\n${lines.join('\n\n')}`;
41
43
  const questions = {};
42
44
  for (let i = 1; i <= head.length; i++) {
@@ -67,8 +69,7 @@ async function requestScores(query, head) {
67
69
  await resp.body?.cancel();
68
70
  throw new Error(`HTTP ${resp.status}${requestId ? `, request ${requestId}` : ''}`);
69
71
  }
70
- const body = await resp.json();
71
- const scores = parseScores(body.answers, head.length);
72
+ const scores = parseScores(await readCappedJson(resp, RERANKER_MAX_REPLY_BYTES), head.length);
72
73
  if (!scores)
73
74
  throw new Error('incomplete or out-of-range answers');
74
75
  return scores;
@@ -1,14 +1,5 @@
1
1
  import type { RerankerFn } from './types.js';
2
- /**
3
- * Track 3 reranker: listwise LLM rerank. Uses a customer-supplied
4
- * OpenAI-compatible endpoint. Gated on HIPPO_LLM_RERANKER_URL to prevent
5
- * accidental cost.
6
- *
7
- * Skeleton only; full characterisation is deferred.
8
- *
9
- * Timeout: defaults to 30s for the whole call, retries included; overridable
10
- * via HIPPO_LLM_RERANKER_TIMEOUT_MS. On timeout or any failure the reranker
11
- * falls back to identity ordering; recall must not hang on a wedged endpoint.
12
- */
2
+ /** Track 3 reranker (skeleton): listwise LLM rerank on a customer-supplied OpenAI-compatible endpoint, gated on HIPPO_LLM_RERANKER_URL against accidental cost.
3
+ * Timeout is 30s for the whole call, retries included (HIPPO_LLM_RERANKER_TIMEOUT_MS); any failure falls back to identity ordering, so recall never hangs. */
13
4
  export declare function createLlmReranker(): RerankerFn;
14
5
  //# sourceMappingURL=llm.d.ts.map
@@ -1,21 +1,14 @@
1
1
  import { envLlmRerankerKey, envLlmRerankerModel, envLlmRerankerTimeoutMs, envLlmRerankerUrl } from '../util/env.js';
2
2
  import { redactSecretsStrict } from '../util/secret-detect.js';
3
3
  import { createOutageWarning } from './outage-warning.js';
4
- import { rerankerPost } from './remote.js';
4
+ import { rerankerPost, RERANKER_MAX_REPLY_BYTES } from './remote.js';
5
+ import { readCappedJson } from '../util/capped-json.js';
6
+ import { isJsonObject, isJsonString } from '../util/json.js';
5
7
  import { errorMessage } from '../util/log.js';
6
8
  const DEFAULT_LLM_RERANK_TOP_K = 20;
7
9
  const DEFAULT_TIMEOUT_MS = 30_000;
8
- /**
9
- * Track 3 reranker: listwise LLM rerank. Uses a customer-supplied
10
- * OpenAI-compatible endpoint. Gated on HIPPO_LLM_RERANKER_URL to prevent
11
- * accidental cost.
12
- *
13
- * Skeleton only; full characterisation is deferred.
14
- *
15
- * Timeout: defaults to 30s for the whole call, retries included; overridable
16
- * via HIPPO_LLM_RERANKER_TIMEOUT_MS. On timeout or any failure the reranker
17
- * falls back to identity ordering; recall must not hang on a wedged endpoint.
18
- */
10
+ /** Track 3 reranker (skeleton): listwise LLM rerank on a customer-supplied OpenAI-compatible endpoint, gated on HIPPO_LLM_RERANKER_URL against accidental cost.
11
+ * Timeout is 30s for the whole call, retries included (HIPPO_LLM_RERANKER_TIMEOUT_MS); any failure falls back to identity ordering, so recall never hangs. */
19
12
  export function createLlmReranker() {
20
13
  const outage = createOutageWarning('llm', 'keeping the input order');
21
14
  return async (query, results, options) => {
@@ -42,6 +35,14 @@ export function createLlmReranker() {
42
35
  }));
43
36
  };
44
37
  }
38
+ /** The first choice's message text, or '' when the reply has none. */
39
+ function replyText(body) {
40
+ const choices = isJsonObject(body) ? body.choices : undefined;
41
+ const choice = Array.isArray(choices) ? choices[0] : undefined;
42
+ const message = isJsonObject(choice) ? choice.message : undefined;
43
+ const content = isJsonObject(message) ? message.content : undefined;
44
+ return isJsonString(content) ? content : '';
45
+ }
45
46
  /** One chat-completions call; rejects with the reason when the reply holds no usable permutation. */
46
47
  async function requestPermutation(url, query, head) {
47
48
  const key = envLlmRerankerKey();
@@ -69,8 +70,7 @@ async function requestPermutation(url, query, head) {
69
70
  await resp.body?.cancel();
70
71
  throw new Error(`HTTP ${resp.status}`);
71
72
  }
72
- const j = await resp.json();
73
- const txt = j.choices?.[0]?.message?.content ?? '';
73
+ const txt = replyText(await readCappedJson(resp, RERANKER_MAX_REPLY_BYTES));
74
74
  const m = txt.match(/\[\s*(\d+(?:\s*,\s*\d+)*)\s*\]/);
75
75
  const parsed = m ? m[1].split(',').map((s) => parseInt(s.trim(), 10)) : [];
76
76
  const isPermutation = parsed.length === head.length &&
@@ -1,7 +1,10 @@
1
+ import { type LogFields } from '../util/log.js';
1
2
  export interface OutageWarning {
2
- failed(reason: string): void;
3
+ /** `fields` carries the error's class and stack onto the warning line. */
4
+ failed(reason: string, fields?: LogFields): void;
3
5
  answered(): void;
4
6
  }
5
- /** Warns when `name` starts failing, at most every five minutes while it keeps failing, and once when it answers again. `fallback` says what recall does meanwhile. */
7
+ /** Warns when `name` starts failing, at most every five minutes while it keeps failing,
8
+ * and once when it answers again. `fallback` says what recall does meanwhile. */
6
9
  export declare function createOutageWarning(name: string, fallback: string): OutageWarning;
7
10
  //# sourceMappingURL=outage-warning.d.ts.map
@@ -1,20 +1,23 @@
1
1
  // One way for a reranker to report that it stopped working, without a line per recall.
2
+ import { MINUTE_MS } from '../util/time.js';
2
3
  import { log } from '../util/log.js';
3
- const REPEAT_MS = 5 * 60_000;
4
- /** Warns when `name` starts failing, at most every five minutes while it keeps failing, and once when it answers again. `fallback` says what recall does meanwhile. */
4
+ const REPEAT_MS = 5 * MINUTE_MS;
5
+ /** Warns when `name` starts failing, at most every five minutes while it keeps failing,
6
+ * and once when it answers again. `fallback` says what recall does meanwhile. */
5
7
  export function createOutageWarning(name, fallback) {
6
8
  let failures = 0;
7
9
  let unreported = 0;
8
10
  let warnedAt = 0;
9
11
  return {
10
- failed(reason) {
12
+ failed(reason, fields) {
11
13
  failures++;
12
14
  if (failures > 1 && Date.now() - warnedAt < REPEAT_MS) {
13
15
  unreported++;
14
16
  return;
15
17
  }
16
18
  const skipped = unreported > 0 ? ` ${unreported} more calls failed since the last warning.` : '';
17
- log.warn(`${name} reranker unavailable (${reason}); ${fallback}.${skipped} While it fails this repeats at most every ${REPEAT_MS / 60_000} minutes.`);
19
+ const repeat = `While it fails this repeats at most every ${REPEAT_MS / MINUTE_MS} minutes.`;
20
+ log.warn(`${name} reranker unavailable (${reason}); ${fallback}.${skipped} ${repeat}`, fields);
18
21
  warnedAt = Date.now();
19
22
  unreported = 0;
20
23
  },
@@ -1,3 +1,4 @@
1
+ export declare const RERANKER_MAX_REPLY_BYTES: number;
1
2
  /** POST a scoring request. A dropped connection, 429 or 5xx is retried, since scoring changes nothing on the far side. */
2
3
  export declare function rerankerPost(url: string, init: RequestInit, budgetMs: number): Promise<Response>;
3
4
  //# sourceMappingURL=remote.d.ts.map
@@ -2,6 +2,8 @@
2
2
  import { fetchWithRetry } from '../util/http-retry.js';
3
3
  // A Retry-After longer than this would outlast most budgets, so the answer is handed back and the reranker falls back.
4
4
  const RETRY_WAIT_CAP_MS = 2_000;
5
+ // Every reranker reads its reply through this cap; the largest honest reply is a few KB, and 1 MiB leaves room for a verbose envelope.
6
+ export const RERANKER_MAX_REPLY_BYTES = 1024 * 1024;
5
7
  /** POST a scoring request. A dropped connection, 429 or 5xx is retried, since scoring changes nothing on the far side. */
6
8
  export async function rerankerPost(url, init, budgetMs) {
7
9
  // The budget bounds the whole call, retries included, so recall never waits past the configured timeout.