modelrig 0.0.1 → 0.2.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 (420) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/LICENSE +201 -0
  3. package/README.md +145 -8
  4. package/data/PROVENANCE.md +19 -0
  5. package/data/pricing-manual.json +22 -0
  6. package/data/pricing-map.json +46362 -0
  7. package/data/pricing-overlay.json +419 -0
  8. package/dist/adapters/anthropic.d.ts +90 -0
  9. package/dist/adapters/anthropic.d.ts.map +1 -0
  10. package/dist/adapters/anthropic.js +296 -0
  11. package/dist/adapters/build-adapters.d.ts +11 -0
  12. package/dist/adapters/build-adapters.d.ts.map +1 -0
  13. package/dist/adapters/build-adapters.js +45 -0
  14. package/dist/adapters/deepseek.d.ts +47 -0
  15. package/dist/adapters/deepseek.d.ts.map +1 -0
  16. package/dist/adapters/deepseek.js +216 -0
  17. package/dist/adapters/gemini.d.ts +44 -0
  18. package/dist/adapters/gemini.d.ts.map +1 -0
  19. package/dist/adapters/gemini.js +262 -0
  20. package/dist/adapters/grok.d.ts +53 -0
  21. package/dist/adapters/grok.d.ts.map +1 -0
  22. package/dist/adapters/grok.js +232 -0
  23. package/dist/adapters/openai-compat.d.ts +80 -0
  24. package/dist/adapters/openai-compat.d.ts.map +1 -0
  25. package/dist/adapters/openai-compat.js +244 -0
  26. package/dist/adapters/openai-stream.d.ts +58 -0
  27. package/dist/adapters/openai-stream.d.ts.map +1 -0
  28. package/dist/adapters/openai-stream.js +120 -0
  29. package/dist/adapters/openai.d.ts +55 -0
  30. package/dist/adapters/openai.d.ts.map +1 -0
  31. package/dist/adapters/openai.js +281 -0
  32. package/dist/adapters/sampling.d.ts +28 -0
  33. package/dist/adapters/sampling.d.ts.map +1 -0
  34. package/dist/adapters/sampling.js +34 -0
  35. package/dist/adapters/tool-mapping.d.ts +92 -0
  36. package/dist/adapters/tool-mapping.d.ts.map +1 -0
  37. package/dist/adapters/tool-mapping.js +143 -0
  38. package/dist/artifacts/artifact.d.ts +137 -0
  39. package/dist/artifacts/artifact.d.ts.map +1 -0
  40. package/dist/artifacts/artifact.js +377 -0
  41. package/dist/artifacts/content-uploader.d.ts +87 -0
  42. package/dist/artifacts/content-uploader.d.ts.map +1 -0
  43. package/dist/artifacts/content-uploader.js +124 -0
  44. package/dist/artifacts/index.d.ts +63 -0
  45. package/dist/artifacts/index.d.ts.map +1 -0
  46. package/dist/artifacts/index.js +80 -0
  47. package/dist/artifacts/run-context.d.ts +129 -0
  48. package/dist/artifacts/run-context.d.ts.map +1 -0
  49. package/dist/artifacts/run-context.js +208 -0
  50. package/dist/artifacts/scrub.d.ts +60 -0
  51. package/dist/artifacts/scrub.d.ts.map +1 -0
  52. package/dist/artifacts/scrub.js +139 -0
  53. package/dist/artifacts/step.d.ts +26 -0
  54. package/dist/artifacts/step.d.ts.map +1 -0
  55. package/dist/artifacts/step.js +37 -0
  56. package/dist/artifacts/taint.d.ts +63 -0
  57. package/dist/artifacts/taint.d.ts.map +1 -0
  58. package/dist/artifacts/taint.js +76 -0
  59. package/dist/bakeoff/cache-sim.d.ts +99 -0
  60. package/dist/bakeoff/cache-sim.d.ts.map +1 -0
  61. package/dist/bakeoff/cache-sim.js +126 -0
  62. package/dist/bakeoff/engine.d.ts +52 -0
  63. package/dist/bakeoff/engine.d.ts.map +1 -0
  64. package/dist/bakeoff/engine.js +163 -0
  65. package/dist/bakeoff/eval-cases.d.ts +96 -0
  66. package/dist/bakeoff/eval-cases.d.ts.map +1 -0
  67. package/dist/bakeoff/eval-cases.js +105 -0
  68. package/dist/bakeoff/replay.d.ts +52 -0
  69. package/dist/bakeoff/replay.d.ts.map +1 -0
  70. package/dist/bakeoff/replay.js +94 -0
  71. package/dist/bakeoff/report.d.ts +41 -0
  72. package/dist/bakeoff/report.d.ts.map +1 -0
  73. package/dist/bakeoff/report.js +142 -0
  74. package/dist/bakeoff/samples.d.ts +77 -0
  75. package/dist/bakeoff/samples.d.ts.map +1 -0
  76. package/dist/bakeoff/samples.js +148 -0
  77. package/dist/bakeoff/stats.d.ts +13 -0
  78. package/dist/bakeoff/stats.d.ts.map +1 -0
  79. package/dist/bakeoff/stats.js +48 -0
  80. package/dist/bakeoff/types.d.ts +37 -0
  81. package/dist/bakeoff/types.d.ts.map +1 -0
  82. package/dist/bakeoff/types.js +10 -0
  83. package/dist/cli.d.ts +25 -0
  84. package/dist/cli.d.ts.map +1 -0
  85. package/dist/cli.js +590 -0
  86. package/dist/config.d.ts +204 -0
  87. package/dist/config.d.ts.map +1 -0
  88. package/dist/config.js +252 -0
  89. package/dist/deprecations.d.ts +32 -0
  90. package/dist/deprecations.d.ts.map +1 -0
  91. package/dist/deprecations.js +59 -0
  92. package/dist/feedback/coverage.d.ts +32 -0
  93. package/dist/feedback/coverage.d.ts.map +1 -0
  94. package/dist/feedback/coverage.js +95 -0
  95. package/dist/feedback/feedback.d.ts +35 -0
  96. package/dist/feedback/feedback.d.ts.map +1 -0
  97. package/dist/feedback/feedback.js +39 -0
  98. package/dist/gateway/http-protocol.d.ts +175 -0
  99. package/dist/gateway/http-protocol.d.ts.map +1 -0
  100. package/dist/gateway/http-protocol.js +105 -0
  101. package/dist/index.d.ts +242 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +576 -0
  104. package/dist/init/finder.d.ts +94 -0
  105. package/dist/init/finder.d.ts.map +1 -0
  106. package/dist/init/finder.js +343 -0
  107. package/dist/init/init-cli.d.ts +10 -0
  108. package/dist/init/init-cli.d.ts.map +1 -0
  109. package/dist/init/init-cli.js +86 -0
  110. package/dist/init/observe-cli.d.ts +19 -0
  111. package/dist/init/observe-cli.d.ts.map +1 -0
  112. package/dist/init/observe-cli.js +73 -0
  113. package/dist/init/observe.d.ts +81 -0
  114. package/dist/init/observe.d.ts.map +1 -0
  115. package/dist/init/observe.js +245 -0
  116. package/dist/init/run.d.ts +99 -0
  117. package/dist/init/run.d.ts.map +1 -0
  118. package/dist/init/run.js +281 -0
  119. package/dist/init/signatures.d.ts +39 -0
  120. package/dist/init/signatures.d.ts.map +1 -0
  121. package/dist/init/signatures.js +116 -0
  122. package/dist/matrix/aggregate.d.ts +89 -0
  123. package/dist/matrix/aggregate.d.ts.map +1 -0
  124. package/dist/matrix/aggregate.js +186 -0
  125. package/dist/query/grammar.d.ts +35 -0
  126. package/dist/query/grammar.d.ts.map +1 -0
  127. package/dist/query/grammar.js +279 -0
  128. package/dist/query/run.d.ts +8 -0
  129. package/dist/query/run.d.ts.map +1 -0
  130. package/dist/query/run.js +21 -0
  131. package/dist/registry/build.d.ts +219 -0
  132. package/dist/registry/build.d.ts.map +1 -0
  133. package/dist/registry/build.js +313 -0
  134. package/dist/registry/cache-policy.d.ts +94 -0
  135. package/dist/registry/cache-policy.d.ts.map +1 -0
  136. package/dist/registry/cache-policy.js +238 -0
  137. package/dist/registry/call-notes.d.ts +11 -0
  138. package/dist/registry/call-notes.d.ts.map +1 -0
  139. package/dist/registry/call-notes.js +110 -0
  140. package/dist/registry/claims.d.ts +63 -0
  141. package/dist/registry/claims.d.ts.map +1 -0
  142. package/dist/registry/claims.js +107 -0
  143. package/dist/registry/effective-rate.d.ts +151 -0
  144. package/dist/registry/effective-rate.d.ts.map +1 -0
  145. package/dist/registry/effective-rate.js +156 -0
  146. package/dist/registry/facts.d.ts +32 -0
  147. package/dist/registry/facts.d.ts.map +1 -0
  148. package/dist/registry/facts.js +136 -0
  149. package/dist/registry/fingerprint.d.ts +20 -0
  150. package/dist/registry/fingerprint.d.ts.map +1 -0
  151. package/dist/registry/fingerprint.js +150 -0
  152. package/dist/registry/parity.d.ts +52 -0
  153. package/dist/registry/parity.d.ts.map +1 -0
  154. package/dist/registry/parity.js +82 -0
  155. package/dist/registry/pricing-shape.d.ts +113 -0
  156. package/dist/registry/pricing-shape.d.ts.map +1 -0
  157. package/dist/registry/pricing-shape.js +123 -0
  158. package/dist/registry/pricing.d.ts +43 -0
  159. package/dist/registry/pricing.d.ts.map +1 -0
  160. package/dist/registry/pricing.js +127 -0
  161. package/dist/registry/rows.d.ts +16 -0
  162. package/dist/registry/rows.d.ts.map +1 -0
  163. package/dist/registry/rows.js +57 -0
  164. package/dist/registry/seed.d.ts +43 -0
  165. package/dist/registry/seed.d.ts.map +1 -0
  166. package/dist/registry/seed.js +97 -0
  167. package/dist/registry/select.d.ts +68 -0
  168. package/dist/registry/select.d.ts.map +1 -0
  169. package/dist/registry/select.js +141 -0
  170. package/dist/registry/staleness.d.ts +18 -0
  171. package/dist/registry/staleness.d.ts.map +1 -0
  172. package/dist/registry/staleness.js +39 -0
  173. package/dist/rigindex/bootstrap.d.ts +36 -0
  174. package/dist/rigindex/bootstrap.d.ts.map +1 -0
  175. package/dist/rigindex/bootstrap.js +97 -0
  176. package/dist/rigindex/fit.d.ts +24 -0
  177. package/dist/rigindex/fit.d.ts.map +1 -0
  178. package/dist/rigindex/fit.js +76 -0
  179. package/dist/rigindex/gates.d.ts +52 -0
  180. package/dist/rigindex/gates.d.ts.map +1 -0
  181. package/dist/rigindex/gates.js +109 -0
  182. package/dist/rigindex/graph.d.ts +31 -0
  183. package/dist/rigindex/graph.d.ts.map +1 -0
  184. package/dist/rigindex/graph.js +120 -0
  185. package/dist/rigindex/index.d.ts +23 -0
  186. package/dist/rigindex/index.d.ts.map +1 -0
  187. package/dist/rigindex/index.js +112 -0
  188. package/dist/rigindex/types.d.ts +76 -0
  189. package/dist/rigindex/types.d.ts.map +1 -0
  190. package/dist/rigindex/types.js +8 -0
  191. package/dist/routes/cache-lint.d.ts +41 -0
  192. package/dist/routes/cache-lint.d.ts.map +1 -0
  193. package/dist/routes/cache-lint.js +81 -0
  194. package/dist/routes/draft.d.ts +83 -0
  195. package/dist/routes/draft.d.ts.map +1 -0
  196. package/dist/routes/draft.js +135 -0
  197. package/dist/routes/loader.d.ts +63 -0
  198. package/dist/routes/loader.d.ts.map +1 -0
  199. package/dist/routes/loader.js +574 -0
  200. package/dist/routes/manifest.d.ts +24 -0
  201. package/dist/routes/manifest.d.ts.map +1 -0
  202. package/dist/routes/manifest.js +118 -0
  203. package/dist/routes/resolved-bundle.d.ts +79 -0
  204. package/dist/routes/resolved-bundle.d.ts.map +1 -0
  205. package/dist/routes/resolved-bundle.js +148 -0
  206. package/dist/routes/sampling-config.d.ts +32 -0
  207. package/dist/routes/sampling-config.d.ts.map +1 -0
  208. package/dist/routes/sampling-config.js +91 -0
  209. package/dist/routes/serveability.d.ts +52 -0
  210. package/dist/routes/serveability.d.ts.map +1 -0
  211. package/dist/routes/serveability.js +73 -0
  212. package/dist/routes/template.d.ts +18 -0
  213. package/dist/routes/template.d.ts.map +1 -0
  214. package/dist/routes/template.js +94 -0
  215. package/dist/run/ajv.d.ts +22 -0
  216. package/dist/run/ajv.d.ts.map +1 -0
  217. package/dist/run/ajv.js +32 -0
  218. package/dist/run/cache-handle.d.ts +58 -0
  219. package/dist/run/cache-handle.d.ts.map +1 -0
  220. package/dist/run/cache-handle.js +54 -0
  221. package/dist/run/cache-stamp.d.ts +65 -0
  222. package/dist/run/cache-stamp.d.ts.map +1 -0
  223. package/dist/run/cache-stamp.js +0 -0
  224. package/dist/run/capture-write.d.ts +33 -0
  225. package/dist/run/capture-write.d.ts.map +1 -0
  226. package/dist/run/capture-write.js +55 -0
  227. package/dist/run/cost.d.ts +26 -0
  228. package/dist/run/cost.d.ts.map +1 -0
  229. package/dist/run/cost.js +41 -0
  230. package/dist/run/dispatch.d.ts +99 -0
  231. package/dist/run/dispatch.d.ts.map +1 -0
  232. package/dist/run/dispatch.js +191 -0
  233. package/dist/run/envelope.d.ts +21 -0
  234. package/dist/run/envelope.d.ts.map +1 -0
  235. package/dist/run/envelope.js +45 -0
  236. package/dist/run/grounding.d.ts +56 -0
  237. package/dist/run/grounding.d.ts.map +1 -0
  238. package/dist/run/grounding.js +89 -0
  239. package/dist/run/raw.d.ts +88 -0
  240. package/dist/run/raw.d.ts.map +1 -0
  241. package/dist/run/raw.js +286 -0
  242. package/dist/run/record-attempt.d.ts +40 -0
  243. package/dist/run/record-attempt.d.ts.map +1 -0
  244. package/dist/run/record-attempt.js +99 -0
  245. package/dist/run/repair.d.ts +36 -0
  246. package/dist/run/repair.d.ts.map +1 -0
  247. package/dist/run/repair.js +61 -0
  248. package/dist/run/resolve.d.ts +99 -0
  249. package/dist/run/resolve.d.ts.map +1 -0
  250. package/dist/run/resolve.js +203 -0
  251. package/dist/run/retry.d.ts +19 -0
  252. package/dist/run/retry.d.ts.map +1 -0
  253. package/dist/run/retry.js +50 -0
  254. package/dist/run/run.d.ts +55 -0
  255. package/dist/run/run.d.ts.map +1 -0
  256. package/dist/run/run.js +540 -0
  257. package/dist/run/stream.d.ts +49 -0
  258. package/dist/run/stream.d.ts.map +1 -0
  259. package/dist/run/stream.js +87 -0
  260. package/dist/run/validate.d.ts +15 -0
  261. package/dist/run/validate.d.ts.map +1 -0
  262. package/dist/run/validate.js +55 -0
  263. package/dist/savings/cache-ledger.d.ts +108 -0
  264. package/dist/savings/cache-ledger.d.ts.map +1 -0
  265. package/dist/savings/cache-ledger.js +174 -0
  266. package/dist/savings/cache-reconcile.d.ts +64 -0
  267. package/dist/savings/cache-reconcile.d.ts.map +1 -0
  268. package/dist/savings/cache-reconcile.js +59 -0
  269. package/dist/savings/cache-stats.d.ts +63 -0
  270. package/dist/savings/cache-stats.d.ts.map +1 -0
  271. package/dist/savings/cache-stats.js +108 -0
  272. package/dist/savings/emit.d.ts +38 -0
  273. package/dist/savings/emit.d.ts.map +1 -0
  274. package/dist/savings/emit.js +100 -0
  275. package/dist/savings/odometer.d.ts +32 -0
  276. package/dist/savings/odometer.d.ts.map +1 -0
  277. package/dist/savings/odometer.js +70 -0
  278. package/dist/savings/swap-execute.d.ts +58 -0
  279. package/dist/savings/swap-execute.d.ts.map +1 -0
  280. package/dist/savings/swap-execute.js +130 -0
  281. package/dist/savings/swaps-client.d.ts +55 -0
  282. package/dist/savings/swaps-client.d.ts.map +1 -0
  283. package/dist/savings/swaps-client.js +95 -0
  284. package/dist/settings/api-fetcher.d.ts +39 -0
  285. package/dist/settings/api-fetcher.d.ts.map +1 -0
  286. package/dist/settings/api-fetcher.js +92 -0
  287. package/dist/settings/index.d.ts +10 -0
  288. package/dist/settings/index.d.ts.map +1 -0
  289. package/dist/settings/index.js +15 -0
  290. package/dist/settings/task-settings.d.ts +91 -0
  291. package/dist/settings/task-settings.d.ts.map +1 -0
  292. package/dist/settings/task-settings.js +116 -0
  293. package/dist/status.d.ts +77 -0
  294. package/dist/status.d.ts.map +1 -0
  295. package/dist/status.js +113 -0
  296. package/dist/telemetry/artifact-store.d.ts +48 -0
  297. package/dist/telemetry/artifact-store.d.ts.map +1 -0
  298. package/dist/telemetry/artifact-store.js +189 -0
  299. package/dist/telemetry/cache-miss-streak.d.ts +79 -0
  300. package/dist/telemetry/cache-miss-streak.d.ts.map +1 -0
  301. package/dist/telemetry/cache-miss-streak.js +99 -0
  302. package/dist/telemetry/capture.d.ts +31 -0
  303. package/dist/telemetry/capture.d.ts.map +1 -0
  304. package/dist/telemetry/capture.js +81 -0
  305. package/dist/telemetry/exporter-setup.d.ts +28 -0
  306. package/dist/telemetry/exporter-setup.d.ts.map +1 -0
  307. package/dist/telemetry/exporter-setup.js +34 -0
  308. package/dist/telemetry/exporter.d.ts +137 -0
  309. package/dist/telemetry/exporter.d.ts.map +1 -0
  310. package/dist/telemetry/exporter.js +510 -0
  311. package/dist/telemetry/health.d.ts +76 -0
  312. package/dist/telemetry/health.d.ts.map +1 -0
  313. package/dist/telemetry/health.js +92 -0
  314. package/dist/telemetry/ingest-protocol.d.ts +310 -0
  315. package/dist/telemetry/ingest-protocol.d.ts.map +1 -0
  316. package/dist/telemetry/ingest-protocol.js +363 -0
  317. package/dist/telemetry/load-error-report.d.ts +24 -0
  318. package/dist/telemetry/load-error-report.d.ts.map +1 -0
  319. package/dist/telemetry/load-error-report.js +50 -0
  320. package/dist/telemetry/otel-map.d.ts +121 -0
  321. package/dist/telemetry/otel-map.d.ts.map +1 -0
  322. package/dist/telemetry/otel-map.js +224 -0
  323. package/dist/telemetry/otel-normalize.d.ts +104 -0
  324. package/dist/telemetry/otel-normalize.d.ts.map +1 -0
  325. package/dist/telemetry/otel-normalize.js +530 -0
  326. package/dist/telemetry/otlp-emitter.d.ts +52 -0
  327. package/dist/telemetry/otlp-emitter.d.ts.map +1 -0
  328. package/dist/telemetry/otlp-emitter.js +144 -0
  329. package/dist/telemetry/otlp-proto.d.ts +29 -0
  330. package/dist/telemetry/otlp-proto.d.ts.map +1 -0
  331. package/dist/telemetry/otlp-proto.js +266 -0
  332. package/dist/telemetry/sinks.d.ts +90 -0
  333. package/dist/telemetry/sinks.d.ts.map +1 -0
  334. package/dist/telemetry/sinks.js +180 -0
  335. package/dist/telemetry/store.d.ts +65 -0
  336. package/dist/telemetry/store.d.ts.map +1 -0
  337. package/dist/telemetry/store.js +547 -0
  338. package/dist/tenancy/api-key-format.d.ts +77 -0
  339. package/dist/tenancy/api-key-format.d.ts.map +1 -0
  340. package/dist/tenancy/api-key-format.js +110 -0
  341. package/dist/tenancy/constants.d.ts +23 -0
  342. package/dist/tenancy/constants.d.ts.map +1 -0
  343. package/dist/tenancy/constants.js +25 -0
  344. package/dist/tenancy/scrub.d.ts +47 -0
  345. package/dist/tenancy/scrub.d.ts.map +1 -0
  346. package/dist/tenancy/scrub.js +85 -0
  347. package/dist/types/config-teaching.d.ts +62 -0
  348. package/dist/types/config-teaching.d.ts.map +1 -0
  349. package/dist/types/config-teaching.js +183 -0
  350. package/dist/types/failures-teaching.d.ts +56 -0
  351. package/dist/types/failures-teaching.d.ts.map +1 -0
  352. package/dist/types/failures-teaching.js +177 -0
  353. package/dist/types/failures.d.ts +27 -0
  354. package/dist/types/failures.d.ts.map +1 -0
  355. package/dist/types/failures.js +41 -0
  356. package/dist/types/provider.d.ts +200 -0
  357. package/dist/types/provider.d.ts.map +1 -0
  358. package/dist/types/provider.js +40 -0
  359. package/dist/types/route.d.ts +205 -0
  360. package/dist/types/route.d.ts.map +1 -0
  361. package/dist/types/route.js +6 -0
  362. package/dist/types/telemetry.d.ts +206 -0
  363. package/dist/types/telemetry.d.ts.map +1 -0
  364. package/dist/types/telemetry.js +6 -0
  365. package/dist/validate-cli.d.ts +12 -0
  366. package/dist/validate-cli.d.ts.map +1 -0
  367. package/dist/validate-cli.js +57 -0
  368. package/dist/verify/capture.d.ts +66 -0
  369. package/dist/verify/capture.d.ts.map +1 -0
  370. package/dist/verify/capture.js +180 -0
  371. package/dist/verify/cli-run.d.ts +23 -0
  372. package/dist/verify/cli-run.d.ts.map +1 -0
  373. package/dist/verify/cli-run.js +57 -0
  374. package/dist/verify/diff.d.ts +48 -0
  375. package/dist/verify/diff.d.ts.map +1 -0
  376. package/dist/verify/diff.js +157 -0
  377. package/dist/verify/index.d.ts +17 -0
  378. package/dist/verify/index.d.ts.map +1 -0
  379. package/dist/verify/index.js +24 -0
  380. package/dist/verify/report.d.ts +14 -0
  381. package/dist/verify/report.d.ts.map +1 -0
  382. package/dist/verify/report.js +88 -0
  383. package/dist/verify/types.d.ts +101 -0
  384. package/dist/verify/types.d.ts.map +1 -0
  385. package/dist/verify/types.js +17 -0
  386. package/dist/verify/verify.d.ts +29 -0
  387. package/dist/verify/verify.d.ts.map +1 -0
  388. package/dist/verify/verify.js +148 -0
  389. package/dist/watch/budget.d.ts +19 -0
  390. package/dist/watch/budget.d.ts.map +1 -0
  391. package/dist/watch/budget.js +35 -0
  392. package/dist/watch/evaluate.d.ts +225 -0
  393. package/dist/watch/evaluate.d.ts.map +1 -0
  394. package/dist/watch/evaluate.js +155 -0
  395. package/dist/watch/monitor.d.ts +116 -0
  396. package/dist/watch/monitor.d.ts.map +1 -0
  397. package/dist/watch/monitor.js +199 -0
  398. package/dist/watch/proposals.d.ts +89 -0
  399. package/dist/watch/proposals.d.ts.map +1 -0
  400. package/dist/watch/proposals.js +197 -0
  401. package/dist/watch/run-record.d.ts +64 -0
  402. package/dist/watch/run-record.d.ts.map +1 -0
  403. package/dist/watch/run-record.js +86 -0
  404. package/dist/watch/run-reported.d.ts +20 -0
  405. package/dist/watch/run-reported.d.ts.map +1 -0
  406. package/dist/watch/run-reported.js +53 -0
  407. package/dist/watch/run.d.ts +73 -0
  408. package/dist/watch/run.d.ts.map +1 -0
  409. package/dist/watch/run.js +83 -0
  410. package/dist/watch/state-store.d.ts +48 -0
  411. package/dist/watch/state-store.d.ts.map +1 -0
  412. package/dist/watch/state-store.js +86 -0
  413. package/dist/watch/state.d.ts +21 -0
  414. package/dist/watch/state.d.ts.map +1 -0
  415. package/dist/watch/state.js +93 -0
  416. package/package.json +56 -14
  417. package/registry/LICENSE +20 -0
  418. package/registry/leaderboard.json +3639 -0
  419. package/registry/registry.json +7263 -0
  420. package/index.js +0 -3
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ /**
3
+ * Bake-off terminal reporting — the matrix printer (moved here from cli.ts for
4
+ * the LOC cap, P1) and the `--from-eval-cases` runner (E4 chunk A) with its
5
+ * HONEST-REFUSAL report: every eval case that could not be rehydrated is NAMED
6
+ * with a reason before any bake-off runs — never a silent subset (spec §3.3).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.formatCacheAdjustedSection = formatCacheAdjustedSection;
10
+ exports.printMatrix = printMatrix;
11
+ exports.runEvalCaseBakeoffCli = runEvalCaseBakeoffCli;
12
+ const node_fs_1 = require("node:fs");
13
+ const node_os_1 = require("node:os");
14
+ const node_path_1 = require("node:path");
15
+ const index_1 = require("../index");
16
+ const engine_1 = require("./engine");
17
+ function fmtEff(usd) {
18
+ return Number.isFinite(usd) ? `$${usd.toFixed(4)}` : "∞ (0 conformant)";
19
+ }
20
+ /**
21
+ * Render the cache-adjusted section (spec §5.4) as lines — measured-cold AND
22
+ * cache-adjusted input cost side by side, with the simulator's assumptions
23
+ * PRINTED so the numbers are never mistaken for measured savings. Pure (returns
24
+ * strings; `printMatrix` does the console I/O) so it is unit-tested directly.
25
+ * Empty input ⇒ no lines (the section is omitted entirely — back-compat).
26
+ */
27
+ function formatCacheAdjustedSection(rows) {
28
+ if (rows.length === 0)
29
+ return [];
30
+ const lines = [
31
+ "cache-adjusted input cost (SIMULATED — not measured savings; the odometer stays measured-only):",
32
+ ];
33
+ const header = ["variant", "measured-cold", "cache-adjusted", "sim-savings"];
34
+ const body = rows.map((r) => {
35
+ const savings = r.measuredColdUsd > 0
36
+ ? `${(((r.measuredColdUsd - r.cacheAdjustedUsd) / r.measuredColdUsd) * 100).toFixed(1)}%`
37
+ : "n/a";
38
+ return [r.variant, `$${r.measuredColdUsd.toFixed(4)}`, `$${r.cacheAdjustedUsd.toFixed(4)}`, savings];
39
+ });
40
+ const widths = header.map((h, c) => Math.max(h.length, ...body.map((row) => row[c].length)));
41
+ const line = (cells) => cells.map((c, i) => c.padEnd(widths[i])).join(" ");
42
+ lines.push(line(header));
43
+ for (const row of body)
44
+ lines.push(line(row));
45
+ // Assumptions basis — one line per distinct policy so a mixed-provider matrix
46
+ // is honest about which TTL/min-cacheable each arm assumed.
47
+ const seen = new Set();
48
+ for (const r of rows) {
49
+ const a = r.assumptions;
50
+ const key = `${a.provider}/${a.model}`;
51
+ if (seen.has(key))
52
+ continue;
53
+ seen.add(key);
54
+ lines.push(` assumptions ${key}: ${a.cacheSupported ? "" : "cache unsupported; "}ttl=${a.ttlSeconds}s` +
55
+ `${a.ttlSourced ? "" : " (fallback — undocumented)"}, min-cacheable=${a.minCacheableTokens}tok, ` +
56
+ `refresh-on-read=${a.refreshOnRead}`);
57
+ }
58
+ return lines;
59
+ }
60
+ function printMatrix(artifact, cacheAdjusted = []) {
61
+ console.log(`bakeoff ${artifact.id}\nroute ${artifact.route}@${artifact.routeVersion} · replayed ${artifact.replayN} captured inputs · ${artifact.ranAt}`);
62
+ const header = ["variant", "n", "conform", "ci95", "repair", "repair$", "lat(ms)", "eff-$/1K-conf"];
63
+ const rows = artifact.variants.map((m) => [
64
+ m.variant,
65
+ String(m.samples),
66
+ `${(m.conformRate * 100).toFixed(0)}%`,
67
+ `[${(m.conformCi95[0] * 100).toFixed(0)},${(m.conformCi95[1] * 100).toFixed(0)}]`,
68
+ `${(m.repairRate * 100).toFixed(0)}%`,
69
+ `$${m.meanRepairCostUsd.toFixed(4)}`,
70
+ m.meanLatencyMs.toFixed(0),
71
+ m.pricingMissing ? "UNPRICED (no ranking)" : fmtEff(m.effectiveUsdPer1kConformant),
72
+ ]);
73
+ const widths = header.map((h, c) => Math.max(h.length, ...rows.map((r) => r[c].length)));
74
+ const line = (cells) => cells.map((cell, c) => cell.padEnd(widths[c])).join(" ");
75
+ console.log(line(header));
76
+ for (const row of rows)
77
+ console.log(line(row));
78
+ if (artifact.proposal !== null) {
79
+ console.log(`PROPOSAL: variant "${artifact.proposal.variant}" beats the incumbent by ` +
80
+ `${artifact.proposal.vsIncumbentSavingsPct.toFixed(1)}% effective cost — human decision required; ` +
81
+ "nothing is executed.");
82
+ }
83
+ else {
84
+ console.log("proposal: none (no variant beats the incumbent's gates)");
85
+ }
86
+ // Cache-adjusted section (spec §5.4) — printed only when the caller supplied
87
+ // simulator rows; absent ⇒ the matrix output is byte-identical to pre-WS-B.
88
+ for (const l of formatCacheAdjustedSection(cacheAdjusted))
89
+ console.log(l);
90
+ }
91
+ /**
92
+ * `modelrig bakeoff --from-eval-cases <task> --variants a,b,c` — replay a task's
93
+ * promoted eval cases through each variant. Prints the honest-refusal report,
94
+ * then (if anything rehydrated) runs the bake-off and persists/mirrors/prints it.
95
+ * Returns the process exit code: 0 on a run (or an empty suite), 1 when cases
96
+ * existed but NONE could be rehydrated (an actionable non-zero, not a crash).
97
+ */
98
+ async function runEvalCaseBakeoffCli(config, task, variants, envelope, keep, asJson) {
99
+ const mirrorTarget = config.export?.mode === "direct" ? config.export : undefined;
100
+ const rig = (0, index_1.createRig)(config);
101
+ try {
102
+ const { selection, artifact } = await rig.bakeoffFromEvalCases(task, {
103
+ variants,
104
+ ...(envelope !== undefined ? { envelopeUsdPerVariant: envelope } : {}),
105
+ ...(keep !== undefined ? { keepOutputs: keep } : {}),
106
+ });
107
+ console.log(`eval cases for "${task}": ${selection.total} total · ` +
108
+ `${selection.rehydratable.length} rehydratable · ${selection.refusals.length} refused`);
109
+ // NEVER a silent subset: name every refused case with its reason.
110
+ for (const r of selection.refusals) {
111
+ console.log(` refused ${r.caseId} (source artifact ${r.sourceArtifactId}): ${r.reason}`);
112
+ }
113
+ if (artifact === null) {
114
+ console.log(selection.total === 0
115
+ ? `no eval cases promoted for "${task}" yet — promote a failure first (artifact.promoteToEval).`
116
+ : "nothing rehydratable — no bake-off run (see the refusals above).");
117
+ return selection.total === 0 ? 0 : 1;
118
+ }
119
+ const outDir = (0, node_path_1.join)((0, node_path_1.dirname)(config.telemetryDbPath), "bakeoffs");
120
+ (0, node_fs_1.mkdirSync)(outDir, { recursive: true });
121
+ const artifactPath = (0, node_path_1.join)(outDir, `${artifact.id}.json`);
122
+ (0, node_fs_1.writeFileSync)(artifactPath, `${JSON.stringify(artifact, null, 2)}\n`);
123
+ let mirrored = false;
124
+ if (mirrorTarget !== undefined) {
125
+ await (0, engine_1.mirrorBakeoff)(artifact, {
126
+ supabaseUrl: mirrorTarget.supabaseUrl,
127
+ serviceRoleKey: mirrorTarget.serviceRoleKey,
128
+ sourceId: mirrorTarget.sourceId ?? (0, node_os_1.hostname)(),
129
+ });
130
+ mirrored = true;
131
+ }
132
+ if (asJson)
133
+ console.log(JSON.stringify(artifact, null, 2));
134
+ else
135
+ printMatrix(artifact);
136
+ console.log(`artifact → ${artifactPath}${mirrored ? " · mirrored to bakeoffs" : ""}`);
137
+ return 0;
138
+ }
139
+ finally {
140
+ await rig.close();
141
+ }
142
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Bake-off review samples — Phase 4 addendum A3 (value-review-storage.md §11).
3
+ *
4
+ * A SEPARATE store from captures: rows exist only because a human ran
5
+ * `modelrig bakeoff --keep-outputs` intending a value review. They carry the
6
+ * rendered input + each arm's output so the human-in-the-loop diff (eval
7
+ * rung 1.5) happens in the console. Written by the CLI with the service-role
8
+ * key; read server-side only; deny-anon RLS. NEVER the anon staging posture.
9
+ *
10
+ * Transport is raw PostgREST over fetch (same pattern as the exporter).
11
+ */
12
+ import type { BakeoffSamplesSink } from "./engine";
13
+ /** 256KB per output, per the architect's caps; TOAST compresses at rest. */
14
+ export declare const OUTPUT_MAX_BYTES: number;
15
+ export type KeepOutputsMode = "winner" | "all";
16
+ export interface BakeoffSample {
17
+ readonly bakeoffId: string;
18
+ readonly route: string;
19
+ readonly arm: string;
20
+ readonly armMeta: Record<string, unknown> | null;
21
+ readonly inputRef: string;
22
+ readonly inputText: string;
23
+ readonly outputText: string | null;
24
+ readonly conform: boolean;
25
+ readonly costUsd: number;
26
+ readonly latencyMs: number;
27
+ readonly expiresAt: string;
28
+ }
29
+ /** One arm's per-input samples, ready to persist. */
30
+ export interface ArmSamples {
31
+ readonly arm: string;
32
+ readonly armMeta: Record<string, unknown> | null;
33
+ readonly samples: ReadonlyArray<{
34
+ readonly inputRef: string;
35
+ readonly inputText: string;
36
+ readonly outputText: string | null;
37
+ readonly conform: boolean;
38
+ readonly costUsd: number;
39
+ readonly latencyMs: number;
40
+ }>;
41
+ }
42
+ /** Default persists incumbent + winner only; "all" persists every arm. */
43
+ export declare function selectArmsToKeep(mode: KeepOutputsMode, incumbentArm: string, winnerArm: string | null, allArms: readonly string[]): string[];
44
+ export declare function truncateOutput(text: string | null): string | null;
45
+ /** Default retention: 90 days from now (or pass a sooner stamp). Pure over
46
+ * an injected `now` so it stays testable and workflow-safe. */
47
+ export declare function retentionExpiry(nowMs: number, days?: number): string;
48
+ export declare function buildBakeoffSamples(bakeoffId: string, route: string, arms: readonly ArmSamples[], expiresAt: string): BakeoffSample[];
49
+ export interface BakeoffSamplesClientConfig {
50
+ readonly supabaseUrl: string;
51
+ readonly serviceRoleKey: string;
52
+ readonly fetchFn?: typeof fetch;
53
+ }
54
+ export interface BakeoffSamplesClient {
55
+ insert(samples: readonly BakeoffSample[]): Promise<void>;
56
+ /** Purge by bakeoff id, or everything past its expiry when no id given. */
57
+ purge(opts?: {
58
+ bakeoffId?: string;
59
+ nowIso?: string;
60
+ }): Promise<number>;
61
+ }
62
+ export declare function createBakeoffSamplesClient(config: BakeoffSamplesClientConfig): BakeoffSamplesClient;
63
+ /**
64
+ * Build the direct-mode bake-off review-sample sink (extracted from index.ts for
65
+ * the LOC cap, P1). Persists retained outputs to the SEPARATE `bakeoff_samples`
66
+ * store (service role; deny-anon RLS); captures never touch it.
67
+ *
68
+ * DIRECT MODE ONLY, and that is a real limitation, not an oversight:
69
+ * `bakeoff_samples` has no ingest route (telemetry-ingestion-boundary.md §2
70
+ * covers telemetry, not review samples), so an api-mode rig keeps its retained
71
+ * outputs local. Callers pass `undefined` for a non-direct rig.
72
+ */
73
+ export declare function buildDirectSamplesSink(cfg: {
74
+ readonly supabaseUrl: string;
75
+ readonly serviceRoleKey: string;
76
+ }): BakeoffSamplesSink;
77
+ //# sourceMappingURL=samples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"samples.d.ts","sourceRoot":"","sources":["../../src/bakeoff/samples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * Bake-off review samples — Phase 4 addendum A3 (value-review-storage.md §11).
4
+ *
5
+ * A SEPARATE store from captures: rows exist only because a human ran
6
+ * `modelrig bakeoff --keep-outputs` intending a value review. They carry the
7
+ * rendered input + each arm's output so the human-in-the-loop diff (eval
8
+ * rung 1.5) happens in the console. Written by the CLI with the service-role
9
+ * key; read server-side only; deny-anon RLS. NEVER the anon staging posture.
10
+ *
11
+ * Transport is raw PostgREST over fetch (same pattern as the exporter).
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.OUTPUT_MAX_BYTES = void 0;
15
+ exports.selectArmsToKeep = selectArmsToKeep;
16
+ exports.truncateOutput = truncateOutput;
17
+ exports.retentionExpiry = retentionExpiry;
18
+ exports.buildBakeoffSamples = buildBakeoffSamples;
19
+ exports.createBakeoffSamplesClient = createBakeoffSamplesClient;
20
+ exports.buildDirectSamplesSink = buildDirectSamplesSink;
21
+ /** 256KB per output, per the architect's caps; TOAST compresses at rest. */
22
+ exports.OUTPUT_MAX_BYTES = 256 * 1024;
23
+ /** Default persists incumbent + winner only; "all" persists every arm. */
24
+ function selectArmsToKeep(mode, incumbentArm, winnerArm, allArms) {
25
+ if (mode === "all")
26
+ return [...allArms];
27
+ const keep = [incumbentArm];
28
+ if (winnerArm !== null && winnerArm !== incumbentArm)
29
+ keep.push(winnerArm);
30
+ return keep;
31
+ }
32
+ function truncateOutput(text) {
33
+ if (text === null)
34
+ return null;
35
+ if (Buffer.byteLength(text, "utf8") <= exports.OUTPUT_MAX_BYTES)
36
+ return text;
37
+ // Cut on a byte budget, then tag it so the reviewer knows it's clipped.
38
+ const marker = "\n\n[truncated at 256KB for review storage]";
39
+ const budget = exports.OUTPUT_MAX_BYTES - Buffer.byteLength(marker, "utf8");
40
+ return Buffer.from(text, "utf8").subarray(0, budget).toString("utf8") + marker;
41
+ }
42
+ /** Default retention: 90 days from now (or pass a sooner stamp). Pure over
43
+ * an injected `now` so it stays testable and workflow-safe. */
44
+ function retentionExpiry(nowMs, days = 90) {
45
+ return new Date(nowMs + days * 24 * 3600 * 1000).toISOString();
46
+ }
47
+ function buildBakeoffSamples(bakeoffId, route, arms, expiresAt) {
48
+ const rows = [];
49
+ for (const arm of arms) {
50
+ for (const s of arm.samples) {
51
+ rows.push({
52
+ bakeoffId,
53
+ route,
54
+ arm: arm.arm,
55
+ armMeta: arm.armMeta,
56
+ inputRef: s.inputRef,
57
+ inputText: s.inputText,
58
+ outputText: truncateOutput(s.outputText),
59
+ conform: s.conform,
60
+ costUsd: s.costUsd,
61
+ latencyMs: s.latencyMs,
62
+ expiresAt,
63
+ });
64
+ }
65
+ }
66
+ return rows;
67
+ }
68
+ function createBakeoffSamplesClient(config) {
69
+ const fetchFn = config.fetchFn ?? fetch;
70
+ const base = config.supabaseUrl.replace(/\/$/, "");
71
+ async function request(path, init) {
72
+ const response = await fetchFn(`${base}/rest/v1/${path}`, {
73
+ ...init,
74
+ headers: {
75
+ "content-type": "application/json",
76
+ apikey: config.serviceRoleKey,
77
+ authorization: `Bearer ${config.serviceRoleKey}`,
78
+ ...(init.headers ?? {}),
79
+ },
80
+ });
81
+ if (!response.ok) {
82
+ throw new Error(`bakeoff_samples ${init.method ?? "GET"} ${path} → ${response.status} ` +
83
+ `${await response.text().catch(() => "")}`);
84
+ }
85
+ return response;
86
+ }
87
+ return {
88
+ async insert(samples) {
89
+ if (samples.length === 0)
90
+ return;
91
+ // Chunk the POST: at the ≤50-inputs cap, large-input routes (e.g. the
92
+ // cutover steps pass ~600KB assembled prompts) would make a single body
93
+ // tens of MB and blow past PostgREST's limit. Small batches keep every
94
+ // body well under it, at any cap.
95
+ const CHUNK = 8;
96
+ for (let i = 0; i < samples.length; i += CHUNK) {
97
+ const batch = samples.slice(i, i + CHUNK);
98
+ await request("bakeoff_samples", {
99
+ method: "POST",
100
+ headers: { prefer: "return=minimal" },
101
+ body: JSON.stringify(batch.map((s) => ({
102
+ bakeoff_id: s.bakeoffId,
103
+ route: s.route,
104
+ arm: s.arm,
105
+ arm_meta: s.armMeta,
106
+ input_ref: s.inputRef,
107
+ input_text: s.inputText,
108
+ output_text: s.outputText,
109
+ conform: s.conform,
110
+ cost_usd: s.costUsd,
111
+ latency_ms: s.latencyMs,
112
+ expires_at: s.expiresAt,
113
+ }))),
114
+ });
115
+ }
116
+ },
117
+ async purge(opts) {
118
+ const filter = opts?.bakeoffId !== undefined
119
+ ? `bakeoff_id=eq.${encodeURIComponent(opts.bakeoffId)}`
120
+ : `expires_at=lt.${encodeURIComponent(opts?.nowIso ?? new Date().toISOString())}`;
121
+ const response = await request(`bakeoff_samples?${filter}`, {
122
+ method: "DELETE",
123
+ headers: { prefer: "return=representation" },
124
+ });
125
+ const deleted = (await response.json().catch(() => []));
126
+ return Array.isArray(deleted) ? deleted.length : 0;
127
+ },
128
+ };
129
+ }
130
+ /**
131
+ * Build the direct-mode bake-off review-sample sink (extracted from index.ts for
132
+ * the LOC cap, P1). Persists retained outputs to the SEPARATE `bakeoff_samples`
133
+ * store (service role; deny-anon RLS); captures never touch it.
134
+ *
135
+ * DIRECT MODE ONLY, and that is a real limitation, not an oversight:
136
+ * `bakeoff_samples` has no ingest route (telemetry-ingestion-boundary.md §2
137
+ * covers telemetry, not review samples), so an api-mode rig keeps its retained
138
+ * outputs local. Callers pass `undefined` for a non-direct rig.
139
+ */
140
+ function buildDirectSamplesSink(cfg) {
141
+ return async ({ bakeoffId, route, arms }) => {
142
+ const rows = buildBakeoffSamples(bakeoffId, route, arms, retentionExpiry(Date.now()));
143
+ await createBakeoffSamplesClient({
144
+ supabaseUrl: cfg.supabaseUrl,
145
+ serviceRoleKey: cfg.serviceRoleKey,
146
+ }).insert(rows);
147
+ };
148
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Bake-off statistics — Phase 3 spec WS5. Wilson 95% intervals ported from
3
+ * the probe suite's summarize math (same constants — results comparable);
4
+ * no cross-package import (the probes package is standalone since P2).
5
+ *
6
+ * The headline: effective $ per 1K conformant outputs — TOTAL sample cost
7
+ * (base + retries + repair + search, F1-corrected) ÷ conformant count × 1000.
8
+ */
9
+ import type { ReplaySampleResult } from "./replay";
10
+ import type { VariantMetrics } from "./types";
11
+ export declare function wilson95(successes: number, n: number): readonly [number, number];
12
+ export declare function aggregateVariantMetrics(variant: string, samples: readonly ReplaySampleResult[]): VariantMetrics;
13
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/bakeoff/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAShF;AAMD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,cAAc,CAuBhB"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * Bake-off statistics — Phase 3 spec WS5. Wilson 95% intervals ported from
4
+ * the probe suite's summarize math (same constants — results comparable);
5
+ * no cross-package import (the probes package is standalone since P2).
6
+ *
7
+ * The headline: effective $ per 1K conformant outputs — TOTAL sample cost
8
+ * (base + retries + repair + search, F1-corrected) ÷ conformant count × 1000.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.wilson95 = wilson95;
12
+ exports.aggregateVariantMetrics = aggregateVariantMetrics;
13
+ function wilson95(successes, n) {
14
+ if (n === 0)
15
+ return [0, 1];
16
+ const z = 1.959963984540054;
17
+ const p = successes / n;
18
+ const z2 = z * z;
19
+ const denominator = 1 + z2 / n;
20
+ const center = (p + z2 / (2 * n)) / denominator;
21
+ const half = (z * Math.sqrt((p * (1 - p)) / n + z2 / (4 * n * n))) / denominator;
22
+ return [Math.max(0, center - half), Math.min(1, center + half)];
23
+ }
24
+ function mean(values) {
25
+ return values.length === 0 ? 0 : values.reduce((a, b) => a + b, 0) / values.length;
26
+ }
27
+ function aggregateVariantMetrics(variant, samples) {
28
+ const n = samples.length;
29
+ const conformant = samples.filter((s) => s.conform);
30
+ const repaired = samples.filter((s) => s.repaired);
31
+ const accuracies = samples
32
+ .map((s) => s.valueAccuracy)
33
+ .filter((a) => a !== null);
34
+ const totalCostUsd = samples.reduce((a, s) => a + s.costUsd, 0);
35
+ return {
36
+ variant,
37
+ samples: n,
38
+ conformRate: n === 0 ? 0 : conformant.length / n,
39
+ conformCi95: wilson95(conformant.length, n),
40
+ repairRate: n === 0 ? 0 : repaired.length / n,
41
+ meanRepairCostUsd: mean(repaired.map((s) => s.repairCostUsd)),
42
+ valueAccuracyMean: accuracies.length === 0 ? null : mean(accuracies),
43
+ meanLatencyMs: mean(samples.map((s) => s.latencyMs)),
44
+ meanCostUsd: n === 0 ? 0 : totalCostUsd / n,
45
+ effectiveUsdPer1kConformant: conformant.length === 0 ? Number.POSITIVE_INFINITY : (totalCostUsd / conformant.length) * 1000,
46
+ pricingMissing: samples.some((s) => s.pricingMissing),
47
+ };
48
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Conformance bake-off contracts — Phase 3 spec WS5 (closed core).
3
+ * The headline metric: effective $ per 1K conformant outputs, with repair
4
+ * and search costs included (F1-corrected accounting).
5
+ */
6
+ export interface VariantMetrics {
7
+ readonly variant: string;
8
+ readonly samples: number;
9
+ readonly conformRate: number;
10
+ readonly conformCi95: readonly [number, number];
11
+ readonly repairRate: number;
12
+ readonly meanRepairCostUsd: number;
13
+ /** Golden-set value accuracy where the route defines expectedValues; null otherwise. */
14
+ readonly valueAccuracyMean: number | null;
15
+ readonly meanLatencyMs: number;
16
+ readonly meanCostUsd: number;
17
+ /** (base + repair + search costs) / conformant outputs × 1000 — the number. */
18
+ readonly effectiveUsdPer1kConformant: number;
19
+ /** Addendum A1: any sample served by a model with no pricing entry —
20
+ * cost columns under-count; this variant is never ranked or proposed. */
21
+ readonly pricingMissing: boolean;
22
+ }
23
+ export interface BakeoffArtifact {
24
+ readonly id: string;
25
+ readonly route: string;
26
+ readonly routeVersion: number;
27
+ readonly ranAt: string;
28
+ readonly replayN: number;
29
+ readonly variants: readonly VariantMetrics[];
30
+ /** Winner by effectiveUsdPer1kConformant among variants meeting the gates;
31
+ * null when no variant beats the incumbent's gates. */
32
+ readonly proposal: {
33
+ readonly variant: string;
34
+ readonly vsIncumbentSavingsPct: number;
35
+ } | null;
36
+ }
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bakeoff/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,wFAAwF;IACxF,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;IAC7C;6EACyE;IACzE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C;2DACuD;IACvD,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChG"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * Conformance bake-off contracts — Phase 3 spec WS5 (closed core).
4
+ * The headline metric: effective $ per 1K conformant outputs, with repair
5
+ * and search costs included (F1-corrected accounting).
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ // Implemented: engine.ts assembles this from replay results; stats.ts owns
9
+ // the math (Wilson CI — ported from the probes' summarize approach, no
10
+ // cross-package import).
package/dist/cli.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * modelrig CLI — Phase 3 plan §3 + Phase 4 plan §3:
4
+ * modelrig bakeoff --route X --variants a,b,c --replay-last N
5
+ * [--budget-usd usd] [--json] [--no-mirror] (--envelope is a kept alias)
6
+ * modelrig bakeoff --from-proposal <id> [--replay-last N] [--json]
7
+ * modelrig watch run [--events fixtures.json] [--json]
8
+ *
9
+ * Bake-offs replay locally captured traffic, write the artifact JSON next
10
+ * to the telemetry db (.modelrig/bakeoffs/<id>.json), upsert the `bakeoffs`
11
+ * mirror when the Supabase sink is configured, and print the matrix.
12
+ * Captures never travel — only aggregate metrics. Watch cycles spend $0;
13
+ * --from-proposal runs draw from the monthly watch envelope and attach
14
+ * their evidence to the proposal (suggested → evidenced). Nothing here
15
+ * executes a swap — that is `modelrig swap execute --approve`, a separate,
16
+ * human command.
17
+ */
18
+ export interface Flags {
19
+ readonly positional: readonly string[];
20
+ readonly named: ReadonlyMap<string, string>;
21
+ readonly bare: ReadonlySet<string>;
22
+ }
23
+ export declare function parseArgs(argv: readonly string[]): Flags;
24
+ export declare function main(argv: readonly string[]): Promise<number>;
25
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;AAiCH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC;AAeD,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,CAuBxD;AA0gBD,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqCnE"}