reeval 0.7.0 → 0.8.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 (209) hide show
  1. package/README.md +2 -2
  2. package/dist/{agent-Dhd5FJCZ.js → agent-B72lZ6w5.js} +6 -6
  3. package/dist/{agent-Dhd5FJCZ.js.map → agent-B72lZ6w5.js.map} +1 -1
  4. package/dist/{agent-gjBiZis8.js → agent-Cfj1wD4D.js} +5 -5
  5. package/dist/{agent-gjBiZis8.js.map → agent-Cfj1wD4D.js.map} +1 -1
  6. package/dist/{analysis-BV3TCznv.js → analysis-BTNnKh1w.js} +4 -4
  7. package/dist/{analysis-BV3TCznv.js.map → analysis-BTNnKh1w.js.map} +1 -1
  8. package/dist/{assemble-Dd_mZYnu.js → assemble-BbFVjHeS.js} +21 -12
  9. package/dist/assemble-BbFVjHeS.js.map +1 -0
  10. package/dist/assemble-CXiTVyHD.js +2 -0
  11. package/dist/capture-BXhBfmsM.js +1206 -0
  12. package/dist/capture-BXhBfmsM.js.map +1 -0
  13. package/dist/capture-N7r3yeak.js +2 -0
  14. package/dist/{cli-r9CDqoFL.js → cli-BMjTKY-D.js} +56 -51
  15. package/dist/cli-BMjTKY-D.js.map +1 -0
  16. package/dist/{cli-spec-DOyxAMc2.js → cli-spec-DSvKsOK4.js} +4 -3
  17. package/dist/cli-spec-DSvKsOK4.js.map +1 -0
  18. package/dist/cli.js +2 -2
  19. package/dist/{client-LsfDiD-X.js → client-CwzU9CiW.js} +2 -201
  20. package/dist/client-CwzU9CiW.js.map +1 -0
  21. package/dist/{command-DMR69l5G.js → command-BK4kOgkH.js} +14 -14
  22. package/dist/{command-DMR69l5G.js.map → command-BK4kOgkH.js.map} +1 -1
  23. package/dist/{command-l4ZFCeMh.js → command-BdstSEHu.js} +7 -7
  24. package/dist/{command-l4ZFCeMh.js.map → command-BdstSEHu.js.map} +1 -1
  25. package/dist/{command-D6r2pwO5.js → command-BqJtFiPy.js} +153 -36
  26. package/dist/command-BqJtFiPy.js.map +1 -0
  27. package/dist/command-CTVGuH8y.js +2 -0
  28. package/dist/{command-Cej2t3y-.js → command-JPGNzFsA.js} +9 -9
  29. package/dist/{command-Cej2t3y-.js.map → command-JPGNzFsA.js.map} +1 -1
  30. package/dist/{commands-BA_NCh2h.js → commands-B618jg3C.js} +6 -6
  31. package/dist/{commands-BA_NCh2h.js.map → commands-B618jg3C.js.map} +1 -1
  32. package/dist/{commands-DgOUkcSO.js → commands-Duo2ur3r.js} +1 -1
  33. package/dist/{config-DuQDCx0B.js → config-B-E0xRkf.js} +4 -4
  34. package/dist/{config-DuQDCx0B.js.map → config-B-E0xRkf.js.map} +1 -1
  35. package/dist/{db-o_osRkqr.js → db-CnoUy-FZ.js} +1 -1
  36. package/dist/{db-CjX7JF4o.js → db-DFbtGIYy.js} +76 -17
  37. package/dist/db-DFbtGIYy.js.map +1 -0
  38. package/dist/{docker-DaUaG4XZ.js → docker-2qns7hJ2.js} +4 -4
  39. package/dist/{docker-DaUaG4XZ.js.map → docker-2qns7hJ2.js.map} +1 -1
  40. package/dist/{docker-Dnya8eo9.js → docker-D6t23fZl.js} +1 -1
  41. package/dist/{docker-ZaYeKE2w.js → docker-IFRW8K5f.js} +2 -2
  42. package/dist/{docker-ZaYeKE2w.js.map → docker-IFRW8K5f.js.map} +1 -1
  43. package/dist/{doctor-Bk6aJeec.js → doctor-B6oYTPoR.js} +11 -11
  44. package/dist/{doctor-Bk6aJeec.js.map → doctor-B6oYTPoR.js.map} +1 -1
  45. package/dist/{egress-BKbyriEa.js → egress-IUKdeayc.js} +16 -9
  46. package/dist/egress-IUKdeayc.js.map +1 -0
  47. package/dist/fake-instructions-CUI33I_F.js +32 -0
  48. package/dist/fake-instructions-CUI33I_F.js.map +1 -0
  49. package/dist/{files-BSMSnQMa.js → files-B6aVVGrk.js} +3 -3
  50. package/dist/{files-BSMSnQMa.js.map → files-B6aVVGrk.js.map} +1 -1
  51. package/dist/files-BpYgF2z0.js +2 -0
  52. package/dist/{files-TNrZJQ3Y.js → files-CMSUXAEg.js} +5 -5
  53. package/dist/{files-TNrZJQ3Y.js.map → files-CMSUXAEg.js.map} +1 -1
  54. package/dist/files-YCCVaTQC.js +2 -0
  55. package/dist/{git-DNGtrOg9.js → git-EmdFJ4DY.js} +2 -2
  56. package/dist/{git-DNGtrOg9.js.map → git-EmdFJ4DY.js.map} +1 -1
  57. package/dist/{harness-CDRaaGvR.js → harness-iqWeJQMM.js} +34 -11
  58. package/dist/harness-iqWeJQMM.js.map +1 -0
  59. package/dist/harness.d.ts +22 -11
  60. package/dist/harness.js +1 -1
  61. package/dist/{header-BZF8Xss1.js → header-_F0EWob3.js} +2 -2
  62. package/dist/{header-BZF8Xss1.js.map → header-_F0EWob3.js.map} +1 -1
  63. package/dist/{images-BpwFDT1E.js → images-CscddrJU.js} +6 -6
  64. package/dist/{images-BpwFDT1E.js.map → images-CscddrJU.js.map} +1 -1
  65. package/dist/index.d.ts +2 -2
  66. package/dist/index.js +85 -17
  67. package/dist/index.js.map +1 -1
  68. package/dist/init-DBHyi92L.js +2 -0
  69. package/dist/{init-CBWt1rZT.js → init-NQfIvi-0.js} +4 -4
  70. package/dist/{init-CBWt1rZT.js.map → init-NQfIvi-0.js.map} +1 -1
  71. package/dist/{invocations-DArYWyXN.js → invocations-nPvrlZPj.js} +3 -3
  72. package/dist/{invocations-DArYWyXN.js.map → invocations-nPvrlZPj.js.map} +1 -1
  73. package/dist/{judge-7WjNdU9z.js → judge-CeYPN8P_.js} +2 -2
  74. package/dist/{judge-7WjNdU9z.js.map → judge-CeYPN8P_.js.map} +1 -1
  75. package/dist/judge.d.ts +5 -4
  76. package/dist/judge.js +4 -3
  77. package/dist/judge.js.map +1 -1
  78. package/dist/{live-DZkCtmNP.js → live-S0qODb6o.js} +2 -2
  79. package/dist/{live-DZkCtmNP.js.map → live-S0qODb6o.js.map} +1 -1
  80. package/dist/model-BbLGRtOs.js +2 -0
  81. package/dist/{model-DyQbu7KF.js → model-BndnmcLm.js} +130 -25
  82. package/dist/model-BndnmcLm.js.map +1 -0
  83. package/dist/{model-Cp6NoAT3.js → model-Cl507trk.js} +8 -7
  84. package/dist/model-Cl507trk.js.map +1 -0
  85. package/dist/{model-Bv8uUZ07.js → model-DEQo3FkZ.js} +6 -6
  86. package/dist/model-DEQo3FkZ.js.map +1 -0
  87. package/dist/{model-BeoRxCcJ.js → model-DMOraCcm.js} +1 -1
  88. package/dist/{options-Ge_x32XE.js → options-DPUlm4FI.js} +152 -29
  89. package/dist/options-DPUlm4FI.js.map +1 -0
  90. package/dist/pairs-DDsjgm5F.js +149 -0
  91. package/dist/pairs-DDsjgm5F.js.map +1 -0
  92. package/dist/{plan-BqBadHYj.js → plan-PPc4-6xd.js} +23 -13
  93. package/dist/plan-PPc4-6xd.js.map +1 -0
  94. package/dist/{preflight-CyaAZE9r.js → preflight-CddycK92.js} +3 -3
  95. package/dist/{preflight-CyaAZE9r.js.map → preflight-CddycK92.js.map} +1 -1
  96. package/dist/{preflight-CFtZNTLt.js → preflight-Zumy0adT.js} +1 -1
  97. package/dist/{prepare-Dl7-t3fO.js → prepare-CKdMoC7e.js} +2 -2
  98. package/dist/{prepare-Zr1xOMUX.js → prepare-CsP-057p.js} +4 -4
  99. package/dist/{prepare-Zr1xOMUX.js.map → prepare-CsP-057p.js.map} +1 -1
  100. package/dist/{provenance-Byl2T6LJ.js → provenance-CsX6PHDR.js} +2 -2
  101. package/dist/{provenance-Byl2T6LJ.js.map → provenance-CsX6PHDR.js.map} +1 -1
  102. package/dist/{providers-Cflw7Ks-.js → providers-DkwiLKDS.js} +3 -3
  103. package/dist/{providers-Cflw7Ks-.js.map → providers-DkwiLKDS.js.map} +1 -1
  104. package/dist/{providers-SBMExI53.js → providers-yXZZcPfx.js} +1 -1
  105. package/dist/{query-DUSLlic0.js → query-BUcwCYsI.js} +2 -2
  106. package/dist/{query-DUSLlic0.js.map → query-BUcwCYsI.js.map} +1 -1
  107. package/dist/query-noGbekGF.js +2 -0
  108. package/dist/{questions-ZdT3JDyQ.js → questions-BEPj98fZ.js} +27 -118
  109. package/dist/questions-BEPj98fZ.js.map +1 -0
  110. package/dist/{record-CbuQH4l1.js → record-BRP9vZrj.js} +21 -1
  111. package/dist/record-BRP9vZrj.js.map +1 -0
  112. package/dist/{results-owJR-NFm.js → results-BcSHWbgB.js} +4 -4
  113. package/dist/{results-owJR-NFm.js.map → results-BcSHWbgB.js.map} +1 -1
  114. package/dist/{resume-BL4Yw7Ld.js → resume-DZ9AmfPv.js} +4 -4
  115. package/dist/{resume-BL4Yw7Ld.js.map → resume-DZ9AmfPv.js.map} +1 -1
  116. package/dist/runtime-Dfb2r-cS.js +202 -0
  117. package/dist/runtime-Dfb2r-cS.js.map +1 -0
  118. package/dist/sandbox.d.ts +1 -1
  119. package/dist/{server-yFVUxAm0.js → server-Da60oe4b.js} +9 -9
  120. package/dist/{server-yFVUxAm0.js.map → server-Da60oe4b.js.map} +1 -1
  121. package/dist/server-DiGR4JxK.js +2 -0
  122. package/dist/{source-M3gS517R.js → source-BVOnL3sn.js} +2 -2
  123. package/dist/{source-M3gS517R.js.map → source-BVOnL3sn.js.map} +1 -1
  124. package/dist/source-Dqu0jKwx.js +2 -0
  125. package/dist/src-BHNiP-5A.js +4 -0
  126. package/dist/{src-DH0jhpoi.js → src-BT4dB5CO.js} +1 -1
  127. package/dist/src-BT5pwco0.js +3 -0
  128. package/dist/src-BrMbt1B2.js +3 -0
  129. package/dist/{src-s-VffoYK.js → src-C1E9HDWO.js} +5 -3
  130. package/dist/{src-s-VffoYK.js.map → src-C1E9HDWO.js.map} +1 -1
  131. package/dist/{src-IOr1rhEg.js → src-CxTC5kNI.js} +7 -3
  132. package/dist/{src-IOr1rhEg.js.map → src-CxTC5kNI.js.map} +1 -1
  133. package/dist/src-D13vpMh0.js +3 -0
  134. package/dist/{src-DxFJrMUA.js → src-D95O-Smv.js} +12 -7
  135. package/dist/{src-DxFJrMUA.js.map → src-D95O-Smv.js.map} +1 -1
  136. package/dist/{src-DTcalvuF.js → src-DDNXsD9H.js} +28 -4
  137. package/dist/{src-DTcalvuF.js.map → src-DDNXsD9H.js.map} +1 -1
  138. package/dist/{src-DSE0FWaU.js → src-DVy58-zZ.js} +2 -2
  139. package/dist/{src-DSE0FWaU.js.map → src-DVy58-zZ.js.map} +1 -1
  140. package/dist/{src-CokPbYCb.js → src-D_cXqmnI.js} +15 -5
  141. package/dist/{src-CokPbYCb.js.map → src-D_cXqmnI.js.map} +1 -1
  142. package/dist/src-DdRlaiRc.js +3 -0
  143. package/dist/{src-79JhW-zG.js → src-TdJuDYqB.js} +7 -7
  144. package/dist/{src-79JhW-zG.js.map → src-TdJuDYqB.js.map} +1 -1
  145. package/dist/src-xczuQbE6.js +3 -0
  146. package/dist/{state-DEj_utaE.js → state-B72h_jEw.js} +10 -10
  147. package/dist/{state-DEj_utaE.js.map → state-B72h_jEw.js.map} +1 -1
  148. package/dist/state-Bf_Vq_pV.js +2 -0
  149. package/dist/studio-app/assets/{index-Bbl0oTxu.js → index-Bgr-efZm.js} +9 -9
  150. package/dist/studio-app/index.html +1 -1
  151. package/dist/{summary-D012KlUM.js → summary-CJdxaRdM.js} +7 -7
  152. package/dist/{summary-D012KlUM.js.map → summary-CJdxaRdM.js.map} +1 -1
  153. package/dist/{summary--FBuB_sr.js → summary-k3mhWWXv.js} +8 -4
  154. package/dist/summary-k3mhWWXv.js.map +1 -0
  155. package/dist/testing.d.ts +14 -0
  156. package/dist/testing.js +2 -0
  157. package/dist/{tools-CJHw-zCo.js → tools-D0gF2QoV.js} +3 -3
  158. package/dist/{tools-CJHw-zCo.js.map → tools-D0gF2QoV.js.map} +1 -1
  159. package/dist/{types-BsRSknLe.d.ts → types-_LOFdPUf.d.ts} +262 -33
  160. package/dist/{usage-DsYUqIUM.js → usage-DDF_6tkV.js} +4 -2
  161. package/dist/{usage-DsYUqIUM.js.map → usage-DDF_6tkV.js.map} +1 -1
  162. package/dist/view/index.d.ts +19 -6
  163. package/dist/view/index.js +6 -6
  164. package/dist/{views-jhL9Jb8A.js → views-DZ1YDqey.js} +4 -4
  165. package/dist/{views-jhL9Jb8A.js.map → views-DZ1YDqey.js.map} +1 -1
  166. package/dist/views-Ds0GXWtX.js +3 -0
  167. package/dist/{worker-entry-OwnsrUdr.js → worker-entry-DXeyWY-m.js} +3 -2
  168. package/dist/worker-entry-DXeyWY-m.js.map +1 -0
  169. package/dist/{workspace-C4_J0pqb.js → workspace-DpXdrslo.js} +3 -3
  170. package/dist/{workspace-C4_J0pqb.js.map → workspace-DpXdrslo.js.map} +1 -1
  171. package/dist/{workspace-wudSz_W-.js → workspace-DzNL-3iO.js} +1 -1
  172. package/package.json +9 -4
  173. package/dist/assemble-D8sZ4Jiv.js +0 -2
  174. package/dist/assemble-Dd_mZYnu.js.map +0 -1
  175. package/dist/capture-CisAmy-G.js +0 -587
  176. package/dist/capture-CisAmy-G.js.map +0 -1
  177. package/dist/capture-DquyqAHC.js +0 -2
  178. package/dist/cli-r9CDqoFL.js.map +0 -1
  179. package/dist/cli-spec-DOyxAMc2.js.map +0 -1
  180. package/dist/client-LsfDiD-X.js.map +0 -1
  181. package/dist/command-Cxfgghqo.js +0 -2
  182. package/dist/command-D6r2pwO5.js.map +0 -1
  183. package/dist/db-CjX7JF4o.js.map +0 -1
  184. package/dist/egress-BKbyriEa.js.map +0 -1
  185. package/dist/files-DmZGPsWK.js +0 -2
  186. package/dist/files-Tb8wY0Ze.js +0 -2
  187. package/dist/harness-CDRaaGvR.js.map +0 -1
  188. package/dist/init-1THeGfut.js +0 -2
  189. package/dist/model-Bv8uUZ07.js.map +0 -1
  190. package/dist/model-Cp6NoAT3.js.map +0 -1
  191. package/dist/model-D_pF3Vcl.js +0 -2
  192. package/dist/model-DyQbu7KF.js.map +0 -1
  193. package/dist/options-Ge_x32XE.js.map +0 -1
  194. package/dist/plan-BqBadHYj.js.map +0 -1
  195. package/dist/query-CvutWHaL.js +0 -2
  196. package/dist/questions-ZdT3JDyQ.js.map +0 -1
  197. package/dist/record-CbuQH4l1.js.map +0 -1
  198. package/dist/server-CNPsB0cT.js +0 -2
  199. package/dist/source-Cmc5SKFn.js +0 -2
  200. package/dist/src--L8B4WGa.js +0 -3
  201. package/dist/src-BLN459er.js +0 -3
  202. package/dist/src-Bz66jDtE.js +0 -3
  203. package/dist/src-CfUwg9UY.js +0 -3
  204. package/dist/src-DV_3QDHA.js +0 -4
  205. package/dist/src-Ljh2vKXm.js +0 -3
  206. package/dist/state-DkqbCVVp.js +0 -2
  207. package/dist/summary--FBuB_sr.js.map +0 -1
  208. package/dist/views-yPmmoo8f.js +0 -3
  209. package/dist/worker-entry-OwnsrUdr.js.map +0 -1
@@ -1,10 +1,14 @@
1
1
  //#region src/view/effort.d.ts
2
2
  /** Below this two-sided p, an effort difference is an effect. */
3
3
  declare const EFFORT_ALPHA = 0.05;
4
+ /** Some counted attempts reported no usage. Not a verdict; never printed as one. */
5
+ declare const TOKENS_UNREPORTED = "some cells did not report usage";
4
6
  type EffortSample = {
5
7
  tools: number;
6
8
  agentMs: number;
7
9
  fileEdits: number;
10
+ /** Total tokens when this attempt reported usage; omitted when the harness dropped it. */
11
+ tokens?: number;
8
12
  };
9
13
  type Spread = {
10
14
  median: number;
@@ -17,10 +21,13 @@ type CellEffort = {
17
21
  tools: Spread;
18
22
  agentMs: Spread;
19
23
  fileEdits: number;
24
+ /** Over the counted attempts that reported usage; omitted when none did. */
25
+ tokens?: Spread;
20
26
  };
21
27
  /**
22
28
  * `fewer` / `more`: the exact rank test's p is below `EFFORT_ALPHA`. `noise`: it isn't.
23
- * `insufficient`: too few attempts for the test to ever reach it (2 against 2 can't).
29
+ * `insufficient`: too few attempts for the test to ever reach it (2 against 2 can't). Never
30
+ * means a harness dropped usage.
24
31
  */
25
32
  type EffortVerdict = 'fewer' | 'more' | 'noise' | 'insufficient';
26
33
  type EffortContrast = {
@@ -37,8 +44,23 @@ type EffortContrast = {
37
44
  /** On tool calls, the steadier measure; `timeVerdict` on agent time. */
38
45
  verdict: EffortVerdict;
39
46
  timeVerdict: EffortVerdict;
47
+ /**
48
+ * Token medians' ratio when both sides have at least one usage sample; null when the
49
+ * control's is 0 or the token test was omitted.
50
+ */
51
+ tokensRatio: number | null;
52
+ tokensP: number | null;
53
+ /**
54
+ * Rank-test verdict on the attempts that reported usage. Null when either side has no
55
+ * token sample — omitted, not `insufficient`.
56
+ */
57
+ tokensVerdict: EffortVerdict | null;
58
+ /** Set when some counted attempts on either side reported no usage. Not a verdict. */
59
+ tokensNote?: typeof TOKENS_UNREPORTED;
40
60
  };
41
- declare const effortSample: (a: Pick<AttemptRecord, 'activity' | 'timings'>) => EffortSample;
61
+ declare const effortSample: (a: Pick<AttemptRecord, 'activity' | 'timings' | 'usage'>) => EffortSample;
62
+ /** Token totals from the attempts that reported usage; empty when none did. */
63
+ declare const tokenValues: (samples: EffortSample[]) => number[];
42
64
  declare function effortOf(samples: EffortSample[]): CellEffort | null;
43
65
  /** The verdict of an exact rank test of `xs` (variant) against `ys` (control). */
44
66
  declare function effortVerdict(xs: number[], ys: number[]): {
@@ -59,13 +81,14 @@ declare function formatSeconds(ms: number): string;
59
81
  declare const VERDICT_TEXT: Record<EffortVerdict, (what: string) => string>;
60
82
  /**
61
83
  * `tools 5 vs 43 (×0.11), agent 21s vs 46s (×0.47): too few attempts to test` for a variant
62
- * against its control; with enough attempts, `fewer tool calls (p = 0.029)`.
84
+ * against its control; with enough attempts, `fewer tool calls (p = 0.029)`. Tokens fold in
85
+ * when both sides have usage samples; they are omitted (not `insufficient`) when either does not.
63
86
  */
64
87
  declare function effortLabel(c: EffortContrast): string;
65
- /** One cell's effort on its own: `tools 43 · agent 46s`. */
66
- declare const effortSummary: (e: Pick<CellEffort, 'tools' | 'agentMs'>) => string;
88
+ /** One cell's effort on its own: `tools 43 · agent 46s`, plus tokens when any attempt reported them. */
89
+ declare const effortSummary: (e: Pick<CellEffort, 'tools' | 'agentMs' | 'tokens'>) => string;
67
90
  /** The same cell between two runs: `tools 44 → 10 (×0.23) · agent 45s → 21s (×0.47)`. */
68
- declare function effortChangeLabel(base: Pick<CellEffort, 'tools' | 'agentMs'>, head: Pick<CellEffort, 'tools' | 'agentMs'>): string;
91
+ declare function effortChangeLabel(base: Pick<CellEffort, 'tools' | 'agentMs' | 'tokens'>, head: Pick<CellEffort, 'tools' | 'agentMs' | 'tokens'>): string;
69
92
  //#endregion
70
93
  //#region src/history/types.d.ts
71
94
  /** Stays 1 while reeval is pre-release: the record changes in place. */
@@ -86,10 +109,19 @@ type ArtifactRef = FileRef & {
86
109
  capture?: {
87
110
  port: number;
88
111
  path: string;
112
+ /** The live window, never the string `'full-page'`. */
89
113
  viewport?: {
90
114
  width: number;
91
115
  height: number;
92
116
  };
117
+ /** Saved PNG used `captureBeyondViewport`. */
118
+ fullPage?: boolean;
119
+ /** Goal strings only; wait beats omitted. */
120
+ instructions?: string[];
121
+ use?: {
122
+ model: string;
123
+ moves: number;
124
+ };
93
125
  };
94
126
  };
95
127
  type GitInfo = {
@@ -149,6 +181,8 @@ type JudgementRecord = {
149
181
  key: string;
150
182
  /** Transient provider errors retried before this verdict, with the backoff before each retry. */
151
183
  retries?: JudgeRetry[];
184
+ /** Captures this call sent the judge as file parts, when any. */
185
+ artifacts?: JudgeArtifactRef[];
152
186
  };
153
187
  type AttemptFiles = {
154
188
  /** Each environment setup step's command, exit code, duration and output. */
@@ -197,6 +231,17 @@ type AttemptRecord = {
197
231
  * recorded them.
198
232
  */
199
233
  servedModels: string[] | null;
234
+ /**
235
+ * The reasoning effort the harness factory asked for (`claudeCode({ effort: 'high' })`);
236
+ * null when the factory left it unset. Fast is not this.
237
+ */
238
+ effort: string | null;
239
+ /**
240
+ * The reasoning effort the harness's API said it ran at, from `servedModels` /
241
+ * each turn's `model` (`medium` from `gpt-5.6-luna[effort=medium]`); null when those
242
+ * labels name none. Fast (`[fast=true]`) is not this.
243
+ */
244
+ servedEffort: string | null;
200
245
  outcome: Outcome;
201
246
  error: AttemptError | null;
202
247
  durationMs: number;
@@ -218,6 +263,15 @@ type AttemptRecord = {
218
263
  }>;
219
264
  /** Tokens across the attempt's turns; null when the harness reported none. */
220
265
  usage: TokenUsage | null;
266
+ /**
267
+ * Tokens the capture vision loop used. Infrastructure only: never folded
268
+ * into `usage`, effort, compare or lift.
269
+ */
270
+ captureUse?: {
271
+ model: string;
272
+ moves: number;
273
+ usage: TokenUsage | null;
274
+ };
221
275
  timings: PhaseTimings;
222
276
  /** Counts from the transcript, so a run's shape is visible without reading it. */
223
277
  activity: {
@@ -277,7 +331,9 @@ type EvalEntry = {
277
331
  attempts: AttemptRecord[];
278
332
  /**
279
333
  * The compare's questions, answered after its attempts by pairwise votes, one per question;
280
- * unset without any. They annotate: `outcome` and `passRate` never depend on them.
334
+ * unset without any. They annotate: `outcome` and `passRate` never depend on them. Each vote
335
+ * may include a short `reason` (capped). `reeval analyze` includes each answer in the digest
336
+ * (rates by cut, votes, ties, a failed call, a sample of reasons).
281
337
  */
282
338
  answers?: CompareAnswer[];
283
339
  };
@@ -332,6 +388,11 @@ type CellRecord = Cell & {
332
388
  harnessKind: string;
333
389
  /** The configured harness model, when it has one. */
334
390
  model: string | null;
391
+ /**
392
+ * The reasoning effort the harness factory asked for; null when it left it unset.
393
+ * Fast is not this.
394
+ */
395
+ effort: string | null;
335
396
  /** How the attempts decide the cell's outcome; `'none'` when it doesn't fail the eval. */
336
397
  gate: CellGate;
337
398
  /** Environment keys the variant replaced on the control's (or a child on its parent's). */
@@ -478,21 +539,31 @@ type Stack = {
478
539
  /** Exact versions of the packages that run and grade the agent. */
479
540
  packages: Record<string, string>;
480
541
  /**
481
- * Each harness: its configured `model`, and `resolvedModels`, what it reported serving across
482
- * the run's turns with the variant it resolved (`composer-2.5[fast=true]` for `composer-2.5`
483
- * without `params`); empty when it reports none.
542
+ * Each harness: its configured `model` and requested `effort`, `resolvedModels` (what it
543
+ * reported serving, with the variant it resolved), and `resolvedEffort` (reasoning-effort
544
+ * suffixes those labels named). Fast (`[fast=true]`) is not `resolvedEffort`.
484
545
  */
485
546
  harnesses: Array<{
486
547
  id: string;
487
548
  kind: string;
488
549
  /** The configured model, when the harness has one. */
489
550
  model: string | null;
551
+ /**
552
+ * The reasoning effort the harness factory asked for; null when it left it unset.
553
+ * Fast is not this.
554
+ */
555
+ effort: string | null;
490
556
  /**
491
557
  * The models the harness reported serving, across every turn in the run, with the variant it
492
558
  * resolved (`composer-2.5[fast=true]` for `composer-2.5` with no `params`); empty when it
493
559
  * reports none.
494
560
  */
495
561
  resolvedModels: string[];
562
+ /**
563
+ * Reasoning-effort suffixes those served models named (`medium` from
564
+ * `gpt-5.6-luna[effort=medium]`); empty when they name none. Fast is not this.
565
+ */
566
+ resolvedEffort: string[];
496
567
  }>;
497
568
  /**
498
569
  * The run's judge: the config's, with what the profile's `judge` and `defaults.judge` set over it.
@@ -535,7 +606,7 @@ type HistoryCell = Pick<CellRecord, 'key' | 'role' | 'variant' | 'harness' | 'mo
535
606
  hi: number;
536
607
  withinNoise: boolean;
537
608
  };
538
- /** Median tool calls and agent time over the counted attempts; null when none counted. */
609
+ /** Median tool calls, agent time and tokens over the counted attempts; null when none counted. */
539
610
  effort: CellEffort | null;
540
611
  };
541
612
  /**
@@ -640,14 +711,67 @@ type ExecResult = {
640
711
  stdout: string;
641
712
  stderr: string;
642
713
  };
643
- /** CSS pixels for `c.capture()`. Default 1280×720 when the call and cascade omit it. */
644
- type Viewport = {
714
+ /** Live tab size for `c.capture()`. Default 1280×720 when the call and cascade omit `viewport`. */
715
+ type CaptureWindow = {
645
716
  width: number;
646
717
  height: number;
647
718
  };
719
+ /**
720
+ * Author camera. `{ width, height }` is the live window and the saved PNG.
721
+ * `'full-page'` keeps the default window and saves with `captureBeyondViewport`.
722
+ */
723
+ type Viewport = CaptureWindow | 'full-page';
724
+ /**
725
+ * Chromium look-ready events. `'load'` is `window` load (`Page.loadEventFired`).
726
+ * `'idle'` is `Page.lifecycleEvent` `networkAlmostIdle`.
727
+ */
728
+ type CaptureWait = 'load' | 'idle';
729
+ /** Same shape at top-level `wait` and `{ wait }` between instructions. */
730
+ type Wait = CaptureWait | {
731
+ ms: number;
732
+ };
733
+ type CaptureInstruction = string | {
734
+ wait: Wait;
735
+ };
736
+ type CaptureUseAction = {
737
+ type: 'click';
738
+ x: number;
739
+ y: number;
740
+ } | {
741
+ type: 'type';
742
+ text: string;
743
+ } | {
744
+ type: 'key';
745
+ key: 'Tab' | 'Enter';
746
+ } | {
747
+ type: 'scroll';
748
+ x: number;
749
+ y: number;
750
+ dy: number;
751
+ } | {
752
+ type: 'drag';
753
+ x: number;
754
+ y: number;
755
+ toX: number;
756
+ toY: number;
757
+ } | {
758
+ type: 'hover';
759
+ x: number;
760
+ y: number;
761
+ } | {
762
+ type: 'done';
763
+ };
764
+ /** One list per instruction string. Tests; never downloads a model. */
765
+ type CaptureUseScript = CaptureUseAction[][];
766
+ /** Resolved vision driver after cascade, call override and analysis fallback. */
767
+ type CaptureUse = {
768
+ model: string;
769
+ } | {
770
+ fake: CaptureUseScript;
771
+ };
648
772
  /**
649
773
  * Camera defaults for `c.capture()`. Cascades config → profile defaults → group → eval,
650
- * shallow-merged. `viewport` on a level replaces the whole object. `port` is not an option:
774
+ * shallow-merged. `viewport` on a level replaces the whole value. `port` is not an option:
651
775
  * pass it as the first argument to `c.capture`.
652
776
  */
653
777
  type CaptureOptions = {
@@ -656,6 +780,11 @@ type CaptureOptions = {
656
780
  timeout?: Duration;
657
781
  /** `false` refuses the host `chrome-headless-shell` binary. `c.capture()` then throws. */
658
782
  browser?: boolean;
783
+ /**
784
+ * Vision model for `instructions`. Cascades like `question`. Default is the analysis
785
+ * model when that model accepts images; never Jev.
786
+ */
787
+ model?: string;
659
788
  };
660
789
  /** A background process started by `c.exec(..., { background: true })` or `c.serve`. */
661
790
  type BackgroundHandle = {
@@ -672,6 +801,7 @@ type Capture = {
672
801
  port: number;
673
802
  /** Path on the app, as passed in. */
674
803
  path: string;
804
+ /** What the author asked, including `'full-page'`. */
675
805
  viewport: Viewport;
676
806
  /** `artifacts/<name>.png` under the attempt directory. */
677
807
  file: {
@@ -683,13 +813,19 @@ type Capture = {
683
813
  /**
684
814
  * Optional camera and path for `c.capture(port | ServeHandle, options?)`.
685
815
  * `port` is the first argument, not a field here. Default `path` is `/`;
686
- * default `name` is derived from the path.
816
+ * default `name` is derived from the path. `wait` and `instructions` are call-only.
687
817
  */
688
818
  type CaptureCall = {
689
819
  name?: string;
690
820
  path?: string;
691
821
  viewport?: Viewport;
692
822
  timeout?: Duration;
823
+ /** Look-ready once, before the first model shot or the saved PNG. Default `'load'`. */
824
+ wait?: Wait;
825
+ /** Journey: goal strings and `{ wait }` beats. Tests may pass `fakeInstructions(...)`. */
826
+ instructions?: CaptureInstruction[];
827
+ /** Overrides cascaded `capture.model` for this call. */
828
+ model?: string;
693
829
  };
694
830
  type FileChange = {
695
831
  path: string;
@@ -747,19 +883,44 @@ type Turn = TurnData & {
747
883
  type JSONValue = null | boolean | number | string | JSONValue[] | {
748
884
  [key: string]: JSONValue;
749
885
  };
886
+ /** JSON fields the judge sees for the turn: task, output, files, diff, optional contents. */
887
+ type JudgeJsonState = {
888
+ [key: string]: JSONValue;
889
+ };
890
+ /** A capture sent to `experimental_decide` as a file part. */
891
+ type JudgeFilePart = {
892
+ type: 'file';
893
+ mediaType: string;
894
+ data: Uint8Array;
895
+ };
896
+ /**
897
+ * What `experimental_decide` (and a fake judge) receive: a JSON object when the call has no
898
+ * captures, or an ordered list of one JSON part plus each capture's file part.
899
+ */
900
+ type JudgeState = JudgeJsonState | Array<{
901
+ type: 'json';
902
+ value: JudgeJsonState;
903
+ } | JudgeFilePart>;
904
+ /** A capture this judge call sent as a file part. Bytes live in `artifacts/<name>.png`. */
905
+ type JudgeArtifactRef = {
906
+ name: string;
907
+ /** `artifacts/<name>.png` under the attempt directory. */
908
+ path: string;
909
+ sha256: string;
910
+ bytes: number;
911
+ mediaType: 'image/png';
912
+ };
750
913
  /**
751
914
  * A canned judge for tests and dry runs; see `fakeJudge()` in `reeval/judge`. `score` as a
752
915
  * function of the state the judge would see works per group, eval or call, not in the config.
753
916
  */
754
917
  type FakeJudgeModel = {
755
918
  kind: 'fake-judge';
756
- score: number | ((state: {
757
- [key: string]: JSONValue;
758
- }) => number);
919
+ score: number | ((state: JudgeState) => number);
759
920
  };
760
921
  /**
761
922
  * `'provider/model'` (e.g. `'typesafe-ai/jev-1.13.0'`, `'google/gemini-3.8-flash'`), an AI SDK
762
- * evaluation model object (per group, eval or call only), or a fake judge.
923
+ * decision model object (per group, eval or call only), or a fake judge.
763
924
  */
764
925
  type JudgeModel = string | FakeJudgeModel | {
765
926
  readonly specificationVersion: string;
@@ -783,6 +944,11 @@ type JudgeOptions = {
783
944
  type JudgeCallOptions = JudgeOptions & {
784
945
  /** What to grade instead of the latest turn: another turn, or a value used as the output. */
785
946
  on?: Turn | JSONValue;
947
+ /**
948
+ * Captures this call sends the judge as file parts. A `c.capture()` handle or its name.
949
+ * Call-only: the bytes are on this attempt. The provider that cannot take files fails the call.
950
+ */
951
+ artifacts?: Array<Capture | string>;
786
952
  };
787
953
  type Verdict = {
788
954
  verdict: 'pass' | 'fail';
@@ -793,6 +959,8 @@ type Verdict = {
793
959
  model: string;
794
960
  /** The model id the provider says served the call, when it reports one. */
795
961
  resolvedModel?: string;
962
+ /** Captures this call sent the judge as file parts, when any. */
963
+ artifacts?: JudgeArtifactRef[];
796
964
  };
797
965
  /**
798
966
  * What `c.judge()` returns when the call failed (the provider's error, after any retries): the attempt fails as a judge error once the eval's body has finished,
@@ -806,7 +974,10 @@ type JudgeFailure = Omit<Verdict, 'verdict' | 'score' | 'resolvedModel'> & {
806
974
  type AttemptContext = {
807
975
  /** Sends the next turn of this eval's agent session, starting the sandbox on first use. */
808
976
  send(prompt: string): Promise<Turn>;
809
- /** Asks the judge a yes/no question about the latest turn (or `options.on`). */
977
+ /**
978
+ * Asks the judge a yes/no question about the latest turn (or `options.on`).
979
+ * `options.artifacts` is a list of `c.capture()` handles or names.
980
+ */
810
981
  judge(question: string, options?: JudgeCallOptions): Promise<Verdict | JudgeFailure>;
811
982
  exec(command: string): Promise<ExecResult>;
812
983
  exec(command: string, options: {
@@ -823,6 +994,7 @@ type AttemptContext = {
823
994
  /**
824
995
  * Screenshots a path on a tunneled sandbox port and writes `artifacts/<name>.png`.
825
996
  * First argument is the container port or a `ServeHandle` from `c.serve`.
997
+ * `instructions` runs a vision journey on that same tab first.
826
998
  * Needs a sandbox, same as `c.exec`.
827
999
  */
828
1000
  capture(target: number | ServeHandle, options?: CaptureCall): Promise<Capture>;
@@ -867,6 +1039,11 @@ type FakeHarnessDescriptor = {
867
1039
  * and variant (`composer-2.5[fast=true]`); unset, it reports none.
868
1040
  */
869
1041
  servedModel?: string;
1042
+ /**
1043
+ * Requested reasoning effort, recorded as `effort` on the cell. Use `servedModel` for what the
1044
+ * turn reports (`fake-1[effort=medium]`). Fast is not this.
1045
+ */
1046
+ effort?: string;
870
1047
  /** Tool calls the fake agent reports on every turn, before writing files. */
871
1048
  tools?: Array<{
872
1049
  tool: string;
@@ -933,7 +1110,12 @@ type CursorHarnessDescriptor = {
933
1110
  * model catalog (`fast=true` for `composer-2.5`), sent explicitly; pass the ones that change cost.
934
1111
  */
935
1112
  params?: Record<string, string>;
936
- /** Cell id; defaults to `cursor:<model>`. */
1113
+ /**
1114
+ * Reasoning effort, mapped onto the catalog param `Cursor.models.list()` names for this model
1115
+ * (`reasoning_effort`, `effort`, …). Not Fast: that stays `params.fast`.
1116
+ */
1117
+ effort?: string;
1118
+ /** Cell id; defaults to `cursor:<model>`, or `cursor:<model>[effort=<value>]` when `effort` is set. */
937
1119
  id?: string;
938
1120
  /** The most Cursor attempts at once, across the run, e.g. for the account's rate limits. */
939
1121
  maxConcurrent?: number;
@@ -948,7 +1130,12 @@ type ClaudeCodeHarnessDescriptor = {
948
1130
  kind: 'claude-code';
949
1131
  /** A model id or alias the `claude` CLI accepts, e.g. `claude-sonnet-5` or `sonnet`. */
950
1132
  model: string;
951
- /** Cell id; defaults to `claude-code:<model>`. */
1133
+ /**
1134
+ * Reasoning effort the Agent SDK `/effort` control takes, e.g. `low`, `medium`, `high`,
1135
+ * `xhigh` (Extra in the UI) or `max`.
1136
+ */
1137
+ effort?: string;
1138
+ /** Cell id; defaults to `claude-code:<model>`, or `claude-code:<model>[effort=<value>]` when `effort` is set. */
952
1139
  id?: string;
953
1140
  /** The most Claude Code attempts at once, across the run, e.g. for the account's rate limits. */
954
1141
  maxConcurrent?: number;
@@ -963,7 +1150,12 @@ type AntigravityHarnessDescriptor = {
963
1150
  kind: 'antigravity';
964
1151
  /** A model slug `agy models` lists for a Gemini API key, e.g. `gemini-3.8-flash-medium`. */
965
1152
  model: string;
966
- /** Cell id; defaults to `antigravity:<model>`. */
1153
+ /**
1154
+ * Reasoning effort passed as `agy --effort`, e.g. `low`, `medium`, `high` or `max`. The
1155
+ * slug's `-low`/`-medium`/`-high` suffix is the same knob baked into `model`.
1156
+ */
1157
+ effort?: string;
1158
+ /** Cell id; defaults to `antigravity:<model>`, or `antigravity:<model>[effort=<value>]` when `effort` is set. */
967
1159
  id?: string;
968
1160
  /** The most Antigravity attempts at once, across the run, e.g. for the key's rate limits. */
969
1161
  maxConcurrent?: number;
@@ -985,7 +1177,12 @@ type OpenCodeHarnessDescriptor = {
985
1177
  * `anthropic/claude-haiku-4-5`; the provider picks the key.
986
1178
  */
987
1179
  model: string;
988
- /** Cell id; defaults to `opencode:<model>`. */
1180
+ /**
1181
+ * Reasoning effort for that provider: `options.reasoningEffort` (OpenAI) or `options.thinking`
1182
+ * (Anthropic). Values are whatever that provider takes.
1183
+ */
1184
+ effort?: string;
1185
+ /** Cell id; defaults to `opencode:<model>`, or `opencode:<model>[effort=<value>]` when `effort` is set. */
989
1186
  id?: string;
990
1187
  /** The most OpenCode attempts at once, across the run, e.g. for the key's rate limits. */
991
1188
  maxConcurrent?: number;
@@ -1003,7 +1200,11 @@ type GooseHarnessDescriptor = {
1003
1200
  kind: 'goose';
1004
1201
  /** A Gemini model id, run on Goose's `google` provider, e.g. `gemini-3.8-flash`. */
1005
1202
  model: string;
1006
- /** Cell id; defaults to `goose:<model>`. */
1203
+ /**
1204
+ * Reasoning effort as `GOOSE_THINKING_EFFORT`, e.g. `off`, `low`, `medium`, `high` or `max`.
1205
+ */
1206
+ effort?: string;
1207
+ /** Cell id; defaults to `goose:<model>`, or `goose:<model>[effort=<value>]` when `effort` is set. */
1007
1208
  id?: string;
1008
1209
  /** The most Goose attempts at once, across the run, e.g. for the key's rate limits. */
1009
1210
  maxConcurrent?: number;
@@ -1022,7 +1223,12 @@ type PiHarnessDescriptor = {
1022
1223
  kind: 'pi';
1023
1224
  /** A Gemini model id, run on pi's `google` provider, e.g. `gemini-3.8-flash`. */
1024
1225
  model: string;
1025
- /** Cell id; defaults to `pi:<model>`. */
1226
+ /**
1227
+ * Reasoning effort, passed as pi's `--thinking` (the CLI's name). Values are whatever that
1228
+ * flag takes, e.g. `off`, `minimal`, `low`, `medium`, `high`, `xhigh` or `max`.
1229
+ */
1230
+ effort?: string;
1231
+ /** Cell id; defaults to `pi:<model>`, or `pi:<model>[effort=<value>]` when `effort` is set. */
1026
1232
  id?: string;
1027
1233
  /** The most pi attempts at once, across the run, e.g. for the key's rate limits. */
1028
1234
  maxConcurrent?: number;
@@ -1040,7 +1246,12 @@ type CodexHarnessDescriptor = {
1040
1246
  kind: 'codex';
1041
1247
  /** An OpenAI model id Codex runs on the Responses API, e.g. `gpt-5.6-luna`. */
1042
1248
  model: string;
1043
- /** Cell id; defaults to `codex:<model>`. */
1249
+ /**
1250
+ * Reasoning effort as Codex's `model_reasoning_effort`, e.g. `low`, `medium`, `high`,
1251
+ * `xhigh`, `max` or `ultra`.
1252
+ */
1253
+ effort?: string;
1254
+ /** Cell id; defaults to `codex:<model>`, or `codex:<model>[effort=<value>]` when `effort` is set. */
1044
1255
  id?: string;
1045
1256
  /** The most Codex attempts at once, across the run, e.g. for the key's rate limits. */
1046
1257
  maxConcurrent?: number;
@@ -1397,16 +1608,27 @@ type CompareOptions<E = Environment> = {
1397
1608
  * win rates and never change pass, fail or the exit code.
1398
1609
  */
1399
1610
  questions?: CompareQuestion[];
1611
+ /**
1612
+ * The factor every question varies when pairing, when a question does not name its own
1613
+ * `across`. `'environment'` holds the harness; `'harness'` holds the environment. A list of
1614
+ * both, or omitted, asks both pair kinds.
1615
+ */
1616
+ across?: PairFactor | PairFactor[];
1400
1617
  };
1401
1618
  /**
1402
1619
  * A question for pairwise judgement: its text, or the text and the `'provider/model'` that
1403
1620
  * answers it. Without a model, `analysis.model` answers, else the judge's when it's a language model.
1621
+ * `across` is the factor it varies when pairing; without it (and without a one-factor
1622
+ * `compare.across`) both pair kinds run.
1404
1623
  */
1405
1624
  type CompareQuestion = string | {
1406
1625
  question: string;
1407
1626
  model?: string;
1627
+ across?: PairFactor;
1408
1628
  };
1409
- /** Which pairs a vote is over: two arms on one harness, or two harnesses on one arm. */
1629
+ /** A matrix factor a compare question varies when pairing; the others are held. */
1630
+ type PairFactor = 'environment' | 'harness';
1631
+ /** Which pairs a vote is over: two environments on one harness, or two harnesses on one environment. */
1410
1632
  type CompareCut = 'within' | 'across';
1411
1633
  /** One judgement of one pair of attempts, in one order. */
1412
1634
  type PairVote = {
@@ -1425,6 +1647,8 @@ type PairVote = {
1425
1647
  winner: string | 'tie';
1426
1648
  /** True for the repeat that showed `b` first. */
1427
1649
  swapped: boolean;
1650
+ /** The model's short reason for this pick; omitted when it gave none. Capped. */
1651
+ reason?: string;
1428
1652
  };
1429
1653
  /** A compare question's answer: every vote, and each side's wins over decided votes per cut. */
1430
1654
  type CompareAnswer = {
@@ -1477,7 +1701,7 @@ type EvalOptionFields = {
1477
1701
  */
1478
1702
  egress?: EgressPolicy;
1479
1703
  judge?: JudgeOptions;
1480
- /** Screenshot defaults for `c.capture()`. Shallow-merged; `viewport` replaces the whole object. */
1704
+ /** Screenshot defaults for `c.capture()`. Shallow-merged; `viewport` and `model` replace the value. */
1481
1705
  capture?: CaptureOptions;
1482
1706
  /** Per attempt. */
1483
1707
  timeout?: Duration;
@@ -1586,14 +1810,19 @@ type FakeAnalysisModel = {
1586
1810
  };
1587
1811
  /**
1588
1812
  * How it answers compare questions: a fixed pick, a function of the blinded pair, or
1589
- * `{ error }` to fail every call. Default `'tie'`.
1813
+ * `{ error }` to fail every call. A pick may be `{ winner, reason? }`. Default `'tie'`.
1590
1814
  */
1591
- vote?: FakeVote | ((pair: BlindPair) => FakeVote) | {
1815
+ vote?: FakePick | ((pair: BlindPair) => FakePick) | {
1592
1816
  error: string;
1593
1817
  };
1594
1818
  };
1595
1819
  /** A blinded label's pick: the attempt shown first (`A`), second (`B`), or neither. */
1596
1820
  type FakeVote = 'A' | 'B' | 'tie';
1821
+ /** A fake compare-question pick, optionally with a reason. */
1822
+ type FakePick = FakeVote | {
1823
+ winner: FakeVote;
1824
+ reason?: string;
1825
+ };
1597
1826
  /** What a compare question's model is shown: the prompt, and the two diffs in slot order. */
1598
1827
  type BlindPair = {
1599
1828
  question: string;
@@ -1858,5 +2087,5 @@ type SandboxWarning = {
1858
2087
  message: string;
1859
2088
  };
1860
2089
  //#endregion
1861
- export { JudgeFailure as $, effortVerdict as $t, EnvironmentHelpers as A, FileRef as At, FakeNoteInput as B, EffortSample as Bt, DirectoryOptions as C, Verdict as Ct, EgressRecord as D, AttemptRecord as Dt, EgressPolicy as E, ArtifactRef as Et, EvalOptions as F, RunRecord as Ft, GroupOptions as G, cellEffort as Gt, FakeScriptStep as H, Spread as Ht, ExecResult as I, StackSummary as It, HarnessEdit as J, effortChangeLabel as Jt, HarnessData as K, cellSamples as Kt, FakeAnalysisModel as L, CellEffort as Lt, EnvironmentSpec as M, HistoryEntry as Mt, EsConfig as N, JudgementRecord as Nt, EnvVars as O, CellRecord as Ot, EvalFn as P, Lift as Pt, JudgeCallOptions as Q, effortSummary as Qt, FakeHarnessDescriptor as R, EFFORT_ALPHA as Rt, Diff as S, TurnStatus as St, Duration as T, WebEventType as Tt, FakeVote as U, VERDICT_TEXT as Ut, FakeSandboxDescriptor as V, EffortVerdict as Vt, GooseHarnessDescriptor as W, cellContrast as Wt, HistoryConfig as X, effortOf as Xt, HarnessOption as Y, effortLabel as Yt, HostFile as Z, effortSample as Zt, CompareOptions as _, SkillSource as _t, BackgroundHandle as a, PairVote as at, ConfigJudgeOptions as b, Turn as bt, Capture as c, Profile as ct, Cell as d, SandboxDescriptor as dt, formatCount as en, JudgeModel as et, CellRole as f, SandboxWarning as ft, CompareCut as g, SetupStep as gt, CompareAnswer as h, ServeHandle as ht, AttemptContext as i, Outcome as it, EnvironmentInput as j, HistoryCell as jt, Environment as k, EvalEntry as kt, CaptureCall as l, ProfileDefaults as lt, CodexHarnessDescriptor as m, SecretTemplate as mt, AnalysisConfig as n, formatSeconds as nn, McpServer as nt, BlindPair as o, PiHarnessDescriptor as ot, ClaudeCodeHarnessDescriptor as p, Secret as pt, HarnessDescriptor as q, contrastEffort as qt, AntigravityHarnessDescriptor as r, OpenCodeHarnessDescriptor as rt, Budget as s, PinnableKey as st, AgentHarnessDescriptor as t, formatRatio as tn, JudgeOptions as tt, CaptureOptions as u, ProfileLimit as ut, CompareQuestion as v, TokenUsage as vt, DockerSandboxDescriptor as w, Viewport as wt, CursorHarnessDescriptor as x, TurnData as xt, ConfigHelpers as y, TranscriptEvent as yt, FakeJudgeModel as z, EffortContrast as zt };
1862
- //# sourceMappingURL=types-BsRSknLe.d.ts.map
2090
+ export { HarnessDescriptor as $, TOKENS_UNREPORTED as $t, DockerSandboxDescriptor as A, TurnData as At, EvalFn as B, FileRef as Bt, CompareOptions as C, SecretTemplate as Ct, CursorHarnessDescriptor as D, TokenUsage as Dt, ConfigJudgeOptions as E, SkillSource as Et, Environment as F, WebEventType as Ft, FakeJudgeModel as G, RunRecord as Gt, ExecResult as H, HistoryEntry as Ht, EnvironmentHelpers as I, ArtifactRef as It, FakeScriptStep as J, EFFORT_ALPHA as Jt, FakeNoteInput as K, StackSummary as Kt, EnvironmentInput as L, AttemptRecord as Lt, EgressPolicy as M, Verdict as Mt, EgressRecord as N, Viewport as Nt, Diff as O, TranscriptEvent as Ot, EnvVars as P, Wait as Pt, HarnessData as Q, Spread as Qt, EnvironmentSpec as R, CellRecord as Rt, CompareCut as S, Secret as St, ConfigHelpers as T, SetupStep as Tt, FakeAnalysisModel as U, JudgementRecord as Ut, EvalOptions as V, HistoryCell as Vt, FakeHarnessDescriptor as W, Lift as Wt, GooseHarnessDescriptor as X, EffortSample as Xt, FakeVote as Y, EffortContrast as Yt, GroupOptions as Z, EffortVerdict as Zt, Cell as _, Profile as _t, BackgroundHandle as a, effortChangeLabel as an, JudgeCallOptions as at, CodexHarnessDescriptor as b, SandboxDescriptor as bt, Capture as c, effortSample as cn, JudgeOptions as ct, CaptureOptions as d, formatCount as dn, OpenCodeHarnessDescriptor as dt, VERDICT_TEXT as en, HarnessEdit as et, CaptureUse as f, formatRatio as fn, Outcome as ft, CaptureWindow as g, PinnableKey as gt, CaptureWait as h, PiHarnessDescriptor as ht, AttemptContext as i, contrastEffort as in, JudgeArtifactRef as it, Duration as j, TurnStatus as jt, DirectoryOptions as k, Turn as kt, CaptureCall as l, effortSummary as ln, JudgeState as lt, CaptureUseScript as m, tokenValues as mn, PairVote as mt, AnalysisConfig as n, cellEffort as nn, HistoryConfig as nt, BlindPair as o, effortLabel as on, JudgeFailure as ot, CaptureUseAction as p, formatSeconds as pn, PairFactor as pt, FakeSandboxDescriptor as q, CellEffort as qt, AntigravityHarnessDescriptor as r, cellSamples as rn, HostFile as rt, Budget as s, effortOf as sn, JudgeModel as st, AgentHarnessDescriptor as t, cellContrast as tn, HarnessOption as tt, CaptureInstruction as u, effortVerdict as un, McpServer as ut, CellRole as v, ProfileDefaults as vt, CompareQuestion as w, ServeHandle as wt, CompareAnswer as x, SandboxWarning as xt, ClaudeCodeHarnessDescriptor as y, ProfileLimit as yt, EsConfig as z, EvalEntry as zt };
2091
+ //# sourceMappingURL=types-_LOFdPUf.d.ts.map
@@ -18,7 +18,9 @@ const sumUsage = (usages) => {
18
18
  };
19
19
  /** Every token the prompt side used: uncached input plus cache reads and writes. */
20
20
  const promptTokens = (u) => u.input + u.cacheRead + u.cacheWrite;
21
+ /** Prompt side, output, and reasoning when the harness reported it. No USD. */
22
+ const totalTokens = (u) => promptTokens(u) + u.output + (u.reasoning ?? 0);
21
23
  //#endregion
22
- export { promptTokens as n, sumUsage as r, addUsage as t };
24
+ export { totalTokens as i, promptTokens as n, sumUsage as r, addUsage as t };
23
25
 
24
- //# sourceMappingURL=usage-DsYUqIUM.js.map
26
+ //# sourceMappingURL=usage-DDF_6tkV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage-DsYUqIUM.js","names":[],"sources":["../src/usage.ts"],"mappings":";;AAGA,SAAgB,SAAS,GAAsB,GAAyC;CACtF,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK;CAC1B,OAAO;EACL,OAAO,EAAE,QAAQ,EAAE;EACnB,QAAQ,EAAE,SAAS,EAAE;EACrB,WAAW,EAAE,YAAY,EAAE;EAC3B,YAAY,EAAE,aAAa,EAAE;EAC7B,WACE,EAAE,cAAc,QAAQ,EAAE,cAAc,OAAO,QAAQ,EAAE,aAAa,MAAM,EAAE,aAAa;CAC/F;AACF;;AAGA,MAAa,YAAY,WAAuE;CAC9F,IAAI,QAA2B;CAC/B,KAAK,MAAM,KAAK,QAAQ,QAAQ,SAAS,OAAO,KAAK,IAAI;CACzD,OAAO;AACT;;AAGA,MAAa,gBAAgB,MAAkB,EAAE,QAAQ,EAAE,YAAY,EAAE"}
1
+ {"version":3,"file":"usage-DDF_6tkV.js","names":[],"sources":["../src/usage.ts"],"mappings":";;AAGA,SAAgB,SAAS,GAAsB,GAAyC;CACtF,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK;CAC1B,OAAO;EACL,OAAO,EAAE,QAAQ,EAAE;EACnB,QAAQ,EAAE,SAAS,EAAE;EACrB,WAAW,EAAE,YAAY,EAAE;EAC3B,YAAY,EAAE,aAAa,EAAE;EAC7B,WACE,EAAE,cAAc,QAAQ,EAAE,cAAc,OAAO,QAAQ,EAAE,aAAa,MAAM,EAAE,aAAa;CAC/F;AACF;;AAGA,MAAa,YAAY,WAAuE;CAC9F,IAAI,QAA2B;CAC/B,KAAK,MAAM,KAAK,QAAQ,QAAQ,SAAS,OAAO,KAAK,IAAI;CACzD,OAAO;AACT;;AAGA,MAAa,gBAAgB,MAAkB,EAAE,QAAQ,EAAE,YAAY,EAAE;;AAGzE,MAAa,eAAe,MAAkB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa"}