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,540 @@
1
+ "use strict";
2
+ /**
3
+ * The run loop — spec §4, plan §4/step 6. State machine:
4
+ * resolve → render → (envelope check) → dispatch → validate
5
+ * → retry per failure class | advance candidate | fail typed | succeed
6
+ * → record telemetry on every INFERENCE exit path (RouteConfigError exits
7
+ * record nothing by design — config errors precede any dispatch; C1
8
+ * ruling 2 / finding F3).
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.run = run;
12
+ const loader_1 = require("../routes/loader");
13
+ const serveability_1 = require("../routes/serveability");
14
+ const template_1 = require("../routes/template");
15
+ const cost_1 = require("./cost");
16
+ const pricing_1 = require("../registry/pricing");
17
+ const failures_1 = require("../types/failures");
18
+ const manifest_1 = require("../routes/manifest");
19
+ const resolve_1 = require("./resolve");
20
+ const envelope_1 = require("./envelope");
21
+ const retry_1 = require("./retry");
22
+ const repair_1 = require("./repair");
23
+ const grounding_1 = require("./grounding");
24
+ const validate_1 = require("./validate");
25
+ const dispatch_1 = require("./dispatch");
26
+ const record_attempt_1 = require("./record-attempt");
27
+ const run_context_1 = require("../artifacts/run-context");
28
+ const capture_write_1 = require("./capture-write");
29
+ /** Look up a named variant; null = default (base config). Unknown names are
30
+ * config errors — the caller asked for something the bundle doesn't define. */
31
+ function resolveVariant(route, name) {
32
+ if (name === undefined || name === "default")
33
+ return null;
34
+ const variant = route.variants.find((v) => v.name === name);
35
+ if (variant === undefined) {
36
+ throw new loader_1.RouteConfigError(`route "${route.route}" has no variant "${name}" — defined: [${route.variants
37
+ .map((v) => v.name)
38
+ .join(", ")}]`);
39
+ }
40
+ return variant;
41
+ }
42
+ /** The variant-effective view of a route: narrowed candidates, overridden
43
+ * json rung, overridden template. Loader validation guarantees variant
44
+ * candidates ⊆ declared candidates, so the candidate-set invariant holds. */
45
+ function effectiveRoute(route, variant) {
46
+ if (variant === null)
47
+ return route;
48
+ return Object.freeze({
49
+ ...route,
50
+ candidates: variant.candidates ?? route.candidates,
51
+ systemTemplate: variant.promptOverride ?? route.systemTemplate,
52
+ policy: Object.freeze({
53
+ ...route.policy,
54
+ json: variant.json ?? route.policy.json,
55
+ }),
56
+ });
57
+ }
58
+ /** Phase 1 prompt convention: the bundle's system template carries the whole
59
+ * task (constitution, data, step instructions); the user turn is a terse
60
+ * trigger. Providers treat long system prompts + short user turns well, and
61
+ * it keeps the single-template bundle contract of spec §3. */
62
+ const USER_DIRECTIVE = "Produce the required output now, following the system instructions exactly.";
63
+ /** User turn for repair calls (WS2) — same terse-trigger convention. */
64
+ const REPAIR_DIRECTIVE = "Produce the corrected JSON object now, following the system instructions exactly.";
65
+ /** Schema coaching for the json_mode rung — ported from the production
66
+ * DeepSeek provider's schema-in-prompt guidance (minLength-is-a-FLOOR etc.). */
67
+ function jsonModeCoaching(schema) {
68
+ return ("\n\n---\nOUTPUT FORMAT (STRICT): Respond with a SINGLE valid JSON object and nothing else — " +
69
+ 'no markdown fences, no introductory text, no sign-off. Your response MUST start with "{" and ' +
70
+ 'end with "}". Sanitize every nested string so embedded quotes/brackets do not break the root ' +
71
+ "JSON escaping. The object MUST conform to this JSON Schema — match key names and types " +
72
+ "EXACTLY, include ALL required fields, and do not add commentary fields. CRITICAL: where the " +
73
+ "schema sets a minLength on a narrative/prose field, that is a FLOOR, not a target — write " +
74
+ "thorough, non-repetitive analysis that comfortably EXCEEDS the minimum (do not pad with " +
75
+ "repetition; add real substance). When unsure how long to make a prose field, write more, " +
76
+ `not less:\n\n${JSON.stringify(schema)}`);
77
+ }
78
+ /** prefer:[cost] ordering metric — combined input+output USD per million
79
+ * tokens from the pricing snapshot; null (unknown) sorts last in resolve. */
80
+ function costPerMTok(provider, model) {
81
+ const pricing = (0, pricing_1.getPricing)(provider, model);
82
+ if (pricing === null)
83
+ return null;
84
+ return (pricing.inputUsdPerTok + pricing.outputUsdPerTok) * 1000000;
85
+ }
86
+ const DEFAULT_SLEEP = (ms) => ms <= 0 ? Promise.resolve() : new Promise((resolve) => setTimeout(resolve, ms));
87
+ async function run(deps, routeName, opts) {
88
+ const baseRoute = deps.routes.get(routeName);
89
+ const variant = resolveVariant(baseRoute, opts.variant);
90
+ const servedVariant = variant?.name ?? null;
91
+ const route = (0, resolve_1.applyRunRequirements)(effectiveRoute(baseRoute, variant), opts.zeroRetention === true);
92
+ const effectiveTags = route.require.includes("zero_retention") ? { ...opts.tags, zdr_enforced: "true" } : opts.tags;
93
+ // Data-hygiene warning (spec WS5): once per process per dimension.
94
+ (0, manifest_1.warnMissingRequiredDimensions)(deps.manifest ?? null, opts.tags);
95
+ const ledger = (0, retry_1.createRetryLedger)(route.policy);
96
+ const sleep = deps.sleep ?? DEFAULT_SLEEP;
97
+ const guard = opts.budget
98
+ ? (0, envelope_1.createEnvelopeGuard)(deps.telemetry, opts.budget.envelope,
99
+ // A per-run budget (the mirror lane's per-org cap) overrides the rig
100
+ // default when THIS run first opens the envelope (open-or-get).
101
+ opts.budget.budgetUsd ?? deps.envelopeBudgetUsd)
102
+ : null;
103
+ // Addendum A1: per-token conservative rate for models without pricing —
104
+ // used for envelope precheck/settlement ONLY (telemetry stays honest-zero).
105
+ const unpricedRatePerTok = (deps.unpricedRateUsdPerMTok ?? cost_1.DEFAULT_UNPRICED_RATE_USD_PER_MTOK) / 1000000;
106
+ const declared = new Set(route.candidates.map((c) => `${c.provider} ${c.model}`));
107
+ // Auto-step (E2 chunk A, spec §1.4): with an active run context, each attempt
108
+ // exit that records an inference also records a ground-truth step referencing
109
+ // it (attempt-per-row, ruling c). Inert without a run.start on this path.
110
+ const runCtx = (0, run_context_1.getActiveRunContext)();
111
+ const autoStepKey = runCtx !== null ? runCtx.nextStepKey(route.route) : null;
112
+ // Capture-WRITE gate (settings-plane §1.5, closes gate 5): the control-plane
113
+ // capture flag wins over the YAML flag, the task's scrub setting is honored,
114
+ // and capture OFF is a no-op writer (byte-identical). See ./capture-write.ts.
115
+ const captureAttempt = (0, capture_write_1.buildCaptureWriter)(deps.settings ?? null, deps.captures, route, opts.input);
116
+ const droppedCacheHandle = new Set(); // CE-1 retry-drop (spec §2.2)
117
+ // Per-attempt telemetry recorder (extracted to ./record-attempt.ts — WS-A,
118
+ // to keep run.ts under the LOC cap and shrink the run-loop conflict surface).
119
+ const recordAttempt = (0, record_attempt_1.createRecordAttempt)({
120
+ telemetry: deps.telemetry,
121
+ route,
122
+ ledger,
123
+ effectiveTags,
124
+ servedVariant,
125
+ runCtx,
126
+ autoStepKey,
127
+ cache: opts.cache,
128
+ droppedCacheHandle,
129
+ });
130
+ function failRun(candidate, failure, latencyMs) {
131
+ recordAttempt({
132
+ candidate,
133
+ servedTier: route.policy.tier,
134
+ tokensIn: 0,
135
+ tokensOut: 0,
136
+ tokensCached: 0,
137
+ costUsd: 0,
138
+ latencyMs,
139
+ failure,
140
+ });
141
+ throw new failures_1.RigFailureError(failure);
142
+ }
143
+ // Repair rung (WS2): variant repair config wins over the route's; its own
144
+ // budget, never fungible with the content_invalid class budget.
145
+ const repairLedger = (0, repair_1.createRepairLedger)(variant?.repair ?? baseRoute.repair);
146
+ /** One repair dispatch. Returns {done} on schema-valid output, {invalid}
147
+ * with the newest output+errors for chaining, or null when the dispatch
148
+ * itself failed (adapter failure / unmintable repair candidate). */
149
+ async function attemptRepair(step, original, originalSystemPrompt, invalidText, errors) {
150
+ let repairCandidate;
151
+ let systemPrompt;
152
+ if (step.kind === "same_model") {
153
+ repairCandidate = original;
154
+ systemPrompt = originalSystemPrompt + (0, repair_1.repairFeedbackBlock)(errors);
155
+ }
156
+ else {
157
+ // Brand stays in resolve.ts; loader validated repairModel ⊆ declared.
158
+ const minted = (0, resolve_1.resolveDeclaredCandidate)(route, step.model);
159
+ if (minted === null)
160
+ return null;
161
+ repairCandidate = minted;
162
+ systemPrompt = (0, repair_1.repairModelPrompt)(invalidText, errors, route.outputSchema);
163
+ }
164
+ const repairedBy = `${repairCandidate.provider}/${repairCandidate.model}`;
165
+ const adapter = deps.adapters.get(repairCandidate.provider);
166
+ if (adapter === undefined)
167
+ return null;
168
+ if (guard !== null) {
169
+ // A1: unpriced repair models fail closed exactly like primaries.
170
+ const breach = guard.precheck((0, cost_1.dispatchEstimateUsd)(repairCandidate.provider, repairCandidate.model, systemPrompt.length + REPAIR_DIRECTIVE.length, unpricedRatePerTok));
171
+ if (breach !== null) {
172
+ failRun(repairCandidate, breach, 0);
173
+ }
174
+ }
175
+ const started = Date.now();
176
+ const result = await adapter.call((0, dispatch_1.buildRepairAdapterRequest)(route, repairCandidate, systemPrompt, REPAIR_DIRECTIVE));
177
+ const latencyMs = Date.now() - started;
178
+ if (!result.ok) {
179
+ let cost = 0;
180
+ let repairFailurePricingMissing = false;
181
+ if (result.usage !== undefined) {
182
+ const settled = (0, cost_1.attemptCost)(repairCandidate.provider, repairCandidate.model, result.usage, unpricedRatePerTok);
183
+ cost = settled.costUsd;
184
+ repairFailurePricingMissing = settled.pricingMissing;
185
+ guard?.settle(settled.envelopeChargeUsd);
186
+ }
187
+ recordAttempt({
188
+ candidate: repairCandidate,
189
+ servedTier: result.usage?.servedTier ?? route.policy.tier,
190
+ tokensIn: result.usage?.tokensIn ?? 0,
191
+ tokensOut: result.usage?.tokensOut ?? 0,
192
+ tokensCached: result.usage?.tokensCached ?? 0,
193
+ tokensCacheWrite: result.usage?.tokensCacheWrite ?? 0,
194
+ tokensCacheWrite1h: result.usage?.tokensCacheWrite1h ?? 0,
195
+ costUsd: cost,
196
+ latencyMs,
197
+ ...(result.usage?.ttfbMs !== undefined ? { ttfbMs: result.usage.ttfbMs } : {}),
198
+ failure: result.failure,
199
+ repairedBy,
200
+ pricingMissing: repairFailurePricingMissing,
201
+ });
202
+ if (failures_1.TERMINAL_CLASSES.has(result.failure.class)) {
203
+ throw new failures_1.RigFailureError(result.failure);
204
+ }
205
+ return null;
206
+ }
207
+ const { costUsd, envelopeChargeUsd, pricingMissing: repairPricingMissing, } = (0, cost_1.attemptCost)(repairCandidate.provider, repairCandidate.model, result.usage, unpricedRatePerTok);
208
+ guard?.settle(envelopeChargeUsd);
209
+ const outcome = (0, validate_1.validateOutput)(route, result.text);
210
+ const failure = outcome.valid
211
+ ? null
212
+ : {
213
+ class: "content_invalid",
214
+ message: `repair output failed schema validation: ${outcome.errors.join("; ")}`,
215
+ provider: repairCandidate.provider,
216
+ model: repairCandidate.model,
217
+ };
218
+ const inferenceId = recordAttempt({
219
+ candidate: repairCandidate,
220
+ servedTier: result.usage.servedTier,
221
+ tokensIn: result.usage.tokensIn,
222
+ tokensOut: result.usage.tokensOut,
223
+ tokensCached: result.usage.tokensCached,
224
+ tokensCacheWrite: result.usage.tokensCacheWrite ?? 0,
225
+ tokensCacheWrite1h: result.usage.tokensCacheWrite1h ?? 0,
226
+ costUsd,
227
+ latencyMs,
228
+ ...(result.usage.ttfbMs !== undefined ? { ttfbMs: result.usage.ttfbMs } : {}),
229
+ failure,
230
+ repairedBy,
231
+ pricingMissing: repairPricingMissing,
232
+ });
233
+ captureAttempt(inferenceId, result.text);
234
+ if (!outcome.valid) {
235
+ return { invalid: { text: result.text, errors: outcome.errors } };
236
+ }
237
+ return {
238
+ done: {
239
+ output: outcome.parsed,
240
+ meta: {
241
+ inferenceId,
242
+ route: route.route,
243
+ routeVersion: route.version,
244
+ provider: repairCandidate.provider,
245
+ model: repairCandidate.model,
246
+ requestedTier: route.policy.tier,
247
+ servedTier: result.usage.servedTier,
248
+ tokensIn: result.usage.tokensIn,
249
+ tokensOut: result.usage.tokensOut,
250
+ tokensCached: result.usage.tokensCached,
251
+ costEstimateUsd: costUsd,
252
+ latencyMs,
253
+ validated: true,
254
+ attemptsByClass: ledger.snapshot(),
255
+ servedVariant,
256
+ repairedBy,
257
+ ...(injectedSources !== null
258
+ ? { citations: (0, grounding_1.extractCitations)(result.text, injectedSources) }
259
+ : {}),
260
+ },
261
+ },
262
+ };
263
+ }
264
+ const searchAvailable = deps.search !== undefined && deps.search !== null;
265
+ const iter = (0, resolve_1.resolveCandidates)(route, deps.capabilities, costPerMTok, searchAvailable, (0, resolve_1.candidateFilterFromOptions)(opts));
266
+ let candidate = iter.next();
267
+ if (candidate === null) {
268
+ throw new loader_1.RouteConfigError(`route "${route.route}" has no eligible candidate — none of the declared candidates ` +
269
+ `satisfy require=[${route.require.join(", ")}] with json=${route.policy.json}${(0, resolve_1.filterSummary)(opts)}`);
270
+ }
271
+ let lastFailure = null;
272
+ // Grounding-inject (WS3): one search per run, cached across candidates and
273
+ // retries; cost accrues to the envelope and its own telemetry row.
274
+ let searchResponse = null;
275
+ let injectedSources = null;
276
+ while (candidate !== null) {
277
+ // Runtime layer of the candidate-set invariant: even a compromised
278
+ // iterator cannot reach an adapter with a pair outside the declared list.
279
+ // Runs BEFORE the adapter lookup so a corrupted pair with an unregistered
280
+ // provider still fails as invariant_violation (with a telemetry row),
281
+ // never as a plain config error.
282
+ if (!declared.has(`${candidate.provider} ${candidate.model}`)) {
283
+ failRun(candidate, {
284
+ class: "invariant_violation",
285
+ message: `candidate (${candidate.provider}, ${candidate.model}) is not in route ` +
286
+ `"${route.route}"'s declared candidate list — refusing to dispatch`,
287
+ provider: candidate.provider,
288
+ model: candidate.model,
289
+ }, 0);
290
+ }
291
+ const adapter = deps.adapters.get(candidate.provider);
292
+ if (adapter === undefined) {
293
+ // Phase 4 resilience: a keyless declared candidate is INERT — skip to
294
+ // the next (the invariant guard above already OK'd the pair); nothing
295
+ // dispatched, so nothing billed. All-inert surfaces via the final throw.
296
+ lastFailure = (0, serveability_1.inertCandidateFailure)(candidate, route.route);
297
+ candidate = iter.next();
298
+ continue;
299
+ }
300
+ // Render against the SERVING candidate's capability flags.
301
+ const flags = deps.capabilities(candidate.provider, candidate.model);
302
+ let systemPrompt = (0, template_1.renderTemplate)(route.systemTemplate, {
303
+ variables: opts.input,
304
+ capabilities: flags,
305
+ });
306
+ // Variant augmentation (WS1): appended after capability-conditionals,
307
+ // before json coaching — promptAppend first, then the reasoning scaffold.
308
+ if (variant?.promptAppend !== undefined) {
309
+ systemPrompt += `\n\n${variant.promptAppend}`;
310
+ }
311
+ if (variant?.scaffold !== undefined) {
312
+ systemPrompt += `\n\n${variant.scaffold}`;
313
+ }
314
+ // Grounding-inject rung (WS3): only when the route requires grounded AND
315
+ // this candidate lacks native grounding. Search failures are ordinary
316
+ // `network` failures — retried per budget, never silently ungrounded.
317
+ const nativeGrounded = flags.has("grounded_native");
318
+ injectedSources = null;
319
+ if (route.require.includes("grounded") && !nativeGrounded && deps.search) {
320
+ if (searchResponse === null) {
321
+ const query = route.groundingQuery !== undefined
322
+ ? (0, template_1.renderTemplate)(route.groundingQuery, { variables: opts.input, capabilities: flags })
323
+ : (0, grounding_1.capSearchQuery)(systemPrompt);
324
+ try {
325
+ searchResponse = await deps.search.search(query);
326
+ guard?.settle(searchResponse.costUsd);
327
+ (0, dispatch_1.recordSearchCostRow)(deps.telemetry, route, effectiveTags, servedVariant, deps.search.id, searchResponse.costUsd);
328
+ }
329
+ catch (err) {
330
+ const failure = {
331
+ class: "network",
332
+ message: `grounding search failed: ${err instanceof Error ? err.message : String(err)}`,
333
+ fixHint: "check the search provider key/config (RigConfig.search)",
334
+ cause: err,
335
+ };
336
+ recordAttempt({
337
+ candidate,
338
+ servedTier: route.policy.tier,
339
+ tokensIn: 0,
340
+ tokensOut: 0,
341
+ tokensCached: 0,
342
+ costUsd: 0,
343
+ latencyMs: 0,
344
+ failure,
345
+ });
346
+ lastFailure = failure;
347
+ if (ledger.consume("network")) {
348
+ await sleep(ledger.delayMs("network"));
349
+ continue;
350
+ }
351
+ candidate = iter.next();
352
+ continue;
353
+ }
354
+ }
355
+ systemPrompt += (0, grounding_1.searchInjectionBlock)(searchResponse.results, new Date().toISOString());
356
+ injectedSources = searchResponse.results;
357
+ }
358
+ // json_mode rung (route-level) or a candidate without native strict
359
+ // enforcement: coach the schema into the prompt (ajv still arbitrates).
360
+ const useJsonModeCoaching = route.outputSchema !== null &&
361
+ (route.policy.json === "json_mode" || !flags.has("structured_native"));
362
+ if (useJsonModeCoaching) {
363
+ systemPrompt += jsonModeCoaching(route.outputSchema);
364
+ }
365
+ // Envelope precheck BEFORE dispatch — upper-bound estimate from the
366
+ // pricing snapshot (prompt-length input + full output budget).
367
+ if (guard !== null) {
368
+ // A1: an unpriced model must never precheck at $0 (fail closed).
369
+ const breach = guard.precheck((0, cost_1.dispatchEstimateUsd)(candidate.provider, candidate.model, systemPrompt.length + USER_DIRECTIVE.length, unpricedRatePerTok));
370
+ if (breach !== null) {
371
+ failRun(candidate, breach, 0);
372
+ }
373
+ }
374
+ // CE-1 (spec §2.2, run/cache-handle.ts): `suppressed` drops the customer handle after a cache_invalid.
375
+ const candidateKey = `${candidate.provider} ${candidate.model}`;
376
+ const suppressed = droppedCacheHandle.has(candidateKey);
377
+ // buildAdapterRequest carries the grounding hint + unified tools passthrough
378
+ // (spec §4.4); dispatchCandidate streams deltas when a sink is wired, else
379
+ // buffers via call() — the returned result is identical either way.
380
+ const request = (0, dispatch_1.buildAdapterRequest)({
381
+ route,
382
+ candidate,
383
+ systemPrompt,
384
+ userDirective: USER_DIRECTIVE,
385
+ nativeGrounded,
386
+ opts,
387
+ suppressCustomerCache: suppressed,
388
+ });
389
+ const started = Date.now();
390
+ const result = await (0, dispatch_1.dispatchCandidate)(adapter, request, deps.onStreamDelta);
391
+ const latencyMs = Date.now() - started;
392
+ if (result.ok) {
393
+ const { costUsd, envelopeChargeUsd, pricingMissing } = (0, cost_1.attemptCost)(candidate.provider, candidate.model, result.usage, unpricedRatePerTok);
394
+ guard?.settle(envelopeChargeUsd);
395
+ // Tool-call turn (spec §4.4): the model asked to call a tool — NOT a
396
+ // schema-validated JSON turn. Record it and surface the normalized calls.
397
+ if (result.toolCalls !== undefined && result.toolCalls.length > 0) {
398
+ return (0, dispatch_1.emitToolCallResult)(recordAttempt, {
399
+ route,
400
+ candidate,
401
+ result,
402
+ costUsd,
403
+ latencyMs,
404
+ attemptsByClass: ledger.snapshot(),
405
+ servedVariant,
406
+ pricingMissing,
407
+ });
408
+ }
409
+ const outcome = (0, validate_1.validateOutput)(route, result.text);
410
+ if (outcome.valid) {
411
+ const inferenceId = recordAttempt({
412
+ candidate,
413
+ servedTier: result.usage.servedTier,
414
+ tokensIn: result.usage.tokensIn,
415
+ tokensOut: result.usage.tokensOut,
416
+ tokensCached: result.usage.tokensCached,
417
+ tokensCacheWrite: result.usage.tokensCacheWrite ?? 0,
418
+ tokensCacheWrite1h: result.usage.tokensCacheWrite1h ?? 0,
419
+ costUsd,
420
+ latencyMs,
421
+ ...(result.usage.ttfbMs !== undefined ? { ttfbMs: result.usage.ttfbMs } : {}),
422
+ failure: null,
423
+ pricingMissing,
424
+ });
425
+ captureAttempt(inferenceId, result.text);
426
+ const meta = {
427
+ inferenceId,
428
+ route: route.route,
429
+ routeVersion: route.version,
430
+ provider: candidate.provider,
431
+ model: candidate.model,
432
+ requestedTier: route.policy.tier,
433
+ servedTier: result.usage.servedTier,
434
+ tokensIn: result.usage.tokensIn,
435
+ tokensOut: result.usage.tokensOut,
436
+ tokensCached: result.usage.tokensCached,
437
+ costEstimateUsd: costUsd,
438
+ latencyMs,
439
+ validated: true,
440
+ attemptsByClass: ledger.snapshot(),
441
+ servedVariant,
442
+ repairedBy: null,
443
+ ...(injectedSources !== null
444
+ ? { citations: (0, grounding_1.extractCitations)(result.text, injectedSources) }
445
+ : {}),
446
+ };
447
+ return { output: outcome.parsed, meta };
448
+ }
449
+ // Schema-invalid output — a real (billed) attempt that failed.
450
+ const failure = {
451
+ class: "content_invalid",
452
+ message: `output failed schema validation: ${outcome.errors.join("; ")}`,
453
+ provider: candidate.provider,
454
+ model: candidate.model,
455
+ };
456
+ const invalidId = recordAttempt({
457
+ candidate,
458
+ servedTier: result.usage.servedTier,
459
+ tokensIn: result.usage.tokensIn,
460
+ tokensOut: result.usage.tokensOut,
461
+ tokensCached: result.usage.tokensCached,
462
+ tokensCacheWrite: result.usage.tokensCacheWrite ?? 0,
463
+ tokensCacheWrite1h: result.usage.tokensCacheWrite1h ?? 0,
464
+ costUsd,
465
+ latencyMs,
466
+ ...(result.usage.ttfbMs !== undefined ? { ttfbMs: result.usage.ttfbMs } : {}),
467
+ failure,
468
+ pricingMissing,
469
+ });
470
+ captureAttempt(invalidId, result.text);
471
+ lastFailure = failure;
472
+ // Repair rung (WS2): consumed BEFORE any content_invalid retry, from
473
+ // its own budget. Chain: same-model error feedback, then the
474
+ // designated repair model on the newest invalid output.
475
+ if (route.outputSchema !== null) {
476
+ let latestText = result.text;
477
+ let latestErrors = outcome.errors;
478
+ let repairStep = repairLedger.next();
479
+ while (repairStep !== null) {
480
+ const repairOutcome = await attemptRepair(repairStep, candidate, systemPrompt, latestText, latestErrors);
481
+ if (repairOutcome?.done !== undefined) {
482
+ return repairOutcome.done;
483
+ }
484
+ if (repairOutcome?.invalid !== undefined) {
485
+ latestText = repairOutcome.invalid.text;
486
+ latestErrors = repairOutcome.invalid.errors;
487
+ }
488
+ repairStep = repairLedger.next();
489
+ }
490
+ }
491
+ if (ledger.consume("content_invalid")) {
492
+ continue; // retry the SAME candidate until the class budget is spent
493
+ }
494
+ candidate = iter.next(); // then advance within the declared set
495
+ continue;
496
+ }
497
+ // Adapter-level typed failure. F1: refusals/truncations that BILLED
498
+ // tokens carry usage — settle the envelope and record the real spend.
499
+ const failure = result.failure;
500
+ let failureCostUsd = 0;
501
+ let failurePricingMissing = false;
502
+ if (result.usage !== undefined) {
503
+ const settled = (0, cost_1.attemptCost)(candidate.provider, candidate.model, result.usage, unpricedRatePerTok);
504
+ failureCostUsd = settled.costUsd;
505
+ failurePricingMissing = settled.pricingMissing;
506
+ guard?.settle(settled.envelopeChargeUsd);
507
+ }
508
+ recordAttempt({
509
+ candidate,
510
+ servedTier: result.usage?.servedTier ?? route.policy.tier,
511
+ tokensIn: result.usage?.tokensIn ?? 0,
512
+ tokensOut: result.usage?.tokensOut ?? 0,
513
+ tokensCached: result.usage?.tokensCached ?? 0,
514
+ tokensCacheWrite: result.usage?.tokensCacheWrite ?? 0,
515
+ tokensCacheWrite1h: result.usage?.tokensCacheWrite1h ?? 0,
516
+ costUsd: failureCostUsd,
517
+ latencyMs,
518
+ ...(result.usage?.ttfbMs !== undefined ? { ttfbMs: result.usage.ttfbMs } : {}),
519
+ failure,
520
+ pricingMissing: failurePricingMissing,
521
+ });
522
+ if (failures_1.TERMINAL_CLASSES.has(failure.class)) {
523
+ throw new failures_1.RigFailureError(failure);
524
+ }
525
+ lastFailure = failure;
526
+ // CE-1 retry-drop (spec §2.2): a cache_invalid that carried the handle drops it on retry.
527
+ const carriedHandle = failure.class === "cache_invalid" && !suppressed && opts.cache?.provider === candidate.provider;
528
+ if (carriedHandle)
529
+ droppedCacheHandle.add(candidateKey);
530
+ if (ledger.consume(failure.class)) {
531
+ await sleep(ledger.delayMs(failure.class));
532
+ continue; // retry the SAME candidate
533
+ }
534
+ candidate = iter.next(); // class budget spent — advance candidate
535
+ }
536
+ throw new failures_1.RigFailureError(lastFailure ?? {
537
+ class: "network",
538
+ message: `route "${route.route}": all candidates exhausted with no recorded failure`,
539
+ });
540
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Streaming surface on the run path — G-1/G-5 Phase A (http-gateway spec §4.3).
3
+ *
4
+ * `runStream` wraps the existing `run()` loop with a delta side-channel: as the
5
+ * serving adapter streams, raw text tokens are emitted as `delta` events; when
6
+ * the run resolves, its terminal `RunResult` is emitted as the `final` event.
7
+ * Crucially the SAME pipeline (resolve → dispatch → validate → repair →
8
+ * telemetry) drives both streamed and buffered runs — streaming is purely a
9
+ * side-channel, so validation, repair, ZDR (G-3) and routing controls (G-2)
10
+ * all apply unchanged. `rig.run()` is left exactly as it was.
11
+ *
12
+ * The structured-route caveat (spec §4.3): streamed `delta` bytes are the
13
+ * model's RAW pre-validation output. The `final` event is authoritative — it
14
+ * carries the schema-validated (and, if repair fired, repaired) object plus
15
+ * `meta.validated` / `meta.repairedBy`. Callers wanting validated-only output
16
+ * pass `buffered: true` (no deltas, just the final) — the SDK mirror of the
17
+ * endpoint's `x-modelrig-stream: buffered`.
18
+ *
19
+ * ModelRig never executes a tool (spec §4.4); a tool-call turn surfaces on the
20
+ * final event's `meta.toolCalls` exactly as it does through `run()`.
21
+ */
22
+ import type { RunDeps } from "./run";
23
+ import type { RunOptions, RunResult } from "../types/route";
24
+ export type RunStreamEvent = {
25
+ readonly type: "delta";
26
+ readonly text: string;
27
+ } | {
28
+ readonly type: "final";
29
+ readonly result: RunResult;
30
+ };
31
+ export interface RunStreamOptions extends RunOptions {
32
+ /** Buffered mode (spec §4.3): suppress token deltas and emit only the
33
+ * terminal (validated) result. Default false = stream-then-final. */
34
+ readonly buffered?: boolean;
35
+ }
36
+ export interface RunStreamHandle {
37
+ /** Async-iterable of `delta` events then a single `final`. Re-throws the
38
+ * run's error if it failed (after any deltas already emitted). */
39
+ readonly events: AsyncIterable<RunStreamEvent>;
40
+ /** The terminal RunResult, or a rejection with the run's typed failure.
41
+ * Resolves with the same object carried by the `final` event. */
42
+ readonly result: Promise<RunResult>;
43
+ }
44
+ /**
45
+ * Drive a route with token streaming. Returns an async-iterable of events plus
46
+ * a `result` promise for callers that only want the terminal value.
47
+ */
48
+ export declare function runStream(deps: RunDeps, routeName: string, opts: RunStreamOptions): RunStreamHandle;
49
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/run/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD;yEACqE;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B;sEACkE;IAClE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC/C;qEACiE;IACjE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,GACrB,eAAe,CA6DjB"}