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,525 @@
1
+ import { n as loadEnvFiles } from "./env-BQqj93gu.js";
2
+ import { i as redactSecrets } from "./redact-C4fL_bZP.js";
3
+ import { i as PACKAGE_DIR } from "./root-CFDjpWuc.js";
4
+ import { a as unenforceable, m as credentialOf } from "./egress-73SQfKdx.js";
5
+ import { a as fromCwd } from "./ids-Bp6ut7ZD.js";
6
+ import { o as judgeCredentials } from "./judge-D8Uf4dA9.js";
7
+ import { s as harnessId, u as sandboxId } from "./options-CAQhu--C.js";
8
+ import { a as defaultConcurrency, i as configPathFor, l as loadConfig, n as badCharacterAt, r as configLabel, t as CONFIG_FILES } from "./config-Cuj0kVYj.js";
9
+ import { t as colors } from "./colors-QV9dFVhN.js";
10
+ import { o as missingGitignoreEntries } from "./init-CFljS8BJ.js";
11
+ import { existsSync, readFileSync } from "node:fs";
12
+ import { join } from "node:path";
13
+ import { execFile } from "node:child_process";
14
+ //#region src/doctor.ts
15
+ const run = (command, args, cwd) => new Promise((resolve) => {
16
+ execFile(command, args, {
17
+ cwd,
18
+ timeout: 2e4,
19
+ windowsHide: true
20
+ }, (error, stdout) => resolve({
21
+ code: error ? typeof error.code === "number" ? error.code : -1 : 0,
22
+ stdout: String(stdout)
23
+ }));
24
+ });
25
+ function defaultDeps(env = process.env) {
26
+ const sandbox = () => import("./src-N7E_mfcZ.js");
27
+ return {
28
+ env,
29
+ nodeVersion: process.versions.node,
30
+ platform: process.platform,
31
+ dockerState: async () => (await sandbox()).dockerState(),
32
+ dockerCapacity: async () => (await sandbox()).dockerCapacity(),
33
+ imageExists: async (ref) => !!await (await sandbox()).imageInfo(ref),
34
+ imageTags: async (repository) => {
35
+ const r = await run("docker", [
36
+ "image",
37
+ "ls",
38
+ "--format",
39
+ "{{.Repository}}:{{.Tag}}",
40
+ repository
41
+ ]);
42
+ return r.code === 0 ? r.stdout.split("\n").filter(Boolean) : [];
43
+ },
44
+ gitIgnored: async (root, paths) => {
45
+ if ((await run("git", ["rev-parse", "--git-dir"], root)).code !== 0) return null;
46
+ return Promise.all(paths.map(async (p) => (await run("git", [
47
+ "check-ignore",
48
+ "-q",
49
+ "--no-index",
50
+ p
51
+ ], root)).code === 0));
52
+ },
53
+ fetch: globalThis.fetch
54
+ };
55
+ }
56
+ const newer = (version, min) => {
57
+ const parts = version.replace(/^v/, "").split(".").map(Number);
58
+ for (let i = 0; i < min.length; i++) {
59
+ const a = parts[i] ?? 0;
60
+ const b = min[i] ?? 0;
61
+ if (a !== b) return a > b;
62
+ }
63
+ return true;
64
+ };
65
+ function checkNode(nodeVersion) {
66
+ const engines = JSON.parse(readFileSync(join(PACKAGE_DIR, "package.json"), "utf8")).engines.node;
67
+ const min = (/(\d+(?:\.\d+)*)/.exec(engines)?.[1] ?? "0").split(".").map(Number);
68
+ return newer(nodeVersion, min) ? {
69
+ id: "node",
70
+ status: "ok",
71
+ summary: `${nodeVersion} (reeval needs ${engines})`
72
+ } : {
73
+ id: "node",
74
+ status: "fail",
75
+ summary: `${nodeVersion}, but reeval needs ${engines}`,
76
+ fix: `install Node ${min.join(".")} or later (https://nodejs.org)`
77
+ };
78
+ }
79
+ /** Every harness and sandbox a run of the config can use: the config's, then each profile's. */
80
+ function configuredUses(config) {
81
+ const uses = config.harness.map((harness) => ({
82
+ harness,
83
+ sandbox: config.sandbox
84
+ }));
85
+ for (const [name, profile] of Object.entries(config.profiles)) {
86
+ const harnesses = profile.defaults?.harness ? [profile.defaults.harness].flat() : profile.defaults?.sandbox ? config.harness : [];
87
+ const sandbox = profile.defaults?.sandbox ?? config.sandbox;
88
+ for (const harness of harnesses) uses.push({
89
+ harness,
90
+ sandbox,
91
+ profile: name
92
+ });
93
+ }
94
+ return uses;
95
+ }
96
+ function describeConfig(config) {
97
+ const profiles = Object.keys(config.profiles);
98
+ return [
99
+ `harness ${config.harness.map(harnessId).join(", ")}`,
100
+ `sandbox ${sandboxId(config.sandbox)}`,
101
+ profiles.length ? `profiles ${profiles.join(", ")}` : "no profiles"
102
+ ].join(", ");
103
+ }
104
+ const DOCKER_FIX = {
105
+ linux: "start Docker Desktop, or the Docker service (sudo systemctl start docker)",
106
+ darwin: "start Docker Desktop (or another Docker engine, such as OrbStack or Colima)",
107
+ win32: "install or start Docker Desktop with the WSL 2 backend and Linux containers (https://docs.docker.com/desktop/setup/install/windows-install/)"
108
+ };
109
+ async function checkDocker(config, deps) {
110
+ if (!configuredUses(config).filter((u) => u.sandbox.kind === "docker").length) return {
111
+ checks: [{
112
+ id: "docker",
113
+ status: "skip",
114
+ summary: "no sandbox in the config uses Docker"
115
+ }],
116
+ running: false
117
+ };
118
+ const state = await deps.dockerState();
119
+ if (state === "windows-containers") return {
120
+ checks: [{
121
+ id: "docker",
122
+ status: "fail",
123
+ summary: "is running Windows containers, but reeval's sandboxes are Linux containers",
124
+ fix: "switch Docker Desktop to Linux containers (its tray menu: Switch to Linux containers), on the WSL 2 backend"
125
+ }],
126
+ running: false,
127
+ windowsContainers: true
128
+ };
129
+ if (state === "down") return {
130
+ checks: [{
131
+ id: "docker",
132
+ status: "fail",
133
+ summary: "isn't running, and the config's sandboxes need it",
134
+ fix: DOCKER_FIX[deps.platform] ?? DOCKER_FIX.linux
135
+ }],
136
+ running: false
137
+ };
138
+ const capacity = await deps.dockerCapacity();
139
+ if (!capacity) return {
140
+ checks: [{
141
+ id: "docker",
142
+ status: "ok",
143
+ summary: "running"
144
+ }],
145
+ running: true
146
+ };
147
+ const gb = capacity.memoryBytes / 1024 ** 3;
148
+ const summary = `running · ${capacity.cpus} CPUs, ${gb.toFixed(1)} GB memory (default concurrency ${defaultConcurrency(capacity)})`;
149
+ return {
150
+ checks: [gb < 4 ? {
151
+ id: "docker",
152
+ status: "warn",
153
+ summary: `${summary}; an attempt may use up to 4 GB`,
154
+ fix: "give Docker more memory (Docker Desktop: Settings › Resources), or lower docker({ limits: { memory } })"
155
+ } : {
156
+ id: "docker",
157
+ status: "ok",
158
+ summary
159
+ }],
160
+ running: true
161
+ };
162
+ }
163
+ /** reeval's sandbox image for each Docker harness in the config: present, missing or left from an older reeval. */
164
+ async function checkImages(config, deps) {
165
+ const { imageFor } = await import("./src-N7E_mfcZ.js");
166
+ const { imageTargets, esImages } = await import("./images-Cc1-coFc.js");
167
+ const targets = imageTargets(configuredUses(config).map((u) => ({
168
+ id: "",
169
+ harness: u.harness,
170
+ sandbox: u.sandbox
171
+ })));
172
+ const checks = [];
173
+ const missing = [];
174
+ for (const harness of esImages(targets)) {
175
+ const ref = imageFor(harness);
176
+ if (await deps.imageExists(ref)) checks.push({
177
+ id: "image",
178
+ status: "ok",
179
+ summary: `${ref} (${harness})`
180
+ });
181
+ else {
182
+ missing.push(ref);
183
+ checks.push({
184
+ id: "image",
185
+ status: "fail",
186
+ summary: `${ref} (${harness}) isn't built`,
187
+ fix: "reeval image build"
188
+ });
189
+ }
190
+ const [repository] = ref.split(":");
191
+ const prefix = `${repository}:${harness}-`;
192
+ const stale = (await deps.imageTags(repository)).filter((tag) => tag.startsWith(prefix) && tag !== ref && !tag.startsWith(`${ref}-`));
193
+ if (stale.length) checks.push({
194
+ id: "image",
195
+ status: "warn",
196
+ summary: `${stale.join(", ")}: built by another reeval version, unused by this one`,
197
+ fix: `docker image rm ${stale.join(" ")}`
198
+ });
199
+ }
200
+ for (const t of targets.filter((t) => t.sandbox.image)) {
201
+ const ref = t.sandbox.image;
202
+ if (!await deps.imageExists(ref)) checks.push({
203
+ id: "image",
204
+ status: "fail",
205
+ summary: `${ref} (docker({ image })) isn't in Docker`,
206
+ fix: `docker pull ${ref}, or build it`
207
+ });
208
+ }
209
+ if (!checks.length) checks.push({
210
+ id: "image",
211
+ status: "skip",
212
+ summary: "no reeval sandbox images to check"
213
+ });
214
+ return {
215
+ checks,
216
+ missing
217
+ };
218
+ }
219
+ /** A tiny authenticated request per key, answering only whether the key works. */
220
+ const PROBES = {
221
+ CURSOR_API_KEY: (key) => ({
222
+ url: "https://api.cursor.com/v0/me",
223
+ headers: { authorization: `Basic ${Buffer.from(`${key}:`).toString("base64")}` }
224
+ }),
225
+ ANTHROPIC_API_KEY: (key) => ({
226
+ url: "https://api.anthropic.com/v1/models?limit=1",
227
+ headers: {
228
+ "x-api-key": key,
229
+ "anthropic-version": "2023-06-01"
230
+ }
231
+ }),
232
+ GEMINI_API_KEY: (key) => ({
233
+ url: "https://generativelanguage.googleapis.com/v1beta/models?pageSize=1",
234
+ headers: { "x-goog-api-key": key }
235
+ }),
236
+ GOOGLE_GENERATIVE_AI_API_KEY: (key) => ({
237
+ url: "https://generativelanguage.googleapis.com/v1beta/models?pageSize=1",
238
+ headers: { "x-goog-api-key": key }
239
+ }),
240
+ OPENAI_API_KEY: (key) => ({
241
+ url: "https://api.openai.com/v1/models",
242
+ headers: { authorization: `Bearer ${key}` }
243
+ })
244
+ };
245
+ /** Whether the API accepts the key, from one request; the key only goes in its headers. */
246
+ async function probeKey(name, key, fetchImpl) {
247
+ const probe = PROBES[name]?.(key);
248
+ if (!probe) return {
249
+ status: "ok",
250
+ summary: "set (no auth check for this key)"
251
+ };
252
+ const host = new URL(probe.url).host;
253
+ try {
254
+ const response = await fetchImpl(probe.url, {
255
+ headers: probe.headers,
256
+ signal: AbortSignal.timeout(1e4)
257
+ });
258
+ if (response.ok) return {
259
+ status: "ok",
260
+ summary: `set, and ${host} accepts it`
261
+ };
262
+ if (response.status === 401 || response.status === 403) return {
263
+ status: "fail",
264
+ summary: `set, but ${host} rejects it (HTTP ${response.status})`
265
+ };
266
+ return {
267
+ status: "warn",
268
+ summary: `set; ${host} answered HTTP ${response.status}, so it's unchecked`
269
+ };
270
+ } catch (error) {
271
+ return {
272
+ status: "warn",
273
+ summary: `set; couldn't reach ${host} (${redactSecrets(error.message)}), so it's unchecked`
274
+ };
275
+ }
276
+ }
277
+ async function keyCheck(id, names, who, required, deps, online, envFile) {
278
+ const name = names.find((n) => deps.env[n]);
279
+ if (!name) {
280
+ const which = names.join(" or ");
281
+ return {
282
+ id,
283
+ status: required ? "fail" : "warn",
284
+ summary: `${which} for ${who}: not set`,
285
+ fix: `add ${names[0]}=... to ${envFile}`
286
+ };
287
+ }
288
+ const value = deps.env[name];
289
+ const at = badCharacterAt(value);
290
+ if (at) return {
291
+ id,
292
+ status: "fail",
293
+ summary: `${name} for ${who}: has whitespace or a line break in it at character ${at}`,
294
+ fix: `set ${name} again as one line in ${envFile}`
295
+ };
296
+ if (!online) return {
297
+ id,
298
+ status: "ok",
299
+ summary: `${name} for ${who}: set`
300
+ };
301
+ const probed = await probeKey(name, value, deps.fetch);
302
+ return {
303
+ id,
304
+ status: probed.status,
305
+ summary: `${name} for ${who}: ${probed.summary}`,
306
+ ...probed.status === "fail" ? { fix: `set a valid ${name} in ${envFile}` } : {}
307
+ };
308
+ }
309
+ /** Each agent harness's key, from the environment and `.env.local` / `.env`. */
310
+ async function checkKeys(config, deps, online, envFile) {
311
+ const byKey = /* @__PURE__ */ new Map();
312
+ for (const use of configuredUses(config)) {
313
+ const key = credentialOf(use.harness);
314
+ if (!key) continue;
315
+ const entry = byKey.get(key) ?? {
316
+ who: [],
317
+ required: false
318
+ };
319
+ const who = use.profile ? `${harnessId(use.harness)} in profile ${use.profile}` : harnessId(use.harness);
320
+ if (!entry.who.includes(who)) entry.who.push(who);
321
+ entry.required ||= !use.profile;
322
+ byKey.set(key, entry);
323
+ }
324
+ if (!byKey.size) return [{
325
+ id: "key",
326
+ status: "skip",
327
+ summary: "no harness in the config needs a key"
328
+ }];
329
+ return Promise.all([...byKey].map(([key, { who, required }]) => keyCheck("key", [key], who.join(", "), required, deps, online, envFile)));
330
+ }
331
+ async function checkJudge(config, deps, online, envFile) {
332
+ const models = [...config.judge.model !== void 0 ? [{
333
+ model: config.judge.model,
334
+ profile: void 0
335
+ }] : [], ...Object.entries(config.profiles).flatMap(([name, p]) => {
336
+ const model = p.defaults?.judge?.model ?? p.judge?.model;
337
+ return model !== void 0 ? [{
338
+ model,
339
+ profile: name
340
+ }] : [];
341
+ })];
342
+ if (!models.length) return [{
343
+ id: "judge",
344
+ status: "skip",
345
+ summary: "no judge model (t.judge needs one)"
346
+ }];
347
+ return Promise.all(models.map(({ model, profile }) => {
348
+ const label = typeof model === "string" ? model : "fakeJudge()";
349
+ const who = profile ? `${label} in profile ${profile}` : label;
350
+ const keys = judgeCredentials(model);
351
+ if (!keys.length) return {
352
+ id: "judge",
353
+ status: "ok",
354
+ summary: `${who} needs no key`
355
+ };
356
+ return keyCheck("judge", keys, who, !profile, deps, online, envFile);
357
+ }));
358
+ }
359
+ const policyText = (policy) => policy === "allow-all" ? "allow-all: the agents reach any host" : policy === "deny-all" ? "deny-all: only each harness's own hosts" : `allow ${policy.allow.join(", ") || "none"}, plus each harness's own hosts`;
360
+ function checkEgress(config) {
361
+ const checks = [];
362
+ const inherited = config.egress ?? "allow-all";
363
+ checks.push({
364
+ id: "egress",
365
+ status: "ok",
366
+ summary: `${policyText(inherited)}${config.egress === void 0 ? " (the default)" : ""}; evals and environments may set their own`
367
+ });
368
+ for (const [name, p] of Object.entries(config.profiles)) {
369
+ const policy = p.defaults?.egress;
370
+ if (policy !== void 0) checks.push({
371
+ id: "egress",
372
+ status: "ok",
373
+ summary: `profile ${name}: ${policyText(policy)}`
374
+ });
375
+ }
376
+ for (const use of configuredUses(config)) {
377
+ const policy = (use.profile ? config.profiles[use.profile]?.defaults?.egress : void 0) ?? inherited;
378
+ const where = use.profile ? `profile ${use.profile}` : "the config";
379
+ const problem = unenforceable({
380
+ policy,
381
+ auto: []
382
+ }, use.sandbox, where);
383
+ if (problem && !checks.some((c) => c.summary === problem)) checks.push({
384
+ id: "egress",
385
+ status: "fail",
386
+ summary: problem
387
+ });
388
+ }
389
+ return checks;
390
+ }
391
+ async function checkGitignore(root, deps) {
392
+ const ignored = await deps.gitIgnored(root, [
393
+ ".env",
394
+ ".env.local",
395
+ ".reeval/runs"
396
+ ]);
397
+ let missing;
398
+ if (ignored) missing = [...ignored[0] && ignored[1] ? [] : [".env*"], ...ignored[2] ? [] : [".reeval/"]];
399
+ else {
400
+ const path = join(root, ".gitignore");
401
+ const absent = missingGitignoreEntries(existsSync(path) ? readFileSync(path, "utf8") : "");
402
+ missing = [".env*", ".reeval/"].filter((e) => absent.includes(e));
403
+ }
404
+ if (!missing.length) return {
405
+ id: "gitignore",
406
+ status: "ok",
407
+ summary: ".env* and .reeval/ are ignored"
408
+ };
409
+ const keys = missing.includes(".env*");
410
+ return {
411
+ id: "gitignore",
412
+ status: keys ? "fail" : "warn",
413
+ summary: `${missing.join(" and ")} ${missing.length === 1 ? "isn't" : "aren't"} ignored${keys ? ": a commit could include your keys" : ""}`,
414
+ fix: `add ${missing.join(" and ")} to .gitignore (reeval init adds them)`
415
+ };
416
+ }
417
+ /** Every check, in order; the config's checks only when it loads. */
418
+ async function doctor(flags, deps) {
419
+ const checks = [checkNode(deps.nodeVersion)];
420
+ const configPath = configPathFor(flags.config);
421
+ let config;
422
+ let missingImages = [];
423
+ if (!configPath) checks.push({
424
+ id: "config",
425
+ status: "fail",
426
+ summary: `no ${CONFIG_FILES[0]} (or ${CONFIG_FILES.slice(1).join(", ")}) here or above`,
427
+ fix: "reeval init"
428
+ });
429
+ else try {
430
+ config = await loadConfig(configPath, "doctor");
431
+ checks.push({
432
+ id: "config",
433
+ status: "ok",
434
+ summary: `${configLabel(configPath)}: ${describeConfig(config)}`
435
+ });
436
+ } catch (error) {
437
+ checks.push({
438
+ id: "config",
439
+ status: "fail",
440
+ summary: redactSecrets(error.message),
441
+ fix: `fix ${configLabel(configPath)}, then reeval run --dry-run`
442
+ });
443
+ }
444
+ if (config) {
445
+ loadEnvFiles(configPath);
446
+ const envFile = fromCwd(join(config.root, ".env.local")) || ".env.local";
447
+ const docker = await checkDocker(config, deps);
448
+ checks.push(...docker.checks);
449
+ if (docker.running) {
450
+ const images = await checkImages(config, deps);
451
+ checks.push(...images.checks);
452
+ missingImages = images.missing;
453
+ } else if (docker.checks[0]?.status === "fail") {
454
+ const why = docker.windowsContainers ? "Docker runs Windows containers" : "Docker isn't running";
455
+ checks.push({
456
+ id: "image",
457
+ status: "skip",
458
+ summary: why
459
+ });
460
+ }
461
+ const online = !!flags.online;
462
+ checks.push(...await checkKeys(config, deps, online, envFile));
463
+ checks.push(...await checkJudge(config, deps, online, envFile));
464
+ checks.push(...checkEgress(config));
465
+ checks.push(await checkGitignore(config.root, deps));
466
+ }
467
+ const problems = checks.filter((c) => c.status === "fail").length;
468
+ const warnings = checks.filter((c) => c.status === "warn").length;
469
+ return {
470
+ report: {
471
+ healthy: problems === 0,
472
+ problems,
473
+ warnings,
474
+ config: configPath ? configLabel(configPath) : null,
475
+ checks
476
+ },
477
+ config,
478
+ missingImages
479
+ };
480
+ }
481
+ function renderReport(report, color) {
482
+ const { green, red, yellow, dim } = colors(color);
483
+ const mark = {
484
+ ok: green("✓"),
485
+ warn: yellow("!"),
486
+ fail: red("✗"),
487
+ skip: dim("-")
488
+ };
489
+ const width = Math.max(...report.checks.map((c) => c.id.length));
490
+ const lines = [`reeval doctor${report.config ? ` · ${report.config}` : ""}`];
491
+ for (const c of report.checks) {
492
+ const text = c.status === "skip" ? dim(c.summary) : c.summary;
493
+ lines.push(`${mark[c.status]} ${c.id.padEnd(width)} ${text}`);
494
+ if (c.fix) lines.push(` ${" ".repeat(width)} ${dim(`fix: ${c.fix}`)}`);
495
+ }
496
+ const count = (n, word) => `${n} ${word}${n === 1 ? "" : "s"}`;
497
+ lines.push("", report.problems ? red(`${count(report.problems, "problem")}, ${count(report.warnings, "warning")}. Fix them and run reeval doctor again.`) : report.warnings ? yellow(`No problems, ${count(report.warnings, "warning")}.`) : green("No problems."));
498
+ return lines;
499
+ }
500
+ /** `reeval doctor`: exit 0 when nothing failed, 1 otherwise. */
501
+ async function doctorCommand(flags, io, deps = defaultDeps()) {
502
+ const { report, config, missingImages } = await doctor(flags, deps);
503
+ if (flags.json) {
504
+ io.out(JSON.stringify(report, null, 2));
505
+ return report.healthy ? 0 : 1;
506
+ }
507
+ for (const line of renderReport(report, io.color)) io.out(line);
508
+ if (config && missingImages.length && io.confirm) {
509
+ if (await io.confirm(`Build ${missingImages.join(", ")} now with reeval image build? [y/N] `)) {
510
+ const { buildImages, imageTargets } = await import("./images-Cc1-coFc.js");
511
+ const built = await buildImages(imageTargets(configuredUses(config).map((u) => ({
512
+ id: "",
513
+ harness: u.harness,
514
+ sandbox: u.sandbox
515
+ }))), config.root, { log: (line) => io.out(line) });
516
+ for (const b of built) if (!b.ok) io.out(`✗ ${b.id}: ${b.failure.message.split("\n")[0]}`);
517
+ io.out(built.every((b) => b.ok) ? "Built. Run reeval doctor again to check." : "Some images failed to build; reeval image build shows why.");
518
+ }
519
+ }
520
+ return report.healthy ? 0 : 1;
521
+ }
522
+ //#endregion
523
+ export { defaultDeps, doctor, doctorCommand };
524
+
525
+ //# sourceMappingURL=doctor-CxlH1pDM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-CxlH1pDM.js","names":[],"sources":["../src/doctor.ts"],"mappings":"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"}