@post-print/agent-test 0.3.3 → 0.3.5
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 +126 -157
- 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 +12 -14
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +342 -366
- package/dist/cli.js.map +1 -1
- package/dist/compare-scenario.d.ts +33 -0
- package/dist/compare-scenario.d.ts.map +1 -0
- package/dist/compare-scenario.js +128 -0
- package/dist/compare-scenario.js.map +1 -0
- package/dist/debug-bundle.d.ts +2 -2
- package/dist/debug-bundle.d.ts.map +1 -1
- package/dist/debug-bundle.js +12 -12
- 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 +136 -14
- 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 +381 -318
- package/dist/html-report.js.map +1 -1
- package/dist/index.d.ts +15 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/dist/live-isolation.d.ts +11 -5
- package/dist/live-isolation.d.ts.map +1 -1
- package/dist/live-isolation.js +32 -14
- 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 +16 -0
- 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/preflight.d.ts +2 -2
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +4 -4
- package/dist/preflight.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 +11 -20
- package/dist/record-trace.d.ts.map +1 -1
- package/dist/record-trace.js +10 -57
- 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 +62 -11
- package/dist/run-suite.d.ts.map +1 -1
- package/dist/run-suite.js +697 -206
- package/dist/run-suite.js.map +1 -1
- package/dist/scenario-story.d.ts +41 -0
- package/dist/scenario-story.d.ts.map +1 -0
- package/dist/scenario-story.js +198 -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 +29 -5
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +204 -45
- package/dist/theme.js.map +1 -1
- package/dist/types.d.ts +107 -24
- 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 +256 -22
- package/dist/validate-suite.js.map +1 -1
- package/package.json +5 -5
- 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/preflight.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
/** Fail fast when
|
|
2
|
-
export declare function
|
|
1
|
+
/** Fail fast when a direct agent run cannot find suite definitions. */
|
|
2
|
+
export declare function assertDirectAgentPreflight(repoRoot: string, suitesDir?: string): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=preflight.d.ts.map
|
package/dist/preflight.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAGA,
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAGA,uEAAuE;AACvE,wBAAsB,0BAA0B,CAC/C,QAAQ,EAAE,MAAM,EAChB,SAAS,SAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAaf"}
|
package/dist/preflight.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { access } from "node:fs/promises";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
|
-
/** Fail fast when
|
|
4
|
-
export async function
|
|
3
|
+
/** Fail fast when a direct agent run cannot find suite definitions. */
|
|
4
|
+
export async function assertDirectAgentPreflight(repoRoot, suitesDir = "agent-suites") {
|
|
5
5
|
const suitesRoot = resolve(repoRoot, suitesDir);
|
|
6
6
|
try {
|
|
7
7
|
await access(suitesRoot);
|
|
8
8
|
}
|
|
9
9
|
catch {
|
|
10
10
|
throw new Error([
|
|
11
|
-
`
|
|
11
|
+
`Direct agent testing requires a suites directory (missing ${suitesRoot}).`,
|
|
12
12
|
"Pass --suites-dir <path> or create agent-suites/<suite>/scenarios.json in the repo.",
|
|
13
|
-
"See @post-print/agent-test README §
|
|
13
|
+
"See @post-print/agent-test README § Direct agent runs.",
|
|
14
14
|
].join("\n"));
|
|
15
15
|
}
|
|
16
16
|
}
|
package/dist/preflight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC/C,QAAgB,EAChB,SAAS,GAAG,cAAc;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CACd;YACC,6DAA6D,UAAU,IAAI;YAC3E,qFAAqF;YACrF,wDAAwD;SACxD,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ,CAAC;IACH,CAAC;AACF,CAAC"}
|
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,24 +21,22 @@ 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
|
-
|
|
36
|
-
export
|
|
37
|
-
|
|
38
|
-
kind: RecordingPathKind;
|
|
39
|
-
}
|
|
40
|
-
export interface ResolveRecordingPathOptions {
|
|
41
|
-
repoRoot: string;
|
|
42
|
-
stagingSessionId?: string;
|
|
43
|
-
}
|
|
44
|
-
/** Staging lives under $TMPDIR; use --record-fixtures to overwrite committed replayTrace. */
|
|
45
|
-
export declare function resolveRecordingPath(suiteName: string, scenarioName: string, replayTrace: string | undefined, recordFixtures: boolean, options: ResolveRecordingPathOptions): ResolvedRecordingPath | undefined;
|
|
46
|
-
/** Persist a live trace for replay regression (strip raw SDK payload). */
|
|
37
|
+
/** Resolve the transient trace used by isolated direct-agent runs. */
|
|
38
|
+
export declare function resolveRecordingPath(suiteName: string, scenarioName: string, stagingSessionId: string | undefined, arm?: "a" | "b"): string | undefined;
|
|
39
|
+
/** Persist a direct-run trace for parent-process judging and diagnostics. */
|
|
47
40
|
export declare function recordTrace(outputPath: string, trace: AgentTrace): Promise<string>;
|
|
48
41
|
/** Load a staged live trace for parent-process judge after isolated child runs. */
|
|
49
42
|
export declare function loadStagingTrace(path: string): Promise<AgentTrace>;
|
|
@@ -53,6 +46,4 @@ export declare function writeStagingResult(path: string, result: LiveScenarioRes
|
|
|
53
46
|
export declare function loadStagingResult(path: string): Promise<LiveScenarioResultSidecar | undefined>;
|
|
54
47
|
/** Remove a live staging session directory under $TMPDIR. */
|
|
55
48
|
export declare function cleanupStagingSession(sessionRoot: string): Promise<void>;
|
|
56
|
-
/** Remove legacy in-repo staging dirs from before tmpdir staging (best-effort). */
|
|
57
|
-
export declare function cleanupLegacyRepoRecordings(repoRoot: string): Promise<string[]>;
|
|
58
49
|
//# sourceMappingURL=record-trace.d.ts.map
|
|
@@ -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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { mkdir,
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
|
-
import { dirname, join
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
5
|
import { enrichTrace } from "@post-print/agent-harness";
|
|
6
6
|
export const LIVE_STAGING_DIR_NAME = "agent-spec";
|
|
7
7
|
let liveStagingRootOverride;
|
|
@@ -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) {
|
|
@@ -80,26 +69,14 @@ export function getStagingResultPath(stagingSessionId, suiteName, scenarioName)
|
|
|
80
69
|
export function createLiveStagingSessionId() {
|
|
81
70
|
return `${process.pid}-${Date.now()}`;
|
|
82
71
|
}
|
|
83
|
-
/**
|
|
84
|
-
export function resolveRecordingPath(suiteName, scenarioName,
|
|
85
|
-
if (
|
|
86
|
-
if (!replayTrace) {
|
|
87
|
-
return undefined;
|
|
88
|
-
}
|
|
89
|
-
return {
|
|
90
|
-
path: resolve(options.repoRoot, replayTrace),
|
|
91
|
-
kind: "fixture",
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
if (!options.stagingSessionId) {
|
|
72
|
+
/** Resolve the transient trace used by isolated direct-agent runs. */
|
|
73
|
+
export function resolveRecordingPath(suiteName, scenarioName, stagingSessionId, arm) {
|
|
74
|
+
if (!stagingSessionId) {
|
|
95
75
|
return undefined;
|
|
96
76
|
}
|
|
97
|
-
return
|
|
98
|
-
path: getStagingTracePath(options.stagingSessionId, suiteName, scenarioName),
|
|
99
|
-
kind: "staging",
|
|
100
|
-
};
|
|
77
|
+
return getStagingTracePath(stagingSessionId, suiteName, scenarioName, arm);
|
|
101
78
|
}
|
|
102
|
-
/** Persist a
|
|
79
|
+
/** Persist a direct-run trace for parent-process judging and diagnostics. */
|
|
103
80
|
export async function recordTrace(outputPath, trace) {
|
|
104
81
|
const enriched = enrichTrace(trace);
|
|
105
82
|
const payload = {
|
|
@@ -142,28 +119,4 @@ export async function loadStagingResult(path) {
|
|
|
142
119
|
export async function cleanupStagingSession(sessionRoot) {
|
|
143
120
|
await rm(sessionRoot, { recursive: true, force: true });
|
|
144
121
|
}
|
|
145
|
-
/** Remove legacy in-repo staging dirs from before tmpdir staging (best-effort). */
|
|
146
|
-
export async function cleanupLegacyRepoRecordings(repoRoot) {
|
|
147
|
-
const suitesRoot = join(repoRoot, "agent-suites");
|
|
148
|
-
const removed = [];
|
|
149
|
-
let suiteNames;
|
|
150
|
-
try {
|
|
151
|
-
suiteNames = await readdir(suitesRoot);
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
return removed;
|
|
155
|
-
}
|
|
156
|
-
for (const suiteName of suiteNames) {
|
|
157
|
-
const recordingsDir = join(suitesRoot, suiteName, "fixtures", "recordings");
|
|
158
|
-
try {
|
|
159
|
-
await stat(recordingsDir);
|
|
160
|
-
await rm(recordingsDir, { recursive: true, force: true });
|
|
161
|
-
removed.push(recordingsDir);
|
|
162
|
-
}
|
|
163
|
-
catch {
|
|
164
|
-
// absent
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return removed;
|
|
168
|
-
}
|
|
169
122
|
//# sourceMappingURL=record-trace.js.map
|
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,
|
|
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"}
|