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,207 @@
1
+ import { a as fromCwd, l as sha256 } from "./ids-Bp6ut7ZD.js";
2
+ import { n as gitText, t as git } from "./git-D6hMeieS.js";
3
+ import { H as compare, W as stackChanges } from "./model-CDL98xue.js";
4
+ import { a as renderSummary } from "./summary-D7Ttky0z.js";
5
+ import { f as scratchDir, i as listRuns, o as readRecord, u as recordRun } from "./files-D2-qn_Dl.js";
6
+ import { a as formatShow, c as resolveRun, i as formatNoBaseline, n as formatCompare, o as history, r as formatHistory, s as pickBaseline } from "./views-BrHOv6wg.js";
7
+ import { existsSync } from "node:fs";
8
+ import { join, resolve } from "node:path";
9
+ import { readFile } from "node:fs/promises";
10
+ //#region src/commands.ts
11
+ var CommandError = class extends Error {
12
+ name = "CommandError";
13
+ };
14
+ const recorded = (config) => listRuns(config.root, config.history.dir, true);
15
+ const scratch = (config) => listRuns(config.root, scratchDir(config.root), false);
16
+ /** Recorded runs plus scratch runs that weren't recorded, sorted by run id. */
17
+ async function allRuns(config) {
18
+ const kept = await recorded(config);
19
+ const ids = new Set(kept.map((e) => e.runId));
20
+ return [...kept, ...(await scratch(config)).filter((e) => !ids.has(e.runId))].sort((a, b) => a.runId < b.runId ? -1 : 1);
21
+ }
22
+ async function lines(root, args) {
23
+ const r = await git(root, args);
24
+ if (r.code !== 0) return null;
25
+ return r.stdout.toString("utf8").split("\n").filter(Boolean);
26
+ }
27
+ /** Commits reachable from HEAD; null when git can't tell (no repo, or a shallow clone). */
28
+ async function reachability(root) {
29
+ const shallow = await lines(root, ["rev-parse", "--is-shallow-repository"]);
30
+ if (!shallow || shallow[0] === "true") return null;
31
+ const shas = await lines(root, [
32
+ "rev-list",
33
+ "--max-count=20000",
34
+ "HEAD"
35
+ ]);
36
+ return shas ? new Set(shas) : null;
37
+ }
38
+ const rel = (path) => fromCwd(path) || path;
39
+ function parseLevel(value, fallback) {
40
+ if (value === void 0) return fallback;
41
+ if (value === "all" || value === "failures" || value === "none") return value;
42
+ throw new CommandError("--artifacts must be all, failures or none");
43
+ }
44
+ async function record(config, runId, flags) {
45
+ const result = await recordRun({
46
+ root: config.root,
47
+ historyDir: config.history.dir,
48
+ runId,
49
+ artifacts: parseLevel(flags.artifacts, config.history.artifacts),
50
+ allowIncomplete: flags["allow-incomplete"],
51
+ skipSecretScan: flags["skip-secret-scan"]
52
+ });
53
+ const where = rel(result.recordPath);
54
+ if (!result.created) return `${where} is already recorded`;
55
+ const kb = (result.bytes / 1024).toFixed(1);
56
+ return `recorded ${where}${result.artifactDir ? ` + ${result.files} artifact files in ${rel(result.artifactDir)}/` : ""} (${kb} KB). Commit it with git.`;
57
+ }
58
+ async function recordCommand(ctx, refs) {
59
+ const runs = await scratch(ctx.config);
60
+ for (const ref of refs.length ? refs : ["latest"]) ctx.out(await record(ctx.config, resolveRun(runs, ref).runId, ctx.flags));
61
+ return 0;
62
+ }
63
+ /** `reeval history --json`: recent runs (recorded, or with `all` scratch ones too) and each eval's strip. */
64
+ async function historyView(config, options = {}) {
65
+ const entries = options.all ? await allRuns(config) : await recorded(config);
66
+ const limit = options.limit ?? 20;
67
+ if (!(limit > 0)) throw new CommandError("--limit must be a positive number");
68
+ const reach = await reachability(config.root);
69
+ return history(entries, {
70
+ filter: options.filter || void 0,
71
+ limit,
72
+ reach
73
+ });
74
+ }
75
+ async function historyCommand(ctx, filter) {
76
+ const view = await historyView(ctx.config, {
77
+ filter: filter.join(" "),
78
+ limit: ctx.flags.limit ? Number(ctx.flags.limit) : void 0,
79
+ all: ctx.flags.all
80
+ });
81
+ ctx.out(ctx.flags.json ? JSON.stringify(view, null, 2) : formatHistory(view));
82
+ return 0;
83
+ }
84
+ /** The record of the run `ref` names (default latest), recorded or scratch. */
85
+ async function showRecord(config, ref) {
86
+ const entry = resolveRun(await allRuns(config), ref);
87
+ const dir = entry.recorded ? config.history.dir : scratchDir(config.root);
88
+ return readRecord(join(dir, `${entry.runId}.json`));
89
+ }
90
+ async function showCommand(ctx, refs) {
91
+ const run = await showRecord(ctx.config, refs[0]);
92
+ if (ctx.flags.json) ctx.out(JSON.stringify(run, null, 2));
93
+ else if (ctx.flags.md) ctx.out(renderSummary(run).trimEnd());
94
+ else ctx.out(formatShow(run));
95
+ return 0;
96
+ }
97
+ /**
98
+ * Two runs and their rows: `base` and `head` when both are given, else `head` (default latest)
99
+ * against its nearest recorded ancestor. `json` is what `reeval compare --json` prints.
100
+ */
101
+ async function compareView(config, refs) {
102
+ const { root } = config;
103
+ const entries = await allRuns(config);
104
+ const reach = await reachability(root);
105
+ let base;
106
+ let head;
107
+ if (refs.length >= 2) {
108
+ base = resolveRun(entries, refs[0]);
109
+ head = resolveRun(entries, refs[1]);
110
+ } else {
111
+ head = resolveRun(entries, refs[0] ?? "latest");
112
+ const ancestry = await lines(root, [
113
+ "rev-list",
114
+ "--max-count=5000",
115
+ head.git && (!reach || reach.has(head.git.sha)) ? head.git.sha : "HEAD"
116
+ ]);
117
+ const candidates = entries.filter((e) => e.recorded && e.runId !== head.runId);
118
+ base = pickBaseline(candidates, head, ancestry);
119
+ }
120
+ const rows = base ? compare(base, head) : head.evals.map((e) => ({
121
+ id: e.id,
122
+ base: null,
123
+ head: e.outcome,
124
+ status: "added"
125
+ }));
126
+ const flag = (e) => ({
127
+ runId: e.runId,
128
+ recorded: e.recorded,
129
+ inHistory: !reach || !e.git ? null : reach.has(e.git.sha)
130
+ });
131
+ const json = base ? {
132
+ base: flag(base),
133
+ head: flag(head),
134
+ changes: stackChanges(base, head),
135
+ rows
136
+ } : {
137
+ base: null,
138
+ head: { runId: head.runId },
139
+ changes: [],
140
+ rows
141
+ };
142
+ return {
143
+ base,
144
+ head,
145
+ rows,
146
+ reach,
147
+ json
148
+ };
149
+ }
150
+ async function compareCommand(ctx, refs) {
151
+ const { base, head, rows, reach, json } = await compareView(ctx.config, refs);
152
+ const failing = regressions(rows);
153
+ if (ctx.flags.json) ctx.out(JSON.stringify(json, null, 2));
154
+ else if (!base) ctx.out(formatNoBaseline(head, rows, !!ctx.flags.md));
155
+ else ctx.out(formatCompare(base, head, rows, !!ctx.flags.md, reach));
156
+ return ctx.flags["fail-on-regression"] && failing.length ? 1 : 0;
157
+ }
158
+ /**
159
+ * What `--fail-on-regression` fails on: an eval that went from pass to fail, and a new or
160
+ * changed (not comparable) eval that fails, since nothing earlier vouches for it.
161
+ */
162
+ const regressions = (rows) => rows.filter((r) => r.status === "regressed" || (r.status === "added" || r.status === "drift") && r.head === "fail");
163
+ /** Recreates the state a run executed in: its commit, plus its uncommitted changes if any. */
164
+ async function checkoutCommand(ctx, args) {
165
+ const { root } = ctx.config;
166
+ const entry = resolveRun(await allRuns(ctx.config), args[0] ?? "latest");
167
+ const dir = entry.recorded ? ctx.config.history.dir : scratchDir(root);
168
+ const run = await readRecord(join(dir, `${entry.runId}.json`));
169
+ if (!run.git) throw new CommandError(`${run.runId} didn't run in a git repository`);
170
+ const { sha } = run.git;
171
+ if ((await git(root, [
172
+ "cat-file",
173
+ "-e",
174
+ `${sha}^{commit}`
175
+ ])).code !== 0) throw new CommandError(`Commit ${sha.slice(0, 12)} isn't in this clone (rebased or not fetched). Fetch it, then try again.`);
176
+ const target = resolve(args[1] ?? join(root, ".reeval", "checkouts", run.runId));
177
+ if (existsSync(target)) throw new CommandError(`${rel(target)} already exists`);
178
+ await gitText(root, [
179
+ "worktree",
180
+ "add",
181
+ "--detach",
182
+ "-q",
183
+ target,
184
+ sha
185
+ ]);
186
+ const patchRef = run.git.worktreePatch;
187
+ let applied = "";
188
+ if (patchRef) {
189
+ const patchPath = join(dir, run.runId, patchRef.path);
190
+ const bytes = await readFile(patchPath);
191
+ if (sha256(bytes) !== patchRef.sha256) throw new CommandError(`${rel(patchPath)} doesn't match the hash in the record`);
192
+ const r = await git(target, [
193
+ "apply",
194
+ "--binary",
195
+ "--whitespace=nowarn",
196
+ patchPath
197
+ ]);
198
+ if (r.code !== 0) throw new CommandError(`Applying worktree.patch failed: ${r.stderr.trim()}`);
199
+ applied = " and applied worktree.patch";
200
+ } else if (run.git.dirty) applied = ` (the run was dirty, but its changes weren't saved: ${run.git.worktreePatchNote ?? "unknown"})`;
201
+ ctx.out(`checked out ${sha.slice(0, 12)} into ${rel(target)}${applied}.\nRemove it with: git worktree remove ${rel(target)}`);
202
+ return 0;
203
+ }
204
+ //#endregion
205
+ export { compareView as a, lines as c, record as d, recordCommand as f, showRecord as h, compareCommand as i, parseLevel as l, showCommand as m, allRuns as n, historyCommand as o, regressions as p, checkoutCommand as r, historyView as s, CommandError as t, reachability as u };
206
+
207
+ //# sourceMappingURL=commands-CF8mOfiu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-CF8mOfiu.js","names":[],"sources":["../src/commands.ts"],"mappings":"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"}
@@ -0,0 +1,415 @@
1
+ import { t as UsageError } from "./errors-CSxfJ4qu.js";
2
+ import { d as isSecret, s as helpersFor, x as parseDuration } from "./environment-Mz7wvrtD.js";
3
+ import { t as inCI } from "./env-BQqj93gu.js";
4
+ import { l as ownFileURL } from "./root-CFDjpWuc.js";
5
+ import { c as DEFAULT_HARNESS, g as isAgentKind, l as HARNESS_EXAMPLE, m as credentialOf, s as AGENTS } from "./egress-73SQfKdx.js";
6
+ import { a as fromCwd } from "./ids-Bp6ut7ZD.js";
7
+ import { t as esJiti } from "./jiti-BOLXpKyG.js";
8
+ import { i as checkModelString, o as judgeCredentials } from "./judge-D8Uf4dA9.js";
9
+ import { i as checkOptions, r as checkHarnesses } from "./options-CAQhu--C.js";
10
+ import { t as docker } from "./sandbox-By2gkdkC.js";
11
+ import { existsSync } from "node:fs";
12
+ import { availableParallelism, totalmem } from "node:os";
13
+ import { dirname, join, resolve } from "node:path";
14
+ //#region src/config.ts
15
+ const CONFIG_KEYS = [
16
+ "include",
17
+ "harness",
18
+ "sandbox",
19
+ "environment",
20
+ "runs",
21
+ "gate",
22
+ "env",
23
+ "egress",
24
+ "judge",
25
+ "timeout",
26
+ "concurrency",
27
+ "record",
28
+ "history",
29
+ "budget",
30
+ "profiles",
31
+ "defaultProfile",
32
+ "secrets",
33
+ "debug",
34
+ "analysis"
35
+ ];
36
+ const PROFILE_KEYS = [
37
+ "defaults",
38
+ "limit",
39
+ "judge",
40
+ "budget",
41
+ "record",
42
+ "tags"
43
+ ];
44
+ const DEFAULTS_KEYS = [
45
+ "harness",
46
+ "sandbox",
47
+ "environment",
48
+ "runs",
49
+ "gate",
50
+ "env",
51
+ "egress",
52
+ "judge",
53
+ "timeout"
54
+ ];
55
+ const LIMIT_KEYS = [
56
+ "runs",
57
+ "compare",
58
+ "harness"
59
+ ];
60
+ /**
61
+ * The config: a plain object, or a callback that destructures the helpers it needs, e.g.
62
+ * `defineConfig(({ secret }) => ({ env: { KEY: secret.fromEnv('KEY') } }))`.
63
+ */
64
+ const defineConfig = (config) => config;
65
+ /** The file names `reeval` looks for in each directory, first match first, as Vitest orders its own. */
66
+ const CONFIG_FILES = [
67
+ "ts",
68
+ "mts",
69
+ "cts",
70
+ "js",
71
+ "mjs",
72
+ "cjs"
73
+ ].map((ext) => `reeval.config.${ext}`);
74
+ const DEFAULT_CONFIG_FILE = "reeval.config.ts";
75
+ /**
76
+ * The nearest config file in `from` or a directory above it, up to the filesystem root, the way
77
+ * Vitest and ESLint find theirs. A git or workspace root doesn't stop the search: a nested
78
+ * project's own config is nearer, so it wins.
79
+ */
80
+ function findConfig(from = process.cwd()) {
81
+ for (let dir = resolve(from);; dir = dirname(dir)) {
82
+ for (const name of CONFIG_FILES) {
83
+ const path = join(dir, name);
84
+ if (existsSync(path)) return path;
85
+ }
86
+ if (dirname(dir) === dir) return void 0;
87
+ }
88
+ }
89
+ /** The config a command reads: `--config` (from the current directory), else the nearest one. */
90
+ const configPathFor = (flag) => flag === void 0 ? findConfig() : resolve(flag);
91
+ /** The config file as the user would type it from the current directory. */
92
+ const configLabel = (path) => fromCwd(path) || path;
93
+ /**
94
+ * Loads the config at `path` (see `configPathFor`); its directory is the project root. Without a
95
+ * config file, every key takes its default and the current directory is the root.
96
+ */
97
+ async function loadConfig(path, command = "run", profile = void 0) {
98
+ if (path === void 0) return resolveConfig({}, process.cwd(), DEFAULT_CONFIG_FILE);
99
+ const root = dirname(path);
100
+ const configPath = configLabel(path);
101
+ let user = {};
102
+ if (existsSync(path)) {
103
+ const module = await (await esJiti(ownFileURL("dist/cli.js").href, { moduleCache: false })).import(path);
104
+ if (!module || typeof module !== "object" || !("default" in module)) {
105
+ const names = module && typeof module === "object" ? Object.keys(module) : [];
106
+ const exportsNote = names.length ? ` (it exports ${names.join(", ")})` : "";
107
+ throw new UsageError(`${configPath} has no default export${exportsNote}. Write export default defineConfig({…}).`);
108
+ }
109
+ let exported = module.default;
110
+ if (typeof exported === "function") {
111
+ const hostEnv = process.env;
112
+ exported = exported({
113
+ ...helpersFor(root),
114
+ ci: inCI(hostEnv),
115
+ command,
116
+ hostEnv,
117
+ profile
118
+ });
119
+ if (exported instanceof Promise) throw new UsageError(`The defineConfig callback in ${configPath} returned a Promise. It runs once when the config loads and must return the config synchronously.`);
120
+ }
121
+ if (!exported || typeof exported !== "object" || exported instanceof Promise) throw new UsageError(`${configPath} must default-export defineConfig({...})`);
122
+ user = exported;
123
+ } else throw new UsageError(`Config file not found: ${configPath}`);
124
+ return resolveConfig(user, root, configPath);
125
+ }
126
+ const GLOB = /[*?[\]{}!]/;
127
+ /** The directory every include pattern starts in: `evals/**\/*.eval.ts` → `evals`. */
128
+ function evalRoot(include) {
129
+ const dirs = include.map((pattern) => {
130
+ const parts = pattern.split("/");
131
+ const stop = parts.findIndex((part) => GLOB.test(part));
132
+ return (stop < 0 ? parts.slice(0, -1) : parts.slice(0, stop)).filter((p) => p && p !== ".");
133
+ });
134
+ const common = [];
135
+ for (let i = 0; dirs.every((d) => d[i] !== void 0 && d[i] === dirs[0]?.[i]); i++) common.push(dirs[0]?.[i]);
136
+ return common.join("/");
137
+ }
138
+ const ARTIFACTS = [
139
+ "all",
140
+ "failures",
141
+ "none"
142
+ ];
143
+ const RECORD = [
144
+ "manual",
145
+ "ci",
146
+ "always"
147
+ ];
148
+ const unknownKey = (value, allowed, where) => {
149
+ const key = Object.keys(value).find((k) => !allowed.includes(k));
150
+ if (key === void 0) return;
151
+ const hints = {
152
+ reuse: "Reusing control results from .history isn’t built yet; every run runs its controls.",
153
+ compare: "compare only goes on a group or eval; a profile can narrow it with limit.compare."
154
+ };
155
+ throw new UsageError(`Unknown option "${key}" in ${where}.${hints[key] ? ` ${hints[key]}` : ` Use ${allowed.join(", ")}.`}`);
156
+ };
157
+ function checkBudget(budget, where) {
158
+ if (budget === void 0) return {};
159
+ if (typeof budget !== "object" || budget === null) throw new UsageError(`${where} must be an object like { attempts: 20, duration: '1h' }`);
160
+ if ("usd" in budget || "tokens" in budget) throw new UsageError(`${where}.${"usd" in budget ? "usd" : "tokens"} isn't supported yet: reeval records the tokens harnesses report, but prices none and enforces no token budget. Cap the run with attempts or duration.`);
161
+ unknownKey(budget, ["attempts", "duration"], where);
162
+ const { attempts, duration } = budget;
163
+ if (attempts !== void 0 && !(Number.isInteger(attempts) && attempts >= 1)) throw new UsageError(`${where}.attempts must be a whole number of at least 1 (got ${attempts})`);
164
+ if (duration !== void 0) parseDuration(duration);
165
+ return {
166
+ ...attempts ? { attempts } : {},
167
+ ...duration ? { duration } : {}
168
+ };
169
+ }
170
+ const describeValue = (v) => {
171
+ if (typeof v !== "object" || v === null) return JSON.stringify(v);
172
+ const { kind } = v;
173
+ if (kind === "fake") return "fakeHarness({ … })";
174
+ return isAgentKind(kind) ? `${AGENTS[kind].factory}({ … })` : "an object";
175
+ };
176
+ function checkProfile(name, profile) {
177
+ const where = `profiles.${name}`;
178
+ if (typeof profile !== "object" || profile === null) throw new UsageError(`${where} must be an object with defaults, limit, budget, …`);
179
+ unknownKey(profile, PROFILE_KEYS, where);
180
+ const p = profile;
181
+ if (p.defaults !== void 0) {
182
+ unknownKey(p.defaults, DEFAULTS_KEYS, `${where}.defaults`);
183
+ checkOptions(p.defaults, `${where}.defaults`);
184
+ }
185
+ if (p.limit !== void 0) {
186
+ unknownKey(p.limit, LIMIT_KEYS, `${where}.limit`);
187
+ const { runs, compare, harness } = p.limit;
188
+ if (runs !== void 0 && !(Number.isInteger(runs) && runs >= 1)) throw new UsageError(`${where}.limit.runs must be a whole number of at least 1`);
189
+ if (compare !== void 0 && compare !== false && !(Number.isInteger(compare?.maxVariants) && compare.maxVariants >= 0)) throw new UsageError(`${where}.limit.compare must be false or { maxVariants: n }`);
190
+ if (harness !== void 0) {
191
+ const bad = Array.isArray(harness) ? harness.find((h) => typeof h !== "string") : harness;
192
+ if (bad !== void 0) throw new UsageError(`${where}.limit.harness can only list harness ids to allow (got ${describeValue(bad)}). To add harnesses, use ${where}.defaults.harness.`);
193
+ }
194
+ }
195
+ if (p.tags !== void 0 && (!Array.isArray(p.tags) || p.tags.some((t) => typeof t !== "string"))) throw new UsageError(`${where}.tags must be a list of tag filters`);
196
+ if (p.record !== void 0 && !RECORD.includes(p.record)) throw new UsageError(`${where}.record must be one of ${RECORD.join(", ")}`);
197
+ if (p.judge !== void 0) resolveJudge(p.judge, `${where}.judge`);
198
+ checkBudget(p.budget, `${where}.budget`);
199
+ return p;
200
+ }
201
+ /** `--profile`, then `REEVAL_PROFILE`, then `defaultProfile.ci` in CI (or `.local`), then none. */
202
+ function selectProfile(config, flag, env = process.env) {
203
+ const pick = () => {
204
+ if (flag) return [flag, "--profile"];
205
+ if (env.REEVAL_PROFILE) return [env.REEVAL_PROFILE, "REEVAL_PROFILE"];
206
+ const ci = inCI(env);
207
+ if (ci && config.defaultProfile.ci) return [config.defaultProfile.ci, "auto: CI is set"];
208
+ if (!ci && config.defaultProfile.local) return [config.defaultProfile.local, "default"];
209
+ return null;
210
+ };
211
+ const picked = pick();
212
+ if (!picked) return null;
213
+ const [name, reason] = picked;
214
+ const profile = config.profiles[name];
215
+ if (!profile) {
216
+ const names = Object.keys(config.profiles);
217
+ throw new UsageError(`Unknown profile "${name}". ${names.length ? `Profiles in ${config.file}: ${names.join(", ")}.` : `${config.file} defines no profiles.`}`);
218
+ }
219
+ return {
220
+ name,
221
+ reason,
222
+ defaults: profile.defaults ?? {},
223
+ limit: profile.limit ?? {},
224
+ judge: profile.judge ?? {},
225
+ tags: profile.tags ?? [],
226
+ budget: {
227
+ ...config.budget,
228
+ ...profile.budget
229
+ },
230
+ ...profile.record ? { record: profile.record } : {}
231
+ };
232
+ }
233
+ function resolveConfig(user, root, file = DEFAULT_CONFIG_FILE) {
234
+ if ("compare" in user) throw new UsageError(`compare can't be set in ${file}: it would multiply every eval. Put it on the group or eval that asks the question.`);
235
+ checkOptions(user, file, CONFIG_KEYS);
236
+ const include = user.include ?? ["evals/**/*.eval.ts"];
237
+ if (!Array.isArray(include) || include.some((p) => typeof p !== "string")) throw new UsageError("config.include must be an array of glob strings");
238
+ const record = user.record ?? "ci";
239
+ if (!RECORD.includes(record)) throw new UsageError(`config.record must be one of ${RECORD.join(", ")}`);
240
+ const artifacts = user.history?.artifacts ?? "all";
241
+ if (!ARTIFACTS.includes(artifacts)) throw new UsageError(`config.history.artifacts must be one of ${ARTIFACTS.join(", ")}`);
242
+ const historyDir = resolve(root, user.history?.dir ?? join(evalRoot(include), ".history"));
243
+ const harness = user.harness === void 0 ? [DEFAULT_HARNESS] : [user.harness].flat();
244
+ if (harness.length === 0) throw new UsageError(`harness is an empty list in ${file}. Give at least one, e.g. harness: ${HARNESS_EXAMPLE}`);
245
+ checkHarnesses(harness, file);
246
+ const profiles = {};
247
+ if (user.profiles !== void 0) {
248
+ if (typeof user.profiles !== "object" || user.profiles === null) throw new UsageError(`profiles in ${file} must be an object of named profiles`);
249
+ for (const [name, profile] of Object.entries(user.profiles)) profiles[name] = checkProfile(name, profile);
250
+ }
251
+ const defaultProfile = user.defaultProfile ?? {};
252
+ unknownKey(defaultProfile, ["ci", "local"], "defaultProfile");
253
+ for (const name of [defaultProfile.ci, defaultProfile.local]) if (name !== void 0 && !profiles[name]) throw new UsageError(`defaultProfile names "${name}", which isn't in profiles (${Object.keys(profiles).join(", ") || "none"})`);
254
+ return {
255
+ root,
256
+ file,
257
+ optionKeys: Object.keys(user),
258
+ include,
259
+ harness,
260
+ sandbox: user.sandbox ?? docker(),
261
+ environment: user.environment,
262
+ runs: user.runs ?? 1,
263
+ gate: user.gate,
264
+ env: user.env ?? {},
265
+ ...user.egress !== void 0 ? { egress: user.egress } : {},
266
+ budget: checkBudget(user.budget, "budget"),
267
+ profiles,
268
+ defaultProfile,
269
+ judge: resolveJudge(user.judge),
270
+ timeoutMs: parseDuration(user.timeout ?? "15m"),
271
+ concurrency: user.concurrency === void 0 ? void 0 : checkConcurrency(user.concurrency, "config.concurrency"),
272
+ record,
273
+ history: {
274
+ dir: historyDir,
275
+ artifacts
276
+ },
277
+ secrets: checkSecrets(user.secrets),
278
+ debug: checkDebug(user.debug),
279
+ analysis: checkAnalysis(user.analysis)
280
+ };
281
+ }
282
+ const ANALYSIS_DEFAULTS = {
283
+ maxInputTokens: 2e4,
284
+ maxOutputTokens: 8e3
285
+ };
286
+ function checkAnalysis(analysis) {
287
+ if (analysis === void 0) return { ...ANALYSIS_DEFAULTS };
288
+ if (typeof analysis !== "object" || analysis === null) throw new UsageError("config.analysis must be an object like { model: 'google/gemini-3.8-flash' }");
289
+ unknownKey(analysis, [
290
+ "model",
291
+ "instructions",
292
+ "maxInputTokens",
293
+ "maxOutputTokens"
294
+ ], "config.analysis");
295
+ const { model, instructions, maxInputTokens = ANALYSIS_DEFAULTS.maxInputTokens, maxOutputTokens = ANALYSIS_DEFAULTS.maxOutputTokens } = analysis;
296
+ if (typeof model === "string") {
297
+ const problem = checkModelString(model);
298
+ if (problem) throw new UsageError(problem.replace("Judge model", "config.analysis.model"));
299
+ } else if (model !== void 0 && model?.kind !== "fake-analysis") throw new UsageError("config.analysis.model must be a 'provider/model' string, e.g. 'google/gemini-3.8-flash'");
300
+ if (instructions !== void 0 && typeof instructions !== "string") throw new UsageError("config.analysis.instructions must be a string");
301
+ if (!(Number.isInteger(maxInputTokens) && maxInputTokens >= 1e3)) throw new UsageError(`config.analysis.maxInputTokens must be a whole number of at least 1000 (got ${maxInputTokens})`);
302
+ if (!(Number.isInteger(maxOutputTokens) && maxOutputTokens >= 500)) throw new UsageError(`config.analysis.maxOutputTokens must be a whole number of at least 500 (got ${maxOutputTokens})`);
303
+ return {
304
+ ...analysis,
305
+ maxInputTokens,
306
+ maxOutputTokens
307
+ };
308
+ }
309
+ /** Runs whose local debug data `.reeval/debug` keeps, and the trace buffer per attempt. */
310
+ const DEBUG_DEFAULTS = {
311
+ keep: 20,
312
+ traceBufferMb: 8
313
+ };
314
+ function checkDebug(debug) {
315
+ if (debug === void 0) return {
316
+ keep: DEBUG_DEFAULTS.keep,
317
+ traceBufferBytes: DEBUG_DEFAULTS.traceBufferMb * 2 ** 20
318
+ };
319
+ if (typeof debug !== "object" || debug === null) throw new UsageError("config.debug must be an object like { keep: 20, traceBufferMb: 8 }");
320
+ unknownKey(debug, ["keep", "traceBufferMb"], "config.debug");
321
+ const { keep = DEBUG_DEFAULTS.keep, traceBufferMb = DEBUG_DEFAULTS.traceBufferMb } = debug;
322
+ if (!(Number.isInteger(keep) && keep >= 1)) throw new UsageError(`config.debug.keep must be a whole number of at least 1 (got ${keep})`);
323
+ if (!(typeof traceBufferMb === "number" && traceBufferMb > 0)) throw new UsageError(`config.debug.traceBufferMb must be a number of megabytes above 0 (got ${traceBufferMb})`);
324
+ return {
325
+ keep,
326
+ traceBufferBytes: Math.round(traceBufferMb * 2 ** 20)
327
+ };
328
+ }
329
+ function checkSecrets(secrets) {
330
+ if (secrets === void 0) return { unbrokered: "warn" };
331
+ if (typeof secrets !== "object" || secrets === null) throw new UsageError("config.secrets must be an object like { unbrokered: 'error' }");
332
+ unknownKey(secrets, ["unbrokered"], "config.secrets");
333
+ const unbrokered = secrets.unbrokered ?? "warn";
334
+ if (unbrokered !== "warn" && unbrokered !== "error") throw new UsageError(`config.secrets.unbrokered is 'warn' or 'error' (got ${JSON.stringify(unbrokered)})`);
335
+ return { unbrokered };
336
+ }
337
+ const hostCapacity = () => ({
338
+ cpus: availableParallelism(),
339
+ memoryBytes: totalmem()
340
+ });
341
+ /**
342
+ * Attempts mostly wait on a model, so the default is 8, but no more than one per CPU or per GB
343
+ * of memory where the sandboxes run (the Docker VM, under Docker Desktop): an idle agent
344
+ * container takes about 300 MB, and the rest is headroom for what the agent runs.
345
+ */
346
+ function defaultConcurrency({ cpus, memoryBytes }) {
347
+ return Math.max(1, Math.min(8, cpus, Math.floor(memoryBytes / 1e9)));
348
+ }
349
+ function checkConcurrency(value, where) {
350
+ const n = typeof value === "string" && value.trim() !== "" ? Number(value) : value;
351
+ if (typeof n !== "number" || !Number.isInteger(n) || n < 1) throw new UsageError(`${where} must be a whole number of at least 1 (got ${String(value)})`);
352
+ return n;
353
+ }
354
+ /** `--concurrency`, then `REEVAL_CONCURRENCY`, then `concurrency` in the config, then the default. */
355
+ async function resolveConcurrency(config, flag, capacity, env = process.env) {
356
+ if (flag !== void 0) return checkConcurrency(flag, "--concurrency");
357
+ if (env.REEVAL_CONCURRENCY) return checkConcurrency(env.REEVAL_CONCURRENCY, "REEVAL_CONCURRENCY");
358
+ return config.concurrency ?? defaultConcurrency(await capacity());
359
+ }
360
+ function resolveJudge(judge = {}, where = "config.judge") {
361
+ const { model } = judge;
362
+ if (typeof model === "string") {
363
+ const problem = checkModelString(model);
364
+ if (problem) throw new UsageError(`${where}: ${problem}`);
365
+ } else if (model !== void 0 && (typeof model !== "object" || model?.kind !== "fake-judge")) throw new UsageError(`${where}.model must be a "provider/model" string or fakeJudge(). Pass model objects per group, eval or call instead.`);
366
+ const threshold = judge.threshold ?? .8;
367
+ if (!(threshold >= 0 && threshold <= 1)) throw new UsageError(`${where}.threshold must be between 0 and 1`);
368
+ return {
369
+ ...judge,
370
+ threshold
371
+ };
372
+ }
373
+ /** Host variables that required `env` secrets read, as `[sandbox name, host name]`. */
374
+ function secretSources(env) {
375
+ return Object.entries(env).flatMap(([name, value]) => isSecret(value) && !value.optional ? [[name, value.from ?? name]] : []);
376
+ }
377
+ /**
378
+ * Names the environment variables the run's providers need but don't have: the harnesses it
379
+ * plans (default: the config's), the config's judge, and required config and profile secrets.
380
+ */
381
+ function missingCredentials(config, env = process.env, options = {}) {
382
+ const missing = [];
383
+ const keys = new Set((options.harnesses ?? config.harness).flatMap((h) => credentialOf(h) ?? []));
384
+ for (const key of keys) if (!env[key]) missing.push(key);
385
+ if (config.judge.model !== void 0) {
386
+ const judgeKeys = judgeCredentials(config.judge.model);
387
+ if (judgeKeys.length && !judgeKeys.some((k) => env[k])) missing.push(judgeKeys.join(" or "));
388
+ }
389
+ const vars = {
390
+ ...config.env,
391
+ ...options.profile?.defaults.env
392
+ };
393
+ for (const [name, from] of secretSources(vars)) if (!env[from]) missing.push(from === name ? name : `${from} (for ${name})`);
394
+ return missing;
395
+ }
396
+ /** Where a value has its first whitespace or control character, from 1; 0 when it has none. */
397
+ const badCharacterAt = (value) => [...value].findIndex((c) => /[\s\p{Cc}]/u.test(c)) + 1;
398
+ /**
399
+ * Keys the run sends in request headers (the agents' credentials and the judge's) whose value has
400
+ * whitespace or a control character in it, with where the first one is: a key pasted from a
401
+ * wrapped terminal line picks up a line break, and the agent then hangs on a request it can't send
402
+ * rather than failing to authenticate.
403
+ */
404
+ function malformedCredentials(config, env = process.env, options = {}) {
405
+ const names = (options.harnesses ?? config.harness).flatMap((h) => credentialOf(h) ?? []);
406
+ if (config.judge.model !== void 0) names.push(...judgeCredentials(config.judge.model));
407
+ return [...new Set(names)].flatMap((name) => {
408
+ const at = badCharacterAt(env[name] ?? "");
409
+ return at ? [`${name} (character ${at})`] : [];
410
+ });
411
+ }
412
+ //#endregion
413
+ export { defaultConcurrency as a, hostCapacity as c, missingCredentials as d, resolveConcurrency as f, configPathFor as i, loadConfig as l, badCharacterAt as n, defineConfig as o, selectProfile as p, configLabel as r, findConfig as s, CONFIG_FILES as t, malformedCredentials as u };
414
+
415
+ //# sourceMappingURL=config-Cuj0kVYj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-Cuj0kVYj.js","names":[],"sources":["../src/config.ts"],"mappings":";;;;;;;;;;;;;;AAiCA,MAAM,cAAc;CAClB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,eAAe;CAAC;CAAY;CAAS;CAAS;CAAU;CAAU;AAAM;AAC9E,MAAM,gBAAgB;CACpB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,aAAa;CAAC;CAAQ;CAAW;AAAS;;;;;AAQhD,MAAa,gBAAuC,WAAiB;;AAKrE,MAAa,eAAe;CAAC;CAAM;CAAO;CAAO;CAAM;CAAO;AAAK,CAAC,CAAC,KAClE,QAAQ,iBAAiB,KAC5B;AAEA,MAAM,sBAAsB;;;;;;AAO5B,SAAgB,WAAW,OAAO,QAAQ,IAAI,GAAuB;CACnE,KAAK,IAAI,MAAM,QAAQ,IAAI,IAAK,MAAM,QAAQ,GAAG,GAAG;EAClD,KAAK,MAAM,QAAQ,cAAc;GAC/B,MAAM,OAAO,KAAK,KAAK,IAAI;GAC3B,IAAI,WAAW,IAAI,GAAG,OAAO;EAC/B;EACA,IAAI,QAAQ,GAAG,MAAM,KAAK,OAAO,KAAA;CACnC;AACF;;AAGA,MAAa,iBAAiB,SAC5B,SAAS,KAAA,IAAY,WAAW,IAAI,QAAQ,IAAI;;AAGlD,MAAa,eAAe,SAAyB,QAAQ,IAAI,KAAK;;;;;AAMtE,eAAsB,WACpB,MACA,UAAU,OACV,UAA8B,KAAA,GACL;CACzB,IAAI,SAAS,KAAA,GAAW,OAAO,cAAc,CAAC,GAAG,QAAQ,IAAI,GAAG,mBAAmB;CACnF,MAAM,OAAO,QAAQ,IAAI;CACzB,MAAM,aAAa,YAAY,IAAI;CACnC,IAAI,OAAiB,CAAC;CACtB,IAAI,WAAW,IAAI,GAAG;EAEpB,MAAM,SAAU,OAAM,MADH,OAAO,WAAW,aAAa,CAAC,CAAC,MAAM,EAAE,aAAa,MAAM,CAAC,EAAA,CACrD,OAAO,IAAI;EAEtC,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,EAAE,aAAa,SAAS;GACnE,MAAM,QAAQ,UAAU,OAAO,WAAW,WAAW,OAAO,KAAK,MAAM,IAAI,CAAC;GAC5E,MAAM,cAAc,MAAM,SAAS,gBAAgB,MAAM,KAAK,IAAI,EAAE,KAAK;GACzE,MAAM,IAAI,WACR,GAAG,WAAW,wBAAwB,YAAY,0CACpD;EACF;EACA,IAAI,WAAW,OAAO;EACtB,IAAI,OAAO,aAAa,YAAY;GAClC,MAAM,UAAU,QAAQ;GACxB,WAAW,SAAS;IAAE,GAAG,WAAW,IAAI;IAAG,IAAI,KAAK,OAAO;IAAG;IAAS;IAAS;GAAQ,CAAC;GACzF,IAAI,oBAAoB,SACtB,MAAM,IAAI,WACR,gCAAgC,WAAW,kGAC7C;EAEJ;EACA,IAAI,CAAC,YAAY,OAAO,aAAa,YAAY,oBAAoB,SACnE,MAAM,IAAI,WAAW,GAAG,WAAW,yCAAyC;EAE9E,OAAO;CACT,OACE,MAAM,IAAI,WAAW,0BAA0B,YAAY;CAE7D,OAAO,cAAc,MAAM,MAAM,UAAU;AAC7C;AAEA,MAAM,OAAO;;AAGb,SAAgB,SAAS,SAA2B;CAClD,MAAM,OAAO,QAAQ,KAAK,YAAY;EACpC,MAAM,QAAQ,QAAQ,MAAM,GAAG;EAC/B,MAAM,OAAO,MAAM,WAAW,SAAS,KAAK,KAAK,IAAI,CAAC;EACtD,QAAQ,OAAO,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM,MAAM,GAAG,IAAI,EAAA,CAAG,QAAQ,MAAM,KAAK,MAAM,GAAG;CAC5F,CAAC;CACD,MAAM,SAAmB,CAAC;CAC1B,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,MAAM,EAAE,OAAO,KAAA,KAAa,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,KAC9E,OAAO,KAAK,KAAK,EAAE,GAAG,EAAY;CAEpC,OAAO,OAAO,KAAK,GAAG;AACxB;AAEA,MAAM,YAAY;CAAC;CAAO;CAAY;AAAM;AAC5C,MAAM,SAAS;CAAC;CAAU;CAAM;AAAQ;AAExC,MAAM,cAAc,OAAe,SAAmB,UAAkB;CACtE,MAAM,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,SAAS,CAAC,CAAC;CAC/D,IAAI,QAAQ,KAAA,GAAW;CACvB,MAAM,QAAgC;EACpC,OAAO;EACP,SAAS;CACX;CACA,MAAM,IAAI,WACR,mBAAmB,IAAI,OAAO,MAAM,GAAG,MAAM,OAAO,IAAI,MAAM,SAAS,QAAQ,QAAQ,KAAK,IAAI,EAAE,IACpG;AACF;AAEA,SAAgB,YAAY,QAAiB,OAAuB;CAClE,IAAI,WAAW,KAAA,GAAW,OAAO,CAAC;CAClC,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,MAAM,IAAI,WAAW,GAAG,MAAM,yDAAyD;CAEzF,IAAI,SAAS,UAAU,YAAY,QACjC,MAAM,IAAI,WACR,GAAG,MAAM,GAAG,SAAS,SAAS,QAAQ,SAAS,uJACjD;CAEF,WAAW,QAAQ,CAAC,YAAY,UAAU,GAAG,KAAK;CAClD,MAAM,EAAE,UAAU,aAAa;CAC/B,IAAI,aAAa,KAAA,KAAa,EAAE,OAAO,UAAU,QAAQ,KAAK,YAAY,IACxE,MAAM,IAAI,WAAW,GAAG,MAAM,sDAAsD,SAAS,EAAE;CAEjG,IAAI,aAAa,KAAA,GAAW,cAAc,QAAQ;CAClD,OAAO;EAAE,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EAAI,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;CAAG;AAChF;AAEA,MAAM,iBAAiB,MAAe;CACpC,IAAI,OAAO,MAAM,YAAY,MAAM,MAAM,OAAO,KAAK,UAAU,CAAC;CAChE,MAAM,EAAE,SAAS;CACjB,IAAI,SAAS,QAAQ,OAAO;CAC5B,OAAO,YAAY,IAAI,IAAI,GAAG,OAAO,KAAK,CAAC,QAAQ,WAAW;AAChE;AAEA,SAAS,aAAa,MAAc,SAA2B;CAC7D,MAAM,QAAQ,YAAY;CAC1B,IAAI,OAAO,YAAY,YAAY,YAAY,MAC7C,MAAM,IAAI,WAAW,GAAG,MAAM,mDAAmD;CAEnF,WAAW,SAAS,cAAc,KAAK;CACvC,MAAM,IAAI;CACV,IAAI,EAAE,aAAa,KAAA,GAAW;EAC5B,WAAW,EAAE,UAAU,eAAe,GAAG,MAAM,UAAU;EACzD,aAAa,EAAE,UAAU,GAAG,MAAM,UAAU;CAC9C;CACA,IAAI,EAAE,UAAU,KAAA,GAAW;EACzB,WAAW,EAAE,OAAO,YAAY,GAAG,MAAM,OAAO;EAChD,MAAM,EAAE,MAAM,SAAS,YAAY,EAAE;EACrC,IAAI,SAAS,KAAA,KAAa,EAAE,OAAO,UAAU,IAAI,KAAK,QAAQ,IAC5D,MAAM,IAAI,WAAW,GAAG,MAAM,iDAAiD;EAEjF,IACE,YAAY,KAAA,KACZ,YAAY,SACZ,EAAE,OAAO,UAAU,SAAS,WAAW,KAAK,QAAQ,eAAe,IAEnE,MAAM,IAAI,WAAW,GAAG,MAAM,mDAAmD;EAEnF,IAAI,YAAY,KAAA,GAAW;GACzB,MAAM,MAAM,MAAM,QAAQ,OAAO,IAAI,QAAQ,MAAM,MAAM,OAAO,MAAM,QAAQ,IAAI;GAClF,IAAI,QAAQ,KAAA,GACV,MAAM,IAAI,WACR,GAAG,MAAM,yDAAyD,cAAc,GAAG,EAAE,2BAA2B,MAAM,mBACxH;EAEJ;CACF;CACA,IACE,EAAE,SAAS,KAAA,MACV,CAAC,MAAM,QAAQ,EAAE,IAAI,KAAK,EAAE,KAAK,MAAM,MAAM,OAAO,MAAM,QAAQ,IAEnE,MAAM,IAAI,WAAW,GAAG,MAAM,oCAAoC;CAEpE,IAAI,EAAE,WAAW,KAAA,KAAa,CAAC,OAAO,SAAS,EAAE,MAAM,GACrD,MAAM,IAAI,WAAW,GAAG,MAAM,yBAAyB,OAAO,KAAK,IAAI,GAAG;CAE5E,IAAI,EAAE,UAAU,KAAA,GAAW,aAAa,EAAE,OAAO,GAAG,MAAM,OAAO;CACjE,YAAY,EAAE,QAAQ,GAAG,MAAM,QAAQ;CACvC,OAAO;AACT;;AAGA,SAAgB,cACd,QACA,MACA,MAAM,QAAQ,KACU;CACxB,MAAM,aAAsC;EAC1C,IAAI,MAAM,OAAO,CAAC,MAAM,WAAW;EACnC,IAAI,IAAI,gBAAgB,OAAO,CAAC,IAAI,gBAAgB,gBAAgB;EACpE,MAAM,KAAK,KAAK,GAAG;EACnB,IAAI,MAAM,OAAO,eAAe,IAAI,OAAO,CAAC,OAAO,eAAe,IAAI,iBAAiB;EACvF,IAAI,CAAC,MAAM,OAAO,eAAe,OAAO,OAAO,CAAC,OAAO,eAAe,OAAO,SAAS;EACtF,OAAO;CACT;CACA,MAAM,SAAS,KAAK;CACpB,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,CAAC,MAAM,UAAU;CACvB,MAAM,UAAU,OAAO,SAAS;CAChC,IAAI,CAAC,SAAS;EACZ,MAAM,QAAQ,OAAO,KAAK,OAAO,QAAQ;EACzC,MAAM,IAAI,WACR,oBAAoB,KAAK,KAAK,MAAM,SAAS,eAAe,OAAO,KAAK,IAAI,MAAM,KAAK,IAAI,EAAE,KAAK,GAAG,OAAO,KAAK,wBACnH;CACF;CACA,OAAO;EACL;EACA;EACA,UAAU,QAAQ,YAAY,CAAC;EAC/B,OAAO,QAAQ,SAAS,CAAC;EACzB,OAAO,QAAQ,SAAS,CAAC;EACzB,MAAM,QAAQ,QAAQ,CAAC;EACvB,QAAQ;GAAE,GAAG,OAAO;GAAQ,GAAG,QAAQ;EAAO;EAC9C,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;CACrD;AACF;AAEA,SAAgB,cACd,MACA,MACA,OAAe,qBACC;CAChB,IAAI,aAAa,MACf,MAAM,IAAI,WACR,2BAA2B,KAAK,oFAClC;CAEF,aAAa,MAAM,MAAM,WAAW;CACpC,MAAM,UAAU,KAAK,WAAW,CAAC,oBAAoB;CACrD,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM,MAAM,OAAO,MAAM,QAAQ,GACtE,MAAM,IAAI,WAAW,iDAAiD;CAExE,MAAM,SAAS,KAAK,UAAU;CAC9B,IAAI,CAAC,OAAO,SAAS,MAAM,GACzB,MAAM,IAAI,WAAW,gCAAgC,OAAO,KAAK,IAAI,GAAG;CAE1E,MAAM,YAAY,KAAK,SAAS,aAAa;CAC7C,IAAI,CAAC,UAAU,SAAS,SAAS,GAC/B,MAAM,IAAI,WAAW,2CAA2C,UAAU,KAAK,IAAI,GAAG;CAExF,MAAM,aAAa,QAAQ,MAAM,KAAK,SAAS,OAAO,KAAK,SAAS,OAAO,GAAG,UAAU,CAAC;CACzF,MAAM,UAAU,KAAK,YAAY,KAAA,IAAY,CAAC,eAAe,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK;CACrF,IAAI,QAAQ,WAAW,GACrB,MAAM,IAAI,WACR,+BAA+B,KAAK,qCAAqC,iBAC3E;CAEF,eAAe,SAAS,IAAI;CAC5B,MAAM,WAAoC,CAAC;CAC3C,IAAI,KAAK,aAAa,KAAA,GAAW;EAC/B,IAAI,OAAO,KAAK,aAAa,YAAY,KAAK,aAAa,MACzD,MAAM,IAAI,WAAW,eAAe,KAAK,qCAAqC;EAEhF,KAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,KAAK,QAAQ,GACxD,SAAS,QAAQ,aAAa,MAAM,OAAO;CAE/C;CACA,MAAM,iBAAiB,KAAK,kBAAkB,CAAC;CAC/C,WAAW,gBAAgB,CAAC,MAAM,OAAO,GAAG,gBAAgB;CAC5D,KAAK,MAAM,QAAQ,CAAC,eAAe,IAAI,eAAe,KAAK,GACzD,IAAI,SAAS,KAAA,KAAa,CAAC,SAAS,OAClC,MAAM,IAAI,WACR,yBAAyB,KAAK,8BAA8B,OAAO,KAAK,QAAQ,CAAC,CAAC,KAAK,IAAI,KAAK,OAAO,EACzG;CAGJ,OAAO;EACL;EACA;EACA,YAAY,OAAO,KAAK,IAAI;EAC5B;EACA;EACA,SAAS,KAAK,WAAW,OAAO;EAChC,aAAa,KAAK;EAClB,MAAM,KAAK,QAAQ;EACnB,MAAM,KAAK;EACX,KAAK,KAAK,OAAO,CAAC;EAClB,GAAI,KAAK,WAAW,KAAA,IAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;EAC3D,QAAQ,YAAY,KAAK,QAAQ,QAAQ;EACzC;EACA;EACA,OAAO,aAAa,KAAK,KAAK;EAC9B,WAAW,cAAc,KAAK,WAAW,KAAK;EAC9C,aACE,KAAK,gBAAgB,KAAA,IACjB,KAAA,IACA,iBAAiB,KAAK,aAAa,oBAAoB;EAC7D;EACA,SAAS;GAAE,KAAK;GAAY;EAAU;EACtC,SAAS,aAAa,KAAK,OAAO;EAClC,OAAO,WAAW,KAAK,KAAK;EAC5B,UAAU,cAAc,KAAK,QAAQ;CACvC;AACF;AAEA,MAAa,oBAAoB;CAAE,gBAAgB;CAAQ,iBAAiB;AAAM;AAElF,SAAS,cAAc,UAA4D;CACjF,IAAI,aAAa,KAAA,GAAW,OAAO,EAAE,GAAG,kBAAkB;CAC1D,IAAI,OAAO,aAAa,YAAY,aAAa,MAC/C,MAAM,IAAI,WACR,6EACF;CAEF,WACE,UACA;EAAC;EAAS;EAAgB;EAAkB;CAAiB,GAC7D,iBACF;CACA,MAAM,EACJ,OACA,cACA,iBAAiB,kBAAkB,gBACnC,kBAAkB,kBAAkB,oBAClC;CACJ,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,UAAU,iBAAiB,KAAK;EACtC,IAAI,SAAS,MAAM,IAAI,WAAW,QAAQ,QAAQ,eAAe,uBAAuB,CAAC;CAC3F,OAAO,IAAI,UAAU,KAAA,KAAc,OAA6B,SAAS,iBACvE,MAAM,IAAI,WACR,yFACF;CAEF,IAAI,iBAAiB,KAAA,KAAa,OAAO,iBAAiB,UACxD,MAAM,IAAI,WAAW,+CAA+C;CAEtE,IAAI,EAAE,OAAO,UAAU,cAAc,KAAK,kBAAkB,MAC1D,MAAM,IAAI,WACR,+EAA+E,eAAe,EAChG;CAEF,IAAI,EAAE,OAAO,UAAU,eAAe,KAAK,mBAAmB,MAC5D,MAAM,IAAI,WACR,+EAA+E,gBAAgB,EACjG;CAEF,OAAO;EAAE,GAAG;EAAU;EAAgB;CAAgB;AACxD;;AAGA,MAAa,iBAAiB;CAAE,MAAM;CAAI,eAAe;AAAE;AAE3D,SAAS,WAAW,OAAmD;CACrE,IAAI,UAAU,KAAA,GACZ,OAAO;EAAE,MAAM,eAAe;EAAM,kBAAkB,eAAe,gBAAgB,KAAK;CAAG;CAE/F,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,MAAM,IAAI,WAAW,oEAAoE;CAE3F,WAAW,OAAO,CAAC,QAAQ,eAAe,GAAG,cAAc;CAC3D,MAAM,EAAE,OAAO,eAAe,MAAM,gBAAgB,eAAe,kBAAkB;CACrF,IAAI,EAAE,OAAO,UAAU,IAAI,KAAK,QAAQ,IACtC,MAAM,IAAI,WAAW,+DAA+D,KAAK,EAAE;CAE7F,IAAI,EAAE,OAAO,kBAAkB,YAAY,gBAAgB,IACzD,MAAM,IAAI,WACR,yEAAyE,cAAc,EACzF;CAEF,OAAO;EAAE;EAAM,kBAAkB,KAAK,MAAM,gBAAgB,KAAK,EAAE;CAAE;AACvE;AAEA,SAAS,aAAa,SAAyD;CAC7E,IAAI,YAAY,KAAA,GAAW,OAAO,EAAE,YAAY,OAAO;CACvD,IAAI,OAAO,YAAY,YAAY,YAAY,MAC7C,MAAM,IAAI,WAAW,+DAA+D;CAEtF,WAAW,SAAS,CAAC,YAAY,GAAG,gBAAgB;CACpD,MAAM,aAAa,QAAQ,cAAc;CACzC,IAAI,eAAe,UAAU,eAAe,SAC1C,MAAM,IAAI,WACR,uDAAuD,KAAK,UAAU,UAAU,EAAE,EACpF;CAEF,OAAO,EAAE,WAAW;AACtB;AAIA,MAAa,sBAAgC;CAC3C,MAAM,qBAAqB;CAC3B,aAAa,SAAS;AACxB;;;;;;AAOA,SAAgB,mBAAmB,EAAE,MAAM,eAAiC;CAC1E,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM,cAAc,GAAG,CAAC,CAAC;AACrE;AAEA,SAAS,iBAAiB,OAAgB,OAAuB;CAC/D,MAAM,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI;CAC7E,IAAI,OAAO,MAAM,YAAY,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GACvD,MAAM,IAAI,WAAW,GAAG,MAAM,6CAA6C,OAAO,KAAK,EAAE,EAAE;CAE7F,OAAO;AACT;;AAGA,eAAsB,mBACpB,QACA,MACA,UACA,MAAM,QAAQ,KACG;CACjB,IAAI,SAAS,KAAA,GAAW,OAAO,iBAAiB,MAAM,eAAe;CACrE,IAAI,IAAI,oBAAoB,OAAO,iBAAiB,IAAI,oBAAoB,oBAAoB;CAChG,OAAO,OAAO,eAAe,mBAAmB,MAAM,SAAS,CAAC;AAClE;AAEA,SAAS,aACP,QAA2B,CAAC,GAC5B,QAAQ,gBACiB;CACzB,MAAM,EAAE,UAAU;CAClB,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,UAAU,iBAAiB,KAAK;EACtC,IAAI,SAAS,MAAM,IAAI,WAAW,GAAG,MAAM,IAAI,SAAS;CAC1D,OAAO,IAAI,UAAU,KAAA,MAAc,OAAO,UAAU,YAAY,OAAO,SAAS,eAC9E,MAAM,IAAI,WACR,GAAG,MAAM,6GAEX;CAEF,MAAM,YAAY,MAAM,aAAA;CACxB,IAAI,EAAE,aAAa,KAAK,aAAa,IACnC,MAAM,IAAI,WAAW,GAAG,MAAM,mCAAmC;CAEnE,OAAO;EAAE,GAAG;EAAO;CAAU;AAC/B;;AAGA,SAAgB,cAAc,KAAuC;CACnE,OAAO,OAAO,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,WACzC,SAAS,KAAK,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC,MAAM,MAAM,QAAQ,IAAI,CAAqB,IAAI,CAAC,CAC3F;AACF;;;;;AAMA,SAAgB,mBACd,QACA,MAAM,QAAQ,KACd,UAAiF,CAAC,GACxE;CACV,MAAM,UAAoB,CAAC;CAC3B,MAAM,OAAO,IAAI,KAAK,QAAQ,aAAa,OAAO,QAAA,CAAS,SAAS,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;CAChG,KAAK,MAAM,OAAO,MAAM,IAAI,CAAC,IAAI,MAAM,QAAQ,KAAK,GAAG;CACvD,IAAI,OAAO,MAAM,UAAU,KAAA,GAAW;EACpC,MAAM,YAAY,iBAAiB,OAAO,MAAM,KAAK;EACrD,IAAI,UAAU,UAAU,CAAC,UAAU,MAAM,MAAM,IAAI,EAAE,GAAG,QAAQ,KAAK,UAAU,KAAK,MAAM,CAAC;CAC7F;CACA,MAAM,OAAO;EAAE,GAAG,OAAO;EAAK,GAAG,QAAQ,SAAS,SAAS;CAAI;CAC/D,KAAK,MAAM,CAAC,MAAM,SAAS,cAAc,IAAI,GAC3C,IAAI,CAAC,IAAI,OAAO,QAAQ,KAAK,SAAS,OAAO,OAAO,GAAG,KAAK,QAAQ,KAAK,EAAE;CAE7E,OAAO;AACT;;AAGA,MAAa,kBAAkB,UAC7B,CAAC,GAAG,KAAK,CAAC,CAAC,WAAW,MAAM,cAAc,KAAK,CAAC,CAAC,IAAI;;;;;;;AAQvD,SAAgB,qBACd,QACA,MAAM,QAAQ,KACd,UAA+C,CAAC,GACtC;CACV,MAAM,SAAS,QAAQ,aAAa,OAAO,QAAA,CAAS,SAAS,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;CACxF,IAAI,OAAO,MAAM,UAAU,KAAA,GAAW,MAAM,KAAK,GAAG,iBAAiB,OAAO,MAAM,KAAK,CAAC;CACxF,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,SAAS;EAC3C,MAAM,KAAK,eAAe,IAAI,SAAS,EAAE;EACzC,OAAO,KAAK,CAAC,GAAG,KAAK,cAAc,GAAG,EAAE,IAAI,CAAC;CAC/C,CAAC;AACH"}