@post-print/agent-test 0.3.4 → 0.3.6
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 +17 -61
- package/dist/check.d.ts +38 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +169 -0
- package/dist/check.js.map +1 -0
- package/dist/cli.d.ts +11 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +327 -318
- package/dist/cli.js.map +1 -1
- package/dist/compare-scenario.d.ts +41 -0
- package/dist/compare-scenario.d.ts.map +1 -0
- package/dist/compare-scenario.js +194 -0
- package/dist/compare-scenario.js.map +1 -0
- package/dist/debug-bundle.d.ts +2 -1
- package/dist/debug-bundle.d.ts.map +1 -1
- package/dist/debug-bundle.js +12 -5
- package/dist/debug-bundle.js.map +1 -1
- package/dist/doctor.d.ts +6 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +133 -11
- package/dist/doctor.js.map +1 -1
- package/dist/expect.d.ts +6 -5
- package/dist/expect.d.ts.map +1 -1
- package/dist/expect.js +67 -57
- package/dist/expect.js.map +1 -1
- package/dist/host-log.d.ts +17 -0
- package/dist/host-log.d.ts.map +1 -0
- package/dist/host-log.js +154 -0
- package/dist/host-log.js.map +1 -0
- package/dist/hosts.d.ts +22 -0
- package/dist/hosts.d.ts.map +1 -0
- package/dist/hosts.js +84 -0
- package/dist/hosts.js.map +1 -0
- package/dist/html-report.d.ts +0 -13
- package/dist/html-report.d.ts.map +1 -1
- package/dist/html-report.js +504 -323
- package/dist/html-report.js.map +1 -1
- package/dist/index.d.ts +14 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/live-isolation.d.ts +11 -4
- package/dist/live-isolation.d.ts.map +1 -1
- package/dist/live-isolation.js +31 -10
- package/dist/live-isolation.js.map +1 -1
- package/dist/load-adapters.d.ts +13 -0
- package/dist/load-adapters.d.ts.map +1 -0
- package/dist/load-adapters.js +76 -0
- package/dist/load-adapters.js.map +1 -0
- package/dist/load-suite.d.ts.map +1 -1
- package/dist/load-suite.js +6 -2
- package/dist/load-suite.js.map +1 -1
- package/dist/mcp-config.d.ts +8 -0
- package/dist/mcp-config.d.ts.map +1 -1
- package/dist/mcp-config.js +46 -0
- package/dist/mcp-config.js.map +1 -1
- package/dist/progress.d.ts +7 -0
- package/dist/progress.d.ts.map +1 -1
- package/dist/progress.js +39 -9
- package/dist/progress.js.map +1 -1
- package/dist/record-trace.d.ts +9 -7
- package/dist/record-trace.d.ts.map +1 -1
- package/dist/record-trace.js +5 -16
- package/dist/record-trace.js.map +1 -1
- package/dist/report-preview-server.d.ts +2 -0
- package/dist/report-preview-server.d.ts.map +1 -0
- package/dist/report-preview-server.js +24 -0
- package/dist/report-preview-server.js.map +1 -0
- package/dist/report-preview.d.ts +11 -0
- package/dist/report-preview.d.ts.map +1 -0
- package/dist/report-preview.js +161 -0
- package/dist/report-preview.js.map +1 -0
- package/dist/run-suite.d.ts +34 -1
- package/dist/run-suite.d.ts.map +1 -1
- package/dist/run-suite.js +588 -82
- package/dist/run-suite.js.map +1 -1
- package/dist/scenario-story.d.ts +43 -0
- package/dist/scenario-story.d.ts.map +1 -0
- package/dist/scenario-story.js +215 -0
- package/dist/scenario-story.js.map +1 -0
- package/dist/suite-summary.d.ts +2 -0
- package/dist/suite-summary.d.ts.map +1 -1
- package/dist/suite-summary.js +70 -22
- package/dist/suite-summary.js.map +1 -1
- package/dist/theme.d.ts +30 -5
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +207 -45
- package/dist/theme.js.map +1 -1
- package/dist/types.d.ts +105 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/validate-seeds.d.ts.map +1 -1
- package/dist/validate-seeds.js +21 -6
- package/dist/validate-seeds.js.map +1 -1
- package/dist/validate-suite.d.ts +3 -1
- package/dist/validate-suite.d.ts.map +1 -1
- package/dist/validate-suite.js +268 -23
- package/dist/validate-suite.js.map +1 -1
- package/package.json +4 -4
- package/dist/compare.d.ts +0 -79
- package/dist/compare.d.ts.map +0 -1
- package/dist/compare.js +0 -232
- package/dist/compare.js.map +0 -1
package/dist/mcp-config.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isAbsolute, join } from "node:path";
|
|
1
2
|
/** Validate a suite/scenario mcpServers map (shape only; env expansion happens at run time). */
|
|
2
3
|
export function isMcpServersMap(value) {
|
|
3
4
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
@@ -72,4 +73,49 @@ function isMcpAuth(value) {
|
|
|
72
73
|
}
|
|
73
74
|
return true;
|
|
74
75
|
}
|
|
76
|
+
/** Repo-relative stdio script args to copy into a sealed workspace. */
|
|
77
|
+
export function mcpStdioScriptPaths(servers) {
|
|
78
|
+
if (!servers) {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
const paths = [];
|
|
82
|
+
for (const config of Object.values(servers)) {
|
|
83
|
+
if (!("command" in config) || !config.args) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
for (const arg of config.args) {
|
|
87
|
+
if (arg.startsWith("-")) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (/\.(mjs|cjs|js)$/.test(arg) || arg.includes("/")) {
|
|
91
|
+
paths.push(arg);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return paths;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Pin stdio MCP cwd to the caller repo so script args like
|
|
99
|
+
* `packages/test/fixtures/mcp-echo/server.mjs` still resolve when the agent
|
|
100
|
+
* cwd is a fixture workspace.
|
|
101
|
+
*/
|
|
102
|
+
export function bindMcpServersToCaller(servers, callerCwd) {
|
|
103
|
+
if (!servers) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const bound = {};
|
|
107
|
+
for (const [name, config] of Object.entries(servers)) {
|
|
108
|
+
if (!("command" in config) || !config.command) {
|
|
109
|
+
bound[name] = config;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const serverCwd = config.cwd === undefined || config.cwd.trim().length === 0
|
|
113
|
+
? callerCwd
|
|
114
|
+
: isAbsolute(config.cwd)
|
|
115
|
+
? config.cwd
|
|
116
|
+
: join(callerCwd, config.cwd);
|
|
117
|
+
bound[name] = { ...config, cwd: serverCwd };
|
|
118
|
+
}
|
|
119
|
+
return bound;
|
|
120
|
+
}
|
|
75
121
|
//# sourceMappingURL=mcp-config.js.map
|
package/dist/mcp-config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"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"}
|
package/dist/progress.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
/** Tenth of a second. Faster ticks flood stdout and wrap the clock line. */
|
|
2
|
+
export declare const TTY_HEARTBEAT_MS = 100;
|
|
1
3
|
export declare function formatDuration(ms: number): string;
|
|
4
|
+
export declare function resolveHeartbeatInterval(isTty: boolean, overrideMs?: number): number;
|
|
2
5
|
export declare function logProgress(message: string): void;
|
|
3
6
|
/** Emit a tree phase line (├─ by default; use endPhase for └─). */
|
|
4
7
|
export declare function logPhase(message: string, options?: {
|
|
@@ -6,12 +9,16 @@ export declare function logPhase(message: string, options?: {
|
|
|
6
9
|
}): void;
|
|
7
10
|
/** Nested heartbeat / continuation under the current phase. */
|
|
8
11
|
export declare function logPhaseNested(message: string): void;
|
|
12
|
+
/** Durable live line (tool call) under the agent clock. */
|
|
13
|
+
export declare function logLive(message: string): void;
|
|
9
14
|
/** Print a verdict block (PASS/FAIL + reasons). */
|
|
10
15
|
export declare function logVerdict(lines: string[]): void;
|
|
16
|
+
export declare function refreshHeartbeat(): void;
|
|
11
17
|
/** Log every `intervalMs` while `promise` is pending (live agent runs). */
|
|
12
18
|
export declare function withHeartbeat<T>(promise: Promise<T>, options: {
|
|
13
19
|
label?: string;
|
|
14
20
|
intervalMs?: number;
|
|
15
21
|
started?: number;
|
|
22
|
+
preview?: () => string | undefined;
|
|
16
23
|
}): Promise<T>;
|
|
17
24
|
//# sourceMappingURL=progress.d.ts.map
|
package/dist/progress.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAKA,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAMpC,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAKpF;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMjD;AAED,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAO5E;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMpD;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAM7C;AAED,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAQhD;AAqBD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,2EAA2E;AAC3E,wBAAsB,aAAa,CAAC,CAAC,EACpC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,OAAO,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACnC,GACC,OAAO,CAAC,CAAC,CAAC,CAgCZ"}
|
package/dist/progress.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { logger } from "@post-print/agent-harness";
|
|
2
|
-
import { formatDurationLabel, theme } from "./theme.js";
|
|
2
|
+
import { clipToColumns, formatClock, formatDurationLabel, theme } from "./theme.js";
|
|
3
3
|
const DEFAULT_HEARTBEAT_MS = 60_000;
|
|
4
|
+
/** Tenth of a second. Faster ticks flood stdout and wrap the clock line. */
|
|
5
|
+
export const TTY_HEARTBEAT_MS = 100;
|
|
4
6
|
function enabled() {
|
|
5
7
|
return process.env.AGENT_TEST_QUIET !== "1" && !process.env.VITEST;
|
|
6
8
|
}
|
|
7
9
|
export function formatDuration(ms) {
|
|
8
10
|
return formatDurationLabel(ms);
|
|
9
11
|
}
|
|
12
|
+
export function resolveHeartbeatInterval(isTty, overrideMs) {
|
|
13
|
+
if (overrideMs !== undefined) {
|
|
14
|
+
return overrideMs;
|
|
15
|
+
}
|
|
16
|
+
return isTty ? TTY_HEARTBEAT_MS : DEFAULT_HEARTBEAT_MS;
|
|
17
|
+
}
|
|
10
18
|
export function logProgress(message) {
|
|
11
19
|
if (!enabled()) {
|
|
12
20
|
return;
|
|
@@ -31,6 +39,14 @@ export function logPhaseNested(message) {
|
|
|
31
39
|
clearHeartbeatLine();
|
|
32
40
|
console.log(theme.phaseTree("│ ", message));
|
|
33
41
|
}
|
|
42
|
+
/** Durable live line (tool call) under the agent clock. */
|
|
43
|
+
export function logLive(message) {
|
|
44
|
+
if (!enabled()) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
clearHeartbeatLine();
|
|
48
|
+
console.log(theme.phaseTree("│ ", message));
|
|
49
|
+
}
|
|
34
50
|
/** Print a verdict block (PASS/FAIL + reasons). */
|
|
35
51
|
export function logVerdict(lines) {
|
|
36
52
|
if (!enabled()) {
|
|
@@ -42,6 +58,7 @@ export function logVerdict(lines) {
|
|
|
42
58
|
}
|
|
43
59
|
}
|
|
44
60
|
let heartbeatActive = false;
|
|
61
|
+
let heartbeatPaint;
|
|
45
62
|
function clearHeartbeatLine() {
|
|
46
63
|
if (!heartbeatActive || !process.stdout.isTTY) {
|
|
47
64
|
return;
|
|
@@ -50,31 +67,44 @@ function clearHeartbeatLine() {
|
|
|
50
67
|
heartbeatActive = false;
|
|
51
68
|
}
|
|
52
69
|
function writeHeartbeatOverwrite(message) {
|
|
53
|
-
process.stdout.
|
|
70
|
+
const columns = process.stdout.columns && process.stdout.columns > 0 ? process.stdout.columns : 80;
|
|
71
|
+
const line = clipToColumns(theme.phaseTree("│ ", message), columns);
|
|
72
|
+
process.stdout.write(`\x1b[2K\r${line}`);
|
|
54
73
|
heartbeatActive = true;
|
|
55
74
|
}
|
|
75
|
+
export function refreshHeartbeat() {
|
|
76
|
+
heartbeatPaint?.();
|
|
77
|
+
}
|
|
56
78
|
/** Log every `intervalMs` while `promise` is pending (live agent runs). */
|
|
57
79
|
export async function withHeartbeat(promise, options) {
|
|
58
80
|
if (!enabled()) {
|
|
59
81
|
return promise;
|
|
60
82
|
}
|
|
61
83
|
const started = options.started ?? performance.now();
|
|
62
|
-
const intervalMs = options.intervalMs ?? DEFAULT_HEARTBEAT_MS;
|
|
63
84
|
const useOverwrite = Boolean(process.stdout.isTTY);
|
|
64
|
-
const
|
|
65
|
-
|
|
85
|
+
const intervalMs = resolveHeartbeatInterval(useOverwrite, options.intervalMs);
|
|
86
|
+
const label = options.label ?? "agent";
|
|
87
|
+
const paint = () => {
|
|
88
|
+
const elapsed = formatClock(performance.now() - started);
|
|
89
|
+
const preview = options.preview?.();
|
|
90
|
+
const line = theme.agentClock(elapsed, preview);
|
|
66
91
|
if (useOverwrite) {
|
|
67
|
-
writeHeartbeatOverwrite(
|
|
92
|
+
writeHeartbeatOverwrite(line);
|
|
68
93
|
return;
|
|
69
94
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
95
|
+
logPhaseNested(theme.phase(label, theme.duration(elapsed)));
|
|
96
|
+
};
|
|
97
|
+
heartbeatPaint = paint;
|
|
98
|
+
paint();
|
|
99
|
+
const timer = setInterval(paint, intervalMs);
|
|
73
100
|
try {
|
|
74
101
|
return await promise;
|
|
75
102
|
}
|
|
76
103
|
finally {
|
|
77
104
|
clearInterval(timer);
|
|
105
|
+
if (heartbeatPaint === paint) {
|
|
106
|
+
heartbeatPaint = undefined;
|
|
107
|
+
}
|
|
78
108
|
clearHeartbeatLine();
|
|
79
109
|
}
|
|
80
110
|
}
|
package/dist/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"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"}
|
package/dist/record-trace.d.ts
CHANGED
|
@@ -9,15 +9,10 @@ export declare function getLiveStagingRootOverride(): string | undefined;
|
|
|
9
9
|
* distinct names that normalize alike (e.g. "Foo Bar" / "foo-bar") never collide.
|
|
10
10
|
*/
|
|
11
11
|
export declare function scenarioArtifactSlug(name: string): string;
|
|
12
|
-
/**
|
|
13
|
-
* Band-neutral key for pairing outcome vs transfer scenarios in compare reports.
|
|
14
|
-
* Strips `outcome:` / `transfer:` prefixes and normalizes case.
|
|
15
|
-
*/
|
|
16
|
-
export declare function scenarioCompareKey(name: string): string;
|
|
17
12
|
export declare function getLiveStagingRoot(): string;
|
|
18
13
|
export declare function getLiveStagingSessionRoot(sessionId: string): string;
|
|
19
14
|
/** Staging JSON path for a live scenario trace (matches recordTrace layout). */
|
|
20
|
-
export declare function getStagingTracePath(stagingSessionId: string, suiteName: string, scenarioName: string): string;
|
|
15
|
+
export declare function getStagingTracePath(stagingSessionId: string, suiteName: string, scenarioName: string, arm?: "a" | "b"): string;
|
|
21
16
|
/** Parent arms subprocess kill from this marker (epoch ms) when the harness deadline starts. */
|
|
22
17
|
export declare function getStagingAgentStartPath(stagingSessionId: string, suiteName: string, scenarioName: string): string;
|
|
23
18
|
/** Child writes when the harness agent deadline clock starts (after pre-stream SDK setup). */
|
|
@@ -26,14 +21,21 @@ export declare function writeAgentStartMarker(path: string): Promise<void>;
|
|
|
26
21
|
export declare function readAgentStartMarker(path: string): Promise<number | undefined>;
|
|
27
22
|
/** Parent reads rubric failures from isolated child runs when exit code is non-zero. */
|
|
28
23
|
export declare function getStagingResultPath(stagingSessionId: string, suiteName: string, scenarioName: string): string;
|
|
24
|
+
export interface LiveCompareArmSidecar {
|
|
25
|
+
durationMs: number;
|
|
26
|
+
}
|
|
29
27
|
export interface LiveScenarioResultSidecar {
|
|
30
28
|
passed: boolean;
|
|
31
29
|
failures: AssertionFailure[];
|
|
32
30
|
durationMs: number;
|
|
31
|
+
compare?: {
|
|
32
|
+
a: LiveCompareArmSidecar;
|
|
33
|
+
b: LiveCompareArmSidecar;
|
|
34
|
+
};
|
|
33
35
|
}
|
|
34
36
|
export declare function createLiveStagingSessionId(): string;
|
|
35
37
|
/** Resolve the transient trace used by isolated direct-agent runs. */
|
|
36
|
-
export declare function resolveRecordingPath(suiteName: string, scenarioName: string, stagingSessionId: string | undefined): string | undefined;
|
|
38
|
+
export declare function resolveRecordingPath(suiteName: string, scenarioName: string, stagingSessionId: string | undefined, arm?: "a" | "b"): string | undefined;
|
|
37
39
|
/** Persist a direct-run trace for parent-process judging and diagnostics. */
|
|
38
40
|
export declare function recordTrace(outputPath: string, trace: AgentTrace): Promise<string>;
|
|
39
41
|
/** Load a staged live trace for parent-process judge after isolated child runs. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-trace.d.ts","sourceRoot":"","sources":["../src/record-trace.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAIlD,2FAA2F;AAC3F,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEzE;AAED,wBAAgB,0BAA0B,IAAI,MAAM,GAAG,SAAS,CAE/D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASzD;AAED
|
|
1
|
+
{"version":3,"file":"record-trace.d.ts","sourceRoot":"","sources":["../src/record-trace.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAIlD,2FAA2F;AAC3F,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEzE;AAED,wBAAgB,0BAA0B,IAAI,MAAM,GAAG,SAAS,CAE/D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASzD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAMD,gFAAgF;AAChF,wBAAgB,mBAAmB,CAClC,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,GACb,MAAM,CAOR;AAED,gGAAgG;AAChG,wBAAgB,wBAAwB,CACvC,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GAClB,MAAM,CAMR;AAED,8FAA8F;AAC9F,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvE;AAED,wFAAwF;AACxF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQpF;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CACnC,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GAClB,MAAM,CAMR;AAED,MAAM,WAAW,qBAAqB;IACrC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACT,CAAC,EAAE,qBAAqB,CAAC;QACzB,CAAC,EAAE,qBAAqB,CAAC;KACzB,CAAC;CACF;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CACnC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,GACb,MAAM,GAAG,SAAS,CAKpB;AAED,6EAA6E;AAC7E,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBxF;AAED,mFAAmF;AACnF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAGxE;AAED,8FAA8F;AAC9F,wBAAsB,kBAAkB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,yBAAyB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,0FAA0F;AAC1F,wBAAsB,iBAAiB,CACtC,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAMhD;AAED,6DAA6D;AAC7D,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E"}
|
package/dist/record-trace.js
CHANGED
|
@@ -25,18 +25,6 @@ export function scenarioArtifactSlug(name) {
|
|
|
25
25
|
const hash = createHash("sha256").update(name).digest("hex").slice(0, 8);
|
|
26
26
|
return `${base}-${hash}`;
|
|
27
27
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Band-neutral key for pairing outcome vs transfer scenarios in compare reports.
|
|
30
|
-
* Strips `outcome:` / `transfer:` prefixes and normalizes case.
|
|
31
|
-
*/
|
|
32
|
-
export function scenarioCompareKey(name) {
|
|
33
|
-
return name
|
|
34
|
-
.replace(/^(outcome|transfer)[:-]\s*/i, "")
|
|
35
|
-
.replace(/-[a-f0-9]{8}$/i, "")
|
|
36
|
-
.replace(/-/g, " ")
|
|
37
|
-
.trim()
|
|
38
|
-
.toLowerCase();
|
|
39
|
-
}
|
|
40
28
|
export function getLiveStagingRoot() {
|
|
41
29
|
if (liveStagingRootOverride) {
|
|
42
30
|
return join(liveStagingRootOverride, "sessions");
|
|
@@ -50,8 +38,9 @@ function stagingScenarioBasename(scenarioName) {
|
|
|
50
38
|
return scenarioArtifactSlug(scenarioName);
|
|
51
39
|
}
|
|
52
40
|
/** Staging JSON path for a live scenario trace (matches recordTrace layout). */
|
|
53
|
-
export function getStagingTracePath(stagingSessionId, suiteName, scenarioName) {
|
|
54
|
-
|
|
41
|
+
export function getStagingTracePath(stagingSessionId, suiteName, scenarioName, arm) {
|
|
42
|
+
const suffix = arm ? `.${arm}` : "";
|
|
43
|
+
return join(getLiveStagingSessionRoot(stagingSessionId), suiteName, `${stagingScenarioBasename(scenarioName)}${suffix}.json`);
|
|
55
44
|
}
|
|
56
45
|
/** Parent arms subprocess kill from this marker (epoch ms) when the harness deadline starts. */
|
|
57
46
|
export function getStagingAgentStartPath(stagingSessionId, suiteName, scenarioName) {
|
|
@@ -81,11 +70,11 @@ export function createLiveStagingSessionId() {
|
|
|
81
70
|
return `${process.pid}-${Date.now()}`;
|
|
82
71
|
}
|
|
83
72
|
/** Resolve the transient trace used by isolated direct-agent runs. */
|
|
84
|
-
export function resolveRecordingPath(suiteName, scenarioName, stagingSessionId) {
|
|
73
|
+
export function resolveRecordingPath(suiteName, scenarioName, stagingSessionId, arm) {
|
|
85
74
|
if (!stagingSessionId) {
|
|
86
75
|
return undefined;
|
|
87
76
|
}
|
|
88
|
-
return getStagingTracePath(stagingSessionId, suiteName, scenarioName);
|
|
77
|
+
return getStagingTracePath(stagingSessionId, suiteName, scenarioName, arm);
|
|
89
78
|
}
|
|
90
79
|
/** Persist a direct-run trace for parent-process judging and diagnostics. */
|
|
91
80
|
export async function recordTrace(outputPath, trace) {
|
package/dist/record-trace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-trace.js","sourceRoot":"","sources":["../src/record-trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAIxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAElD,IAAI,uBAA2C,CAAC;AAEhD,2FAA2F;AAC3F,MAAM,UAAU,0BAA0B,CAAC,IAAwB;IAClE,uBAAuB,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,0BAA0B;IACzC,OAAO,uBAAuB,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAChD,MAAM,IAAI,GACT,IAAI;SACF,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"record-trace.js","sourceRoot":"","sources":["../src/record-trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-preview-server.d.ts","sourceRoot":"","sources":["../src/report-preview-server.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { isCliMain } from "./cli-entry.js";
|
|
4
|
+
import { listenReportPreview } from "./report-preview.js";
|
|
5
|
+
const entry = fileURLToPath(import.meta.url);
|
|
6
|
+
if (isCliMain(process.argv[1], entry)) {
|
|
7
|
+
const filePath = process.argv[2];
|
|
8
|
+
if (!filePath) {
|
|
9
|
+
process.stderr.write("report preview needs an html file path\n");
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const idleMs = Number(process.argv[3]);
|
|
13
|
+
void listenReportPreview(resolve(filePath), {
|
|
14
|
+
idleMs: Number.isFinite(idleMs) && idleMs > 0 ? idleMs : undefined,
|
|
15
|
+
})
|
|
16
|
+
.then(({ url }) => {
|
|
17
|
+
process.stdout.write(`${url}\n`);
|
|
18
|
+
})
|
|
19
|
+
.catch((error) => {
|
|
20
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=report-preview-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-preview-server.js","sourceRoot":"","sources":["../src/report-preview-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAE7C,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,KAAK,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAC3C,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAClE,CAAC;SACA,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Preview process exits after this idle time. */
|
|
2
|
+
export declare const REPORT_PREVIEW_IDLE_MS: number;
|
|
3
|
+
export declare function shouldStartReportPreview(env?: NodeJS.ProcessEnv, stdoutIsTty?: boolean): boolean;
|
|
4
|
+
export declare function listenReportPreview(filePath: string, options?: {
|
|
5
|
+
idleMs?: number;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
url: string;
|
|
8
|
+
close: () => Promise<void>;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function startDetachedReportPreview(filePath: string): Promise<string | undefined>;
|
|
11
|
+
//# sourceMappingURL=report-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-preview.d.ts","sourceRoot":"","sources":["../src/report-preview.ts"],"names":[],"mappings":"AAQA,kDAAkD;AAClD,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AAIrD,wBAAgB,wBAAwB,CACvC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,WAAW,UAAgC,GACzC,OAAO,CAQT;AAED,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CA6CtD;AAED,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA8B9F"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { readFile } from "node:fs/promises";
|
|
4
|
+
import { createServer } from "node:http";
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
/** Preview process exits after this idle time. */
|
|
8
|
+
export const REPORT_PREVIEW_IDLE_MS = 30 * 60 * 1000;
|
|
9
|
+
const PREVIEW_HOST = "127.0.0.1";
|
|
10
|
+
export function shouldStartReportPreview(env = process.env, stdoutIsTty = Boolean(process.stdout.isTTY)) {
|
|
11
|
+
if (env.CI === "1" || env.CI === "true") {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
if (env.AGENT_TEST_NO_REPORT_PREVIEW === "1") {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return stdoutIsTty;
|
|
18
|
+
}
|
|
19
|
+
export function listenReportPreview(filePath, options = {}) {
|
|
20
|
+
const absolutePath = resolve(filePath);
|
|
21
|
+
const idleMs = options.idleMs;
|
|
22
|
+
return new Promise((resolveListen, reject) => {
|
|
23
|
+
let idle;
|
|
24
|
+
const bumpIdle = () => {
|
|
25
|
+
if (idleMs === undefined) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (idle !== undefined) {
|
|
29
|
+
clearTimeout(idle);
|
|
30
|
+
}
|
|
31
|
+
idle = setTimeout(() => {
|
|
32
|
+
void close();
|
|
33
|
+
}, idleMs);
|
|
34
|
+
};
|
|
35
|
+
const server = createServer((req, res) => {
|
|
36
|
+
bumpIdle();
|
|
37
|
+
void serveReportFile(absolutePath, req, res);
|
|
38
|
+
});
|
|
39
|
+
const close = () => new Promise((resolveClose, rejectClose) => {
|
|
40
|
+
if (idle !== undefined) {
|
|
41
|
+
clearTimeout(idle);
|
|
42
|
+
idle = undefined;
|
|
43
|
+
}
|
|
44
|
+
server.close((error) => {
|
|
45
|
+
if (error) {
|
|
46
|
+
rejectClose(error);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
resolveClose();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
server.once("error", reject);
|
|
53
|
+
server.listen(0, PREVIEW_HOST, () => {
|
|
54
|
+
const addr = server.address();
|
|
55
|
+
if (!addr || typeof addr === "string") {
|
|
56
|
+
reject(new Error("report preview has no port"));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
bumpIdle();
|
|
60
|
+
resolveListen({ url: `http://${PREVIEW_HOST}:${addr.port}/`, close });
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export async function startDetachedReportPreview(filePath) {
|
|
65
|
+
const serverPath = resolvePreviewServerEntry();
|
|
66
|
+
if (!serverPath) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
const child = spawn(process.execPath, [serverPath, resolve(filePath), String(REPORT_PREVIEW_IDLE_MS)], {
|
|
70
|
+
detached: true,
|
|
71
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
72
|
+
});
|
|
73
|
+
if (!child.stdout) {
|
|
74
|
+
child.kill();
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const line = await readFirstLine(child.stdout, 3000);
|
|
79
|
+
if (!isLocalPreviewUrl(line)) {
|
|
80
|
+
child.kill();
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
child.stdout.destroy();
|
|
84
|
+
child.unref();
|
|
85
|
+
return line;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
killPreviewChild(child);
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function isLocalPreviewUrl(url) {
|
|
93
|
+
return /^http:\/\/127\.0\.0\.1:\d+\/$/.test(url);
|
|
94
|
+
}
|
|
95
|
+
function resolvePreviewServerEntry() {
|
|
96
|
+
const js = fileURLToPath(new URL("./report-preview-server.js", import.meta.url));
|
|
97
|
+
const ts = fileURLToPath(new URL("./report-preview-server.ts", import.meta.url));
|
|
98
|
+
if (existsSync(js)) {
|
|
99
|
+
return js;
|
|
100
|
+
}
|
|
101
|
+
if (existsSync(ts)) {
|
|
102
|
+
return ts;
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
function killPreviewChild(child) {
|
|
107
|
+
if (!child.killed) {
|
|
108
|
+
child.kill();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function readFirstLine(stream, timeoutMs) {
|
|
112
|
+
return new Promise((resolveLine, reject) => {
|
|
113
|
+
let buf = "";
|
|
114
|
+
const timer = setTimeout(() => {
|
|
115
|
+
cleanup();
|
|
116
|
+
reject(new Error("report preview timed out"));
|
|
117
|
+
}, timeoutMs);
|
|
118
|
+
const onData = (chunk) => {
|
|
119
|
+
buf += String(chunk);
|
|
120
|
+
const nl = buf.indexOf("\n");
|
|
121
|
+
if (nl === -1) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
cleanup();
|
|
125
|
+
resolveLine(buf.slice(0, nl).trim());
|
|
126
|
+
};
|
|
127
|
+
const onError = (error) => {
|
|
128
|
+
cleanup();
|
|
129
|
+
reject(error);
|
|
130
|
+
};
|
|
131
|
+
const cleanup = () => {
|
|
132
|
+
clearTimeout(timer);
|
|
133
|
+
stream.off("data", onData);
|
|
134
|
+
stream.off("error", onError);
|
|
135
|
+
};
|
|
136
|
+
stream.on("data", onData);
|
|
137
|
+
stream.on("error", onError);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
async function serveReportFile(filePath, req, res) {
|
|
141
|
+
const url = req.url ?? "/";
|
|
142
|
+
const path = url.split("?")[0] ?? "/";
|
|
143
|
+
if (req.method !== "GET" || (path !== "/" && path !== "/index.html")) {
|
|
144
|
+
res.writeHead(404);
|
|
145
|
+
res.end();
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const body = await readFile(filePath);
|
|
150
|
+
res.writeHead(200, {
|
|
151
|
+
"content-type": "text/html; charset=utf-8",
|
|
152
|
+
"cache-control": "no-store",
|
|
153
|
+
});
|
|
154
|
+
res.end(body);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
res.writeHead(404);
|
|
158
|
+
res.end();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=report-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-preview.js","sourceRoot":"","sources":["../src/report-preview.ts"],"names":[],"mappings":"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"}
|
package/dist/run-suite.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentHost, RoutingContract } from "@post-print/agent-harness";
|
|
1
|
+
import type { AgentHost, JudgeCriterion, RoutingContract } from "@post-print/agent-harness";
|
|
2
2
|
import type { AgentScenario, AgentSuiteDefaults, ScenarioResult, ScenarioRubric, SuiteRunReport } from "./types.js";
|
|
3
3
|
/** Parent process prints suite headers and final verdicts; children only print phases. */
|
|
4
4
|
export declare function shouldPrintSuiteChrome(): boolean;
|
|
@@ -8,6 +8,11 @@ export interface RunSuiteOptions {
|
|
|
8
8
|
cwd: string;
|
|
9
9
|
suitePath: string;
|
|
10
10
|
host?: AgentHost;
|
|
11
|
+
/**
|
|
12
|
+
* When true, skip scenarios pinned to a different host.
|
|
13
|
+
* Set by a multi-host matrix so `scenario.host` does not rerun on every cell.
|
|
14
|
+
*/
|
|
15
|
+
hostLocked?: boolean;
|
|
11
16
|
/** Run only this scenario name (used by live subprocess isolation). */
|
|
12
17
|
scenarioFilter?: string;
|
|
13
18
|
/** Run the harness LLM judge for rubric.judge criteria. */
|
|
@@ -31,6 +36,8 @@ export interface RunSuiteOptions {
|
|
|
31
36
|
scenarioRetries?: number;
|
|
32
37
|
/** Prefer `<rubricsDir>/<suite>/rubrics.json` over sibling rubrics (harness-only). */
|
|
33
38
|
rubricsDir?: string;
|
|
39
|
+
/** Consumer adapter modules to forward to isolated children. */
|
|
40
|
+
adapterModules?: string[];
|
|
34
41
|
}
|
|
35
42
|
export interface RunAgentTestOptions {
|
|
36
43
|
cwd: string;
|
|
@@ -56,6 +63,30 @@ export interface RunAgentTestOptions {
|
|
|
56
63
|
}
|
|
57
64
|
/** Live-only mode hint from rubric — not part of the user scenario prompt. */
|
|
58
65
|
export declare function outputContractForRubric(rubric: ScenarioRubric): RoutingContract | undefined;
|
|
66
|
+
/** Explicit judge questions plus skill-invoke questions for mustInvokeSkill. */
|
|
67
|
+
export declare function collectJudgeCriteria(rubric: ScenarioRubric): JudgeCriterion[];
|
|
68
|
+
/** Pairwise judge questions only. Skill-follow checks stay per-arm and deterministic. */
|
|
69
|
+
export declare function collectCompareJudgeCriteria(rubric: ScenarioRubric): JudgeCriterion[];
|
|
70
|
+
/** Judge auth and the judge call apply only when a rubric has judge work. */
|
|
71
|
+
export declare function judgeAuthRequired(judge: boolean, rubrics: readonly ScenarioRubric[]): boolean;
|
|
72
|
+
/** Pairwise judge on compare. Skill-follow judge questions stay on non-compare scenarios. */
|
|
73
|
+
export declare function scenarioNeedsJudge(judge: boolean, scenario: Pick<AgentScenario, "compare" | "rubric">): boolean;
|
|
74
|
+
/** True when the selected live run will call the judge. */
|
|
75
|
+
export declare function selectedRunNeedsJudge(options: {
|
|
76
|
+
cwd: string;
|
|
77
|
+
suitesDir: string;
|
|
78
|
+
filter?: string;
|
|
79
|
+
scenarioFilter?: string;
|
|
80
|
+
rubricsDir?: string;
|
|
81
|
+
judge?: boolean;
|
|
82
|
+
}): Promise<boolean>;
|
|
83
|
+
export declare function loadSelectedRubrics(options: {
|
|
84
|
+
cwd: string;
|
|
85
|
+
suitesDir: string;
|
|
86
|
+
filter?: string;
|
|
87
|
+
scenarioFilter?: string;
|
|
88
|
+
rubricsDir?: string;
|
|
89
|
+
}): Promise<ScenarioRubric[]>;
|
|
59
90
|
export declare function runSuite(options: RunSuiteOptions): Promise<SuiteRunReport>;
|
|
60
91
|
/** Run one real agent scenario. JSON suites delegate to this same execution boundary. */
|
|
61
92
|
export declare function runAgentTest(options: RunAgentTestOptions): Promise<ScenarioResult>;
|
|
@@ -63,6 +94,7 @@ export declare function runAllSuites(options: {
|
|
|
63
94
|
cwd: string;
|
|
64
95
|
suitesDir: string;
|
|
65
96
|
host?: AgentHost;
|
|
97
|
+
hosts?: readonly AgentHost[];
|
|
66
98
|
filter?: string;
|
|
67
99
|
scenarioFilter?: string;
|
|
68
100
|
judge?: boolean;
|
|
@@ -75,6 +107,7 @@ export declare function runAllSuites(options: {
|
|
|
75
107
|
debugDir?: string;
|
|
76
108
|
scenarioRetries?: number;
|
|
77
109
|
rubricsDir?: string;
|
|
110
|
+
adapterModules?: string[];
|
|
78
111
|
}): Promise<SuiteRunReport[]>;
|
|
79
112
|
export { discoverSuites } from "./discover-suites.js";
|
|
80
113
|
//# sourceMappingURL=run-suite.d.ts.map
|