reeval 0.0.1

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 (213) hide show
  1. package/LICENSE +202 -0
  2. package/THIRD_PARTY_NOTICES.md +2160 -0
  3. package/assets/package.json +9 -0
  4. package/assets/pnpm-lock.yaml +1336 -0
  5. package/dist/agent-DVHkx8aT.js +532 -0
  6. package/dist/agent-DVHkx8aT.js.map +1 -0
  7. package/dist/analysis-CxSCt1YY.js +16 -0
  8. package/dist/analysis-CxSCt1YY.js.map +1 -0
  9. package/dist/assemble-B-nmz8oH.js +695 -0
  10. package/dist/assemble-B-nmz8oH.js.map +1 -0
  11. package/dist/assemble-CmRVDZ2Q.js +2 -0
  12. package/dist/attempt-BdRQ9jKX.js +176 -0
  13. package/dist/attempt-BdRQ9jKX.js.map +1 -0
  14. package/dist/bridge/index.mjs +1911 -0
  15. package/dist/bridge/package.json +13 -0
  16. package/dist/bridge/pnpm-lock.yaml +1041 -0
  17. package/dist/bridge/pnpm-workspace.yaml +2 -0
  18. package/dist/budget-DBUrH4jX.js +8 -0
  19. package/dist/budget-DBUrH4jX.js.map +1 -0
  20. package/dist/cli--CQ3Iy9q.js +1865 -0
  21. package/dist/cli--CQ3Iy9q.js.map +1 -0
  22. package/dist/cli-spec-DKAu09Gi.js +478 -0
  23. package/dist/cli-spec-DKAu09Gi.js.map +1 -0
  24. package/dist/cli.d.ts +1 -0
  25. package/dist/cli.js +8 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/colors-QV9dFVhN.js +34 -0
  28. package/dist/colors-QV9dFVhN.js.map +1 -0
  29. package/dist/command-BSJzHMtP.js +280 -0
  30. package/dist/command-BSJzHMtP.js.map +1 -0
  31. package/dist/command-CEm8PZ1N.js +1043 -0
  32. package/dist/command-CEm8PZ1N.js.map +1 -0
  33. package/dist/command-D-jnQWVG.js +673 -0
  34. package/dist/command-D-jnQWVG.js.map +1 -0
  35. package/dist/command-DQAvbG7d.js +432 -0
  36. package/dist/command-DQAvbG7d.js.map +1 -0
  37. package/dist/commands-A4udfyKZ.js +2 -0
  38. package/dist/commands-CF8mOfiu.js +207 -0
  39. package/dist/commands-CF8mOfiu.js.map +1 -0
  40. package/dist/config-Cuj0kVYj.js +415 -0
  41. package/dist/config-Cuj0kVYj.js.map +1 -0
  42. package/dist/context-loi9OCZv.js +106 -0
  43. package/dist/context-loi9OCZv.js.map +1 -0
  44. package/dist/core-tLN-z1Be.js +96 -0
  45. package/dist/core-tLN-z1Be.js.map +1 -0
  46. package/dist/db-Cjj2ZsfQ.js +2 -0
  47. package/dist/db-DxDzMhtB.js +827 -0
  48. package/dist/db-DxDzMhtB.js.map +1 -0
  49. package/dist/debug-D24NOQH1.js +89 -0
  50. package/dist/debug-D24NOQH1.js.map +1 -0
  51. package/dist/debug-SEmW4w8f.js +2 -0
  52. package/dist/dist-BZXYHN2X.js +1673 -0
  53. package/dist/dist-BZXYHN2X.js.map +1 -0
  54. package/dist/docker-DQDZWXF9.js +20 -0
  55. package/dist/docker-DQDZWXF9.js.map +1 -0
  56. package/dist/docker-DnWAVdEm.js +2 -0
  57. package/dist/docker-oSbCExHL.js +153 -0
  58. package/dist/docker-oSbCExHL.js.map +1 -0
  59. package/dist/doctor-CxlH1pDM.js +525 -0
  60. package/dist/doctor-CxlH1pDM.js.map +1 -0
  61. package/dist/egress-73SQfKdx.js +619 -0
  62. package/dist/egress-73SQfKdx.js.map +1 -0
  63. package/dist/env-BQqj93gu.js +21 -0
  64. package/dist/env-BQqj93gu.js.map +1 -0
  65. package/dist/environment-Mz7wvrtD.js +552 -0
  66. package/dist/environment-Mz7wvrtD.js.map +1 -0
  67. package/dist/errors-C9w_ud7g.js +160 -0
  68. package/dist/errors-C9w_ud7g.js.map +1 -0
  69. package/dist/errors-CSxfJ4qu.js +11 -0
  70. package/dist/errors-CSxfJ4qu.js.map +1 -0
  71. package/dist/files--6CEUXm7.js +2 -0
  72. package/dist/files-BLlrhU4-.js +62 -0
  73. package/dist/files-BLlrhU4-.js.map +1 -0
  74. package/dist/files-Bd25OAQH.js +2 -0
  75. package/dist/files-BvHCFWgD.js +2 -0
  76. package/dist/files-D2-qn_Dl.js +275 -0
  77. package/dist/files-D2-qn_Dl.js.map +1 -0
  78. package/dist/files-bF2fPuT9.js +99 -0
  79. package/dist/files-bF2fPuT9.js.map +1 -0
  80. package/dist/git-D6hMeieS.js +44 -0
  81. package/dist/git-D6hMeieS.js.map +1 -0
  82. package/dist/harness-ls5aX1UO.js +131 -0
  83. package/dist/harness-ls5aX1UO.js.map +1 -0
  84. package/dist/harness.d.ts +74 -0
  85. package/dist/harness.js +2 -0
  86. package/dist/header-DzFDoMCI.js +78 -0
  87. package/dist/header-DzFDoMCI.js.map +1 -0
  88. package/dist/ids-Bp6ut7ZD.js +49 -0
  89. package/dist/ids-Bp6ut7ZD.js.map +1 -0
  90. package/dist/images-Cc1-coFc.js +286 -0
  91. package/dist/images-Cc1-coFc.js.map +1 -0
  92. package/dist/index.d.ts +97 -0
  93. package/dist/index.js +1959 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/init-CFljS8BJ.js +344 -0
  96. package/dist/init-CFljS8BJ.js.map +1 -0
  97. package/dist/init-z2ZPn9Tj.js +2 -0
  98. package/dist/invocations-rXktgSAn.js +157 -0
  99. package/dist/invocations-rXktgSAn.js.map +1 -0
  100. package/dist/jiti-BOLXpKyG.js +46 -0
  101. package/dist/jiti-BOLXpKyG.js.map +1 -0
  102. package/dist/judge-D8Uf4dA9.js +146 -0
  103. package/dist/judge-D8Uf4dA9.js.map +1 -0
  104. package/dist/judge.d.ts +21 -0
  105. package/dist/judge.js +19 -0
  106. package/dist/judge.js.map +1 -0
  107. package/dist/live-Bs3LReMV.js +98 -0
  108. package/dist/live-Bs3LReMV.js.map +1 -0
  109. package/dist/matchers-DyLvm7EG.js +374 -0
  110. package/dist/matchers-DyLvm7EG.js.map +1 -0
  111. package/dist/model-BdO79gWz.js +44 -0
  112. package/dist/model-BdO79gWz.js.map +1 -0
  113. package/dist/model-CDL98xue.js +725 -0
  114. package/dist/model-CDL98xue.js.map +1 -0
  115. package/dist/model-v-0_Ik7S.js +2 -0
  116. package/dist/node-kG64XxdE.js +506 -0
  117. package/dist/node-kG64XxdE.js.map +1 -0
  118. package/dist/opencode-providers-DZuD_oYt.js +3149 -0
  119. package/dist/opencode-providers-DZuD_oYt.js.map +1 -0
  120. package/dist/options-CAQhu--C.js +452 -0
  121. package/dist/options-CAQhu--C.js.map +1 -0
  122. package/dist/patch-BkKje4cp.js +69 -0
  123. package/dist/patch-BkKje4cp.js.map +1 -0
  124. package/dist/paths-CBvm6pap.js +72 -0
  125. package/dist/paths-CBvm6pap.js.map +1 -0
  126. package/dist/plan-gwk6dJ8c.js +237 -0
  127. package/dist/plan-gwk6dJ8c.js.map +1 -0
  128. package/dist/preflight-BtubXKQ8.js +2 -0
  129. package/dist/preflight-BypZMNBG.js +185 -0
  130. package/dist/preflight-BypZMNBG.js.map +1 -0
  131. package/dist/prepare-Cwv0bHs_.js +3 -0
  132. package/dist/prepare-D6Uzcubb.js +213 -0
  133. package/dist/prepare-D6Uzcubb.js.map +1 -0
  134. package/dist/provenance-Dfb8YY5Y.js +129 -0
  135. package/dist/provenance-Dfb8YY5Y.js.map +1 -0
  136. package/dist/provider-BDbNOQhQ.js +2 -0
  137. package/dist/provider-CmAYTQQs.js +14 -0
  138. package/dist/provider-CmAYTQQs.js.map +1 -0
  139. package/dist/providers-2p3ylMHI.js +107 -0
  140. package/dist/providers-2p3ylMHI.js.map +1 -0
  141. package/dist/providers-BUOxitcT.js +2 -0
  142. package/dist/query-CFATHZmV.js +91 -0
  143. package/dist/query-CFATHZmV.js.map +1 -0
  144. package/dist/query-DR4m6CXf.js +2 -0
  145. package/dist/record-DQ8wzyco.js +99 -0
  146. package/dist/record-DQ8wzyco.js.map +1 -0
  147. package/dist/redact-C4fL_bZP.js +167 -0
  148. package/dist/redact-C4fL_bZP.js.map +1 -0
  149. package/dist/results-CeXb8Wde.js +37 -0
  150. package/dist/results-CeXb8Wde.js.map +1 -0
  151. package/dist/root-CFDjpWuc.js +110 -0
  152. package/dist/root-CFDjpWuc.js.map +1 -0
  153. package/dist/sandbox-By2gkdkC.js +133 -0
  154. package/dist/sandbox-By2gkdkC.js.map +1 -0
  155. package/dist/sandbox.d.ts +41 -0
  156. package/dist/sandbox.js +2 -0
  157. package/dist/server-Bi61uiY0.js +350 -0
  158. package/dist/server-Bi61uiY0.js.map +1 -0
  159. package/dist/server-CsSBL8NC.js +2 -0
  160. package/dist/source-BXzrmof5.js +2 -0
  161. package/dist/source-Bsfa3LZH.js +40 -0
  162. package/dist/source-Bsfa3LZH.js.map +1 -0
  163. package/dist/src-55j1zNHH.js +3 -0
  164. package/dist/src-AEwxd1UP.js +602 -0
  165. package/dist/src-AEwxd1UP.js.map +1 -0
  166. package/dist/src-BDwSuyIo.js +3 -0
  167. package/dist/src-BQyMiWri.js +490 -0
  168. package/dist/src-BQyMiWri.js.map +1 -0
  169. package/dist/src-C-LHyTSV.js +3 -0
  170. package/dist/src-Cmp-7YrD.js +1136 -0
  171. package/dist/src-Cmp-7YrD.js.map +1 -0
  172. package/dist/src-D0RdqpNb.js +252 -0
  173. package/dist/src-D0RdqpNb.js.map +1 -0
  174. package/dist/src-D8KYzxBX.js +793 -0
  175. package/dist/src-D8KYzxBX.js.map +1 -0
  176. package/dist/src-DEgff9Z7.js +4 -0
  177. package/dist/src-DXx_29pq.js +567 -0
  178. package/dist/src-DXx_29pq.js.map +1 -0
  179. package/dist/src-DwwiVLqv.js +2937 -0
  180. package/dist/src-DwwiVLqv.js.map +1 -0
  181. package/dist/src-N7E_mfcZ.js +2 -0
  182. package/dist/src-W9g-y5X5.js +3 -0
  183. package/dist/src-daS0wKH2.js +3 -0
  184. package/dist/state-Cyw3QTsN.js +2 -0
  185. package/dist/state-DZ7eqb1F.js +167 -0
  186. package/dist/state-DZ7eqb1F.js.map +1 -0
  187. package/dist/stats-BNAHlNMD.js +114 -0
  188. package/dist/stats-BNAHlNMD.js.map +1 -0
  189. package/dist/studio-app/assets/index-D6XyfFSH.js +58 -0
  190. package/dist/studio-app/assets/index-xwzWdcE_.css +2 -0
  191. package/dist/studio-app/favicon.svg +1 -0
  192. package/dist/studio-app/index.html +15 -0
  193. package/dist/summary-D7Ttky0z.js +166 -0
  194. package/dist/summary-D7Ttky0z.js.map +1 -0
  195. package/dist/text-gEcKjAyp.js +29 -0
  196. package/dist/text-gEcKjAyp.js.map +1 -0
  197. package/dist/types-C5vI3g1C.js +9 -0
  198. package/dist/types-C5vI3g1C.js.map +1 -0
  199. package/dist/types-DLec-6Cx.d.ts +1535 -0
  200. package/dist/usage-DsYUqIUM.js +24 -0
  201. package/dist/usage-DsYUqIUM.js.map +1 -0
  202. package/dist/view/index.d.ts +645 -0
  203. package/dist/view/index.js +8 -0
  204. package/dist/views-BrHOv6wg.js +220 -0
  205. package/dist/views-BrHOv6wg.js.map +1 -0
  206. package/dist/views-CwCWLWqo.js +3 -0
  207. package/dist/worker-entry-DnYkANPG.js +506 -0
  208. package/dist/worker-entry-DnYkANPG.js.map +1 -0
  209. package/dist/workspace-C2S0Z6gl.js +327 -0
  210. package/dist/workspace-C2S0Z6gl.js.map +1 -0
  211. package/dist/workspace-CyoXG6CY.js +2 -0
  212. package/docker/Dockerfile +19 -0
  213. package/package.json +79 -0
@@ -0,0 +1,44 @@
1
+ import { i as redactSecrets } from "./redact-C4fL_bZP.js";
2
+ import { et as run } from "./src-DwwiVLqv.js";
3
+ import { resolve } from "node:path";
4
+ //#region src/git.ts
5
+ /** Runs git without a shell. Never include credentials in `args`; pass them through `env`. */
6
+ async function git(cwd, args, options = {}) {
7
+ const r = await run("git", args, {
8
+ cwd,
9
+ env: {
10
+ GIT_TERMINAL_PROMPT: "0",
11
+ LC_ALL: "C",
12
+ ...options.env
13
+ },
14
+ input: options.input,
15
+ detached: false,
16
+ binary: true
17
+ });
18
+ return {
19
+ code: r.exitCode,
20
+ stdout: r.stdout,
21
+ stderr: redactSecrets(r.stderr)
22
+ };
23
+ }
24
+ /**
25
+ * The repository's top level, spelled from `root`: `--show-toplevel` resolves symlinks and
26
+ * Windows 8.3 names (`RUNNER~1`), so a path relative to it can climb out of the repository.
27
+ */
28
+ async function repoTop(root) {
29
+ const r = await git(root, ["rev-parse", "--show-cdup"]);
30
+ return r.code === 0 ? resolve(root, r.stdout.toString("utf8").trim()) : null;
31
+ }
32
+ var GitError = class extends Error {
33
+ name = "GitError";
34
+ };
35
+ /** Runs git and returns trimmed stdout, or throws with git's (redacted) stderr. */
36
+ async function gitText(cwd, args, options) {
37
+ const r = await git(cwd, args, options);
38
+ if (r.code !== 0) throw new GitError(`git ${args[0]} failed: ${r.stderr.trim()}`);
39
+ return r.stdout.toString("utf8").trim();
40
+ }
41
+ //#endregion
42
+ export { gitText as n, repoTop as r, git as t };
43
+
44
+ //# sourceMappingURL=git-D6hMeieS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-D6hMeieS.js","names":[],"sources":["../src/git.ts"],"mappings":";;;;;AASA,eAAsB,IACpB,KACA,MACA,UAAsB,CAAC,GACH;CACpB,MAAM,IAAI,MAAM,IAAI,OAAO,MAAM;EAC/B;EACA,KAAK;GAAE,qBAAqB;GAAK,QAAQ;GAAK,GAAG,QAAQ;EAAI;EAC7D,OAAO,QAAQ;EACf,UAAU;EACV,QAAQ;CACV,CAAC;CACD,OAAO;EAAE,MAAM,EAAE;EAAU,QAAQ,EAAE;EAAQ,QAAQ,cAAc,EAAE,MAAM;CAAE;AAC/E;;;;;AAMA,eAAsB,QAAQ,MAAsC;CAClE,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,aAAa,aAAa,CAAC;CACtD,OAAO,EAAE,SAAS,IAAI,QAAQ,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI;AAC1E;AAEA,IAAa,WAAb,cAA8B,MAAM;CAClC,OAAgB;AAClB;;AAGA,eAAsB,QAAQ,KAAa,MAAgB,SAAuC;CAChG,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO;CACtC,IAAI,EAAE,SAAS,GAAG,MAAM,IAAI,SAAS,OAAO,KAAK,GAAG,WAAW,EAAE,OAAO,KAAK,GAAG;CAChF,OAAO,EAAE,OAAO,SAAS,MAAM,CAAC,CAAC,KAAK;AACxC"}
@@ -0,0 +1,131 @@
1
+ import { t as UsageError } from "./errors-CSxfJ4qu.js";
2
+ import { s as resolveOpenCodeProvider } from "./opencode-providers-DZuD_oYt.js";
3
+ //#region src/harness.ts
4
+ /**
5
+ * Cursor's agent through the Cursor TypeScript SDK, in the sandbox. `model` is required (the SDK
6
+ * has no default for local agents); `params` sets model parameters such as `{ fast: 'false' }`.
7
+ * `id` names the cell; it defaults to `cursor:<model>`.
8
+ */
9
+ const cursor = (options) => {
10
+ if (typeof options?.model !== "string" || !options.model) throw new UsageError("cursor() needs a model, e.g. cursor({ model: 'composer-2.5' })");
11
+ if (options.params !== void 0 && (typeof options.params !== "object" || options.params === null || !Object.values(options.params).every((v) => typeof v === "string"))) throw new UsageError(`cursor({ params }) maps parameter ids to string values, e.g. { fast: 'false' } (got ${JSON.stringify(options.params)})`);
12
+ return {
13
+ kind: "cursor",
14
+ ...options
15
+ };
16
+ };
17
+ /**
18
+ * The Claude Code CLI. `model` is required, since the CLI's default changes under you. `id`
19
+ * names the cell; it defaults to `claude-code:<model>`.
20
+ */
21
+ const claudeCode = (options) => {
22
+ if (typeof options?.model !== "string" || !options.model) throw new UsageError("claudeCode() needs a model, e.g. claudeCode({ model: 'claude-sonnet-5' })");
23
+ return {
24
+ kind: "claude-code",
25
+ ...options
26
+ };
27
+ };
28
+ /**
29
+ * The Antigravity CLI, with a Gemini API key. `model` is required, since the CLI's default
30
+ * changes under you. `id` names the cell; it defaults to `antigravity:<model>`.
31
+ */
32
+ const antigravity = (options) => {
33
+ if (typeof options?.model !== "string" || !options.model) throw new UsageError("antigravity() needs a model, e.g. antigravity({ model: 'gemini-3.8-flash-medium' })");
34
+ return {
35
+ kind: "antigravity",
36
+ ...options
37
+ };
38
+ };
39
+ /**
40
+ * OpenCode, on the model's provider: `model` is OpenCode's `<provider>/<model>`, such as
41
+ * `google/gemini-3.8-flash` or `anthropic/claude-haiku-4-5`, and only that provider's key is
42
+ * needed and brokered. A provider whose key reeval can't broker is refused, saying why. `id` names
43
+ * the cell; it defaults to `opencode:<model>`, the part after the last `/`.
44
+ */
45
+ const opencode = (options) => {
46
+ const why = opencodeModelError(options?.model);
47
+ if (why) throw new UsageError(`opencode(): ${why}`);
48
+ return {
49
+ kind: "opencode",
50
+ ...options
51
+ };
52
+ };
53
+ /** Why `model` can't run on OpenCode, or undefined when it can. */
54
+ function opencodeModelError(model) {
55
+ if (typeof model !== "string" || !model) return `needs a model, <provider>/<model>, e.g. opencode({ model: 'google/gemini-3.8-flash' }) (got ${JSON.stringify(model)})`;
56
+ const resolved = resolveOpenCodeProvider(model, process.env);
57
+ return "error" in resolved ? resolved.error : void 0;
58
+ }
59
+ /**
60
+ * Goose, with a Gemini API key: `model` is a Gemini model id, which it runs on its `google`
61
+ * provider. `id` names the cell; it defaults to `goose:<model>`.
62
+ */
63
+ const goose = (options) => {
64
+ if (typeof options?.model !== "string" || !/^[\w.-]+$/.test(options.model)) throw new UsageError(`goose() needs a Gemini model id, without a provider, since it runs on a Gemini API key, e.g. goose({ model: 'gemini-3.8-flash' }) (got ${JSON.stringify(options?.model)})`);
65
+ return {
66
+ kind: "goose",
67
+ ...options
68
+ };
69
+ };
70
+ /**
71
+ * pi, with a Gemini API key: `model` is a Gemini model id, which it runs on its `google` provider.
72
+ * `id` names the cell; it defaults to `pi:<model>`.
73
+ */
74
+ const pi = (options) => {
75
+ if (typeof options?.model !== "string" || !/^[\w.-]+$/.test(options.model)) throw new UsageError(`pi() needs a Gemini model id, without a provider, since it runs on a Gemini API key, e.g. pi({ model: 'gemini-3.8-flash' }) (got ${JSON.stringify(options?.model)})`);
76
+ return {
77
+ kind: "pi",
78
+ ...options
79
+ };
80
+ };
81
+ /**
82
+ * OpenAI's Codex CLI, with an OpenAI API key: `model` is an OpenAI model id, e.g. `gpt-5.4-mini`,
83
+ * required since the CLI's default changes under you. `id` names the cell; it defaults to
84
+ * `codex:<model>`.
85
+ */
86
+ const codex = (options) => {
87
+ if (typeof options?.model !== "string" || !/^[\w.-]+$/.test(options.model)) throw new UsageError(`codex() needs an OpenAI model id, without a provider, since it runs on an OpenAI API key, e.g. codex({ model: 'gpt-5.4-mini' }) (got ${JSON.stringify(options?.model)})`);
88
+ return {
89
+ kind: "codex",
90
+ ...options
91
+ };
92
+ };
93
+ const LAYOUTS = [
94
+ "cursor",
95
+ "claude-code",
96
+ "antigravity",
97
+ "opencode",
98
+ "goose",
99
+ "pi",
100
+ "codex"
101
+ ];
102
+ const STEP_KEYS = [
103
+ "exec",
104
+ "write",
105
+ "reply",
106
+ "mcp",
107
+ "error"
108
+ ];
109
+ function checkScript(script) {
110
+ const example = "script: [[{ exec: 'cat notes.txt' }, { reply: 'done' }]]";
111
+ if (!Array.isArray(script) || !script.every(Array.isArray)) throw new UsageError(`fakeHarness({ script }) takes one list of steps per turn, e.g. ${example} (got ${JSON.stringify(script)})`);
112
+ for (const step of script.flat()) {
113
+ const keys = typeof step === "object" && step !== null ? Object.keys(step) : [];
114
+ const [key] = keys;
115
+ const value = key === void 0 ? void 0 : step[key];
116
+ if (!(keys.length === 1 && key !== void 0 && STEP_KEYS.includes(key) && (key === "write" ? typeof value === "object" && value !== null && Object.values(value).every((c) => typeof c === "string") : key === "mcp" ? typeof value === "string" && /^[^/]+\/[^/]+$/.test(value) : typeof value === "string"))) throw new UsageError(`fakeHarness({ script }) steps are { exec: string }, { write: { path: content } }, { reply: string }, { mcp: '<server>/<tool>' } or { error: string } (got ${JSON.stringify(step)})`);
117
+ }
118
+ }
119
+ /** A fake agent that writes canned files and replies with canned text. For tests and dry runs. */
120
+ const fakeHarness = (options = {}) => {
121
+ if (options.script !== void 0) checkScript(options.script);
122
+ if (options.layout !== void 0 && !LAYOUTS.includes(options.layout)) throw new UsageError(`fakeHarness({ layout }) is one of ${LAYOUTS.map((l) => `'${l}'`).join(", ")} (got ${JSON.stringify(options.layout)})`);
123
+ return {
124
+ kind: "fake",
125
+ ...options
126
+ };
127
+ };
128
+ //#endregion
129
+ export { fakeHarness as a, opencodeModelError as c, cursor as i, pi as l, claudeCode as n, goose as o, codex as r, opencode as s, antigravity as t };
130
+
131
+ //# sourceMappingURL=harness-ls5aX1UO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-ls5aX1UO.js","names":[],"sources":["../src/harness.ts"],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { G as OpenCodeHarnessDescriptor, I as HarnessDescriptor, M as FakeScriptStep, N as GooseHarnessDescriptor, c as CodexHarnessDescriptor, f as CursorHarnessDescriptor, h as Duration, k as FakeHarnessDescriptor, q as PiHarnessDescriptor, r as AntigravityHarnessDescriptor, s as ClaudeCodeHarnessDescriptor, t as AgentHarnessDescriptor } from "./types-DLec-6Cx.js";
2
+ //#region src/harness.d.ts
3
+ /**
4
+ * Cursor's agent through the Cursor TypeScript SDK, in the sandbox. `model` is required (the SDK
5
+ * has no default for local agents); `params` sets model parameters such as `{ fast: 'false' }`.
6
+ * `id` names the cell; it defaults to `cursor:<model>`.
7
+ */
8
+ export declare const cursor: (options: Omit<CursorHarnessDescriptor, 'kind'>) => CursorHarnessDescriptor;
9
+ /**
10
+ * The Claude Code CLI. `model` is required, since the CLI's default changes under you. `id`
11
+ * names the cell; it defaults to `claude-code:<model>`.
12
+ */
13
+ export declare const claudeCode: (options: Omit<ClaudeCodeHarnessDescriptor, 'kind'>) => ClaudeCodeHarnessDescriptor;
14
+ /**
15
+ * The Antigravity CLI, with a Gemini API key. `model` is required, since the CLI's default
16
+ * changes under you. `id` names the cell; it defaults to `antigravity:<model>`.
17
+ */
18
+ export declare const antigravity: (options: Omit<AntigravityHarnessDescriptor, 'kind'>) => AntigravityHarnessDescriptor;
19
+ /**
20
+ * OpenCode, on the model's provider: `model` is OpenCode's `<provider>/<model>`, such as
21
+ * `google/gemini-3.8-flash` or `anthropic/claude-haiku-4-5`, and only that provider's key is
22
+ * needed and brokered. A provider whose key reeval can't broker is refused, saying why. `id` names
23
+ * the cell; it defaults to `opencode:<model>`, the part after the last `/`.
24
+ */
25
+ export declare const opencode: (options: Omit<OpenCodeHarnessDescriptor, 'kind'>) => OpenCodeHarnessDescriptor;
26
+ /** Why `model` can't run on OpenCode, or undefined when it can. */
27
+ export declare function opencodeModelError(model: unknown): string | undefined;
28
+ /**
29
+ * Goose, with a Gemini API key: `model` is a Gemini model id, which it runs on its `google`
30
+ * provider. `id` names the cell; it defaults to `goose:<model>`.
31
+ */
32
+ export declare const goose: (options: Omit<GooseHarnessDescriptor, 'kind'>) => GooseHarnessDescriptor;
33
+ /**
34
+ * pi, with a Gemini API key: `model` is a Gemini model id, which it runs on its `google` provider.
35
+ * `id` names the cell; it defaults to `pi:<model>`.
36
+ */
37
+ export declare const pi: (options: Omit<PiHarnessDescriptor, 'kind'>) => PiHarnessDescriptor;
38
+ /**
39
+ * OpenAI's Codex CLI, with an OpenAI API key: `model` is an OpenAI model id, e.g. `gpt-5.4-mini`,
40
+ * required since the CLI's default changes under you. `id` names the cell; it defaults to
41
+ * `codex:<model>`.
42
+ */
43
+ export declare const codex: (options: Omit<CodexHarnessDescriptor, 'kind'>) => CodexHarnessDescriptor;
44
+ /** A fake agent that writes canned files and replies with canned text. For tests and dry runs. */
45
+ export declare const fakeHarness: (options?: Omit<FakeHarnessDescriptor, 'kind'>) => {
46
+ id?: string;
47
+ files?: Record<string, string>;
48
+ text?: string;
49
+ delayMs?: number;
50
+ ignoreAbort?: boolean;
51
+ failWith?: string;
52
+ startHangs?: number | true;
53
+ reasoning?: string;
54
+ servedModel?: string;
55
+ tools?: Array<{
56
+ tool: string;
57
+ input: unknown;
58
+ output: unknown;
59
+ ok?: boolean;
60
+ }>;
61
+ withSkill?: {
62
+ files?: Record<string, string>;
63
+ text?: string;
64
+ };
65
+ flakeRate?: number;
66
+ script?: FakeScriptStep[][];
67
+ maxConcurrent?: number;
68
+ startTimeout?: Duration;
69
+ layout?: 'cursor' | 'claude-code' | 'antigravity' | 'opencode' | 'goose' | 'pi' | 'codex';
70
+ kind: "fake";
71
+ };
72
+ //#endregion
73
+ export type { AgentHarnessDescriptor, AntigravityHarnessDescriptor, ClaudeCodeHarnessDescriptor, CursorHarnessDescriptor, FakeHarnessDescriptor, FakeScriptStep, GooseHarnessDescriptor, HarnessDescriptor, OpenCodeHarnessDescriptor, PiHarnessDescriptor };
74
+ //# sourceMappingURL=harness.d.ts.map
@@ -0,0 +1,2 @@
1
+ import { a as fakeHarness, c as opencodeModelError, i as cursor, l as pi, n as claudeCode, o as goose, r as codex, s as opencode, t as antigravity } from "./harness-ls5aX1UO.js";
2
+ export { antigravity, claudeCode, codex, cursor, fakeHarness, goose, opencode, opencodeModelError, pi };
@@ -0,0 +1,78 @@
1
+ import { k as cellEffort } from "./model-CDL98xue.js";
2
+ //#region src/view/header.ts
3
+ /** The derived header of one run: what listings, indexes and comparisons need without the record. */
4
+ function runHeader(record, recorded) {
5
+ return {
6
+ runId: record.runId,
7
+ recorded,
8
+ status: record.status,
9
+ startedAt: record.startedAt,
10
+ durationMs: record.durationMs,
11
+ author: record.author,
12
+ git: record.git ? {
13
+ sha: record.git.sha,
14
+ branch: record.git.branch,
15
+ dirty: record.git.dirty
16
+ } : null,
17
+ runner: record.runner.kind,
18
+ ci: record.runner.kind === "ci" ? {
19
+ provider: record.runner.provider,
20
+ runUrl: record.runner.runUrl,
21
+ pr: record.runner.pr
22
+ } : null,
23
+ harnesses: record.stack.harnesses.map((h) => h.id),
24
+ summary: record.summary,
25
+ usage: record.cost.usage,
26
+ stack: {
27
+ imageIds: record.stack.images.map((i) => i.id),
28
+ agentClis: [...new Set(record.stack.images.flatMap((i) => i.agentCli ? [i.agentCli] : []))],
29
+ harnesses: record.stack.harnesses.map((h) => h.id),
30
+ environments: record.environments.map((e) => `${e.name}@${e.digest.replace(/^sha256:/, "").slice(0, 12)}`),
31
+ judgeModel: record.stack.judge.model,
32
+ judgeServed: record.stack.judge.resolvedModels,
33
+ judgeVersion: record.stack.judge.version,
34
+ threshold: record.stack.judge.threshold,
35
+ fingerprintScope: record.stack.fingerprintScope
36
+ },
37
+ evals: record.evals.map((e) => ({
38
+ id: e.id,
39
+ key: e.key,
40
+ slug: e.slug,
41
+ fingerprint: e.fingerprint,
42
+ sources: e.sources,
43
+ outcome: e.outcome,
44
+ passRate: e.passRate,
45
+ cells: e.cells.map((c) => ({
46
+ key: c.key,
47
+ role: c.role,
48
+ ...c.variant !== void 0 ? { variant: c.variant } : {},
49
+ harness: c.harness,
50
+ model: c.model,
51
+ environment: c.environment,
52
+ environmentDigest: c.environmentDigest,
53
+ gate: c.gate,
54
+ fingerprint: c.fingerprint,
55
+ fingerprintParts: c.fingerprintParts,
56
+ runs: c.runs,
57
+ pass: c.pass,
58
+ fail: c.fail,
59
+ infraError: c.infraError,
60
+ skipped: c.skipped,
61
+ passRate: c.passRate,
62
+ outcome: c.outcome,
63
+ effort: cellEffort(e, c.key),
64
+ ...c.lift ? { lift: {
65
+ vs: c.lift.vs,
66
+ points: c.lift.points,
67
+ lo: c.lift.interval.lo,
68
+ hi: c.lift.interval.hi,
69
+ withinNoise: c.lift.withinNoise
70
+ } } : {}
71
+ }))
72
+ }))
73
+ };
74
+ }
75
+ //#endregion
76
+ export { runHeader as t };
77
+
78
+ //# sourceMappingURL=header-DzFDoMCI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-DzFDoMCI.js","names":[],"sources":["../src/view/header.ts"],"mappings":";;;AAIA,SAAgB,UAAU,QAAmB,UAAiC;CAC5E,OAAO;EACL,OAAO,OAAO;EACd;EACA,QAAQ,OAAO;EACf,WAAW,OAAO;EAClB,YAAY,OAAO;EACnB,QAAQ,OAAO;EACf,KAAK,OAAO,MACR;GAAE,KAAK,OAAO,IAAI;GAAK,QAAQ,OAAO,IAAI;GAAQ,OAAO,OAAO,IAAI;EAAM,IAC1E;EACJ,QAAQ,OAAO,OAAO;EACtB,IACE,OAAO,OAAO,SAAS,OACnB;GACE,UAAU,OAAO,OAAO;GACxB,QAAQ,OAAO,OAAO;GACtB,IAAI,OAAO,OAAO;EACpB,IACA;EACN,WAAW,OAAO,MAAM,UAAU,KAAK,MAAM,EAAE,EAAE;EACjD,SAAS,OAAO;EAChB,OAAO,OAAO,KAAK;EACnB,OAAO;GACL,UAAU,OAAO,MAAM,OAAO,KAAK,MAAM,EAAE,EAAE;GAC7C,WAAW,CAAC,GAAG,IAAI,IAAI,OAAO,MAAM,OAAO,SAAS,MAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAE,CAAC,CAAC;GAC5F,WAAW,OAAO,MAAM,UAAU,KAAK,MAAM,EAAE,EAAE;GACjD,cAAc,OAAO,aAAa,KAC/B,MAAM,GAAG,EAAE,KAAK,GAAG,EAAE,OAAO,QAAQ,YAAY,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,GAClE;GACA,YAAY,OAAO,MAAM,MAAM;GAC/B,aAAa,OAAO,MAAM,MAAM;GAChC,cAAc,OAAO,MAAM,MAAM;GACjC,WAAW,OAAO,MAAM,MAAM;GAC9B,kBAAkB,OAAO,MAAM;EACjC;EACA,OAAO,OAAO,MAAM,KAAK,OAAO;GAC9B,IAAI,EAAE;GACN,KAAK,EAAE;GACP,MAAM,EAAE;GACR,aAAa,EAAE;GACf,SAAS,EAAE;GACX,SAAS,EAAE;GACX,UAAU,EAAE;GACZ,OAAO,EAAE,MAAM,KAAK,OAAO;IACzB,KAAK,EAAE;IACP,MAAM,EAAE;IACR,GAAI,EAAE,YAAY,KAAA,IAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;IACxD,SAAS,EAAE;IACX,OAAO,EAAE;IACT,aAAa,EAAE;IACf,mBAAmB,EAAE;IACrB,MAAM,EAAE;IACR,aAAa,EAAE;IACf,kBAAkB,EAAE;IACpB,MAAM,EAAE;IACR,MAAM,EAAE;IACR,MAAM,EAAE;IACR,YAAY,EAAE;IACd,SAAS,EAAE;IACX,UAAU,EAAE;IACZ,SAAS,EAAE;IACX,QAAQ,WAAW,GAAG,EAAE,GAAG;IAC3B,GAAI,EAAE,OACF,EACE,MAAM;KACJ,IAAI,EAAE,KAAK;KACX,QAAQ,EAAE,KAAK;KACf,IAAI,EAAE,KAAK,SAAS;KACpB,IAAI,EAAE,KAAK,SAAS;KACpB,aAAa,EAAE,KAAK;IACtB,EACF,IACA,CAAC;GACP,EAAE;EACJ,EAAE;CACJ;AACF"}
@@ -0,0 +1,49 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { basename, dirname, join, relative, sep } from "node:path";
3
+ import { createHash, randomBytes } from "node:crypto";
4
+ //#region src/ids.ts
5
+ const relativeFile = (root, file) => relative(root, file).split(sep).join("/");
6
+ /**
7
+ * `path` from the current directory, as reeval prints it. The current directory is always spelled
8
+ * physically (macOS's `/var/…` is `/private/var/…`), so `path` is too, through its nearest part
9
+ * that exists.
10
+ */
11
+ function fromCwd(path) {
12
+ const real = (p) => {
13
+ try {
14
+ return realpathSync(p);
15
+ } catch {
16
+ const parent = dirname(p);
17
+ return parent === p ? p : join(real(parent), basename(p));
18
+ }
19
+ };
20
+ return relativeFile(process.cwd(), real(path));
21
+ }
22
+ /** Stable id: the file, the enclosing group names and the eval name. */
23
+ const evalId = (file, path) => [file, ...path].join(" › ");
24
+ const sha256 = (data) => createHash("sha256").update(data).digest("hex");
25
+ const recordFileName = (id) => `${sha256(id).slice(0, 16)}.json`;
26
+ /** `<cell key>#<n>`, e.g. `cursor:composer-2.5/with-skill/docker#2`. */
27
+ const attemptId = (cellKey, n) => `${cellKey}#${n}`;
28
+ /** Unique per attempt across the run: the eval id and the attempt id. */
29
+ const attemptKey = (evalId, cellKey, n) => `${evalId} # ${attemptId(cellKey, n)}`;
30
+ const CROCKFORD = "0123456789abcdefghjkmnpqrstvwxyz";
31
+ const randomSuffix = (length) => [...randomBytes(length)].map((b) => CROCKFORD[b % 32]).join("");
32
+ /** Lower-case letters, digits and dashes, for use inside file names. */
33
+ const slugify = (text, max) => text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, max).replace(/-+$/, "");
34
+ /**
35
+ * `20260924T152700Z_009763c_elliot-hesp_k3f9`. Sorting by name sorts by UTC start time; the SHA
36
+ * and author keep runs from different people or branches apart, and the random suffix keeps
37
+ * runs that start in the same second anywhere (other projects, CI shards) apart.
38
+ */
39
+ function newRunId(start, sha, author, suffix = randomSuffix(4)) {
40
+ return `${start.toISOString().replace(/[-:]/g, "").replace(/\.\d+Z$/, "Z")}_${sha ? sha.slice(0, 7) : "nogit"}_${author}_${suffix}`;
41
+ }
42
+ /** Readable, unique directory name for an eval id. */
43
+ function evalSlug(id) {
44
+ return `${slugify(id, 60) || "eval"}-${sha256(id).slice(0, 6)}`;
45
+ }
46
+ //#endregion
47
+ export { fromCwd as a, relativeFile as c, evalSlug as i, sha256 as l, attemptKey as n, newRunId as o, evalId as r, recordFileName as s, attemptId as t, slugify as u };
48
+
49
+ //# sourceMappingURL=ids-Bp6ut7ZD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids-Bp6ut7ZD.js","names":[],"sources":["../src/ids.ts"],"mappings":";;;;AAIA,MAAa,gBAAgB,MAAc,SACzC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;;;;;;AAO1C,SAAgB,QAAQ,MAAsB;CAC5C,MAAM,QAAQ,MAAsB;EAClC,IAAI;GACF,OAAO,aAAa,CAAC;EACvB,QAAQ;GACN,MAAM,SAAS,QAAQ,CAAC;GACxB,OAAO,WAAW,IAAI,IAAI,KAAK,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1D;CACF;CACA,OAAO,aAAa,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC;AAC/C;;AAGA,MAAa,UAAU,MAAc,SAAmB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK;AAElF,MAAa,UAAU,SAA8B,WAAW,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK;AAEnG,MAAa,kBAAkB,OAAe,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE;;AAGzE,MAAa,aAAa,SAAiB,MAAc,GAAG,QAAQ,GAAG;;AAGvE,MAAa,cAAc,QAAgB,SAAiB,MAC1D,GAAG,OAAO,KAAK,UAAU,SAAS,CAAC;AAErC,MAAM,YAAY;AAElB,MAAa,gBAAgB,WAC3B,CAAC,GAAG,YAAY,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,UAAU,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE;;AAGhE,MAAa,WAAW,MAAc,QACpC,KACG,YAAY,CAAC,CACb,QAAQ,eAAe,GAAG,CAAC,CAC3B,QAAQ,YAAY,EAAE,CAAC,CACvB,MAAM,GAAG,GAAG,CAAC,CACb,QAAQ,OAAO,EAAE;;;;;;AAUtB,SAAgB,SACd,OACA,KACA,QACA,SAAS,aAAa,CAAC,GACf;CAKR,OAAO,GAJO,MACX,YAAY,CAAC,CACb,QAAQ,SAAS,EAAE,CAAC,CACpB,QAAQ,WAAW,GACR,EAAE,GAAG,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,QAAQ,GAAG,OAAO,GAAG;AAClE;;AAKA,SAAgB,SAAS,IAAoB;CAC3C,OAAO,GAAG,QAAQ,IAAI,EAAE,KAAK,OAAO,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;AAC9D"}