@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.
Files changed (82) hide show
  1. package/README.md +1 -0
  2. package/dist/cli.d.ts +9 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +53 -3
  5. package/dist/cli.js.map +1 -1
  6. package/dist/command-allowlist.d.ts +9 -0
  7. package/dist/command-allowlist.d.ts.map +1 -0
  8. package/dist/command-allowlist.js +29 -0
  9. package/dist/command-allowlist.js.map +1 -0
  10. package/dist/compare-scenario.d.ts +5 -0
  11. package/dist/compare-scenario.d.ts.map +1 -1
  12. package/dist/compare-scenario.js +42 -25
  13. package/dist/compare-scenario.js.map +1 -1
  14. package/dist/expect.d.ts +2 -0
  15. package/dist/expect.d.ts.map +1 -1
  16. package/dist/expect.js +17 -0
  17. package/dist/expect.js.map +1 -1
  18. package/dist/html-report.d.ts +1 -0
  19. package/dist/html-report.d.ts.map +1 -1
  20. package/dist/html-report.js +26 -30
  21. package/dist/html-report.js.map +1 -1
  22. package/dist/index.d.ts +7 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +7 -2
  25. package/dist/index.js.map +1 -1
  26. package/dist/live-isolation.d.ts +6 -1
  27. package/dist/live-isolation.d.ts.map +1 -1
  28. package/dist/live-isolation.js +30 -2
  29. package/dist/live-isolation.js.map +1 -1
  30. package/dist/record-trace.d.ts +2 -2
  31. package/dist/record-trace.d.ts.map +1 -1
  32. package/dist/record-trace.js +6 -4
  33. package/dist/record-trace.js.map +1 -1
  34. package/dist/run-suite.d.ts +9 -1
  35. package/dist/run-suite.d.ts.map +1 -1
  36. package/dist/run-suite.js +103 -42
  37. package/dist/run-suite.js.map +1 -1
  38. package/dist/scenario-story.d.ts.map +1 -1
  39. package/dist/scenario-story.js +11 -4
  40. package/dist/scenario-story.js.map +1 -1
  41. package/dist/types.d.ts +8 -1
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/validate-suite.d.ts.map +1 -1
  44. package/dist/validate-suite.js +1 -0
  45. package/dist/validate-suite.js.map +1 -1
  46. package/dist/viewer/catalog.d.ts +51 -0
  47. package/dist/viewer/catalog.d.ts.map +1 -0
  48. package/dist/viewer/catalog.js +107 -0
  49. package/dist/viewer/catalog.js.map +1 -0
  50. package/dist/viewer/cli.d.ts +17 -0
  51. package/dist/viewer/cli.d.ts.map +1 -0
  52. package/dist/viewer/cli.js +38 -0
  53. package/dist/viewer/cli.js.map +1 -0
  54. package/dist/viewer/emit.d.ts +7 -0
  55. package/dist/viewer/emit.d.ts.map +1 -0
  56. package/dist/viewer/emit.js +25 -0
  57. package/dist/viewer/emit.js.map +1 -0
  58. package/dist/viewer/events.d.ts +55 -0
  59. package/dist/viewer/events.d.ts.map +1 -0
  60. package/dist/viewer/events.js +45 -0
  61. package/dist/viewer/events.js.map +1 -0
  62. package/dist/viewer/live-runner.d.ts +14 -0
  63. package/dist/viewer/live-runner.d.ts.map +1 -0
  64. package/dist/viewer/live-runner.js +73 -0
  65. package/dist/viewer/live-runner.js.map +1 -0
  66. package/dist/viewer/page.d.ts +3 -0
  67. package/dist/viewer/page.d.ts.map +1 -0
  68. package/dist/viewer/page.js +431 -0
  69. package/dist/viewer/page.js.map +1 -0
  70. package/dist/viewer/run-controller.d.ts +22 -0
  71. package/dist/viewer/run-controller.d.ts.map +1 -0
  72. package/dist/viewer/run-controller.js +128 -0
  73. package/dist/viewer/run-controller.js.map +1 -0
  74. package/dist/viewer/server.d.ts +16 -0
  75. package/dist/viewer/server.d.ts.map +1 -0
  76. package/dist/viewer/server.js +147 -0
  77. package/dist/viewer/server.js.map +1 -0
  78. package/dist/worker-pool.d.ts +8 -0
  79. package/dist/worker-pool.d.ts.map +1 -0
  80. package/dist/worker-pool.js +26 -0
  81. package/dist/worker-pool.js.map +1 -0
  82. 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,3 @@
1
+ import type { ViewerCatalog } from "./catalog.js";
2
+ export declare function renderViewerPage(catalog: ViewerCatalog): string;
3
+ //# sourceMappingURL=page.d.ts.map
@@ -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"}