@doidor/agentrig 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +64 -29
  2. package/dist/agent/copilot.js +46 -5
  3. package/dist/agent/copilot.js.map +1 -1
  4. package/dist/cli.js +36 -6
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/doctor.js +53 -8
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/eval-dynamic.js +316 -0
  9. package/dist/commands/eval-dynamic.js.map +1 -0
  10. package/dist/commands/eval-scaffold.js +173 -0
  11. package/dist/commands/eval-scaffold.js.map +1 -0
  12. package/dist/commands/eval.js +184 -55
  13. package/dist/commands/eval.js.map +1 -1
  14. package/dist/commands/init.js +26 -5
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/update.js +1 -1
  17. package/dist/commands/update.js.map +1 -1
  18. package/dist/core/audit.js +237 -9
  19. package/dist/core/audit.js.map +1 -1
  20. package/dist/core/install.js +28 -1
  21. package/dist/core/install.js.map +1 -1
  22. package/dist/core/model-family.js +31 -0
  23. package/dist/core/model-family.js.map +1 -0
  24. package/dist/core/scenario-runner.js +298 -0
  25. package/dist/core/scenario-runner.js.map +1 -0
  26. package/dist/prompts/index.js +121 -30
  27. package/dist/prompts/index.js.map +1 -1
  28. package/knowledge/PRINCIPLES.md +2 -2
  29. package/knowledge/manifest.json +16 -1
  30. package/knowledge/templates/AGENTS.md +7 -6
  31. package/knowledge/templates/agents/README.md +4 -4
  32. package/knowledge/templates/agents/developer.yml +1 -1
  33. package/knowledge/templates/agents/judge.yml +1 -1
  34. package/knowledge/templates/agents/reviewer.yml +1 -1
  35. package/knowledge/templates/agents/triager.yml +5 -4
  36. package/knowledge/templates/dashboard/dashboard.mjs +12 -5
  37. package/knowledge/templates/eval/RUBRIC.md +87 -64
  38. package/knowledge/templates/eval/axes.json +25 -25
  39. package/knowledge/templates/eval/calibration/README.md +54 -0
  40. package/knowledge/templates/eval/calibration/review/seed-correct.yml +43 -0
  41. package/knowledge/templates/eval/calibration/run/seed-correct.yml +35 -0
  42. package/knowledge/templates/eval/calibration/run/seed-no-verify.yml +34 -0
  43. package/knowledge/templates/eval/checks.json +88 -11
  44. package/knowledge/templates/eval/scenarios/add-small-feature/README.md +17 -0
  45. package/knowledge/templates/eval/scenarios/add-small-feature/fixture/SPEC.md +25 -0
  46. package/knowledge/templates/eval/scenarios/add-small-feature/fixture/package.json +9 -0
  47. package/knowledge/templates/eval/scenarios/add-small-feature/fixture/src/slugify.js +5 -0
  48. package/knowledge/templates/eval/scenarios/add-small-feature/fixture/tests/feature.test.js +31 -0
  49. package/knowledge/templates/eval/scenarios/add-small-feature/judge_brief.md +25 -0
  50. package/knowledge/templates/eval/scenarios/add-small-feature/oracle.yml +41 -0
  51. package/knowledge/templates/eval/scenarios/add-small-feature/prompt.md +17 -0
  52. package/knowledge/templates/eval/scenarios/add-small-feature/scenario.yml +22 -0
  53. package/knowledge/templates/eval/scenarios/fix-failing-test/README.md +18 -0
  54. package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/package.json +9 -0
  55. package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/src/math.js +13 -0
  56. package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/tests/add.test.js +7 -0
  57. package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/tests/divide.test.js +11 -0
  58. package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/tests/multiply.test.js +7 -0
  59. package/knowledge/templates/eval/scenarios/fix-failing-test/judge_brief.md +20 -0
  60. package/knowledge/templates/eval/scenarios/fix-failing-test/oracle.yml +33 -0
  61. package/knowledge/templates/eval/scenarios/fix-failing-test/prompt.md +12 -0
  62. package/knowledge/templates/eval/scenarios/fix-failing-test/scenario.yml +23 -0
  63. package/knowledge/templates/eval/scenarios/review-catches-bug/README.md +17 -0
  64. package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/baseline/package.json +6 -0
  65. package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/baseline/src/format.js +4 -0
  66. package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/baseline/src/pagination.js +7 -0
  67. package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/change/src/format.js +6 -0
  68. package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/change/src/pagination.js +7 -0
  69. package/knowledge/templates/eval/scenarios/review-catches-bug/judge_brief.md +38 -0
  70. package/knowledge/templates/eval/scenarios/review-catches-bug/oracle.yml +29 -0
  71. package/knowledge/templates/eval/scenarios/review-catches-bug/prompt.md +33 -0
  72. package/knowledge/templates/eval/scenarios/review-catches-bug/scenario.yml +23 -0
  73. package/knowledge/templates/eval/score.mjs +368 -42
  74. package/knowledge/templates/eval/static-audit.mjs +204 -17
  75. package/knowledge/templates/harness/state-machine.yml +18 -12
  76. package/knowledge/templates/skills/harness-eval/SKILL.md +59 -54
  77. package/knowledge/templates/skills/log-gotcha/SKILL.md +68 -0
  78. package/knowledge/templates/skills/self-verify/SKILL.md +32 -8
  79. package/package.json +4 -3
  80. package/knowledge/templates/eval/scenarios/README.md +0 -24
  81. package/knowledge/templates/eval/scenarios/add-small-feature.md +0 -28
  82. package/knowledge/templates/eval/scenarios/fix-failing-test.md +0 -27
  83. package/knowledge/templates/eval/scenarios/review-catches-bug.md +0 -30
@@ -0,0 +1,316 @@
1
+ /**
2
+ * Dynamic eval orchestrator (P3-P4). Owns the per-scenario flow:
3
+ * seed worktree -> producer conv (in worktree) -> capture diff
4
+ * -> run oracle (hard axes) -> judge conv (separate, different family)
5
+ * -> save record via score.mjs with both producer+judge model metadata.
6
+ *
7
+ * --n controls trial count; each trial is an independent seed+producer+oracle+judge cycle.
8
+ * --variant tags the records so `score.mjs compare --baseline` can compute lift.
9
+ *
10
+ * For `variant=baseline` the producer prompt explicitly tells the agent to ignore AGENTS.md/
11
+ * rules/skills; the same scenario otherwise runs identically. That's the harness on/off A/B.
12
+ */
13
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, cpSync } from "node:fs";
14
+ import { spawnSync } from "node:child_process";
15
+ import { join, resolve } from "node:path";
16
+ import { color, log } from "../core/logger.js";
17
+ import { ActivityMonitor } from "../core/activity.js";
18
+ import { getProvider } from "../agent/index.js";
19
+ import { AgentTimeoutError } from "../agent/provider.js";
20
+ import { listScenarios, locateScenario, loadScenario, loadOracle, seedWorktree, runOracle, oracleAxisScores, oracleAxesToFlags, captureDiff, } from "../core/scenario-runner.js";
21
+ import { modelFamily, sameFamily } from "../core/model-family.js";
22
+ import { buildProducerPrompt, buildJudgePrompt, SYSTEM_MESSAGE } from "../prompts/index.js";
23
+ /** Stage the AgentRig harness (AGENTS.md + .agents/ + .agentrig/) into a worktree for the
24
+ * "harness" variant so the producer agent sees the same instructions/skills/rules an
25
+ * AgentRig-installed repo would have, then fold the staged files into the baseline commit
26
+ * so they don't pollute the producer's diff. Skipped for the "baseline" variant. */
27
+ function stageHarnessInto(worktree, repoRoot, variant) {
28
+ if (variant === "baseline")
29
+ return;
30
+ let staged = false;
31
+ for (const rel of ["AGENTS.md", ".agents", ".agentrig"]) {
32
+ const src = join(repoRoot, rel);
33
+ if (!existsSync(src))
34
+ continue;
35
+ cpSync(src, join(worktree, rel), { recursive: true });
36
+ staged = true;
37
+ }
38
+ if (!staged)
39
+ return;
40
+ // CRITICAL: fold the staged harness into the baseline commit. Without this, every staged
41
+ // file shows up in captureDiff() as part of the producer's change → oracle scope check
42
+ // erroneously sees "+5000 lines / 100 files" and the judge scores scope/maintainability=0
43
+ // for a producer who only edited two files. (Caught by user-reported eval run 2026-06-10.)
44
+ spawnSync("git", ["add", "-A"], { cwd: worktree });
45
+ spawnSync("git", ["commit", "-q", "--amend", "--no-edit"], { cwd: worktree });
46
+ }
47
+ /** Save a scenario score by shelling out to the installed score.mjs (single source of truth
48
+ * for the on-disk format + validation). Returns the child exit status. */
49
+ function saveScoreViaScript(repoRoot, type, scenarioId, axisFlags, opts) {
50
+ const script = join(repoRoot, ".agentrig", "eval", "score.mjs");
51
+ const args = [
52
+ script,
53
+ "save",
54
+ "--type", type,
55
+ "--task", scenarioId,
56
+ "--scenario", scenarioId,
57
+ "--judge", opts.judgeModel || "n/a",
58
+ "--variant", opts.variant,
59
+ "--run", opts.runId,
60
+ ...axisFlags.flatMap((f) => ["--axis", f]),
61
+ ];
62
+ // Producer/judge metadata is appended via env so score.mjs can record + validate without
63
+ // adding new positional flags. The new flags are picked up by env in score.mjs's save.
64
+ const env = {
65
+ ...process.env,
66
+ AGENTRIG_PRODUCER_MODEL: opts.producerModel || "",
67
+ AGENTRIG_JUDGE_MODEL: opts.judgeModel || "",
68
+ AGENTRIG_ALLOW_SAME_FAMILY: opts.allowSameFamily ? "1" : "",
69
+ };
70
+ const res = spawnSync(process.execPath, args, { encoding: "utf8", env });
71
+ return { status: res.status ?? 1, stdout: res.stdout ?? "", stderr: res.stderr ?? "" };
72
+ }
73
+ /** Read judge soft scores from <artifactsDir>/<scenario>.<trial>.judge.json (judge writes
74
+ * this file via the prompt — provider-agnostic so we don't depend on tool-calling APIs). */
75
+ function readJudgeScores(artifactsDir, scenarioId, trial) {
76
+ const path = join(artifactsDir, `${scenarioId}.trial${trial}.judge.json`);
77
+ if (!existsSync(path))
78
+ return null;
79
+ try {
80
+ const obj = JSON.parse(readFileSync(path, "utf8"));
81
+ return Array.isArray(obj?.axes) ? obj : null;
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ function judgeAxesToFlags(judgeOut) {
88
+ return judgeOut.axes.map((a) => {
89
+ if (a.confidence === 0)
90
+ return `${a.name}=na`;
91
+ if (a.score >= 1)
92
+ return `${a.name}=1.0`;
93
+ const code = a.code || "";
94
+ const ev = (a.evidence || "judge-scored").replace(/:/g, ";").slice(0, 200);
95
+ return `${a.name}=${a.score}:${code}:${ev}`;
96
+ });
97
+ }
98
+ /** Run one trial of one scenario: producer → oracle → judge → save. */
99
+ async function runOneTrial(repoRoot, paths, trial, opts) {
100
+ const fm = loadScenario(paths);
101
+ const oracle = loadOracle(paths);
102
+ const wt = seedWorktree(paths.fixtureDir, opts.runId, `${fm.id}.trial${trial}`);
103
+ log.info(color.dim(` [${fm.id} trial ${trial + 1}/${opts.trials}] worktree ${wt}`));
104
+ stageHarnessInto(wt, repoRoot, opts.variant);
105
+ // ---- 1. Producer ----
106
+ // The dogfood scenario skips the producer entirely — the oracle runs `agentrig init` itself.
107
+ const promptText = readFileSync(paths.promptMd, "utf8");
108
+ const isDogfood = fm.id === "agentrig-init-on-empty-repo";
109
+ let producerTranscript = "";
110
+ if (!isDogfood) {
111
+ const provider = getProvider();
112
+ const monitor = new ActivityMonitor().start();
113
+ let convo = null;
114
+ try {
115
+ convo = await provider.startConversation({
116
+ cwd: wt,
117
+ systemMessage: SYSTEM_MESSAGE,
118
+ onEvent: monitor.handle,
119
+ ...(opts.producerModel ? { model: opts.producerModel } : {}),
120
+ ...(opts.timeoutMinutes ? { maxMs: opts.timeoutMinutes * 60 * 1000 } : {}),
121
+ });
122
+ producerTranscript = await convo.send(buildProducerPrompt(promptText, opts.variant));
123
+ }
124
+ catch (err) {
125
+ if (err instanceof AgentTimeoutError) {
126
+ log.warn(` producer timed out: ${err.message}`);
127
+ producerTranscript = `[producer timed out: ${err.message}]`;
128
+ }
129
+ else {
130
+ throw err;
131
+ }
132
+ }
133
+ finally {
134
+ // Stop the heartbeat first so a failure later (e.g. convo.end()) doesn't keep it
135
+ // ticking. setInterval was the silent leak that flooded the terminal pre-fix.
136
+ monitor.stop();
137
+ if (convo)
138
+ await convo.end().catch(() => undefined);
139
+ }
140
+ }
141
+ // ---- 2. Oracle ----
142
+ const oracleEnv = {};
143
+ if (isDogfood)
144
+ oracleEnv.AGENTRIG_CLI = resolve(repoRoot, "dist/cli.js");
145
+ const oracleResults = runOracle(wt, oracle, oracleEnv);
146
+ const oracleAxes = oracleAxisScores(oracleResults);
147
+ const oracleFlags = oracleAxesToFlags(oracleAxes, fm.type);
148
+ const oraclePassed = oracleAxes.every((a) => a.score === 1);
149
+ // Persist diff + transcript so regressions are inspectable.
150
+ const diff = captureDiff(wt);
151
+ writeFileSync(join(opts.artifactsDir, `${fm.id}.trial${trial}.diff.patch`), diff);
152
+ writeFileSync(join(opts.artifactsDir, `${fm.id}.trial${trial}.transcript.md`), producerTranscript || "(no producer transcript — dogfood scenario)");
153
+ writeFileSync(join(opts.artifactsDir, `${fm.id}.trial${trial}.oracle.json`), JSON.stringify({ axes: oracleAxes, raw: oracleResults }, null, 2));
154
+ // ---- 3. Judge ----
155
+ let judgeFlags = [];
156
+ const wantJudge = Array.isArray(fm.judge_axes) && fm.judge_axes.length > 0;
157
+ if (wantJudge) {
158
+ if (opts.judgeModel) {
159
+ const provider = getProvider();
160
+ const monitor = new ActivityMonitor().start();
161
+ const judgeOutPath = join(opts.artifactsDir, `${fm.id}.trial${trial}.judge.json`);
162
+ const judgeCwd = join(opts.artifactsDir, `judge.${fm.id}.trial${trial}`);
163
+ let convo = null;
164
+ let judgeFailed = false;
165
+ try {
166
+ mkdirSync(judgeCwd, { recursive: true });
167
+ // The judge sees ONLY: prompt, diff, transcript, oracle results, brief. NOT the producer worktree.
168
+ writeFileSync(join(judgeCwd, "prompt.md"), promptText);
169
+ writeFileSync(join(judgeCwd, "diff.patch"), diff);
170
+ writeFileSync(join(judgeCwd, "transcript.md"), producerTranscript || "");
171
+ writeFileSync(join(judgeCwd, "oracle.json"), JSON.stringify(oracleAxes, null, 2));
172
+ if (paths.judgeBriefMd)
173
+ writeFileSync(join(judgeCwd, "judge_brief.md"), readFileSync(paths.judgeBriefMd, "utf8"));
174
+ convo = await provider.startConversation({
175
+ cwd: judgeCwd,
176
+ systemMessage: SYSTEM_MESSAGE,
177
+ onEvent: monitor.handle,
178
+ ...(opts.judgeModel ? { model: opts.judgeModel } : {}),
179
+ ...(opts.timeoutMinutes ? { maxMs: Math.max(1, Math.floor((opts.timeoutMinutes ?? 30) / 3)) * 60 * 1000 } : {}),
180
+ });
181
+ await convo.send(buildJudgePrompt({
182
+ scenario: fm.id,
183
+ type: fm.type,
184
+ judgeAxes: fm.judge_axes ?? [],
185
+ outputJsonPath: judgeOutPath,
186
+ rubricPath: resolve(repoRoot, ".agentrig/eval/axes.json"),
187
+ }));
188
+ }
189
+ catch (err) {
190
+ judgeFailed = true;
191
+ if (err instanceof AgentTimeoutError) {
192
+ log.warn(` judge timed out: ${err.message}`);
193
+ }
194
+ else {
195
+ // Don't bail the whole trial — soft axes will just be marked na below. Log so the
196
+ // operator sees the cause (e.g. "Model X is not available").
197
+ log.warn(` judge failed (${err.message}); soft axes will be na for this trial`);
198
+ }
199
+ }
200
+ finally {
201
+ // Stop the heartbeat first so any later failure (e.g. convo.end()) doesn't keep it ticking.
202
+ monitor.stop();
203
+ if (convo)
204
+ await convo.end().catch(() => undefined);
205
+ }
206
+ if (!judgeFailed) {
207
+ const judgeOut = readJudgeScores(opts.artifactsDir, fm.id, trial);
208
+ if (judgeOut)
209
+ judgeFlags = judgeAxesToFlags(judgeOut);
210
+ else
211
+ log.warn(` judge did not write ${judgeOutPath} — soft axes recorded as na`);
212
+ }
213
+ }
214
+ // If no judge model OR judge failed to write, mark soft axes na so they're excluded from rollup.
215
+ if (judgeFlags.length === 0)
216
+ judgeFlags = (fm.judge_axes ?? []).map((a) => `${a}=na`);
217
+ }
218
+ // ---- 4. Save ----
219
+ const allFlags = [...oracleFlags, ...judgeFlags];
220
+ const saved = saveScoreViaScript(repoRoot, fm.type, fm.id, allFlags, {
221
+ variant: opts.variant,
222
+ runId: opts.runId,
223
+ producerModel: opts.producerModel ?? "",
224
+ judgeModel: opts.judgeModel ?? "",
225
+ allowSameFamily: Boolean(opts.allowSameFamily),
226
+ });
227
+ const notes = saved.stderr ? saved.stderr.split("\n").filter(Boolean).slice(-2).join(" | ") : "";
228
+ if (saved.status !== 0)
229
+ log.warn(` score.mjs save failed (${saved.status}): ${notes}`);
230
+ return { scenario: fm.id, trialIndex: trial, oraclePassed, saveExit: saved.status, notes };
231
+ }
232
+ /** Run every scenario × every trial. Returns one outcome per (scenario, trial). */
233
+ export async function runDynamicEval(repoRoot, opts) {
234
+ // Resolve scenario list, then filter out `bundled: true` unless the user opted in.
235
+ // When --scenario <id> is explicit, we always run it (the user named it, they get it).
236
+ let ids;
237
+ let bundledExcluded = [];
238
+ if (opts.scenario) {
239
+ ids = [opts.scenario];
240
+ }
241
+ else {
242
+ const all = listScenarios(repoRoot);
243
+ ids = [];
244
+ for (const id of all) {
245
+ const paths = locateScenario(repoRoot, id);
246
+ if (!paths)
247
+ continue;
248
+ let fm;
249
+ try {
250
+ fm = loadScenario(paths);
251
+ }
252
+ catch {
253
+ continue;
254
+ }
255
+ if (fm.bundled === true && !opts.includeBundled) {
256
+ bundledExcluded.push({ id, reason: "bundled (template; pass --include-bundled to run it)" });
257
+ continue;
258
+ }
259
+ ids.push(id);
260
+ }
261
+ if (bundledExcluded.length) {
262
+ log.info(color.dim(` Excluded ${bundledExcluded.length} bundled scenario(s) from default run: ${bundledExcluded.map((b) => b.id).join(", ")}`));
263
+ log.info(color.dim(" Pass --include-bundled to run them too, or generate repo-specific ones with `agentrig eval --scaffold`."));
264
+ }
265
+ if (ids.length === 0) {
266
+ log.warn("No repo-specific scenarios found.");
267
+ log.warn("Generate some with: agentrig eval --scaffold");
268
+ log.warn("Or run the bundled template scenarios anyway: agentrig eval --dynamic --include-bundled");
269
+ return [];
270
+ }
271
+ }
272
+ const outcomes = [];
273
+ // Family enforcement up-front so we fail fast (before the first model call).
274
+ if (opts.producerModel && opts.judgeModel && !opts.allowSameFamily) {
275
+ if (sameFamily(opts.producerModel, opts.judgeModel)) {
276
+ throw new Error(`producer "${opts.producerModel}" and judge "${opts.judgeModel}" share family "${modelFamily(opts.producerModel)}". ` +
277
+ `Pass --allow-same-family to override (recorded in every result).`);
278
+ }
279
+ }
280
+ // Pre-flight model validation: catch typos in producer/judge model ids before we burn 30s
281
+ // of producer work just to crash at the judge call. This is what bit us when the default
282
+ // judge model was "gpt-5" (which doesn't exist; the real id is "gpt-5.4").
283
+ const provider = getProvider();
284
+ if (provider.validateModel) {
285
+ for (const [role, model] of [["producer", opts.producerModel], ["judge", opts.judgeModel]]) {
286
+ if (!model)
287
+ continue;
288
+ const v = await provider.validateModel(model);
289
+ if (!v.ok) {
290
+ throw new Error(`${role} model "${model}" not available from provider "${provider.name}". ${v.detail ?? ""} ` +
291
+ `Fix by editing .agentrig/agents/${role === "producer" ? "developer" : "reviewer"}.yml ` +
292
+ `or passing --${role}-model <id>.`);
293
+ }
294
+ }
295
+ }
296
+ for (const id of ids) {
297
+ const paths = locateScenario(repoRoot, id);
298
+ if (!paths) {
299
+ log.warn(`scenario "${id}" not found — skipping`);
300
+ continue;
301
+ }
302
+ log.step(`scenario ${color.bold(id)} (${opts.trials} trial${opts.trials > 1 ? "s" : ""})`);
303
+ for (let trial = 0; trial < opts.trials; trial++) {
304
+ try {
305
+ const outcome = await runOneTrial(repoRoot, paths, trial, opts);
306
+ outcomes.push(outcome);
307
+ }
308
+ catch (err) {
309
+ log.error(`scenario ${id} trial ${trial + 1} failed: ${err.message}`);
310
+ outcomes.push({ scenario: id, trialIndex: trial, oraclePassed: false, saveExit: 1, notes: err.message });
311
+ }
312
+ }
313
+ }
314
+ return outcomes;
315
+ }
316
+ //# sourceMappingURL=eval-dynamic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-dynamic.js","sourceRoot":"","sources":["../../src/commands/eval-dynamic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * `agentrig eval --scaffold` orchestrator. Asks the agent to generate repo-specific scenarios
3
+ * alongside the bundled generic ones, then validates each new scenario's structure via the
4
+ * existing scenario-runner load logic. No-ops for invalid output rather than corrupting the
5
+ * eval surface.
6
+ */
7
+ import { existsSync, readFileSync } from "node:fs";
8
+ import { ActivityMonitor } from "../core/activity.js";
9
+ import { color, log } from "../core/logger.js";
10
+ import { getProvider } from "../agent/index.js";
11
+ import { AgentTimeoutError } from "../agent/provider.js";
12
+ import { listScenarios, locateScenario, loadScenario, loadOracle, } from "../core/scenario-runner.js";
13
+ import { buildScaffoldScenariosPrompt, SYSTEM_MESSAGE } from "../prompts/index.js";
14
+ import { join } from "../core/fsutil.js";
15
+ /** Discover up to 3 existing scenarios to use as templates for the agent. Prefers
16
+ * small fixtures so the prompt stays compact. */
17
+ function collectExamples(repoRoot) {
18
+ const ids = listScenarios(repoRoot).filter((id) => id !== "agentrig-init-on-empty-repo");
19
+ const out = [];
20
+ for (const id of ids.slice(0, 3)) {
21
+ const paths = locateScenario(repoRoot, id);
22
+ if (!paths)
23
+ continue;
24
+ out.push({
25
+ id,
26
+ scenarioYml: existsSync(paths.scenarioYml) ? readFileSync(paths.scenarioYml, "utf8") : "",
27
+ promptMd: existsSync(paths.promptMd) ? readFileSync(paths.promptMd, "utf8") : "",
28
+ oracleYml: existsSync(paths.oracleYml) ? readFileSync(paths.oracleYml, "utf8") : "",
29
+ });
30
+ }
31
+ return out;
32
+ }
33
+ /** Pull the allowed axis names from the live axes.json registry so the prompt can constrain
34
+ * the agent to existing axes (otherwise the new scenario won't score). */
35
+ function collectAxesAvailable(repoRoot) {
36
+ const axesPath = join(repoRoot, ".agentrig/eval/axes.json");
37
+ if (!existsSync(axesPath))
38
+ return { types: [], axisNames: [] };
39
+ const axes = JSON.parse(readFileSync(axesPath, "utf8"));
40
+ const types = Object.keys(axes.types ?? {});
41
+ const axisNames = new Set();
42
+ for (const t of Object.values(axes.types ?? {})) {
43
+ for (const cat of Object.values(t.categories ?? {})) {
44
+ for (const axis of Object.keys(cat))
45
+ axisNames.add(axis);
46
+ }
47
+ }
48
+ return { types, axisNames: [...axisNames].sort() };
49
+ }
50
+ /** Validate one newly-generated scenario. Catches parse errors + obvious schema gaps
51
+ * (unknown axes, missing fixture dir) before the user runs `eval --dynamic`. */
52
+ function validateScaffoldedScenario(repoRoot, id, allowedAxes) {
53
+ const paths = locateScenario(repoRoot, id);
54
+ if (!paths)
55
+ return { ok: false, reason: "scenario directory disappeared after agent run" };
56
+ if (!existsSync(paths.fixtureDir))
57
+ return { ok: false, reason: "missing fixture/ directory" };
58
+ let fm;
59
+ try {
60
+ fm = loadScenario(paths);
61
+ }
62
+ catch (e) {
63
+ return { ok: false, reason: `scenario.yml parse error: ${e.message}` };
64
+ }
65
+ let oracle;
66
+ try {
67
+ oracle = loadOracle(paths);
68
+ }
69
+ catch (e) {
70
+ return { ok: false, reason: `oracle.yml parse error: ${e.message}` };
71
+ }
72
+ // Every axis referenced (oracle_axes, judge_axes, oracle.checks[].axis) must exist in axes.json.
73
+ const referenced = new Set([
74
+ ...(fm.oracle_axes ?? []),
75
+ ...(fm.judge_axes ?? []),
76
+ ...oracle.checks.map((c) => c.axis),
77
+ ]);
78
+ const unknown = [...referenced].filter((a) => a && !allowedAxes.has(a));
79
+ if (unknown.length)
80
+ return { ok: false, reason: `unknown axes: ${unknown.join(", ")}` };
81
+ if (!existsSync(paths.promptMd))
82
+ return { ok: false, reason: "missing prompt.md" };
83
+ return { ok: true };
84
+ }
85
+ export async function scaffoldScenarios(repoRoot, opts) {
86
+ const provider = getProvider();
87
+ const pre = await provider.preflight();
88
+ if (!pre.ok)
89
+ throw new Error(`agent unavailable: ${pre.detail}`);
90
+ log.ok(`agent ready (${pre.detail})`);
91
+ if (opts.producerModel && provider.validateModel) {
92
+ const v = await provider.validateModel(opts.producerModel);
93
+ if (!v.ok)
94
+ throw new Error(`model "${opts.producerModel}" not available. ${v.detail ?? ""}`);
95
+ }
96
+ const before = new Set(listScenarios(repoRoot));
97
+ const examples = collectExamples(repoRoot);
98
+ if (examples.length === 0) {
99
+ throw new Error("no existing scenarios found to use as templates. Run `agentrig init` first so the " +
100
+ "generic scenarios are installed at .agentrig/eval/scenarios/.");
101
+ }
102
+ const axesAvailable = collectAxesAvailable(repoRoot);
103
+ if (axesAvailable.axisNames.length === 0) {
104
+ throw new Error("no axes registered at .agentrig/eval/axes.json — run `agentrig init` first.");
105
+ }
106
+ const contextMdPath = join(repoRoot, ".agentrig/context.md");
107
+ const contextMd = existsSync(contextMdPath) ? readFileSync(contextMdPath, "utf8") : "";
108
+ if (!contextMd) {
109
+ log.warn("no .agentrig/context.md found — the agent will investigate the repo itself,");
110
+ log.warn("which adds time. Consider running `agentrig init` (without --skip-agent) first.");
111
+ }
112
+ log.step(`scaffolding ${opts.count} repo-specific scenario(s)…`);
113
+ log.info(color.dim(` Using ${examples.length} existing scenario(s) as templates: ${examples.map((e) => e.id).join(", ")}`));
114
+ log.info(color.dim(` Available axes (${axesAvailable.axisNames.length}): ${axesAvailable.axisNames.slice(0, 6).join(", ")}…`));
115
+ const monitor = new ActivityMonitor().start();
116
+ let convo = null;
117
+ try {
118
+ convo = await provider.startConversation({
119
+ cwd: repoRoot,
120
+ systemMessage: SYSTEM_MESSAGE,
121
+ onEvent: monitor.handle,
122
+ ...(opts.producerModel ? { model: opts.producerModel } : {}),
123
+ ...(opts.timeoutMinutes ? { maxMs: opts.timeoutMinutes * 60 * 1000 } : {}),
124
+ });
125
+ await convo.send(buildScaffoldScenariosPrompt({
126
+ count: opts.count,
127
+ contextMd,
128
+ examples,
129
+ axesAvailable,
130
+ }));
131
+ }
132
+ catch (err) {
133
+ if (err instanceof AgentTimeoutError)
134
+ log.warn(`agent stopped: ${err.message}`);
135
+ else
136
+ throw err;
137
+ }
138
+ finally {
139
+ monitor.stop();
140
+ if (convo)
141
+ await convo.end().catch(() => undefined);
142
+ }
143
+ const after = listScenarios(repoRoot);
144
+ const created = after.filter((id) => !before.has(id));
145
+ const allowed = new Set(axesAvailable.axisNames);
146
+ const validated = [];
147
+ const invalid = [];
148
+ for (const id of created) {
149
+ const v = validateScaffoldedScenario(repoRoot, id, allowed);
150
+ if (v.ok) {
151
+ validated.push(id);
152
+ log.ok(` ${id} — validated`);
153
+ }
154
+ else {
155
+ invalid.push({ id, reason: v.reason });
156
+ log.error(` ${id} — INVALID: ${v.reason}`);
157
+ }
158
+ }
159
+ log.info("");
160
+ if (created.length === 0) {
161
+ log.warn("agent produced 0 new scenarios. Re-run with --verbose to see what it did.");
162
+ }
163
+ else {
164
+ log.ok(`created ${created.length} scenario(s); ${validated.length} valid, ${invalid.length} invalid`);
165
+ if (invalid.length) {
166
+ log.warn("invalid scenarios were NOT deleted; inspect them under .agentrig/eval/scenarios/<id>/");
167
+ log.warn("then either fix them by hand or remove the directory and re-run --scaffold.");
168
+ }
169
+ log.info(color.dim(" Run a new scenario with: agentrig eval --dynamic --scenario <id>"));
170
+ }
171
+ return { created, validated, invalid };
172
+ }
173
+ //# sourceMappingURL=eval-scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-scaffold.js","sourceRoot":"","sources":["../../src/commands/eval-scaffold.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,aAAa,EACb,cAAc,EACd,YAAY,EACZ,UAAU,GACX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,4BAA4B,EAAE,cAAc,EAAwB,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAczC;kDACkD;AAClD,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,6BAA6B,CAAC,CAAC;IACzF,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,GAAG,CAAC,IAAI,CAAC;YACP,EAAE;YACF,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YACzF,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YAChF,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;SACpF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;2EAC2E;AAC3E,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAA2D,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1G,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YACpD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AACrD,CAAC;AAED;iFACiF;AACjF,SAAS,0BAA0B,CACjC,QAAgB,EAChB,EAAU,EACV,WAAwB;IAExB,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAC;IAC3F,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IAC9F,IAAI,EAAmC,CAAC;IACxC,IAAI,CAAC;QACH,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA8B,CAAW,CAAC,OAAO,EAAE,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,MAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA4B,CAAW,CAAC,OAAO,EAAE,EAAE,CAAC;IAClF,CAAC;IACD,iGAAiG;IACjG,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS;QACjC,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC;QACzB,GAAG,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC;QACxB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;KACpC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACxF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACnF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,IAAqB;IAC7E,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,GAAG,CAAC,EAAE,CAAC,gBAAgB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3D,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,aAAa,oBAAoB,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,oFAAoF;YACpF,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QACxF,GAAG,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;IAC9F,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,6BAA6B,CAAC,CAAC;IACjE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,MAAM,uCAAuC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7H,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,aAAa,CAAC,SAAS,CAAC,MAAM,MAAM,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhI,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC,KAAK,EAAE,CAAC;IAC9C,IAAI,KAAK,GAAkE,IAAI,CAAC;IAChF,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC;YACvC,GAAG,EAAE,QAAQ;YACb,aAAa,EAAE,cAAc;YAC7B,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC;YAC5C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS;YACT,QAAQ;YACR,aAAa;SACd,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,iBAAiB;YAAE,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;;YAC3E,MAAM,GAAG,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAqC,EAAE,CAAC;IACrD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,0BAA0B,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACT,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnB,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IACxF,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,EAAE,CAAC,WAAW,OAAO,CAAC,MAAM,iBAAiB,SAAS,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QACtG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;YAClG,GAAG,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAC1F,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC"}