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
package/dist/cli/eval.js CHANGED
@@ -1,17 +1,19 @@
1
1
  // The `hippo eval` verb; main() loads it lazily from the command table.
2
2
  import * as path from 'path';
3
3
  import * as fs from 'fs';
4
- import { loadAllEntries } from '../store/entry-reads.js';
4
+ import { listMemories } from '../api/memories.js';
5
+ import { cliApiContext } from './api-context.js';
5
6
  import { loadConfig } from '../core/config.js';
6
- import { getGlobalRoot } from '../sharing/shared.js';
7
+ import { getGlobalRoot } from '../sharing/global-store.js';
7
8
  import { runEval, bootstrapCorpus, compareSummaries } from '../eval/eval.js';
8
9
  import { runFeatureEval, formatResult, resultToBaseline, detectRegressions } from '../eval/eval-suite.js';
9
10
  import { PACKAGE_VERSION } from '../util/version.js';
10
11
  import { printError } from './output.js';
11
12
  import { requireInit } from './shared.js';
12
13
  import { fmt } from './print.js';
13
- import { boolFlag } from './flag-values.js';
14
+ import { boolFlag, numberFlag } from './flag-values.js';
14
15
  import { errorMessage } from '../util/log.js';
16
+ import { CliExit } from './exit.js';
15
17
  const HIT_TOP_K = 10;
16
18
  const MAX_FAILING_SHOWN = 10;
17
19
  const TOP_IDS_SHOWN = 3;
@@ -19,14 +21,14 @@ const MAX_MISSED_SHOWN = 4;
19
21
  const QUERY_PREVIEW_CHARS = 60;
20
22
  const MAX_DELTAS_SHOWN = 5;
21
23
  /** Runs `hippo eval`: --bootstrap writes a corpus, --suite runs the built-in feature eval, else it scores a corpus file. */
22
- async function cmdEval(hippoRoot, corpusPath, flags) {
24
+ async function cmdEval(hippoRoot, tenantId, corpusPath, flags) {
23
25
  const asJson = boolFlag(flags, 'json');
24
- const minMrr = flags['min-mrr'] !== undefined ? parseFloat(String(flags['min-mrr'])) : null;
26
+ const minMrr = numberFlag(flags, 'min-mrr') ?? null;
25
27
  const comparePath = flags['compare'] ? String(flags['compare']) : null;
26
28
  // Suite mode doesn't need an initialized store
27
29
  if (!flags['suite'])
28
30
  requireInit(hippoRoot);
29
- const entries = flags['suite'] ? [] : loadAllEntries(hippoRoot);
31
+ const entries = flags['suite'] ? [] : listMemories(cliApiContext(hippoRoot, tenantId), { everyTenant: true });
30
32
  if (flags['bootstrap']) {
31
33
  writeBootstrapCorpus(entries, flags);
32
34
  return;
@@ -44,7 +46,7 @@ async function cmdEval(hippoRoot, corpusPath, flags) {
44
46
  }
45
47
  if (minMrr !== null && summary.meanMrr < minMrr) {
46
48
  printError(`MRR ${fmt(summary.meanMrr, 4)} below threshold ${minMrr}`);
47
- process.exit(1);
49
+ throw new CliExit(1);
48
50
  }
49
51
  if (comparePath)
50
52
  printEvalCompare(summary, comparePath, asJson);
@@ -54,22 +56,20 @@ async function runCorpusEval(hippoRoot, corpusPath, entries, flags) {
54
56
  const globalRoot = getGlobalRoot();
55
57
  const localBump = flags['equal-sources']
56
58
  ? 1.0
57
- : flags['local-bump'] !== undefined
58
- ? parseFloat(String(flags['local-bump']))
59
- : loadConfig(hippoRoot).search.localBump;
59
+ : numberFlag(flags, 'local-bump') ?? loadConfig(hippoRoot).search.localBump;
60
60
  return runEval(cases, entries, {
61
61
  hippoRoot,
62
62
  globalRoot,
63
63
  mmr: !flags['no-mmr'],
64
- mmrLambda: flags['mmr-lambda'] !== undefined ? parseFloat(String(flags['mmr-lambda'])) : undefined,
65
- embeddingWeight: flags['embedding-weight'] !== undefined ? parseFloat(String(flags['embedding-weight'])) : undefined,
64
+ mmrLambda: numberFlag(flags, 'mmr-lambda'),
65
+ embeddingWeight: numberFlag(flags, 'embedding-weight'),
66
66
  localBump,
67
67
  });
68
68
  }
69
69
  /** Bootstrap mode: emit a synthetic corpus built from the store's own memories. */
70
70
  function writeBootstrapCorpus(entries, flags) {
71
71
  const outPath = flags['out'] ? String(flags['out']) : null;
72
- const max = flags['max-cases'] !== undefined ? parseInt(String(flags['max-cases']), 10) : 50;
72
+ const max = numberFlag(flags, 'max-cases') ?? 50;
73
73
  const corpus = bootstrapCorpus(entries, max);
74
74
  const payload = JSON.stringify({ cases: corpus }, null, 2);
75
75
  if (outPath) {
@@ -85,11 +85,12 @@ function writeBootstrapCorpus(entries, flags) {
85
85
  async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
86
86
  const baselinePath = flags['baseline'] ? String(flags['baseline']) : path.join(hippoRoot, 'eval-baseline.json');
87
87
  let baseline;
88
- if (fs.existsSync(baselinePath)) {
89
- try {
90
- baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
91
- }
92
- catch {
88
+ try {
89
+ baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
90
+ }
91
+ catch (err) {
92
+ // No baseline file is a first run and says nothing; a file that is there and cannot be used warns.
93
+ if (!(err instanceof Error && 'code' in err && err.code === 'ENOENT')) {
93
94
  printError(`Warning: eval baseline ${baselinePath} is unreadable; running without it.`);
94
95
  }
95
96
  }
@@ -109,7 +110,7 @@ async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
109
110
  if (baseline) {
110
111
  const report = detectRegressions(baseline, result);
111
112
  if (report.verdict === 'REGRESSION' && minMrr === null) {
112
- process.exit(1);
113
+ throw new CliExit(1);
113
114
  }
114
115
  }
115
116
  }
@@ -117,11 +118,11 @@ async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
117
118
  function readCorpus(corpusPath) {
118
119
  if (!corpusPath) {
119
120
  printError('Usage: hippo eval <corpus.json> OR hippo eval --suite [--save-baseline] OR hippo eval --bootstrap');
120
- process.exit(1);
121
+ throw new CliExit(1);
121
122
  }
122
123
  if (!fs.existsSync(corpusPath)) {
123
124
  printError(`Corpus file not found: ${corpusPath}`);
124
- process.exit(1);
125
+ throw new CliExit(1);
125
126
  }
126
127
  let cases;
127
128
  try {
@@ -132,7 +133,7 @@ function readCorpus(corpusPath) {
132
133
  }
133
134
  catch (err) {
134
135
  printError(`Failed to read corpus: ${errorMessage(err)}`);
135
- process.exit(1);
136
+ throw new CliExit(1);
136
137
  }
137
138
  return cases;
138
139
  }
@@ -176,7 +177,7 @@ function printEvalSummary(summary, showCases) {
176
177
  function printEvalCompare(summary, comparePath, asJson) {
177
178
  if (!fs.existsSync(comparePath)) {
178
179
  printError(`Baseline file not found: ${comparePath}`);
179
- process.exit(1);
180
+ throw new CliExit(1);
180
181
  }
181
182
  let baseline;
182
183
  try {
@@ -184,7 +185,7 @@ function printEvalCompare(summary, comparePath, asJson) {
184
185
  }
185
186
  catch (err) {
186
187
  printError(`Failed to parse baseline: ${errorMessage(err)}`);
187
- process.exit(1);
188
+ throw new CliExit(1);
188
189
  }
189
190
  const cmp = compareSummaries(baseline, summary);
190
191
  if (asJson) {
@@ -218,8 +219,8 @@ function printEvalCompare(summary, comparePath, asJson) {
218
219
  }
219
220
  }
220
221
  }
221
- export async function handleEval({ hippoRoot, args, flags }) {
222
+ export async function handleEval({ hippoRoot, tenantId, args, flags }) {
222
223
  const corpusPath = args[0] ? String(args[0]) : null;
223
- await cmdEval(hippoRoot, corpusPath, flags);
224
+ await cmdEval(hippoRoot, tenantId, corpusPath, flags);
224
225
  }
225
226
  //# sourceMappingURL=eval.js.map
@@ -0,0 +1,6 @@
1
+ /** Thrown after the verb has printed its own message, so it carries the exit code and nothing for the entry to print. */
2
+ export declare class CliExit extends Error {
3
+ readonly code: number;
4
+ constructor(code: number);
5
+ }
6
+ //# sourceMappingURL=exit.d.ts.map
@@ -0,0 +1,11 @@
1
+ // The one error a CLI verb throws to stop its command; runCli is the one place that turns it into the process exit code.
2
+ /** Thrown after the verb has printed its own message, so it carries the exit code and nothing for the entry to print. */
3
+ export class CliExit extends Error {
4
+ code;
5
+ constructor(code) {
6
+ super(`hippo exits with code ${code}`);
7
+ this.name = 'CliExit';
8
+ this.code = code;
9
+ }
10
+ }
11
+ //# sourceMappingURL=exit.js.map
@@ -1,4 +1,3 @@
1
- import { type CliFlags, type CommandContext } from './flag-values.js';
2
- export declare function cmdExplain(hippoRoot: string, query: string, flags: CliFlags): Promise<void>;
3
- export declare function handleExplain({ hippoRoot, args, flags }: CommandContext): Promise<void>;
1
+ import { type CommandContext } from './flag-values.js';
2
+ export declare function handleExplain({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
4
3
  //# sourceMappingURL=explain.d.ts.map
@@ -1,34 +1,28 @@
1
1
  // The `hippo explain` verb; main() loads it lazily from the command table.
2
2
  import { confidenceFacets } from '../core/memory.js';
3
- import { isInitialized } from '../store/open.js';
4
- import { loadSearchEntries } from '../store/search-rows.js';
5
- import { loadIndex } from '../store/index-and-stats.js';
6
3
  import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
7
4
  import { loadConfig } from '../core/config.js';
8
5
  import { dropHeldCopies } from '../util/same-text.js';
9
- import { detectScope } from '../sharing/scope.js';
10
- import { getGlobalRoot } from '../sharing/shared.js';
6
+ import { detectScope } from '../core/active-scope.js';
7
+ import { getGlobalRoot } from '../sharing/global-store.js';
11
8
  import * as api from '../api/index.js';
12
- import { resolveTenantId } from '../store/tenant.js';
9
+ import { cliRecallOrigin, scopeHiddenCount } from '../api/recall-cli.js';
10
+ import { cliApiContext } from './api-context.js';
13
11
  import { printedTokens } from '../api/context-render.js';
14
12
  import { printError } from './output.js';
15
13
  import { parseLimitFlag, parseBudgetFlag, parseAsOfFlag, engineFlags, boolFlag } from './flag-values.js';
16
14
  import { requireInit } from './shared.js';
17
15
  import { fmt, recallEntryText, recallHeading } from './print.js';
16
+ import { CliExit } from './exit.js';
18
17
  const EXPLAIN_PREVIEW_CHARS = 48;
19
18
  /** The SQL predicate drops denied rows before the window, so an unscoped probe counts what the policy hides. */
20
- function noteScopeHidden(hippoRoot, globalRoot, query, tenantId, requested) {
21
- const probe = [
22
- ...loadSearchEntries(hippoRoot, query, undefined, tenantId),
23
- ...(globalRoot ? loadSearchEntries(globalRoot, query, undefined, tenantId) : []),
24
- ];
25
- // Window-capped, so the count is a floor on large stores; fine for a "why is my row missing" hint.
26
- const hidden = probe.filter((e) => !api.passesCliRecallScopeFilter(e.scope ?? null, requested)).length;
19
+ function noteScopeHidden(ctx, globalRoot, query, requested) {
20
+ const hidden = scopeHiddenCount(ctx, query, globalRoot, requested);
27
21
  if (hidden > 0) {
28
22
  printError(`[note] ${hidden} candidate${hidden === 1 ? '' : 's'} hidden by recall scope policy (pass an explicit --scope to inspect).`);
29
23
  }
30
24
  }
31
- export async function cmdExplain(hippoRoot, query, flags) {
25
+ async function cmdExplain(hippoRoot, tenantId, query, flags) {
32
26
  requireInit(hippoRoot);
33
27
  const budget = parseBudgetFlag(flags['budget'], DEFAULT_RECALL_BUDGET);
34
28
  const limit = parseLimitFlag(flags['limit']);
@@ -36,25 +30,26 @@ export async function cmdExplain(hippoRoot, query, flags) {
36
30
  const includeSuperseded = boolFlag(flags, 'include-superseded');
37
31
  const asOf = parseAsOfFlag(flags);
38
32
  const globalRoot = getGlobalRoot();
39
- const tenantId = resolveTenantId({});
33
+ const ctx = cliApiContext(hippoRoot, tenantId);
40
34
  // Explain shows what recall would see, so it applies the same scope rule.
41
35
  const explicitScope = flags['scope'] !== undefined ? String(flags['scope']).trim() : null;
36
+ const activeScope = explicitScope || detectScope();
42
37
  // Unlike recall, explain reads the global store whenever it exists, even when it is the local root.
43
- const explainGlobalOn = isInitialized(globalRoot);
44
- noteScopeHidden(hippoRoot, explainGlobalOn ? globalRoot : undefined, query, tenantId, explicitScope || undefined);
38
+ const origin = cliRecallOrigin(ctx, { globalRoot, primaryIsGlobal: false, activeScope });
39
+ const explainGlobalOn = origin.globalOn;
40
+ noteScopeHidden(ctx, explainGlobalOn ? globalRoot : undefined, query, explicitScope || undefined);
45
41
  const config = loadConfig(hippoRoot);
46
42
  const engine = engineFlags(flags, config);
47
43
  // Priced as recall prints each result, so explain returns what recall's engines would.
48
- const explainIndex = loadIndex(hippoRoot);
49
- const cost = (r) => printedTokens(recallEntryText(r, query, false, explainGlobalOn && !explainIndex.entries[r.entry.id]));
44
+ const cost = (r) => printedTokens(recallEntryText(r, query, false, origin.isGlobal(r.entry.id)));
50
45
  const entryBudget = Math.max(0, budget - printedTokens(recallHeading(budget, budget, query)));
51
46
  const slot = {};
52
- await api.retrieve({ hippoRoot, tenantId, actor: api.adminActor('cli') }, {
47
+ await api.retrieve(ctx, {
53
48
  query,
54
49
  cliCore: {
55
50
  rank: {
56
51
  budget: entryBudget, cost, limit, includeSuperseded, asOf,
57
- explicitScope, activeScope: explicitScope || detectScope(),
52
+ explicitScope, activeScope,
58
53
  search: { ...engine, multihop: false, explain: true },
59
54
  },
60
55
  sources: { globalRoot: explainGlobalOn ? globalRoot : undefined },
@@ -117,7 +112,8 @@ function printExplainTable(results, query, modeUsed, candidates) {
117
112
  const b = r.breakdown;
118
113
  const preview = r.entry.content.replace(/\s+/g, ' ').slice(0, EXPLAIN_PREVIEW_CHARS);
119
114
  const ageStr = b ? `${b.ageDays}d` : '?';
120
- console.log(`${String(i + 1).padEnd(5)} ${fmt(r.score, 3).padEnd(7)} ${fmt(r.entry.strength).padEnd(9)} ${ageStr.padEnd(6)} ${r.entry.layer.padEnd(10)} ${r.entry.id.padEnd(17)} ${preview}`);
115
+ console.log(`${String(i + 1).padEnd(5)} ${fmt(r.score, 3).padEnd(7)} ${fmt(r.entry.strength).padEnd(9)} ${ageStr.padEnd(6)} ` +
116
+ `${r.entry.layer.padEnd(10)} ${r.entry.id.padEnd(17)} ${preview}`);
121
117
  }
122
118
  console.log();
123
119
  }
@@ -150,8 +146,10 @@ function printExplainBreakdown(r, i) {
150
146
  console.log(` path: x${fmt(b.pathBoost, 3)} (cwd path tag overlap)`);
151
147
  if (b.sourceBump !== 1)
152
148
  console.log(` source: x${fmt(b.sourceBump, 2)} (local priority bump over global)`);
153
- if (b.outcomeBoost !== 1)
154
- console.log(` outcome: x${fmt(b.outcomeBoost, 3)} (user feedback: pos-neg = ${(r.entry.outcome_positive ?? 0) - (r.entry.outcome_negative ?? 0)})`);
149
+ if (b.outcomeBoost !== 1) {
150
+ console.log(` outcome: x${fmt(b.outcomeBoost, 3)} ` +
151
+ `(user feedback: pos-neg = ${(r.entry.outcome_positive ?? 0) - (r.entry.outcome_negative ?? 0)})`);
152
+ }
155
153
  if (b.churnStaleMultiplier !== 1)
156
154
  console.log(` churn: x${fmt(b.churnStaleMultiplier, 2)} (tagged 'churn-stale')`);
157
155
  if (b.preMmrRank !== undefined && b.postMmrRank !== undefined && b.preMmrRank !== b.postMmrRank) {
@@ -162,12 +160,12 @@ function printExplainBreakdown(r, i) {
162
160
  }
163
161
  console.log();
164
162
  }
165
- export async function handleExplain({ hippoRoot, args, flags }) {
163
+ export async function handleExplain({ hippoRoot, tenantId, args, flags }) {
166
164
  const query = args.join(' ').trim();
167
165
  if (!query) {
168
166
  printError('Please provide a search query.');
169
- process.exit(1);
167
+ throw new CliExit(1);
170
168
  }
171
- await cmdExplain(hippoRoot, query, flags);
169
+ await cmdExplain(hippoRoot, tenantId, query, flags);
172
170
  }
173
171
  //# sourceMappingURL=explain.js.map
@@ -1,19 +1,24 @@
1
1
  import type { RecallSearchOpts } from '../api/recall-pipeline.js';
2
2
  import type { HippoConfig } from '../core/config.js';
3
+ export declare function isBooleanFlag(value: string | boolean | string[] | undefined): value is boolean;
4
+ export declare function isStringFlag(value: string | boolean | string[] | undefined): value is string;
3
5
  export declare function parseLimitFlag(value: string | boolean | string[] | undefined): number;
4
6
  export declare function parseCountFlag(value: string | boolean | string[] | undefined): number;
5
7
  export declare function parseBudgetFlag(value: string | boolean | string[] | undefined, fallback: number): number;
6
8
  export type CliFlags = Record<string, string | boolean | string[]>;
7
- export declare function parsePositiveId(idRaw: unknown, label: string): number;
9
+ export declare function parsePositiveId(idRaw: string | undefined, label: string): number;
8
10
  export declare function parseListLimit(flags: CliFlags): number;
9
11
  export declare function stringFlag(flags: CliFlags, name: string): string | undefined;
10
12
  export declare function nonEmptyStringFlag(flags: CliFlags, name: string): string | undefined;
13
+ export declare function stringListFlag(flags: CliFlags, name: string): string[] | undefined;
14
+ export declare function isOneOf<T extends string>(allowed: readonly T[], value: string): value is T;
11
15
  export declare function numberFlag(flags: CliFlags, name: string): number | undefined;
12
16
  export declare function boolFlag(flags: CliFlags, name: string): boolean;
13
17
  export declare function flagIsTrue(flags: CliFlags, name: string): boolean;
14
18
  /** What the command table hands each verb's run(). */
15
19
  export interface CommandContext {
16
20
  readonly hippoRoot: string;
21
+ readonly tenantId: string;
17
22
  readonly args: string[];
18
23
  readonly flags: CliFlags;
19
24
  }
@@ -1,5 +1,13 @@
1
1
  // Readers that turn parsed CLI flags into typed values, and the flag types they share.
2
+ import { resolveListLimit } from '../util/limits.js';
2
3
  import { printError } from './output.js';
4
+ import { CliExit } from './exit.js';
5
+ export function isBooleanFlag(value) {
6
+ return typeof value === 'boolean';
7
+ }
8
+ export function isStringFlag(value) {
9
+ return typeof value === 'string';
10
+ }
3
11
  export function parseLimitFlag(value) {
4
12
  if (!value)
5
13
  return Infinity;
@@ -16,49 +24,68 @@ export function parseBudgetFlag(value, fallback) {
16
24
  if (value === undefined)
17
25
  return fallback;
18
26
  // A value-less flag and a junk value are different typos; the --hops guard already splits them.
19
- if (typeof value !== 'string') {
27
+ if (!isStringFlag(value)) {
20
28
  printError('--budget requires an integer value (e.g. --budget 1500).');
21
- process.exit(1);
29
+ throw new CliExit(1);
22
30
  }
23
31
  // Number(), like the --hops guard: parseInt('12abc') is 12, silently accepting what this message rejects.
24
32
  const parsed = Number(value);
25
33
  if (!Number.isInteger(parsed) || parsed < 0) {
26
34
  printError(`Invalid --budget: "${value}". Must be a non-negative integer.`);
27
- process.exit(1);
35
+ throw new CliExit(1);
28
36
  }
29
37
  return parsed;
30
38
  }
31
- // Whole-arg digits only: parseInt alone reads "1abc" as 1 and a mutating verb would hit the wrong row. Digits past 2^53 round to a neighbouring id, so they are refused too.
39
+ // Whole-arg digits only: parseInt alone reads "1abc" as 1 and a mutating verb would hit the wrong row.
40
+ // Digits past 2^53 round to a neighbouring id, so they are refused too.
32
41
  export function parsePositiveId(idRaw, label) {
33
42
  const s = String(idRaw ?? '').trim();
34
43
  const id = parseInt(s, 10);
35
44
  if (!/^\d+$/.test(s) || id <= 0 || !Number.isSafeInteger(id)) {
36
45
  printError(`Invalid ${label} id: "${idRaw}" (expected a positive integer).`);
37
- process.exit(1);
46
+ throw new CliExit(1);
38
47
  }
39
48
  return id;
40
49
  }
41
50
  export function parseListLimit(flags) {
42
51
  const limitRaw = flags['limit'];
43
- const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
44
- if (!Number.isFinite(limit) || limit <= 0) {
52
+ const limit = resolveListLimit(limitRaw !== undefined ? parseInt(String(limitRaw), 10) : undefined);
53
+ if (limit === undefined) {
45
54
  printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
46
- process.exit(1);
55
+ throw new CliExit(1);
47
56
  }
48
57
  return limit;
49
58
  }
50
59
  // A value-less flag is `true` and a repeated one is a string[]; only a string counts here.
51
60
  export function stringFlag(flags, name) {
52
61
  const v = flags[name];
53
- return typeof v === 'string' ? v : undefined;
62
+ return isStringFlag(v) ? v : undefined;
54
63
  }
55
64
  // An empty value reads as absent, so `--change ""` keeps the default.
56
65
  export function nonEmptyStringFlag(flags, name) {
57
66
  return stringFlag(flags, name) || undefined;
58
67
  }
68
+ // A repeated flag is already a list; a single value is a comma-separated list.
69
+ export function stringListFlag(flags, name) {
70
+ const v = flags[name];
71
+ if (Array.isArray(v))
72
+ return v;
73
+ return isStringFlag(v) ? v.split(',').map((t) => t.trim()).filter(Boolean) : undefined;
74
+ }
75
+ export function isOneOf(allowed, value) {
76
+ return allowed.some((a) => a === value);
77
+ }
78
+ // A junk value exits instead of becoming NaN, which would pass every `<` gate.
59
79
  export function numberFlag(flags, name) {
60
80
  const v = flags[name];
61
- return typeof v === 'string' ? Number(v) : undefined;
81
+ if (!isStringFlag(v))
82
+ return undefined;
83
+ const parsed = Number(v);
84
+ if (v.trim() === '' || !Number.isFinite(parsed)) {
85
+ printError(`Invalid --${name}: "${v}". Must be a number.`);
86
+ throw new CliExit(1);
87
+ }
88
+ return parsed;
62
89
  }
63
90
  // Any truthy value counts, so a string value is true too.
64
91
  export function boolFlag(flags, name) {
@@ -72,7 +99,7 @@ export function parseAsOfFlag(flags) {
72
99
  const asOf = stringFlag(flags, 'as-of');
73
100
  if (asOf !== undefined && Number.isNaN(new Date(asOf).getTime())) {
74
101
  printError(`Error: --as-of value "${asOf}" is not a valid ISO date (e.g. 2026-04-22 or 2026-04-22T12:00:00Z).`);
75
- process.exit(1);
102
+ throw new CliExit(1);
76
103
  }
77
104
  return asOf;
78
105
  }
@@ -82,21 +109,21 @@ export function engineFlags(flags, config) {
82
109
  usePhysics: boolFlag(flags, 'physics') || (!flags['classic'] && config.physics.enabled !== false),
83
110
  physicsConfig: config.physics,
84
111
  mmr: !flags['no-mmr'] && config.mmr.enabled,
85
- mmrLambda: flags['mmr-lambda'] !== undefined ? parseFloat(String(flags['mmr-lambda'])) : config.mmr.lambda,
112
+ mmrLambda: numberFlag(flags, 'mmr-lambda') ?? config.mmr.lambda,
86
113
  localBump: flags['equal-sources']
87
114
  ? 1.0
88
- : flags['local-bump'] !== undefined ? parseFloat(String(flags['local-bump'])) : config.search.localBump,
115
+ : numberFlag(flags, 'local-bump') ?? config.search.localBump,
89
116
  };
90
117
  }
91
118
  // parseArgs turns a value-less flag into `true`; refuse rather than silently
92
- // stringifying it (String(true) === 'true'), mirroring cmdHandoff's guard.
119
+ // stringifying it (String(true) === 'true'), mirroring handleHandoff's guard.
93
120
  export function stringFlagOrExit(flags, key) {
94
121
  const v = flags[key];
95
122
  if (v === undefined)
96
123
  return undefined;
97
124
  if (v === true || v === false || Array.isArray(v)) {
98
125
  printError(`--${key} requires a value`);
99
- process.exit(1);
126
+ throw new CliExit(1);
100
127
  }
101
128
  return v.trim();
102
129
  }