flakelab 0.1.5 → 0.1.7
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.
- package/README.md +7 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/repair.js +8 -1
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/replay.js +6 -0
- package/dist/commands/replay.js.map +1 -1
- package/dist/domain/schema.d.ts +2 -2
- package/dist/investigator/agent.js +44 -56
- package/dist/investigator/agent.js.map +1 -1
- package/dist/investigator/planning.d.ts +110 -0
- package/dist/investigator/planning.js +78 -0
- package/dist/investigator/planning.js.map +1 -0
- package/dist/investigator/schema.d.ts +3 -3
- package/dist/repair/workspace.d.ts +2 -0
- package/dist/repair/workspace.js +12 -0
- package/dist/repair/workspace.js.map +1 -1
- package/dist/report/schema.d.ts +1 -1
- package/dist/ui/diff.d.ts +3 -0
- package/dist/ui/diff.js +36 -0
- package/dist/ui/diff.js.map +1 -0
- package/dist/ui/progress.d.ts +11 -3
- package/dist/ui/progress.js +61 -4
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/theme.d.ts +2 -0
- package/dist/ui/theme.js +4 -0
- package/dist/ui/theme.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -350,13 +350,19 @@ received. FlakeLab rejects test changes,
|
|
|
350
350
|
assertion weakening, lint suppressions, credential-like additions, path escapes, and numeric-only
|
|
351
351
|
timeout increases before execution.
|
|
352
352
|
|
|
353
|
-
The candidate is
|
|
353
|
+
The candidate diff is rendered in an interactive terminal and saved to `candidate.diff` before
|
|
354
|
+
proof begins, without changing the working tree. The candidate is then copied into a disposable
|
|
355
|
+
Solari microVM. Typecheck, lint, hostile trials, clean
|
|
354
356
|
controls, and up to 50 nested or co-located `.spec.*` and `.test.*` regression files all run there.
|
|
355
357
|
The machine is destroyed afterward, and the
|
|
356
358
|
candidate is returned as a reviewable diff; FlakeLab never applies it to the local checkout.
|
|
357
359
|
Cold validation installs the pinned Node/pnpm toolchain and Chromium, so it is intentionally
|
|
358
360
|
slower than the future snapshot-backed warm path.
|
|
359
361
|
|
|
362
|
+
While an interactive stage is waiting on Playwright, Groq, or Solari, FlakeLab prints a small
|
|
363
|
+
`working...` pulse. Redirected output and CI logs remain static, and machine-readable stdout is
|
|
364
|
+
unchanged.
|
|
365
|
+
|
|
360
366
|
## Evidence report
|
|
361
367
|
|
|
362
368
|
Turn the validated investigation, reproducer, candidate, and proof into one portable report:
|
package/dist/cli.js
CHANGED
|
@@ -2,6 +2,7 @@ import { parseCliArguments } from "./cli-arguments.js";
|
|
|
2
2
|
import { helpText, VERSION } from "./cli-help.js";
|
|
3
3
|
import { writeStderr, writeStdout } from "./ui/console.js";
|
|
4
4
|
import { TerminalDocument } from "./ui/document.js";
|
|
5
|
+
import { ProgressReporter } from "./ui/progress.js";
|
|
5
6
|
import { stderrTheme, stdoutTheme } from "./ui/theme.js";
|
|
6
7
|
const PROVIDER_COMMANDS = new Set([
|
|
7
8
|
"bisect",
|
|
@@ -109,6 +110,7 @@ async function main() {
|
|
|
109
110
|
await runCommand(invocation);
|
|
110
111
|
}
|
|
111
112
|
catch (error) {
|
|
113
|
+
ProgressReporter.failActive();
|
|
112
114
|
let message = "FlakeLab failed";
|
|
113
115
|
if (error instanceof Error) {
|
|
114
116
|
message = providerCommand ? await providerErrorMessage(error) : error.message;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/repair.js
CHANGED
|
@@ -10,9 +10,11 @@ import { withSolariTransport } from "../solari/transport.js";
|
|
|
10
10
|
import { formatProviderBoundary } from "../ui/boundary.js";
|
|
11
11
|
import { writeStderr } from "../ui/console.js";
|
|
12
12
|
import { formatCount } from "../ui/format.js";
|
|
13
|
+
import { formatCandidateDiff } from "../ui/diff.js";
|
|
13
14
|
import { ProgressReporter } from "../ui/progress.js";
|
|
14
|
-
import { stderrTheme } from "../ui/theme.js";
|
|
15
|
+
import { stderrTheme, terminalActivityEnabled } from "../ui/theme.js";
|
|
15
16
|
import { formatProofSummary } from "../repair/summary.js";
|
|
17
|
+
import { createCandidateDiff } from "../repair/workspace.js";
|
|
16
18
|
import { integerOption, positiveNumberOption, withInterruption } from "./options.js";
|
|
17
19
|
export async function repair(investigationPath, values) {
|
|
18
20
|
writeStderr(formatProviderBoundary({
|
|
@@ -53,6 +55,11 @@ export async function repair(investigationPath, values) {
|
|
|
53
55
|
sourcePaths: values.source,
|
|
54
56
|
});
|
|
55
57
|
progress.done(formatCount(generated.candidate.edits.length, "source edit"));
|
|
58
|
+
const previewDiff = await createCandidateDiff(projectRoot, generated.candidate);
|
|
59
|
+
await writeFile(patchPath, previewDiff, "utf8");
|
|
60
|
+
if (terminalActivityEnabled()) {
|
|
61
|
+
writeStderr(formatCandidateDiff(previewDiff, values.patch, stderrTheme()));
|
|
62
|
+
}
|
|
56
63
|
progress.start("isolated proof", "Solari microVM");
|
|
57
64
|
const validated = await withSolariTransport(async () => validateProofOfFix({
|
|
58
65
|
apiKey: solariApiKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAOpF,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,iBAAyB,EACzB,MAAqB;IAErB,WAAW,CAAC,sBAAsB,CAAC;QACjC,WAAW,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC;QAC/C,MAAM,EAAE,0EAA0E;cAC9E,8EAA8E;cAC9E,qBAAqB;QACzB,IAAI,EAAE;YACJ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;YACvC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE;YAC1D,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE;YAC7D,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;SAC/E;QACD,KAAK,EAAE,iDAAiD;KACzD,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE;QAC7C,WAAW,EAAE,MAAM,CAAC,oBAAoB,CAAC;KAC1C,CAAC,CAAA;IACF,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE;QACrD,WAAW,EAAE,MAAM,CAAC,oBAAoB,CAAC;KAC1C,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,2BAA2B,CAAA;IAClF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACjC,MAAM,aAAa,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAC5F,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;IAChF,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACpD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAA;IACvC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,2BAA2B,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACrD,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC;YAC7C,aAAa;YACb,UAAU,EAAE,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;YAChE,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;YAC/D,KAAK,EAAE,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;YACxD,WAAW;YACX,MAAM;YACN,WAAW,EAAE,MAAM,CAAC,MAAM;SAC3B,CAAC,CAAA;QACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAA;QAC3E,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;QAC/E,MAAM,SAAS,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QAC/C,IAAI,uBAAuB,EAAE,EAAE,CAAC;YAC9B,WAAW,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QAC5E,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;QAClD,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,KAAK,IAAI,EAAE,CAAC,kBAAkB,CACxE;YACE,MAAM,EAAE,YAAY;YACpB,OAAO;YACP,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;YAC7D,WAAW;YACX,UAAU;YACV,MAAM;SACP,EACD,SAAS,CACV,CAAC,CAAA;QACF,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAA;IACjD,CAAC,CAAC,CAAA;IACF,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAA;IACvF,MAAM,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC/C,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAChF,WAAW,CAAC,kBAAkB,CAC5B,MAAM,CAAC,KAAK,EACZ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAC5C,WAAW,EAAE,CACd,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACzF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACtB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;AACrD,CAAC"}
|
package/dist/commands/replay.js
CHANGED
|
@@ -4,6 +4,8 @@ import { readReproducer } from "../reproducer/file.js";
|
|
|
4
4
|
import { createPlaywrightExecutor } from "../runner/playwright-executor.js";
|
|
5
5
|
import { writeStderr } from "../ui/console.js";
|
|
6
6
|
import { TerminalDocument } from "../ui/document.js";
|
|
7
|
+
import { formatCount } from "../ui/format.js";
|
|
8
|
+
import { ProgressReporter } from "../ui/progress.js";
|
|
7
9
|
import { stderrTheme } from "../ui/theme.js";
|
|
8
10
|
import { integerOption, withInterruption } from "./options.js";
|
|
9
11
|
function replaySummary(verdict) {
|
|
@@ -18,6 +20,8 @@ function replaySummary(verdict) {
|
|
|
18
20
|
export async function replay(filePath, values) {
|
|
19
21
|
const projectRoot = process.cwd();
|
|
20
22
|
const reproducer = await readReproducer(resolve(projectRoot, filePath));
|
|
23
|
+
const progress = new ProgressReporter();
|
|
24
|
+
progress.start("reproducer replay", `${formatCount(reproducer.trials, "trial")} under the recorded fault`);
|
|
21
25
|
const result = await withInterruption(async (signal) => evaluateExperiment(createPlaywrightExecutor(projectRoot, reproducer.test, { signal }), {
|
|
22
26
|
concurrency: integerOption(values.concurrency, "concurrency"),
|
|
23
27
|
faults: reproducer.faults,
|
|
@@ -29,6 +33,8 @@ export async function replay(filePath, values) {
|
|
|
29
33
|
const signatureMatches = !reproducer.expectedFailure.signature
|
|
30
34
|
|| reproducer.expectedFailure.signature === result.dominantFailureSignature;
|
|
31
35
|
const reproduced = result.confirmed && signatureMatches;
|
|
36
|
+
progress.done(`${result.failed}/${result.trials} failed · signature `
|
|
37
|
+
+ `${signatureMatches ? "matched" : "did not match"}`);
|
|
32
38
|
writeStderr(replaySummary({ failed: result.failed, path: filePath, reproduced, signatureMatches, test: reproducer.test,
|
|
33
39
|
trials: result.trials }));
|
|
34
40
|
console.log(JSON.stringify({ reproduced, signatureMatches, result }, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/commands/replay.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/commands/replay.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/schema.d.ts
CHANGED
|
@@ -600,9 +600,9 @@ export declare const trialOutcomeSchema: z.ZodObject<{
|
|
|
600
600
|
path: z.ZodString;
|
|
601
601
|
}, z.core.$strip>>>;
|
|
602
602
|
status: z.ZodEnum<{
|
|
603
|
+
failed: "failed";
|
|
603
604
|
error: "error";
|
|
604
605
|
passed: "passed";
|
|
605
|
-
failed: "failed";
|
|
606
606
|
}>;
|
|
607
607
|
durationMs: z.ZodNumber;
|
|
608
608
|
exitCode: z.ZodNullable<z.ZodNumber>;
|
|
@@ -925,9 +925,9 @@ export declare const runEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
925
925
|
path: z.ZodString;
|
|
926
926
|
}, z.core.$strip>>>;
|
|
927
927
|
status: z.ZodEnum<{
|
|
928
|
+
failed: "failed";
|
|
928
929
|
error: "error";
|
|
929
930
|
passed: "passed";
|
|
930
|
-
failed: "failed";
|
|
931
931
|
}>;
|
|
932
932
|
durationMs: z.ZodNumber;
|
|
933
933
|
exitCode: z.ZodNullable<z.ZodNumber>;
|
|
@@ -3,19 +3,8 @@ import { z } from "zod";
|
|
|
3
3
|
import { evaluateExperiment } from "../discovery/evaluate.js";
|
|
4
4
|
import { InvestigationBudget } from "./budget.js";
|
|
5
5
|
import { InvestigationLedger } from "./ledger.js";
|
|
6
|
+
import { generateValidInvestigationPlan, investigationPlanSchema, } from "./planning.js";
|
|
6
7
|
import { readSafeTestContext } from "./safe-source.js";
|
|
7
|
-
import { experimentConditionSchema } from "./schema.js";
|
|
8
|
-
const plannedHypothesisSchema = z.object({
|
|
9
|
-
statement: z.string().min(8).max(500),
|
|
10
|
-
prediction: z.string().min(8).max(500),
|
|
11
|
-
});
|
|
12
|
-
const investigationPlanSchema = z.object({
|
|
13
|
-
hypotheses: z.array(plannedHypothesisSchema).min(2).max(3),
|
|
14
|
-
experiments: z.array(z.object({
|
|
15
|
-
hypothesisIndex: z.number().int().nonnegative(),
|
|
16
|
-
condition: experimentConditionSchema,
|
|
17
|
-
})).length(3),
|
|
18
|
-
});
|
|
19
8
|
const assessmentItemSchema = z.object({
|
|
20
9
|
hypothesisId: z.string().regex(/^H\d+$/u),
|
|
21
10
|
status: z.enum(["rejected", "confirmed"]),
|
|
@@ -46,6 +35,13 @@ function estimatedCost(inputTokens, outputTokens, options) {
|
|
|
46
35
|
return (inputTokens * options.inputUsdPerMillion
|
|
47
36
|
+ outputTokens * options.outputUsdPerMillion) / 1_000_000;
|
|
48
37
|
}
|
|
38
|
+
function enforceCostBudget(inputTokens, outputTokens, options, budget) {
|
|
39
|
+
const cost = estimatedCost(inputTokens, outputTokens, options);
|
|
40
|
+
if (cost > budget.maxCostUsd()) {
|
|
41
|
+
throw new Error(`Investigation cost $${cost.toFixed(4)} exceeded its configured budget`);
|
|
42
|
+
}
|
|
43
|
+
return cost;
|
|
44
|
+
}
|
|
49
45
|
function planningPrompt(test, sources, maximumDelayMs) {
|
|
50
46
|
return [
|
|
51
47
|
"You are planning a causal investigation of a flaky Playwright test.",
|
|
@@ -113,32 +109,6 @@ function applyAssessment(state, assessment) {
|
|
|
113
109
|
}
|
|
114
110
|
state.ledger.conclude(assessment.conclusionHypothesisId, assessment.conclusion, assessment.conclusionEvidenceIds);
|
|
115
111
|
}
|
|
116
|
-
function validatePlan(plan, options) {
|
|
117
|
-
if (plan.experiments.length > options.maxExperiments) {
|
|
118
|
-
throw new Error("Model proposed more experiments than the configured budget");
|
|
119
|
-
}
|
|
120
|
-
if (plan.experiments.some((entry) => entry.hypothesisIndex >= plan.hypotheses.length)) {
|
|
121
|
-
throw new Error("Model proposed an experiment for a missing hypothesis");
|
|
122
|
-
}
|
|
123
|
-
const coveredHypotheses = new Set(plan.experiments.map((entry) => entry.hypothesisIndex));
|
|
124
|
-
if (plan.hypotheses.some((_hypothesis, index) => !coveredHypotheses.has(index))) {
|
|
125
|
-
throw new Error("Every proposed hypothesis must receive an experiment");
|
|
126
|
-
}
|
|
127
|
-
if (plan.experiments.some((entry) => (entry.condition.kind === "network-delay" || entry.condition.kind === "resource-loading-delay"
|
|
128
|
-
|| entry.condition.kind === "startup-event-delay"
|
|
129
|
-
|| entry.condition.kind === "storage-state-delay")
|
|
130
|
-
&& entry.condition.delayMs > options.maximumDelayMs)) {
|
|
131
|
-
throw new Error("Model proposed a delay above the configured maximum");
|
|
132
|
-
}
|
|
133
|
-
if (plan.experiments.some((entry) => entry.condition.kind === "event-loop-stall"
|
|
134
|
-
&& entry.condition.durationMs > options.maximumDelayMs)) {
|
|
135
|
-
throw new Error("Model proposed an event-loop stall above the configured maximum");
|
|
136
|
-
}
|
|
137
|
-
const kinds = new Set(plan.experiments.map((entry) => entry.condition.kind));
|
|
138
|
-
if (!kinds.has("baseline") || kinds.size !== 3) {
|
|
139
|
-
throw new Error("Investigation plan must contain a baseline and two distinct interventions");
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
112
|
export async function runInvestigation(options) {
|
|
143
113
|
if (options.maxSteps < 2) {
|
|
144
114
|
throw new Error("Investigation requires a budget of two model steps");
|
|
@@ -147,18 +117,38 @@ export async function runInvestigation(options) {
|
|
|
147
117
|
const timeoutSignal = AbortSignal.timeout(options.maxSeconds * 1_000);
|
|
148
118
|
const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
|
|
149
119
|
const sources = await readSafeTestContext(options.projectRoot, options.test);
|
|
150
|
-
const planResult = await
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
120
|
+
const planResult = await generateValidInvestigationPlan({
|
|
121
|
+
generate: async (prompt, temperature) => {
|
|
122
|
+
const result = await generateText({
|
|
123
|
+
model: options.model,
|
|
124
|
+
output: Output.object({ schema: investigationPlanSchema }),
|
|
125
|
+
prompt,
|
|
126
|
+
maxOutputTokens: options.outputTokenLimit,
|
|
127
|
+
maxRetries: 2,
|
|
128
|
+
timeout: { totalMs: budget.remainingMs() },
|
|
129
|
+
abortSignal: signal,
|
|
130
|
+
temperature,
|
|
131
|
+
});
|
|
132
|
+
return {
|
|
133
|
+
output: result.output,
|
|
134
|
+
usage: {
|
|
135
|
+
inputTokens: result.usage.inputTokens ?? 0,
|
|
136
|
+
outputTokens: result.usage.outputTokens ?? 0,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
initialPrompt: planningPrompt(options.test, sources, options.maximumDelayMs),
|
|
141
|
+
maxAttempts: Math.min(2, options.maxSteps - 1),
|
|
142
|
+
rules: {
|
|
143
|
+
maxExperiments: options.maxExperiments,
|
|
144
|
+
maximumDelayMs: options.maximumDelayMs,
|
|
145
|
+
},
|
|
159
146
|
});
|
|
160
|
-
const plan = planResult.
|
|
161
|
-
|
|
147
|
+
const plan = planResult.plan;
|
|
148
|
+
let modelSteps = planResult.generations.length;
|
|
149
|
+
const planningInputTokens = planResult.generations.reduce((total, result) => total + result.usage.inputTokens, 0);
|
|
150
|
+
const planningOutputTokens = planResult.generations.reduce((total, result) => total + result.usage.outputTokens, 0);
|
|
151
|
+
enforceCostBudget(planningInputTokens, planningOutputTokens, options, budget);
|
|
162
152
|
plan.experiments.forEach(() => {
|
|
163
153
|
budget.reserveExperiment(options.trialsPerExperiment);
|
|
164
154
|
});
|
|
@@ -181,12 +171,13 @@ export async function runInvestigation(options) {
|
|
|
181
171
|
abortSignal: signal,
|
|
182
172
|
temperature: 0.2,
|
|
183
173
|
});
|
|
174
|
+
modelSteps += 1;
|
|
184
175
|
const assessmentResults = [assessmentResult];
|
|
185
176
|
try {
|
|
186
177
|
applyAssessment(state, assessmentResult.output);
|
|
187
178
|
}
|
|
188
179
|
catch (error) {
|
|
189
|
-
if (options.maxSteps
|
|
180
|
+
if (modelSteps >= options.maxSteps) {
|
|
190
181
|
throw error;
|
|
191
182
|
}
|
|
192
183
|
const validationError = error instanceof Error ? error.message : "invalid evidence assessment";
|
|
@@ -204,12 +195,9 @@ export async function runInvestigation(options) {
|
|
|
204
195
|
state = createLedgerState(plan, results);
|
|
205
196
|
applyAssessment(state, repairResult.output);
|
|
206
197
|
}
|
|
207
|
-
const inputTokens =
|
|
208
|
-
const outputTokens =
|
|
209
|
-
const cost =
|
|
210
|
-
if (cost > budget.maxCostUsd()) {
|
|
211
|
-
throw new Error(`Investigation cost $${cost.toFixed(4)} exceeded its configured budget`);
|
|
212
|
-
}
|
|
198
|
+
const inputTokens = planningInputTokens + assessmentResults.reduce((total, result) => total + (result.usage.inputTokens ?? 0), 0);
|
|
199
|
+
const outputTokens = planningOutputTokens + assessmentResults.reduce((total, result) => total + (result.usage.outputTokens ?? 0), 0);
|
|
200
|
+
const cost = enforceCostBudget(inputTokens, outputTokens, options, budget);
|
|
213
201
|
return state.ledger.buildReport(options.test, options.modelId, sources.map((source) => source.path), {
|
|
214
202
|
inputTokens,
|
|
215
203
|
outputTokens,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/investigator/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAI7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/investigator/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const investigationPlanSchema: z.ZodObject<{
|
|
3
|
+
hypotheses: z.ZodArray<z.ZodObject<{
|
|
4
|
+
statement: z.ZodString;
|
|
5
|
+
prediction: z.ZodString;
|
|
6
|
+
}, z.core.$strip>>;
|
|
7
|
+
experiments: z.ZodArray<z.ZodObject<{
|
|
8
|
+
hypothesisIndex: z.ZodNumber;
|
|
9
|
+
condition: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
10
|
+
kind: z.ZodLiteral<"baseline">;
|
|
11
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
12
|
+
kind: z.ZodLiteral<"animation-speed">;
|
|
13
|
+
rate: z.ZodNumber;
|
|
14
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
15
|
+
kind: z.ZodLiteral<"auth-cookie-expiry">;
|
|
16
|
+
cookieName: z.ZodString;
|
|
17
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
18
|
+
kind: z.ZodLiteral<"clock-jump">;
|
|
19
|
+
jumpAfterMs: z.ZodNumber;
|
|
20
|
+
offsetMs: z.ZodNumber;
|
|
21
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
22
|
+
kind: z.ZodLiteral<"event-loop-stall">;
|
|
23
|
+
durationMs: z.ZodNumber;
|
|
24
|
+
startAfterMs: z.ZodNumber;
|
|
25
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
26
|
+
kind: z.ZodLiteral<"network-delay">;
|
|
27
|
+
delayMs: z.ZodNumber;
|
|
28
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
29
|
+
kind: z.ZodLiteral<"locale">;
|
|
30
|
+
locale: z.ZodString;
|
|
31
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
32
|
+
kind: z.ZodLiteral<"request-failure">;
|
|
33
|
+
statusCode: z.ZodNumber;
|
|
34
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
35
|
+
kind: z.ZodLiteral<"reduced-motion">;
|
|
36
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
37
|
+
kind: z.ZodLiteral<"response-truncation">;
|
|
38
|
+
removeBytes: z.ZodNumber;
|
|
39
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
40
|
+
kind: z.ZodLiteral<"response-duplication">;
|
|
41
|
+
duplicateBytes: z.ZodNumber;
|
|
42
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
43
|
+
kind: z.ZodLiteral<"response-reordering">;
|
|
44
|
+
holdMs: z.ZodNumber;
|
|
45
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
46
|
+
kind: z.ZodLiteral<"resource-loading-delay">;
|
|
47
|
+
delayMs: z.ZodNumber;
|
|
48
|
+
resourceType: z.ZodEnum<{
|
|
49
|
+
script: "script";
|
|
50
|
+
document: "document";
|
|
51
|
+
font: "font";
|
|
52
|
+
image: "image";
|
|
53
|
+
stylesheet: "stylesheet";
|
|
54
|
+
}>;
|
|
55
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
56
|
+
kind: z.ZodLiteral<"startup-event-delay">;
|
|
57
|
+
delayMs: z.ZodNumber;
|
|
58
|
+
event: z.ZodEnum<{
|
|
59
|
+
"dom-content-loaded": "dom-content-loaded";
|
|
60
|
+
load: "load";
|
|
61
|
+
}>;
|
|
62
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
63
|
+
kind: z.ZodLiteral<"storage-state-delay">;
|
|
64
|
+
delayMs: z.ZodNumber;
|
|
65
|
+
key: z.ZodString;
|
|
66
|
+
storage: z.ZodEnum<{
|
|
67
|
+
"local-storage": "local-storage";
|
|
68
|
+
"session-storage": "session-storage";
|
|
69
|
+
}>;
|
|
70
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
71
|
+
kind: z.ZodLiteral<"timezone">;
|
|
72
|
+
timezoneId: z.ZodString;
|
|
73
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
74
|
+
kind: z.ZodLiteral<"viewport">;
|
|
75
|
+
height: z.ZodNumber;
|
|
76
|
+
width: z.ZodNumber;
|
|
77
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
78
|
+
kind: z.ZodLiteral<"worker-pressure">;
|
|
79
|
+
workers: z.ZodNumber;
|
|
80
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
81
|
+
copies: z.ZodNumber;
|
|
82
|
+
kind: z.ZodLiteral<"shared-state-interference">;
|
|
83
|
+
}, z.core.$strip>], "kind">;
|
|
84
|
+
}, z.core.$strip>>;
|
|
85
|
+
}, z.core.$strip>;
|
|
86
|
+
export type InvestigationPlan = z.infer<typeof investigationPlanSchema>;
|
|
87
|
+
export interface PlanGeneration {
|
|
88
|
+
output: InvestigationPlan;
|
|
89
|
+
usage: {
|
|
90
|
+
inputTokens: number;
|
|
91
|
+
outputTokens: number;
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
interface PlanRules {
|
|
95
|
+
maxExperiments: number;
|
|
96
|
+
maximumDelayMs: number;
|
|
97
|
+
}
|
|
98
|
+
interface GenerateValidPlanOptions {
|
|
99
|
+
generate: (prompt: string, temperature: number) => Promise<PlanGeneration>;
|
|
100
|
+
initialPrompt: string;
|
|
101
|
+
maxAttempts: number;
|
|
102
|
+
rules: PlanRules;
|
|
103
|
+
}
|
|
104
|
+
export interface ValidPlanResult {
|
|
105
|
+
generations: PlanGeneration[];
|
|
106
|
+
plan: InvestigationPlan;
|
|
107
|
+
}
|
|
108
|
+
export declare function validateInvestigationPlan(plan: InvestigationPlan, rules: PlanRules): void;
|
|
109
|
+
export declare function generateValidInvestigationPlan(options: GenerateValidPlanOptions): Promise<ValidPlanResult>;
|
|
110
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { experimentConditionSchema } from "./schema.js";
|
|
3
|
+
const plannedHypothesisSchema = z.object({
|
|
4
|
+
statement: z.string().min(8).max(500),
|
|
5
|
+
prediction: z.string().min(8).max(500),
|
|
6
|
+
});
|
|
7
|
+
export const investigationPlanSchema = z.object({
|
|
8
|
+
hypotheses: z.array(plannedHypothesisSchema).min(2).max(3),
|
|
9
|
+
experiments: z.array(z.object({
|
|
10
|
+
hypothesisIndex: z.number().int().nonnegative(),
|
|
11
|
+
condition: experimentConditionSchema,
|
|
12
|
+
})).length(3),
|
|
13
|
+
});
|
|
14
|
+
function conditionKinds(plan) {
|
|
15
|
+
return plan.experiments.map((entry) => entry.condition.kind);
|
|
16
|
+
}
|
|
17
|
+
export function validateInvestigationPlan(plan, rules) {
|
|
18
|
+
if (plan.experiments.length > rules.maxExperiments) {
|
|
19
|
+
throw new Error("Model proposed more experiments than the configured budget");
|
|
20
|
+
}
|
|
21
|
+
if (plan.experiments.some((entry) => entry.hypothesisIndex >= plan.hypotheses.length)) {
|
|
22
|
+
throw new Error("Model proposed an experiment for a missing hypothesis");
|
|
23
|
+
}
|
|
24
|
+
const coveredHypotheses = new Set(plan.experiments.map((entry) => entry.hypothesisIndex));
|
|
25
|
+
if (plan.hypotheses.some((_hypothesis, index) => !coveredHypotheses.has(index))) {
|
|
26
|
+
throw new Error("Every proposed hypothesis must receive an experiment");
|
|
27
|
+
}
|
|
28
|
+
const excessiveDelay = plan.experiments.some((entry) => (entry.condition.kind === "network-delay"
|
|
29
|
+
|| entry.condition.kind === "resource-loading-delay"
|
|
30
|
+
|| entry.condition.kind === "startup-event-delay"
|
|
31
|
+
|| entry.condition.kind === "storage-state-delay")
|
|
32
|
+
&& entry.condition.delayMs > rules.maximumDelayMs);
|
|
33
|
+
if (excessiveDelay) {
|
|
34
|
+
throw new Error("Model proposed a delay above the configured maximum");
|
|
35
|
+
}
|
|
36
|
+
const excessiveStall = plan.experiments.some((entry) => entry.condition.kind === "event-loop-stall"
|
|
37
|
+
&& entry.condition.durationMs > rules.maximumDelayMs);
|
|
38
|
+
if (excessiveStall) {
|
|
39
|
+
throw new Error("Model proposed an event-loop stall above the configured maximum");
|
|
40
|
+
}
|
|
41
|
+
const kinds = conditionKinds(plan);
|
|
42
|
+
if (!kinds.includes("baseline") || new Set(kinds).size !== 3) {
|
|
43
|
+
throw new Error("Investigation plan must contain one baseline and two distinct interventions;"
|
|
44
|
+
+ ` received ${kinds.join(", ")}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function repairPrompt(initialPrompt, invalidPlan, validationError) {
|
|
48
|
+
return [
|
|
49
|
+
initialPrompt,
|
|
50
|
+
"Your previous plan passed the output schema but failed deterministic validation.",
|
|
51
|
+
`Validation error: ${validationError}`,
|
|
52
|
+
"Previous invalid plan:",
|
|
53
|
+
JSON.stringify(invalidPlan, null, 2),
|
|
54
|
+
"Return one corrected plan with exactly one baseline and two different intervention kinds.",
|
|
55
|
+
"Keep exactly three experiments, cover every hypothesis, and do not repeat a condition kind.",
|
|
56
|
+
].join("\n");
|
|
57
|
+
}
|
|
58
|
+
export async function generateValidInvestigationPlan(options) {
|
|
59
|
+
const generations = [];
|
|
60
|
+
let prompt = options.initialPrompt;
|
|
61
|
+
for (let attempt = 0; attempt < options.maxAttempts; attempt += 1) {
|
|
62
|
+
const generated = await options.generate(prompt, attempt === 0 ? 0.2 : 0);
|
|
63
|
+
generations.push(generated);
|
|
64
|
+
try {
|
|
65
|
+
validateInvestigationPlan(generated.output, options.rules);
|
|
66
|
+
return { generations, plan: generated.output };
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (attempt + 1 >= options.maxAttempts) {
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
const message = error instanceof Error ? error.message : "invalid investigation plan";
|
|
73
|
+
prompt = repairPrompt(options.initialPrompt, generated.output, message);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
throw new Error("Investigation plan generation exhausted its attempt budget");
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=planning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning.js","sourceRoot":"","sources":["../../src/investigator/planning.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,8 +33,8 @@ export declare const experimentResultSchema: z.ZodObject<{
|
|
|
33
33
|
}, z.core.$strip>>;
|
|
34
34
|
durationMs: z.ZodNumber;
|
|
35
35
|
status: z.ZodEnum<{
|
|
36
|
-
passed: "passed";
|
|
37
36
|
failed: "failed";
|
|
37
|
+
passed: "passed";
|
|
38
38
|
}>;
|
|
39
39
|
trialId: z.ZodString;
|
|
40
40
|
}, z.core.$strip>>;
|
|
@@ -240,8 +240,8 @@ export declare const experimentEvidenceSchema: z.ZodObject<{
|
|
|
240
240
|
}, z.core.$strip>>;
|
|
241
241
|
durationMs: z.ZodNumber;
|
|
242
242
|
status: z.ZodEnum<{
|
|
243
|
-
passed: "passed";
|
|
244
243
|
failed: "failed";
|
|
244
|
+
passed: "passed";
|
|
245
245
|
}>;
|
|
246
246
|
trialId: z.ZodString;
|
|
247
247
|
}, z.core.$strip>>;
|
|
@@ -380,8 +380,8 @@ export declare const investigationReportSchema: z.ZodObject<{
|
|
|
380
380
|
}, z.core.$strip>>;
|
|
381
381
|
durationMs: z.ZodNumber;
|
|
382
382
|
status: z.ZodEnum<{
|
|
383
|
-
passed: "passed";
|
|
384
383
|
failed: "failed";
|
|
384
|
+
passed: "passed";
|
|
385
385
|
}>;
|
|
386
386
|
trialId: z.ZodString;
|
|
387
387
|
}, z.core.$strip>>;
|
|
@@ -5,3 +5,5 @@ export interface PatchWorkspace {
|
|
|
5
5
|
}
|
|
6
6
|
export declare function createPatchWorkspace(projectRoot: string): Promise<PatchWorkspace>;
|
|
7
7
|
export declare function applyCandidatePatch(workspaceRoot: string, candidate: CandidatePatch): Promise<string>;
|
|
8
|
+
/** Builds the exact patch without changing the developer's working tree. */
|
|
9
|
+
export declare function createCandidateDiff(projectRoot: string, candidate: CandidatePatch): Promise<string>;
|
package/dist/repair/workspace.js
CHANGED
|
@@ -37,4 +37,16 @@ export async function applyCandidatePatch(workspaceRoot, candidate) {
|
|
|
37
37
|
}
|
|
38
38
|
return patches.join("\n");
|
|
39
39
|
}
|
|
40
|
+
/** Builds the exact patch without changing the developer's working tree. */
|
|
41
|
+
export async function createCandidateDiff(projectRoot, candidate) {
|
|
42
|
+
const patches = await Promise.all(candidate.edits.map(async (edit) => {
|
|
43
|
+
const beforeFile = await readFile(resolve(projectRoot, edit.path), "utf8");
|
|
44
|
+
const afterFile = beforeFile.replace(edit.before, edit.after);
|
|
45
|
+
if (afterFile === beforeFile) {
|
|
46
|
+
throw new Error(`Candidate edit did not change ${edit.path}`);
|
|
47
|
+
}
|
|
48
|
+
return createTwoFilesPatch(`a/${edit.path}`, `b/${edit.path}`, beforeFile, afterFile, "before", "candidate", { context: 3 });
|
|
49
|
+
}));
|
|
50
|
+
return patches.join("\n");
|
|
51
|
+
}
|
|
40
52
|
//# sourceMappingURL=workspace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/repair/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,MAAM,YAAY,GAAG;IACnB,KAAK;IACL,OAAO;IACP,mBAAmB;IACnB,cAAc;IACd,gBAAgB;IAChB,qBAAqB;IACrB,sBAAsB;IACtB,eAAe;CACP,CAAA;AAOV,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAA;IACnE,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;IACzD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClF,CAAC;IACD,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KAChE,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,aAAqB,EACrB,SAAyB;IAEzB,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7D,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/D,CAAC;QACD,MAAM,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAC5C,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAC9B,KAAK,IAAI,CAAC,IAAI,EAAE,EAChB,KAAK,IAAI,CAAC,IAAI,EAAE,EAChB,UAAU,EACV,SAAS,EACT,QAAQ,EACR,WAAW,EACX,EAAE,OAAO,EAAE,CAAC,EAAE,CACf,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC"}
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/repair/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/report/schema.d.ts
CHANGED
|
@@ -158,8 +158,8 @@ export declare const evidenceReportSchema: z.ZodObject<{
|
|
|
158
158
|
}, z.core.$strip>>;
|
|
159
159
|
durationMs: z.ZodNumber;
|
|
160
160
|
status: z.ZodEnum<{
|
|
161
|
-
passed: "passed";
|
|
162
161
|
failed: "failed";
|
|
162
|
+
passed: "passed";
|
|
163
163
|
}>;
|
|
164
164
|
trialId: z.ZodString;
|
|
165
165
|
}, z.core.$strip>>;
|
package/dist/ui/diff.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { paint } from "./style.js";
|
|
2
|
+
import { sanitizeText } from "./text.js";
|
|
3
|
+
import { PLAIN_THEME } from "./theme.js";
|
|
4
|
+
const MAXIMUM_RENDERED_LINES = 240;
|
|
5
|
+
function diffStyle(line) {
|
|
6
|
+
if (line.startsWith("+++ ") || line.startsWith("--- ")) {
|
|
7
|
+
return "bold";
|
|
8
|
+
}
|
|
9
|
+
if (line.startsWith("@@")) {
|
|
10
|
+
return "cyan";
|
|
11
|
+
}
|
|
12
|
+
if (line.startsWith("+")) {
|
|
13
|
+
return "green";
|
|
14
|
+
}
|
|
15
|
+
if (line.startsWith("-")) {
|
|
16
|
+
return "red";
|
|
17
|
+
}
|
|
18
|
+
if (line.startsWith("Index:") || line.startsWith("=")) {
|
|
19
|
+
return "dim";
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
/** A bounded, sanitized terminal preview; the complete exact patch remains on disk. */
|
|
24
|
+
export function formatCandidateDiff(diff, patchPath, theme = PLAIN_THEME) {
|
|
25
|
+
const lines = sanitizeText(diff).split("\n");
|
|
26
|
+
const visible = lines.slice(0, MAXIMUM_RENDERED_LINES);
|
|
27
|
+
const rendered = visible.map((line) => {
|
|
28
|
+
const style = diffStyle(line);
|
|
29
|
+
return style ? paint(theme, style, line) : line;
|
|
30
|
+
});
|
|
31
|
+
if (lines.length > MAXIMUM_RENDERED_LINES) {
|
|
32
|
+
rendered.push(paint(theme, "dim", `... preview truncated; complete diff saved to ${patchPath}`));
|
|
33
|
+
}
|
|
34
|
+
return ["", paint(theme, "bold", "Candidate diff"), ...rendered].join("\n");
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/ui/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,sBAAsB,GAAG,GAAG,CAAA;AAElC,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,SAAiB,EACjB,QAAuB,WAAW;IAElC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAA;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAC7B,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACjD,CAAC,CAAC,CAAA;IACF,IAAI,KAAK,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,KAAK,CACjB,KAAK,EACL,KAAK,EACL,iDAAiD,SAAS,EAAE,CAC7D,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7E,CAAC"}
|
package/dist/ui/progress.d.ts
CHANGED
|
@@ -2,13 +2,18 @@ import type { StatusTone } from "./status.js";
|
|
|
2
2
|
import type { TerminalTheme } from "./theme.js";
|
|
3
3
|
export type ProgressWriter = (chunk: string) => void;
|
|
4
4
|
export interface ProgressOptions {
|
|
5
|
+
animate?: boolean;
|
|
6
|
+
pulseIntervalMs?: number;
|
|
7
|
+
schedulePulse?: PulseScheduler;
|
|
5
8
|
theme?: TerminalTheme;
|
|
6
9
|
write?: ProgressWriter;
|
|
7
10
|
}
|
|
11
|
+
type CancelPulse = () => void;
|
|
12
|
+
type PulseScheduler = (pulse: () => void, intervalMs: number) => CancelPulse;
|
|
8
13
|
/**
|
|
9
|
-
* Line-oriented stage progress on stderr.
|
|
10
|
-
*
|
|
11
|
-
*
|
|
14
|
+
* Line-oriented stage progress on stderr. Interactive terminals receive a
|
|
15
|
+
* growing dot pulse during quiet work; redirected and CI output stays static.
|
|
16
|
+
* It never emits cursor movement, carriage returns, or erase sequences.
|
|
12
17
|
*/
|
|
13
18
|
export declare class ProgressReporter {
|
|
14
19
|
#private;
|
|
@@ -18,4 +23,7 @@ export declare class ProgressReporter {
|
|
|
18
23
|
step(text: string, tone?: StatusTone): void;
|
|
19
24
|
done(detail?: string): void;
|
|
20
25
|
fail(detail?: string): void;
|
|
26
|
+
/** Closes any live pulse before the command-level error is rendered. */
|
|
27
|
+
static failActive(): void;
|
|
21
28
|
}
|
|
29
|
+
export {};
|
package/dist/ui/progress.js
CHANGED
|
@@ -1,33 +1,55 @@
|
|
|
1
|
+
var _a;
|
|
1
2
|
import { formatDuration } from "./format.js";
|
|
2
3
|
import { statusMark } from "./status.js";
|
|
3
4
|
import { paint } from "./style.js";
|
|
4
5
|
import { sanitizeLine, truncate } from "./text.js";
|
|
5
|
-
import { stderrTheme } from "./theme.js";
|
|
6
|
+
import { stderrTheme, terminalActivityEnabled } from "./theme.js";
|
|
6
7
|
const MAXIMUM_DETAIL_LENGTH = 200;
|
|
7
8
|
function defaultWriter(chunk) {
|
|
8
9
|
process.stderr.write(chunk);
|
|
9
10
|
}
|
|
11
|
+
function defaultPulseScheduler(pulse, intervalMs) {
|
|
12
|
+
const timer = setInterval(pulse, intervalMs);
|
|
13
|
+
timer.unref();
|
|
14
|
+
return () => clearInterval(timer);
|
|
15
|
+
}
|
|
10
16
|
/**
|
|
11
|
-
* Line-oriented stage progress on stderr.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
17
|
+
* Line-oriented stage progress on stderr. Interactive terminals receive a
|
|
18
|
+
* growing dot pulse during quiet work; redirected and CI output stays static.
|
|
19
|
+
* It never emits cursor movement, carriage returns, or erase sequences.
|
|
14
20
|
*/
|
|
15
21
|
export class ProgressReporter {
|
|
22
|
+
static #active = new Set();
|
|
23
|
+
#animate;
|
|
24
|
+
#cancelPulse;
|
|
16
25
|
#label;
|
|
26
|
+
#pulseDots = 0;
|
|
27
|
+
#pulseLineOpen = false;
|
|
28
|
+
#pulseIntervalMs;
|
|
29
|
+
#schedulePulse;
|
|
17
30
|
#startedAt = 0;
|
|
18
31
|
#theme;
|
|
19
32
|
#write;
|
|
20
33
|
constructor(options = {}) {
|
|
34
|
+
this.#animate = options.animate ?? terminalActivityEnabled();
|
|
35
|
+
this.#pulseIntervalMs = options.pulseIntervalMs ?? 1_000;
|
|
36
|
+
this.#schedulePulse = options.schedulePulse ?? defaultPulseScheduler;
|
|
21
37
|
this.#theme = options.theme ?? stderrTheme();
|
|
22
38
|
this.#write = options.write ?? defaultWriter;
|
|
23
39
|
}
|
|
24
40
|
start(label, detail) {
|
|
41
|
+
this.#stopPulse();
|
|
25
42
|
this.#label = sanitizeLine(label);
|
|
26
43
|
this.#startedAt = Date.now();
|
|
27
44
|
this.#line("running", this.#label, detail);
|
|
45
|
+
_a.#active.add(this);
|
|
46
|
+
if (this.#animate) {
|
|
47
|
+
this.#cancelPulse = this.#schedulePulse(() => this.#pulse(), this.#pulseIntervalMs);
|
|
48
|
+
}
|
|
28
49
|
}
|
|
29
50
|
/** A subordinate observation inside the running stage. */
|
|
30
51
|
step(text, tone = "muted") {
|
|
52
|
+
this.#finishPulseLine();
|
|
31
53
|
this.#write(` ${statusMark(this.#theme, tone)} ${this.#detail(text)}\n`);
|
|
32
54
|
}
|
|
33
55
|
done(detail) {
|
|
@@ -36,14 +58,48 @@ export class ProgressReporter {
|
|
|
36
58
|
fail(detail) {
|
|
37
59
|
this.#close("failure", detail);
|
|
38
60
|
}
|
|
61
|
+
/** Closes any live pulse before the command-level error is rendered. */
|
|
62
|
+
static failActive() {
|
|
63
|
+
for (const reporter of [..._a.#active]) {
|
|
64
|
+
reporter.fail("failed");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
39
67
|
#close(tone, detail) {
|
|
40
68
|
const label = this.#label;
|
|
41
69
|
if (!label) {
|
|
42
70
|
return;
|
|
43
71
|
}
|
|
72
|
+
this.#stopPulse();
|
|
44
73
|
this.#label = undefined;
|
|
74
|
+
_a.#active.delete(this);
|
|
45
75
|
this.#line(tone, label, detail, formatDuration(Date.now() - this.#startedAt));
|
|
46
76
|
}
|
|
77
|
+
#finishPulseLine() {
|
|
78
|
+
if (this.#pulseLineOpen) {
|
|
79
|
+
this.#write("\n");
|
|
80
|
+
this.#pulseLineOpen = false;
|
|
81
|
+
this.#pulseDots = 0;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
#pulse() {
|
|
85
|
+
if (!this.#label) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (!this.#pulseLineOpen) {
|
|
89
|
+
this.#write(` ${statusMark(this.#theme, "muted")} ${this.#detail("working")}`);
|
|
90
|
+
this.#pulseLineOpen = true;
|
|
91
|
+
}
|
|
92
|
+
this.#write(paint(this.#theme, "dim", "."));
|
|
93
|
+
this.#pulseDots += 1;
|
|
94
|
+
if (this.#pulseDots >= 12) {
|
|
95
|
+
this.#finishPulseLine();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
#stopPulse() {
|
|
99
|
+
this.#cancelPulse?.();
|
|
100
|
+
this.#cancelPulse = undefined;
|
|
101
|
+
this.#finishPulseLine();
|
|
102
|
+
}
|
|
47
103
|
#line(tone, label, ...details) {
|
|
48
104
|
const separator = this.#theme.unicode ? " · " : " | ";
|
|
49
105
|
const suffix = details
|
|
@@ -56,4 +112,5 @@ export class ProgressReporter {
|
|
|
56
112
|
return paint(this.#theme, "dim", truncate(sanitizeLine(value), MAXIMUM_DETAIL_LENGTH));
|
|
57
113
|
}
|
|
58
114
|
}
|
|
115
|
+
_a = ProgressReporter;
|
|
59
116
|
//# sourceMappingURL=progress.js.map
|
package/dist/ui/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/ui/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/ui/progress.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/theme.d.ts
CHANGED
|
@@ -21,3 +21,5 @@ export declare function createTheme(context: TerminalContext): TerminalTheme;
|
|
|
21
21
|
export declare function streamTheme(stream: NodeJS.WriteStream, env?: NodeJS.ProcessEnv): TerminalTheme;
|
|
22
22
|
export declare function stdoutTheme(): TerminalTheme;
|
|
23
23
|
export declare function stderrTheme(): TerminalTheme;
|
|
24
|
+
/** Live terminal affordances stay out of redirected output and CI logs. */
|
|
25
|
+
export declare function terminalActivityEnabled(stream?: NodeJS.WriteStream, env?: NodeJS.ProcessEnv): boolean;
|
package/dist/ui/theme.js
CHANGED
|
@@ -74,4 +74,8 @@ export function stdoutTheme() {
|
|
|
74
74
|
export function stderrTheme() {
|
|
75
75
|
return streamTheme(process.stderr);
|
|
76
76
|
}
|
|
77
|
+
/** Live terminal affordances stay out of redirected output and CI logs. */
|
|
78
|
+
export function terminalActivityEnabled(stream = process.stderr, env = process.env) {
|
|
79
|
+
return Boolean(stream.isTTY) && !present(env.CI) && env.TERM !== "dumb";
|
|
80
|
+
}
|
|
77
81
|
//# sourceMappingURL=theme.js.map
|
package/dist/ui/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
|