@post-print/agent-test 0.3.11 → 0.3.13
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 +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +53 -3
- package/dist/cli.js.map +1 -1
- package/dist/command-allowlist.d.ts +9 -0
- package/dist/command-allowlist.d.ts.map +1 -0
- package/dist/command-allowlist.js +29 -0
- package/dist/command-allowlist.js.map +1 -0
- package/dist/compare-scenario.d.ts +5 -0
- package/dist/compare-scenario.d.ts.map +1 -1
- package/dist/compare-scenario.js +42 -25
- package/dist/compare-scenario.js.map +1 -1
- package/dist/expect.d.ts +2 -0
- package/dist/expect.d.ts.map +1 -1
- package/dist/expect.js +17 -0
- package/dist/expect.js.map +1 -1
- package/dist/html-report.d.ts +1 -0
- package/dist/html-report.d.ts.map +1 -1
- package/dist/html-report.js +26 -30
- package/dist/html-report.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/live-isolation.d.ts +6 -1
- package/dist/live-isolation.d.ts.map +1 -1
- package/dist/live-isolation.js +30 -2
- package/dist/live-isolation.js.map +1 -1
- package/dist/record-trace.d.ts +2 -2
- package/dist/record-trace.d.ts.map +1 -1
- package/dist/record-trace.js +6 -4
- package/dist/record-trace.js.map +1 -1
- package/dist/run-suite.d.ts +9 -1
- package/dist/run-suite.d.ts.map +1 -1
- package/dist/run-suite.js +103 -42
- package/dist/run-suite.js.map +1 -1
- package/dist/scenario-story.d.ts.map +1 -1
- package/dist/scenario-story.js +11 -4
- package/dist/scenario-story.js.map +1 -1
- package/dist/types.d.ts +8 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/validate-suite.d.ts.map +1 -1
- package/dist/validate-suite.js +1 -0
- package/dist/validate-suite.js.map +1 -1
- package/dist/viewer/catalog.d.ts +51 -0
- package/dist/viewer/catalog.d.ts.map +1 -0
- package/dist/viewer/catalog.js +107 -0
- package/dist/viewer/catalog.js.map +1 -0
- package/dist/viewer/cli.d.ts +17 -0
- package/dist/viewer/cli.d.ts.map +1 -0
- package/dist/viewer/cli.js +38 -0
- package/dist/viewer/cli.js.map +1 -0
- package/dist/viewer/emit.d.ts +7 -0
- package/dist/viewer/emit.d.ts.map +1 -0
- package/dist/viewer/emit.js +25 -0
- package/dist/viewer/emit.js.map +1 -0
- package/dist/viewer/events.d.ts +55 -0
- package/dist/viewer/events.d.ts.map +1 -0
- package/dist/viewer/events.js +45 -0
- package/dist/viewer/events.js.map +1 -0
- package/dist/viewer/live-runner.d.ts +14 -0
- package/dist/viewer/live-runner.d.ts.map +1 -0
- package/dist/viewer/live-runner.js +73 -0
- package/dist/viewer/live-runner.js.map +1 -0
- package/dist/viewer/page.d.ts +3 -0
- package/dist/viewer/page.d.ts.map +1 -0
- package/dist/viewer/page.js +431 -0
- package/dist/viewer/page.js.map +1 -0
- package/dist/viewer/run-controller.d.ts +22 -0
- package/dist/viewer/run-controller.d.ts.map +1 -0
- package/dist/viewer/run-controller.js +128 -0
- package/dist/viewer/run-controller.js.map +1 -0
- package/dist/viewer/server.d.ts +16 -0
- package/dist/viewer/server.d.ts.map +1 -0
- package/dist/viewer/server.js +147 -0
- package/dist/viewer/server.js.map +1 -0
- package/dist/worker-pool.d.ts +8 -0
- package/dist/worker-pool.d.ts.map +1 -0
- package/dist/worker-pool.js +26 -0
- package/dist/worker-pool.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AgentHost } from "@post-print/agent-harness";
|
|
2
|
+
import type { ScenarioRubric } from "../types.js";
|
|
3
|
+
export interface ViewerCatalogArm {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
prompt?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ViewerCatalogScenario {
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
prompt: string;
|
|
13
|
+
skip?: boolean;
|
|
14
|
+
host?: AgentHost;
|
|
15
|
+
rubric: ScenarioRubric;
|
|
16
|
+
compare?: ViewerCatalogArm[];
|
|
17
|
+
}
|
|
18
|
+
export interface ViewerCatalogSuite {
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
hosts: AgentHost[];
|
|
22
|
+
scenarios: ViewerCatalogScenario[];
|
|
23
|
+
}
|
|
24
|
+
export interface ViewerCatalog {
|
|
25
|
+
suitesDir: string;
|
|
26
|
+
defaultSelectedHosts: AgentHost[];
|
|
27
|
+
suites: ViewerCatalogSuite[];
|
|
28
|
+
}
|
|
29
|
+
export interface LoadViewerCatalogOptions {
|
|
30
|
+
cwd: string;
|
|
31
|
+
suitesDir: string;
|
|
32
|
+
rubricsDir?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ViewerRunRequest {
|
|
35
|
+
suite?: string;
|
|
36
|
+
scenario?: string;
|
|
37
|
+
hosts?: AgentHost[];
|
|
38
|
+
parallelHosts?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface ViewerJob {
|
|
41
|
+
suite: string;
|
|
42
|
+
scenario: string;
|
|
43
|
+
host: AgentHost;
|
|
44
|
+
arm?: string;
|
|
45
|
+
prompt: string;
|
|
46
|
+
}
|
|
47
|
+
/** Load suite JSON for the viewer. Omit MCP server env and other secrets. */
|
|
48
|
+
export declare function loadViewerCatalog(options: LoadViewerCatalogOptions): Promise<ViewerCatalog>;
|
|
49
|
+
/** Expand a viewer run into one job per host cell, or per compare arm. */
|
|
50
|
+
export declare function expandViewerJobs(catalog: ViewerCatalog, request: ViewerRunRequest): ViewerJob[];
|
|
51
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/viewer/catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAM3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,SAAS,EAAE,CAAC;IAClC,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CACf;AAED,6EAA6E;AAC7E,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwDjG;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,EAAE,CA0C/F"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { compareArmDescription, compareArmLabel, resolveCompareArms } from "../compare-scenario.js";
|
|
3
|
+
import { discoverSuites } from "../discover-suites.js";
|
|
4
|
+
import { resolveSuiteHosts } from "../hosts.js";
|
|
5
|
+
import { loadSuiteFile } from "../load-suite.js";
|
|
6
|
+
/** Load suite JSON for the viewer. Omit MCP server env and other secrets. */
|
|
7
|
+
export async function loadViewerCatalog(options) {
|
|
8
|
+
const suitesDir = resolve(options.cwd, options.suitesDir);
|
|
9
|
+
const suitePaths = await discoverSuites(suitesDir);
|
|
10
|
+
const suites = [];
|
|
11
|
+
for (const suitePath of suitePaths) {
|
|
12
|
+
const suite = await loadSuiteFile(suitePath, { rubricsDir: options.rubricsDir });
|
|
13
|
+
suites.push({
|
|
14
|
+
name: suite.name,
|
|
15
|
+
description: suite.description,
|
|
16
|
+
hosts: resolveSuiteHosts({
|
|
17
|
+
suiteHosts: suite.hosts,
|
|
18
|
+
defaultHost: suite.defaults?.host,
|
|
19
|
+
}),
|
|
20
|
+
scenarios: suite.scenarios.map((scenario) => {
|
|
21
|
+
const arms = resolveCompareArms(scenario.compare).map((entry) => {
|
|
22
|
+
const arm = {
|
|
23
|
+
id: entry.id,
|
|
24
|
+
label: compareArmLabel(entry.arm, entry.id),
|
|
25
|
+
};
|
|
26
|
+
const description = compareArmDescription(entry.arm);
|
|
27
|
+
if (description) {
|
|
28
|
+
arm.description = description;
|
|
29
|
+
}
|
|
30
|
+
const prompt = entry.arm.prompt?.trim();
|
|
31
|
+
if (prompt) {
|
|
32
|
+
arm.prompt = prompt;
|
|
33
|
+
}
|
|
34
|
+
return arm;
|
|
35
|
+
});
|
|
36
|
+
const row = {
|
|
37
|
+
name: scenario.name,
|
|
38
|
+
prompt: scenario.prompt,
|
|
39
|
+
rubric: scenario.rubric,
|
|
40
|
+
};
|
|
41
|
+
if (scenario.description) {
|
|
42
|
+
row.description = scenario.description;
|
|
43
|
+
}
|
|
44
|
+
if (scenario.skip) {
|
|
45
|
+
row.skip = true;
|
|
46
|
+
}
|
|
47
|
+
if (scenario.host) {
|
|
48
|
+
row.host = scenario.host;
|
|
49
|
+
}
|
|
50
|
+
if (arms.length > 0) {
|
|
51
|
+
row.compare = arms;
|
|
52
|
+
}
|
|
53
|
+
return row;
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
suites.sort((left, right) => left.name.localeCompare(right.name));
|
|
58
|
+
return {
|
|
59
|
+
suitesDir,
|
|
60
|
+
defaultSelectedHosts: ["cursor"],
|
|
61
|
+
suites,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Expand a viewer run into one job per host cell, or per compare arm. */
|
|
65
|
+
export function expandViewerJobs(catalog, request) {
|
|
66
|
+
const selectedHosts = request.hosts && request.hosts.length > 0 ? request.hosts : catalog.defaultSelectedHosts;
|
|
67
|
+
const suites = request.suite
|
|
68
|
+
? catalog.suites.filter((suite) => suite.name === request.suite)
|
|
69
|
+
: catalog.suites;
|
|
70
|
+
const jobs = [];
|
|
71
|
+
for (const suite of suites) {
|
|
72
|
+
const hosts = selectedHosts.filter((host) => suite.hosts.includes(host));
|
|
73
|
+
const scenarios = request.scenario
|
|
74
|
+
? suite.scenarios.filter((scenario) => scenario.name === request.scenario)
|
|
75
|
+
: suite.scenarios;
|
|
76
|
+
for (const scenario of scenarios) {
|
|
77
|
+
if (scenario.skip) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
for (const host of hosts) {
|
|
81
|
+
if (scenario.host && scenario.host !== host) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (scenario.compare && scenario.compare.length > 0) {
|
|
85
|
+
for (const arm of scenario.compare) {
|
|
86
|
+
jobs.push({
|
|
87
|
+
suite: suite.name,
|
|
88
|
+
scenario: scenario.name,
|
|
89
|
+
host,
|
|
90
|
+
arm: arm.id,
|
|
91
|
+
prompt: arm.prompt ?? scenario.prompt,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
jobs.push({
|
|
97
|
+
suite: suite.name,
|
|
98
|
+
scenario: scenario.name,
|
|
99
|
+
host,
|
|
100
|
+
prompt: scenario.prompt,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return jobs;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/viewer/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HostAuthMode } from "@post-print/agent-harness";
|
|
2
|
+
export interface ViewerCliOptions {
|
|
3
|
+
cwd: string;
|
|
4
|
+
suitesDir: string;
|
|
5
|
+
rubricsDir?: string;
|
|
6
|
+
filter?: string;
|
|
7
|
+
judge?: boolean;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
authMode?: HostAuthMode;
|
|
10
|
+
adapterModules?: string[];
|
|
11
|
+
viewerPort?: number;
|
|
12
|
+
/** Parallel live agents. Default 4. */
|
|
13
|
+
workers?: number;
|
|
14
|
+
}
|
|
15
|
+
/** Start the localhost suite viewer and wait until the process exits. */
|
|
16
|
+
export declare function startViewerCli(options: ViewerCliOptions): Promise<number>;
|
|
17
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/viewer/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAM9D,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yEAAyE;AACzE,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC/E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { DEFAULT_VIEWER_WORKERS } from "../worker-pool.js";
|
|
2
|
+
import { loadViewerCatalog } from "./catalog.js";
|
|
3
|
+
import { listenViewer } from "./server.js";
|
|
4
|
+
/** Start the localhost suite viewer and wait until the process exits. */
|
|
5
|
+
export async function startViewerCli(options) {
|
|
6
|
+
const catalog = await loadViewerCatalog({
|
|
7
|
+
cwd: options.cwd,
|
|
8
|
+
suitesDir: options.suitesDir,
|
|
9
|
+
rubricsDir: options.rubricsDir,
|
|
10
|
+
});
|
|
11
|
+
if (options.filter) {
|
|
12
|
+
catalog.suites = catalog.suites.filter((suite) => suite.name === options.filter);
|
|
13
|
+
}
|
|
14
|
+
const workers = options.workers ?? DEFAULT_VIEWER_WORKERS;
|
|
15
|
+
const handle = await listenViewer({
|
|
16
|
+
catalog,
|
|
17
|
+
cwd: options.cwd,
|
|
18
|
+
suitesDir: options.suitesDir,
|
|
19
|
+
rubricsDir: options.rubricsDir,
|
|
20
|
+
judge: options.judge,
|
|
21
|
+
timeoutMs: options.timeoutMs,
|
|
22
|
+
authMode: options.authMode,
|
|
23
|
+
adapterModules: options.adapterModules,
|
|
24
|
+
port: options.viewerPort,
|
|
25
|
+
workers,
|
|
26
|
+
});
|
|
27
|
+
console.log(`Suite viewer: ${handle.url}`);
|
|
28
|
+
console.log(`${workers} workers. Ctrl+C stops the viewer.`);
|
|
29
|
+
await new Promise((resolveClose) => {
|
|
30
|
+
const stop = () => {
|
|
31
|
+
void handle.close().finally(() => resolveClose());
|
|
32
|
+
};
|
|
33
|
+
process.once("SIGINT", stop);
|
|
34
|
+
process.once("SIGTERM", stop);
|
|
35
|
+
});
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/viewer/cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgB3C,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAyB;IAC7D,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;QACvC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;KAC9B,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,sBAAsB,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QACjC,OAAO;QACP,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,IAAI,EAAE,OAAO,CAAC,UAAU;QACxB,OAAO;KACP,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,oCAAoC,CAAC,CAAC;IAC5D,MAAM,IAAI,OAAO,CAAO,CAAC,YAAY,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,GAAS,EAAE;YACvB,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,CAAC;AACV,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ViewerEvent } from "./events.js";
|
|
2
|
+
export declare const VIEWER_EVENTS_FD = 3;
|
|
3
|
+
export declare const VIEWER_EVENTS_FD_ENV = "AGENT_TEST_EVENTS_FD";
|
|
4
|
+
export declare function viewerEventsFd(env?: NodeJS.ProcessEnv): number | undefined;
|
|
5
|
+
/** Write one NDJSON event to the parent pipe. No-op when the fd is unset. */
|
|
6
|
+
export declare function emitViewerEvent(event: ViewerEvent, fd?: number | undefined): void;
|
|
7
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/viewer/emit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAElE,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAOvF;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,qBAAmB,GAAG,IAAI,CAS/E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { writeSync } from "node:fs";
|
|
2
|
+
import { encodeViewerEvent } from "./events.js";
|
|
3
|
+
export const VIEWER_EVENTS_FD = 3;
|
|
4
|
+
export const VIEWER_EVENTS_FD_ENV = "AGENT_TEST_EVENTS_FD";
|
|
5
|
+
export function viewerEventsFd(env = process.env) {
|
|
6
|
+
const raw = env[VIEWER_EVENTS_FD_ENV]?.trim();
|
|
7
|
+
if (!raw) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
const fd = Number(raw);
|
|
11
|
+
return Number.isInteger(fd) && fd >= 3 ? fd : undefined;
|
|
12
|
+
}
|
|
13
|
+
/** Write one NDJSON event to the parent pipe. No-op when the fd is unset. */
|
|
14
|
+
export function emitViewerEvent(event, fd = viewerEventsFd()) {
|
|
15
|
+
if (fd === undefined) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
writeSync(fd, `${encodeViewerEvent(event)}\n`);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Parent closed the pipe.
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/viewer/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,aAAa,CAAC;AAElE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAE3D,MAAM,UAAU,cAAc,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IAClE,MAAM,GAAG,GAAG,GAAG,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,KAAkB,EAAE,EAAE,GAAG,cAAc,EAAE;IACxE,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO;IACR,CAAC;IACD,IAAI,CAAC;QACJ,SAAS,CAAC,EAAE,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACR,0BAA0B;IAC3B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface ViewerEventEnvelope {
|
|
2
|
+
suite: string;
|
|
3
|
+
scenario: string;
|
|
4
|
+
host: string;
|
|
5
|
+
arm?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ViewerFailureEvent {
|
|
8
|
+
matcher: string;
|
|
9
|
+
message: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ViewerJudgeVerdictEvent {
|
|
12
|
+
id: string;
|
|
13
|
+
question: string;
|
|
14
|
+
pass: boolean;
|
|
15
|
+
rationale: string;
|
|
16
|
+
}
|
|
17
|
+
export type ViewerEvent = {
|
|
18
|
+
type: "run_started";
|
|
19
|
+
runId: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: "run_finished";
|
|
22
|
+
runId: string;
|
|
23
|
+
passed: number;
|
|
24
|
+
failed: number;
|
|
25
|
+
skipped: number;
|
|
26
|
+
} | ({
|
|
27
|
+
type: "cell_started";
|
|
28
|
+
} & ViewerEventEnvelope) | ({
|
|
29
|
+
type: "prompt";
|
|
30
|
+
text: string;
|
|
31
|
+
} & ViewerEventEnvelope) | ({
|
|
32
|
+
type: "text";
|
|
33
|
+
text: string;
|
|
34
|
+
} & ViewerEventEnvelope) | ({
|
|
35
|
+
type: "tool";
|
|
36
|
+
name: string;
|
|
37
|
+
args?: Record<string, unknown>;
|
|
38
|
+
} & ViewerEventEnvelope) | ({
|
|
39
|
+
type: "cell_finished";
|
|
40
|
+
passed: boolean;
|
|
41
|
+
skipped?: boolean;
|
|
42
|
+
durationMs: number;
|
|
43
|
+
failures?: ViewerFailureEvent[];
|
|
44
|
+
} & ViewerEventEnvelope) | ({
|
|
45
|
+
type: "judge";
|
|
46
|
+
verdicts: ViewerJudgeVerdictEvent[];
|
|
47
|
+
} & ViewerEventEnvelope) | ({
|
|
48
|
+
type: "error";
|
|
49
|
+
message: string;
|
|
50
|
+
} & Partial<ViewerEventEnvelope>);
|
|
51
|
+
/** One NDJSON object with no trailing newline. */
|
|
52
|
+
export declare function encodeViewerEvent(event: ViewerEvent): string;
|
|
53
|
+
export declare function parseViewerEvent(line: string): ViewerEvent | undefined;
|
|
54
|
+
export declare function parseViewerEventLines(chunk: string): ViewerEvent[];
|
|
55
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/viewer/events.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GACpB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxF,CAAC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG,mBAAmB,CAAC,GAChD,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,mBAAmB,CAAC,GACxD,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,mBAAmB,CAAC,GACtD,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,mBAAmB,CAAC,GACtF,CAAC;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC/B,GAAG,mBAAmB,CAAC,GACxB,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,uBAAuB,EAAE,CAAA;CAAE,GAAG,mBAAmB,CAAC,GAC9E,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAcvE,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CActE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAKlE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const EVENT_TYPES = new Set([
|
|
2
|
+
"run_started",
|
|
3
|
+
"run_finished",
|
|
4
|
+
"cell_started",
|
|
5
|
+
"prompt",
|
|
6
|
+
"text",
|
|
7
|
+
"tool",
|
|
8
|
+
"cell_finished",
|
|
9
|
+
"judge",
|
|
10
|
+
"error",
|
|
11
|
+
]);
|
|
12
|
+
/** One NDJSON object with no trailing newline. */
|
|
13
|
+
export function encodeViewerEvent(event) {
|
|
14
|
+
return JSON.stringify(event);
|
|
15
|
+
}
|
|
16
|
+
export function parseViewerEvent(line) {
|
|
17
|
+
const trimmed = line.trim();
|
|
18
|
+
if (!trimmed) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const parsed = JSON.parse(trimmed);
|
|
23
|
+
if (!isViewerEvent(parsed)) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function parseViewerEventLines(chunk) {
|
|
33
|
+
return chunk.split("\n").flatMap((line) => {
|
|
34
|
+
const event = parseViewerEvent(line);
|
|
35
|
+
return event ? [event] : [];
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function isViewerEvent(value) {
|
|
39
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const type = value.type;
|
|
43
|
+
return typeof type === "string" && EVENT_TYPES.has(type);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/viewer/events.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAsB;IAChD,aAAa;IACb,cAAc;IACd,cAAc;IACd,QAAQ;IACR,MAAM;IACN,MAAM;IACN,eAAe;IACf,OAAO;IACP,OAAO;CACP,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IACnD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IAClD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,IAA2B,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HostAuthMode } from "@post-print/agent-harness";
|
|
2
|
+
import type { ViewerRunner } from "./run-controller.js";
|
|
3
|
+
export interface LiveViewerRunnerOptions {
|
|
4
|
+
cwd: string;
|
|
5
|
+
suitesDir: string;
|
|
6
|
+
rubricsDir?: string;
|
|
7
|
+
judge?: boolean;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
authMode?: HostAuthMode;
|
|
10
|
+
adapterModules?: string[];
|
|
11
|
+
}
|
|
12
|
+
/** Spawn one isolated child per viewer job. Forward NDJSON events to the UI. */
|
|
13
|
+
export declare function createLiveViewerRunner(options: LiveViewerRunnerOptions): ViewerRunner;
|
|
14
|
+
//# sourceMappingURL=live-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-runner.d.ts","sourceRoot":"","sources":["../../src/viewer/live-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAO9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAWD,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,YAAY,CAyDrF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { missingAgentAuth } from "../doctor.js";
|
|
2
|
+
import { killActiveLiveChildren, spawnLiveScenario } from "../live-isolation.js";
|
|
3
|
+
import { createLiveStagingSessionId } from "../record-trace.js";
|
|
4
|
+
function envelope(job) {
|
|
5
|
+
return {
|
|
6
|
+
suite: job.suite,
|
|
7
|
+
scenario: job.scenario,
|
|
8
|
+
host: job.host,
|
|
9
|
+
...(job.arm ? { arm: job.arm } : {}),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Spawn one isolated child per viewer job. Forward NDJSON events to the UI. */
|
|
13
|
+
export function createLiveViewerRunner(options) {
|
|
14
|
+
return {
|
|
15
|
+
async runJob(job, emit, signal) {
|
|
16
|
+
const cell = envelope(job);
|
|
17
|
+
const missing = missingAgentAuth(job.host);
|
|
18
|
+
if (missing) {
|
|
19
|
+
emit({ type: "cell_started", ...cell });
|
|
20
|
+
emit({ type: "error", message: missing, ...cell });
|
|
21
|
+
emit({
|
|
22
|
+
type: "cell_finished",
|
|
23
|
+
...cell,
|
|
24
|
+
passed: false,
|
|
25
|
+
durationMs: 0,
|
|
26
|
+
failures: [{ matcher: "liveScenario", message: missing }],
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (signal.aborted) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const onAbort = () => {
|
|
34
|
+
killActiveLiveChildren();
|
|
35
|
+
};
|
|
36
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
37
|
+
try {
|
|
38
|
+
await spawnLiveScenario({
|
|
39
|
+
cwd: options.cwd,
|
|
40
|
+
suiteName: job.suite,
|
|
41
|
+
scenarioName: job.scenario,
|
|
42
|
+
suitesDir: options.suitesDir,
|
|
43
|
+
rubricsDir: options.rubricsDir,
|
|
44
|
+
suiteFilter: job.suite,
|
|
45
|
+
host: job.host,
|
|
46
|
+
compareArm: job.arm,
|
|
47
|
+
stagingSessionId: createLiveStagingSessionId(),
|
|
48
|
+
judge: options.judge,
|
|
49
|
+
timeoutMs: options.timeoutMs,
|
|
50
|
+
noTimeout: options.timeoutMs === 0,
|
|
51
|
+
authMode: options.authMode,
|
|
52
|
+
adapterModules: options.adapterModules,
|
|
53
|
+
onViewerEvent: (event) => emit(event),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
58
|
+
emit({ type: "error", message, ...cell });
|
|
59
|
+
emit({
|
|
60
|
+
type: "cell_finished",
|
|
61
|
+
...cell,
|
|
62
|
+
passed: false,
|
|
63
|
+
durationMs: 0,
|
|
64
|
+
failures: [{ matcher: "liveScenario", message }],
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
signal.removeEventListener("abort", onAbort);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=live-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-runner.js","sourceRoot":"","sources":["../../src/viewer/live-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/viewer/page.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAA6C,MAAM,cAAc,CAAC;AAsY7F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAoD/D"}
|