@post-print/agent-test 2.0.0 → 2.0.2

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 (138) hide show
  1. package/dist/sdk/cli.d.ts +1 -1
  2. package/dist/sdk/cli.d.ts.map +1 -1
  3. package/dist/sdk/cli.js +49 -14
  4. package/dist/sdk/cli.js.map +1 -1
  5. package/dist/sdk/criteria.d.ts +3 -0
  6. package/dist/sdk/criteria.d.ts.map +1 -0
  7. package/dist/sdk/criteria.js +162 -0
  8. package/dist/sdk/criteria.js.map +1 -0
  9. package/dist/sdk/definitions.js +1 -1
  10. package/dist/sdk/definitions.js.map +1 -1
  11. package/dist/sdk/execution-reporter.d.ts +18 -0
  12. package/dist/sdk/execution-reporter.d.ts.map +1 -0
  13. package/dist/sdk/execution-reporter.js +171 -0
  14. package/dist/sdk/execution-reporter.js.map +1 -0
  15. package/dist/sdk/execution-runner.d.ts +14 -0
  16. package/dist/sdk/execution-runner.d.ts.map +1 -0
  17. package/dist/sdk/execution-runner.js +80 -0
  18. package/dist/sdk/execution-runner.js.map +1 -0
  19. package/dist/sdk/execution-store.d.ts +92 -0
  20. package/dist/sdk/execution-store.d.ts.map +1 -0
  21. package/dist/sdk/execution-store.js +357 -0
  22. package/dist/sdk/execution-store.js.map +1 -0
  23. package/dist/sdk/expect.d.ts.map +1 -1
  24. package/dist/sdk/expect.js +33 -5
  25. package/dist/sdk/expect.js.map +1 -1
  26. package/dist/sdk/playwright-cli.d.ts +2 -0
  27. package/dist/sdk/playwright-cli.d.ts.map +1 -0
  28. package/dist/sdk/playwright-cli.js +6 -0
  29. package/dist/sdk/playwright-cli.js.map +1 -0
  30. package/dist/sdk/reporter.d.ts.map +1 -1
  31. package/dist/sdk/reporter.js +40 -0
  32. package/dist/sdk/reporter.js.map +1 -1
  33. package/dist/sdk/runtime.d.ts +1 -1
  34. package/dist/sdk/runtime.d.ts.map +1 -1
  35. package/dist/sdk/runtime.js +14 -5
  36. package/dist/sdk/runtime.js.map +1 -1
  37. package/dist/sdk/test.d.ts +10 -1
  38. package/dist/sdk/test.d.ts.map +1 -1
  39. package/dist/sdk/test.js +49 -4
  40. package/dist/sdk/test.js.map +1 -1
  41. package/dist/sdk/types.d.ts +2 -1
  42. package/dist/sdk/types.d.ts.map +1 -1
  43. package/dist/sdk/viewer.d.ts +3 -9
  44. package/dist/sdk/viewer.d.ts.map +1 -1
  45. package/dist/sdk/viewer.js +41 -127
  46. package/dist/sdk/viewer.js.map +1 -1
  47. package/dist/viewer/bootstrap.d.ts +10 -0
  48. package/dist/viewer/bootstrap.d.ts.map +1 -0
  49. package/dist/viewer/bootstrap.js +2 -0
  50. package/dist/viewer/bootstrap.js.map +1 -0
  51. package/dist/viewer/client-entry.d.ts +2 -0
  52. package/dist/viewer/client-entry.d.ts.map +1 -0
  53. package/dist/viewer/client-entry.js +31 -0
  54. package/dist/viewer/client-entry.js.map +1 -0
  55. package/dist/viewer/generated-api.d.ts +15 -0
  56. package/dist/viewer/generated-api.d.ts.map +1 -0
  57. package/dist/viewer/generated-api.js +42 -0
  58. package/dist/viewer/generated-api.js.map +1 -0
  59. package/dist/viewer/generated-contracts.d.ts +13 -0
  60. package/dist/viewer/generated-contracts.d.ts.map +1 -0
  61. package/dist/viewer/generated-contracts.js +12 -0
  62. package/dist/viewer/generated-contracts.js.map +1 -0
  63. package/dist/viewer/main.js +64 -3
  64. package/dist/viewer/main.js.map +1 -1
  65. package/dist/viewer/page.d.ts +2 -4
  66. package/dist/viewer/page.d.ts.map +1 -1
  67. package/dist/viewer/page.js +18 -194
  68. package/dist/viewer/page.js.map +1 -1
  69. package/dist/viewer/presentation.d.ts +12 -0
  70. package/dist/viewer/presentation.d.ts.map +1 -0
  71. package/dist/viewer/presentation.js +48 -0
  72. package/dist/viewer/presentation.js.map +1 -0
  73. package/dist/viewer/protocol.d.ts +21 -0
  74. package/dist/viewer/protocol.d.ts.map +1 -0
  75. package/dist/viewer/protocol.js +6 -0
  76. package/dist/viewer/protocol.js.map +1 -0
  77. package/dist/viewer/server.d.ts +5 -10
  78. package/dist/viewer/server.d.ts.map +1 -1
  79. package/dist/viewer/server.js +301 -199
  80. package/dist/viewer/server.js.map +1 -1
  81. package/dist/viewer/styles.d.ts +1 -1
  82. package/dist/viewer/styles.d.ts.map +1 -1
  83. package/dist/viewer/styles.js +82 -429
  84. package/dist/viewer/styles.js.map +1 -1
  85. package/dist/viewer/stylex.css +1322 -0
  86. package/dist/viewer/test-catalog.d.ts +43 -0
  87. package/dist/viewer/test-catalog.d.ts.map +1 -0
  88. package/dist/viewer/test-catalog.js +27 -0
  89. package/dist/viewer/test-catalog.js.map +1 -0
  90. package/dist/viewer/v2-client.d.ts +7 -0
  91. package/dist/viewer/v2-client.d.ts.map +1 -0
  92. package/dist/viewer/v2-client.js +1862 -0
  93. package/dist/viewer/v2-client.js.map +1 -0
  94. package/package.json +14 -4
  95. package/dist/compare-scenario.d.ts +0 -65
  96. package/dist/compare-scenario.d.ts.map +0 -1
  97. package/dist/compare-scenario.js +0 -325
  98. package/dist/compare-scenario.js.map +0 -1
  99. package/dist/failures.d.ts +0 -8
  100. package/dist/failures.d.ts.map +0 -1
  101. package/dist/failures.js +0 -7
  102. package/dist/failures.js.map +0 -1
  103. package/dist/scenario-story.d.ts +0 -41
  104. package/dist/scenario-story.d.ts.map +0 -1
  105. package/dist/scenario-story.js +0 -477
  106. package/dist/scenario-story.js.map +0 -1
  107. package/dist/scenario-usage.d.ts +0 -15
  108. package/dist/scenario-usage.d.ts.map +0 -1
  109. package/dist/scenario-usage.js +0 -18
  110. package/dist/scenario-usage.js.map +0 -1
  111. package/dist/sdk/viewer-results.d.ts +0 -43
  112. package/dist/sdk/viewer-results.d.ts.map +0 -1
  113. package/dist/sdk/viewer-results.js +0 -126
  114. package/dist/sdk/viewer-results.js.map +0 -1
  115. package/dist/types.d.ts +0 -328
  116. package/dist/types.d.ts.map +0 -1
  117. package/dist/types.js +0 -2
  118. package/dist/types.js.map +0 -1
  119. package/dist/viewer/catalog.d.ts +0 -66
  120. package/dist/viewer/catalog.d.ts.map +0 -1
  121. package/dist/viewer/catalog.js +0 -49
  122. package/dist/viewer/catalog.js.map +0 -1
  123. package/dist/viewer/client.d.ts +0 -7
  124. package/dist/viewer/client.d.ts.map +0 -1
  125. package/dist/viewer/client.js +0 -14
  126. package/dist/viewer/client.js.map +0 -1
  127. package/dist/viewer/events.d.ts +0 -118
  128. package/dist/viewer/events.d.ts.map +0 -1
  129. package/dist/viewer/events.js +0 -51
  130. package/dist/viewer/events.js.map +0 -1
  131. package/dist/viewer/run-controller.d.ts +0 -43
  132. package/dist/viewer/run-controller.d.ts.map +0 -1
  133. package/dist/viewer/run-controller.js +0 -475
  134. package/dist/viewer/run-controller.js.map +0 -1
  135. package/dist/worker-pool.d.ts +0 -12
  136. package/dist/worker-pool.d.ts.map +0 -1
  137. package/dist/worker-pool.js +0 -26
  138. package/dist/worker-pool.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-entry.js","sourceRoot":"","sources":["../../src/viewer/client-entry.tsx"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare class ViewerApi {
2
+ private readonly request;
3
+ constructor(request?: typeof fetch);
4
+ getTestCatalog<T>(): Promise<T>;
5
+ listExecutions<T>(): Promise<T>;
6
+ getExecution<T>(id: string): Promise<T>;
7
+ startExecution<T>(testId: string, workers?: number): Promise<T>;
8
+ startTestGroup<T>(testIds: string[], workers?: number): Promise<T>;
9
+ startSuiteExecution<T>(workers?: number): Promise<T>;
10
+ cancelExecution<T>(id: string): Promise<T>;
11
+ private start;
12
+ private json;
13
+ }
14
+ export declare const viewerApi: ViewerApi;
15
+ //# sourceMappingURL=generated-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-api.d.ts","sourceRoot":"","sources":["../../src/viewer/generated-api.ts"],"names":[],"mappings":"AAIA,qBAAa,SAAS;IACT,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,GAAE,OAAO,KAA2C,EAAI;IAC5F,cAAc,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAE9B;IACD,cAAc,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAE9B;IACD,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAEtC;IACD,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzD;IACD,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAE5D;IACD,mBAAmB,CAAC,CAAC,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAE9C;IACD,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzC;IACD,OAAO,CAAC,KAAK;YAOC,IAAI;CAKlB;AACD,eAAO,MAAM,SAAS,WAAkB,CAAC"}
@@ -0,0 +1,42 @@
1
+ export class ViewerApi {
2
+ request;
3
+ constructor(request = (input, init) => fetch(input, init)) {
4
+ this.request = request;
5
+ }
6
+ getTestCatalog() {
7
+ return this.json("/api/test-catalog");
8
+ }
9
+ listExecutions() {
10
+ return this.json("/api/executions");
11
+ }
12
+ getExecution(id) {
13
+ return this.json(`/api/executions/${id}`);
14
+ }
15
+ startExecution(testId, workers = 1) {
16
+ return this.start({ testId, workers });
17
+ }
18
+ startTestGroup(testIds, workers = 1) {
19
+ return this.start({ testIds, workers });
20
+ }
21
+ startSuiteExecution(workers = 1) {
22
+ return this.start({ all: true, workers });
23
+ }
24
+ cancelExecution(id) {
25
+ return this.json(`/api/executions/${id}/cancel`, { method: "POST" });
26
+ }
27
+ start(body) {
28
+ return this.json("/api/executions", {
29
+ method: "POST",
30
+ headers: { "content-type": "application/json" },
31
+ body: JSON.stringify(body),
32
+ });
33
+ }
34
+ async json(path, init) {
35
+ const response = await this.request(path, init);
36
+ if (!response.ok)
37
+ throw new Error(`Request failed: ${response.status}`);
38
+ return response.json();
39
+ }
40
+ }
41
+ export const viewerApi = new ViewerApi();
42
+ //# sourceMappingURL=generated-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-api.js","sourceRoot":"","sources":["../../src/viewer/generated-api.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,SAAS;IACQ,OAAO;IAApC,YAA6B,OAAO,GAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;uBAA3D,OAAO;IAAuD,CAAC;IAC5F,cAAc;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,cAAc;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IACD,YAAY,CAAI,EAAU;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,cAAc,CAAI,MAAc,EAAE,OAAO,GAAG,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,cAAc,CAAI,OAAiB,EAAE,OAAO,GAAG,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,mBAAmB,CAAI,OAAO,GAAG,CAAC;QACjC,OAAO,IAAI,CAAC,KAAK,CAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,eAAe,CAAI,EAAU;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IACO,KAAK,CAAI,IAAsB;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC1B,CAAC,CAAC;IACJ,CAAC;IACO,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAkB;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACtC,CAAC;CACD;AACD,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { z } from "zod/v4";
2
+ export declare const VIEWER_PROTOCOL_VERSION = 1;
3
+ export declare const viewerClientMessage: z.ZodDiscriminatedUnion<[z.ZodObject<{
4
+ type: z.ZodLiteral<"hello">;
5
+ protocol: z.ZodNumber;
6
+ subscriptions: z.ZodArray<z.ZodEnum<{
7
+ catalog: "catalog";
8
+ executions: "executions";
9
+ }>>;
10
+ cursors: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
11
+ }, z.core.$strip>]>;
12
+ export type ViewerClientMessage = z.output<typeof viewerClientMessage>;
13
+ //# sourceMappingURL=generated-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-contracts.d.ts","sourceRoot":"","sources":["../../src/viewer/generated-contracts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,mBAAmB;;;;;;;;mBAO9B,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ // Generated by scripts/generate-viewer-contracts.ts from contracts/viewer.asyncapi.json.
2
+ import { z } from "zod/v4";
3
+ export const VIEWER_PROTOCOL_VERSION = 1;
4
+ export const viewerClientMessage = z.discriminatedUnion("type", [
5
+ z.object({
6
+ type: z.literal("hello"),
7
+ protocol: z.number().int().positive(),
8
+ subscriptions: z.array(z.enum(["catalog", "executions"])),
9
+ cursors: z.record(z.string(), z.number().int().nonnegative()).default({}),
10
+ }),
11
+ ]);
12
+ //# sourceMappingURL=generated-contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-contracts.js","sourceRoot":"","sources":["../../src/viewer/generated-contracts.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,CAAC,CAAC,MAAM,CAAC;QACR,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACxB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACrC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACzD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KACzE,CAAC;CACF,CAAC,CAAC"}
@@ -1,11 +1,72 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
3
+ import { RouterProvider } from "@tanstack/react-router";
4
+ import { useEffect } from "react";
2
5
  import { createRoot } from "react-dom/client";
3
- import ViewerApp from "./client.js";
6
+ import { viewerRouter } from "./v2-client.js";
4
7
  const root = document.getElementById("viewer-root");
5
8
  const bootstrapData = document.getElementById("bootstrap-data")?.textContent;
6
9
  if (!(root instanceof HTMLElement) || bootstrapData === undefined) {
7
10
  throw new Error("Viewer shell is missing its root or bootstrap data");
8
11
  }
9
12
  const bootstrap = JSON.parse(bootstrapData);
10
- createRoot(root).render(_jsx(ViewerApp, { bootstrap: bootstrap }));
13
+ const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5_000 } } });
14
+ function ExecutionSync({ bootstrap }) {
15
+ useEffect(() => {
16
+ return connectExecutionSync(bootstrap);
17
+ }, [bootstrap]);
18
+ return null;
19
+ }
20
+ function applyLiveEvent(message) {
21
+ const event = JSON.parse(message.data);
22
+ if (event.type === "catalog.snapshot")
23
+ queryClient.setQueryData(["test-catalog"], event.catalog);
24
+ if (event.type === "executions.snapshot")
25
+ queryClient.setQueryData(["execution-history"], event.executions ?? []);
26
+ if (event.type === "execution.snapshot" && typeof event.execution?.id === "string")
27
+ queryClient.setQueryData(["execution", event.execution.id], event.execution);
28
+ }
29
+ function connectExecutionSync(bootstrap) {
30
+ const socket = bootstrap.capabilities.socket;
31
+ if (!socket)
32
+ return undefined;
33
+ let connection;
34
+ let reconnect;
35
+ let stopped = false;
36
+ let opened = false;
37
+ let delay = 250;
38
+ const connect = () => {
39
+ const protocol = location.protocol === "https:" ? "wss:" : "ws:";
40
+ connection = new WebSocket(`${protocol}//${location.host}${socket.path}?token=${socket.token}`);
41
+ connection.onopen = () => {
42
+ if (opened)
43
+ void queryClient.invalidateQueries({ queryKey: ["execution"] });
44
+ opened = true;
45
+ delay = 250;
46
+ connection?.send(JSON.stringify({
47
+ type: "hello",
48
+ protocol: socket.protocol,
49
+ subscriptions: ["catalog", "executions"],
50
+ }));
51
+ };
52
+ connection.onmessage = applyLiveEvent;
53
+ connection.onclose = () => {
54
+ if (stopped)
55
+ return;
56
+ reconnect = setTimeout(connect, delay);
57
+ delay = Math.min(delay * 2, 5_000);
58
+ };
59
+ };
60
+ connect();
61
+ return () => {
62
+ stopped = true;
63
+ if (reconnect)
64
+ clearTimeout(reconnect);
65
+ connection?.close();
66
+ };
67
+ }
68
+ createRoot(root).render(_jsx(QueryClientProvider, { client: queryClient, children: _jsx(ViewerRoot, {}) }));
69
+ function ViewerRoot() {
70
+ return (_jsxs("div", { children: [_jsx(ExecutionSync, { bootstrap: bootstrap }), _jsx(RouterProvider, { router: viewerRouter })] }));
71
+ }
11
72
  //# sourceMappingURL=main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/viewer/main.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,SAAS,MAAM,aAAa,CAAC;AAGpC,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACpD,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,WAAW,CAAC;AAE7E,IAAI,CAAC,CAAC,IAAI,YAAY,WAAW,CAAC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;IACnE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAoB,CAAC;AAC/D,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAC,SAAS,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/viewer/main.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,6 @@
1
- import type { ViewerCatalog } from "./catalog.js";
2
- import type { ViewerBootstrap } from "./events.js";
1
+ import type { ViewerBootstrap } from "./bootstrap.js";
3
2
  export interface ViewerPageRenderOptions {
4
3
  baseCss?: string;
5
4
  }
6
- /** Render the self-contained shell used by both the live viewer and saved reports. */
7
- export declare function renderViewerPage(input: ViewerCatalog | ViewerBootstrap, options?: ViewerPageRenderOptions): string;
5
+ export declare function renderViewerPage(bootstrap: ViewerBootstrap, options?: ViewerPageRenderOptions): string;
8
6
  //# sourceMappingURL=page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/viewer/page.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,uBAAuB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAuMD,sFAAsF;AACtF,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,aAAa,GAAG,eAAe,EACtC,OAAO,GAAE,uBAA4B,GACnC,MAAM,CAkBR"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/viewer/page.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AA0BD,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,eAAe,EAC1B,OAAO,GAAE,uBAA4B,GACnC,MAAM,CAeR"}
@@ -2,213 +2,37 @@ import { existsSync, readFileSync } from "node:fs";
2
2
  function embedJson(value) {
3
3
  return JSON.stringify(value).replaceAll("<", "\\u003c");
4
4
  }
5
- function viewerClient() {
6
- const candidates = [
7
- new URL("./client.js", import.meta.url),
8
- new URL("../../dist/viewer/client.js", import.meta.url),
5
+ function readBuiltViewer() {
6
+ const paths = [
7
+ new URL("./client-entry.js", import.meta.url),
8
+ new URL("../../dist/viewer/client-entry.js", import.meta.url),
9
9
  ];
10
- const bundle = candidates.find((candidate) => existsSync(candidate));
11
- if (!bundle) {
10
+ const path = paths.find((candidate) => existsSync(candidate));
11
+ if (!path)
12
12
  throw new Error("Viewer client bundle is missing. Run the @post-print/agent-test build first.");
13
- }
14
- return readFileSync(bundle, "utf8").replaceAll("</script", "<\\/script");
13
+ return readFileSync(path, "utf8").replaceAll("</script", "<\\/script");
15
14
  }
16
- function viewerCss() {
17
- return `
18
- html { font-size: 87.5%; }
19
- html, body, #viewer-root { height: 100%; }
20
- body { overflow: hidden; word-spacing: normal; }
21
- button, select, input { font: inherit; }
22
- button { min-height: 2rem; border-radius: 8px; border: 1px solid var(--border); background: var(--panel-2); color: var(--text); padding: .38rem .68rem; line-height: 1.2; cursor: pointer; }
23
- button:disabled { cursor: not-allowed; opacity: .5; }
24
- button.primary { background: color-mix(in srgb, var(--pass) 18%, var(--panel-2)); border-color: color-mix(in srgb, var(--pass) 40%, var(--border)); }
25
- button.danger { color: var(--fail); border-color: color-mix(in srgb, var(--fail) 45%, var(--border)); }
26
- .viewer-shell { display: flex; flex-direction: column; width: 100%; max-width: 96rem; height: 100vh; height: 100dvh; margin: 0 auto; overflow: hidden; padding: .65rem .9rem; }
27
- .viewer-topbar { display: flex; align-items: end; border-block-end: 1px solid var(--border); padding-block-end: .65rem; }
28
- .viewer-identity h1 { margin: 0; font-size: 1.35rem; }
29
- .section-label, .toolbar-label, .task-meta-label { color: var(--muted); font-size: .72rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; }
30
- .run-history { min-width: 10rem; border: 1px solid var(--border); border-radius: 8px; background: var(--panel-2); color: var(--text); padding: .45rem .6rem; }
31
- .run-banner { color: var(--muted); font-size: .82rem; }
32
- .viewer-command-row { display: flex; flex-wrap: wrap; align-items: center; gap: .55rem 1rem; padding-block: .55rem; }
33
- .toolbar-block { display: flex; align-items: center; gap: .65rem; }
34
- .toolbar-block .toolbar-label { margin: 0; }
35
- .sidebar-toggle { display: inline-grid; place-items: center; width: 2rem; min-height: 2rem; padding: 0; }
36
- .sidebar-toggle svg { width: 1rem; height: 1rem; fill: none; stroke: currentColor; stroke-width: 1.8; }
37
- .host-toggles, .scenario-actions, .host-tablist, .compare-tablist, .compare-definition-tabs { display: flex; flex-wrap: wrap; gap: .4rem; }
38
- .host-toggles label, .parallel-control, .worker-control, .run-actions { display: inline-flex; align-items: center; gap: .3rem; font-size: .82rem; }
39
- .worker-control input { min-inline-size: 4.25rem; }
40
- .viewer-workspace { display: grid; grid-template-columns: minmax(13rem, 17rem) minmax(0, 1fr); flex: 1 1 auto; min-height: 0; gap: .75rem; overflow: hidden; }
41
- .viewer-workspace[data-sidebar-open="false"] { grid-template-columns: minmax(0, 1fr); }
42
- .test-navigator { min-height: 0; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; border: 1px solid var(--border); border-radius: 10px; background: var(--panel); padding: .6rem; }
43
- .test-navigator-heading h2, .test-nav-suite h2 { margin: 0; }
44
- .test-picker-label, .test-picker { display: none; }
45
- .test-nav-suite { margin-block-start: .7rem; }
46
- .test-nav-suite > header { display: flex; gap: .5rem; align-items: center; justify-content: space-between; }
47
- .test-nav-suite h2 { font-size: .72rem; color: var(--muted); }
48
- .test-navigator .run-suite { min-height: 1.55rem; border-radius: 6px; padding: .18rem .45rem; font-size: .68rem; line-height: 1.1; }
49
- .test-nav-items { display: grid; gap: .25rem; margin-block-start: .35rem; }
50
- .test-nav-item { display: grid; grid-template-columns: .55rem 1fr; gap: .4rem; width: 100%; text-align: start; padding: .42rem; }
51
- .test-nav-item[aria-current="true"] { border-color: color-mix(in srgb, var(--pass) 50%, var(--border)); background: color-mix(in srgb, var(--pass) 12%, var(--panel-2)); }
52
- .test-nav-status { width: .55rem; height: .55rem; margin-block-start: .18rem; border: 1px solid color-mix(in srgb, currentColor 20%, transparent); border-radius: 50%; background: var(--border); box-shadow: 0 0 0 2px color-mix(in srgb, var(--panel-2) 80%, transparent); }
53
- .test-nav-item[data-status="passed"] .test-nav-status { background: var(--pass); }
54
- .test-nav-item[data-status="failed"] .test-nav-status { background: var(--fail); }
55
- .test-nav-item[data-status="running"] .test-nav-status { background: var(--skip); }
56
- .test-nav-copy { display: grid; min-width: 0; gap: .08rem; font-size: .82rem; line-height: 1.22; }
57
- .test-nav-copy small { color: var(--muted); font-size: .68rem; line-height: 1.25; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
58
- .test-stage { min-width: 0; min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
59
- .scenario-card { min-width: 0; }
60
- .scenario-card[hidden] { display: none; }
61
- .scenario-card { display: grid; gap: .75rem; border: 1px solid var(--border); border-radius: 12px; background: var(--panel); padding: .75rem .85rem; }
62
- .scenario-focus-header { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 1rem; padding-block-end: .85rem; border-block-end: 1px solid var(--border); }
63
- .scenario-heading-copy { display: grid; gap: .2rem; min-width: 0; }
64
- .scenario-path { color: var(--muted); font-size: .7rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; }
65
- .scenario-focus-header h2 { font-size: 1.2rem; line-height: 1.25; text-wrap: balance; }
66
- .scenario-focus-header .scenario-lede { color: var(--muted); font-size: .84rem; line-height: 1.4; }
67
- .diagnostics { display: grid; grid-template-columns: minmax(0, 1fr); gap: .7rem; margin-bottom: .9rem; }
68
- .diagnostics > * { min-width: 0; }
69
- .focus-verdict { display: inline-flex; align-items: center; gap: .4rem; border: 1px solid var(--border); border-radius: 999px; padding: .22rem .55rem; color: var(--muted); font-size: .72rem; font-weight: 650; white-space: nowrap; }
70
- .focus-verdict > span { width: .45rem; height: .45rem; border-radius: 50%; background: currentColor; }
71
- .focus-verdict[data-status="passed"] { color: var(--pass); border-color: color-mix(in srgb, var(--pass) 40%, var(--border)); }
72
- .focus-verdict[data-status="failed"] { color: var(--fail); border-color: color-mix(in srgb, var(--fail) 40%, var(--border)); }
73
- .focus-verdict[data-status="running"], .focus-verdict[data-status="cancelling"] { color: var(--skip); border-color: color-mix(in srgb, var(--skip) 40%, var(--border)); }
74
- .scenario-definition { display: grid; gap: 1rem; }
75
- .scenario-detail { display: grid; gap: .3rem; }
76
- .scenario-detail h2, .scenario-detail p { margin: 0; }
77
- .test-intent { display: grid; gap: .35rem; }
78
- .prompt-preview { color: var(--text); font-size: .92rem; line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; }
79
- .rubric-line, .arm-note { color: var(--muted); font-size: .8rem; white-space: pre-wrap; }
80
- .scenario-toolbar { display: flex; flex-wrap: wrap; justify-content: space-between; gap: .75rem 1rem; align-items: end; border-block-start: 1px solid var(--border); padding-block-start: .85rem; }
81
- .host-runs { display: flex; align-items: center; gap: .55rem; }
82
- .host-runs-label { color: var(--muted); font-size: .7rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; }
83
- .host-tablist { gap: .3rem; }
84
- .host-tab { min-height: 0; padding: .22rem .42rem; font-size: .72rem; line-height: 1.15; }
85
- .cell-status { margin-inline-start: .1rem; color: var(--muted); font-size: .62rem; font-weight: 500; text-transform: capitalize; }
86
- .host-tab[aria-selected="true"], .compare-tab[aria-selected="true"], .compare-definition-tab[aria-selected="true"] { border-color: color-mix(in srgb, var(--pass) 50%, var(--border)); background: color-mix(in srgb, var(--pass) 14%, var(--panel-2)); }
87
- .task-definition { display: grid; gap: .8rem; border: 1px solid var(--border); border-radius: 12px; padding: .9rem; }
88
- .task-definition-header { display: flex; justify-content: space-between; gap: 1rem; align-items: baseline; }
89
- .task-definition-header h3, .criteria > h3 { margin: 0; }
90
- .task-description { font-size: .96rem; }
91
- .task-prompt { margin: 0; padding: .75rem; border-radius: 8px; background: var(--panel-2); white-space: pre-wrap; overflow-wrap: anywhere; }
92
- .starting-context { border-block-start: 1px solid var(--border); padding-block: .55rem .8rem; }
93
- .criteria-panel { border-block-start: 1px solid var(--border); padding-block: .55rem .8rem; }
94
- .criteria-panel > summary { cursor: pointer; padding-block: .1rem .55rem; font-weight: 650; }
95
- .criteria-panel[open] > summary { margin-block-end: .35rem; }
96
- .criteria-summary { margin-inline-start: .8rem; color: var(--muted); font-size: .75rem; font-weight: 500; }
97
- .criteria-empty { color: var(--muted); font-size: .84rem; }
98
- .criteria { display: grid; gap: .75rem; }
99
- .criterion-groups { display: flex; flex-direction: row; align-items: stretch; gap: .45rem; }
100
- .criterion-groups > .criterion-group { flex: 1 1 0; min-width: 0; }
101
- .criterion-group { border: 1px solid var(--border); border-radius: 10px; padding: .7rem; background: var(--panel-2); }
102
- .criterion-group h4 { margin: 0 0 .45rem; }
103
- .criterion-group p { color: var(--muted); font-size: .82rem; line-height: 1.45; }
104
- .criterion-list { margin: 0; padding-inline-start: 1.2rem; font-size: .86rem; line-height: 1.45; }
105
- .source-folder-link { color: var(--text); overflow-wrap: anywhere; text-decoration-color: color-mix(in srgb, var(--text) 45%, transparent); text-underline-offset: .18em; }
106
- .source-folder-link:hover { text-decoration-color: currentColor; }
107
- .criterion-group p + .criterion-list { margin-block-start: .5rem; }
108
- .criterion-list li + li { margin-block-start: .38rem; }
109
- .comparison-task, .comparison-criteria, .compare-definition-tabbed { display: grid; gap: .4rem; }
110
- .comparison-intro { color: var(--muted); font-size: .84rem; }
111
- .comparison-criteria .criterion-groups { margin-block-start: .2rem; }
112
- .compare-definition-tabbed { gap: .55rem; }
113
- .compare-arm-definition { display: grid; gap: .75rem; border-block-start: 1px solid var(--border); padding-block-start: .8rem; }
114
- .compare-arm-header { display: grid; gap: .2rem; }
115
- .compare-arm-header h3 { color: var(--text); font-size: .95rem; }
116
- .compare-arm-description { color: var(--muted); font-size: .82rem; line-height: 1.4; }
117
- .comparison-definition { display: grid; gap: .75rem; border: 1px solid color-mix(in srgb, var(--skip) 35%, var(--border)); border-radius: 12px; padding: .85rem; }
118
- .compare-definition-arms, .compare-arms, .compare-definition-arm, .compare-arm { min-width: 0; }
119
- .compare-tabs .compare-arm { border-block-start-width: 1px; border-block-start-color: var(--border); }
120
- .scenario-live { display: grid; gap: .8rem; }
121
- .live-cell { border: 1px solid var(--border); border-radius: 12px; background: var(--panel-2); padding: .8rem; }
122
- .live-status { max-height: 9rem; overflow: auto; color: var(--muted); font: .75rem ui-monospace, monospace; }
123
- .chat-running-row[hidden] { display: none; }
124
- .chat-running { display: inline-flex; align-items: center; gap: .45rem; color: var(--muted); font-size: .85rem; padding: .2rem .1rem; }
125
- .chat-progress { display: inline-flex; gap: .18rem; }
126
- .chat-progress span { width: .32rem; height: .32rem; border-radius: 999px; background: var(--skip); animation: chat-progress 1s ease-in-out infinite; }
127
- .chat-progress span:nth-child(2) { animation-delay: .15s; }
128
- .chat-progress span:nth-child(3) { animation-delay: .3s; }
129
- @keyframes chat-progress { 0%, 80%, 100% { opacity: .2; } 40% { opacity: 1; } }
130
- .bubble.is-streaming .bubble-text::after { content: "▍"; margin-inline-start: .12rem; color: var(--pass); animation: chat-caret 1s step-end infinite; }
131
- @keyframes chat-caret { 50% { opacity: 0; } }
132
- @media (prefers-reduced-motion: reduce) {
133
- .chat-progress span, .bubble.is-streaming .bubble-text::after { animation: none; }
134
- .run-progress-segment { transition: none; }
135
- }
136
- .run-progress { border: 1px solid var(--border); border-radius: 10px; padding: .7rem; margin-bottom: .8rem; }
137
- .run-progress-title { margin: 0 0 .4rem; }
138
- .run-progress-track { display: flex; height: .5rem; border-radius: 999px; background: var(--panel-2); overflow: hidden; }
139
- .run-progress-segment { display: block; height: 100%; transition: width .2s ease; }
140
- .run-progress-passed { background: var(--pass); }
141
- .run-progress-failed { background: var(--fail); }
142
- .run-progress-skipped { background: var(--skip); }
143
- .run-progress-counts { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: .4rem; font-size: .78rem; color: var(--muted); }
144
- .progress-passed strong { color: var(--pass); }
145
- .progress-failed strong { color: var(--fail); }
146
- .progress-skipped strong { color: var(--skip); }
147
- .failure-panel { border-color: color-mix(in oklch, var(--fail) 42%, var(--border)); background: color-mix(in oklch, var(--fail) 5%, var(--panel-2)); }
148
- .failure-section-head { display: flex; align-items: start; justify-content: space-between; gap: .75rem; padding-block-end: .65rem; border-block-end: 1px solid color-mix(in oklch, var(--fail) 22%, var(--border)); }
149
- .failure-section-head h3 { color: var(--text); font-size: .86rem; }
150
- .failure-section-head p { margin-block-start: .12rem; color: var(--muted); font-size: .72rem; }
151
- .copy-error { min-height: 0; flex: none; padding: .28rem .48rem; font-size: .7rem; }
152
- .failures { display: grid; gap: .65rem; margin-block-start: .7rem; }
153
- .failures .failure-item { display: grid; gap: .32rem; padding: .62rem .68rem; border: 1px solid color-mix(in oklch, var(--fail) 24%, var(--border)); border-inline-start: 3px solid var(--fail); border-radius: 8px; background: color-mix(in oklch, var(--fail) 5%, var(--panel)); }
154
- .failure-label { color: var(--fail); font-size: .68rem; font-weight: 750; letter-spacing: .055em; text-transform: uppercase; }
155
- .failure-message { margin: 0; padding: 0; border: 0; background: transparent; color: var(--text); font: 650 .84rem/1.4 "Helvetica Neue", Helvetica, Arial, sans-serif; white-space: pre-wrap; overflow-wrap: anywhere; }
156
- .failure-evidence-details { margin-block-start: .12rem; border-block-start: 1px solid var(--border); }
157
- .failure-evidence-details > summary { cursor: pointer; padding-block: .42rem .1rem; color: var(--muted); font-size: .72rem; font-weight: 650; }
158
- .failure-evidence { max-height: 11rem; margin: .4rem 0 0; padding: .5rem .55rem; overflow: auto; border: 1px dashed var(--border); border-radius: 6px; background: color-mix(in oklch, black 28%, var(--panel)); color: var(--muted); font: .7rem/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; overflow-wrap: anywhere; }
159
- .story-criteria { padding-block: .55rem .8rem; }
160
- .story-criteria > h3 { margin: 0 0 .55rem; }
161
- .judge-responses { display: grid; gap: .7rem; padding-block: .25rem .8rem; }
162
- .judge-responses-inline { border: 0; background: transparent; padding: .75rem 0 0 1rem; }
163
- .judge-response { display: grid; gap: .65rem; width: 100%; border: 1px solid color-mix(in oklch, var(--arm-a) 32%, var(--border)); border-radius: 12px; background: color-mix(in oklch, var(--arm-a) 7%, var(--panel)); padding: .9rem 1rem; }
164
- .judge-response-inline { gap: .4rem; border: 0; border-radius: 0; background: transparent; padding: 0; color: color-mix(in oklch, var(--arm-a) 72%, var(--text)); }
165
- .judge-answer-label { margin: 0; color: var(--muted); font-size: .7rem; font-weight: 700; letter-spacing: .055em; text-transform: uppercase; }
166
- .judge-response-inline .judge-rationale, .judge-response-inline .judge-evidence, .judge-response-inline .judge-evidence q { color: inherit; }
167
- .judge-response-head { display: flex; align-items: start; justify-content: space-between; gap: .75rem; }
168
- .judge-response-head h3 { margin: 0; font-size: .95rem; }
169
- .judge-verdict-badge { flex: none; padding: .15rem .38rem; border: 1px solid currentColor; border-radius: 999px; font-size: .62rem; font-weight: 800; letter-spacing: .055em; text-transform: uppercase; }
170
- .judge-response.verdict-pass .judge-verdict-badge { color: var(--pass); }
171
- .judge-response.verdict-fail .judge-verdict-badge { color: var(--fail); }
172
- .judge-response.verdict-pending .judge-verdict-badge { color: var(--skip); }
173
- .judge-rationale { margin: 0; color: var(--text); font-size: .95rem; line-height: 1.55; white-space: pre-wrap; }
174
- .judge-evidence { display: grid; gap: .35rem; margin: 0; padding-inline-start: 1.2rem; color: var(--muted); font-size: .85rem; line-height: 1.5; }
175
- .judge-evidence q { color: var(--text); }
176
- .trace-command-list { display: grid; gap: .45rem; margin-block-start: .7rem; padding-block-start: .65rem; border-block-start: 1px solid var(--border); }
177
- .trace-command-list h4 { margin: 0; font-size: .8rem; }
178
- .trace-details .trace-summary-title { color: var(--text); font-weight: 700; }
179
- .trace-details .trace-summary-meta { margin-inline-start: auto; color: var(--muted); font-weight: 400; }
180
- .viewer-shell .chat { max-inline-size: none; }
181
- @media (max-width: 760px) {
182
- .viewer-shell { padding: .75rem; }
183
- .viewer-topbar { align-items: start; }
184
- .run-banner { text-align: start; }
185
- .viewer-workspace { grid-template-columns: 1fr; }
186
- .test-navigator { overflow: visible; }
187
- .test-picker-label { display: block; margin-top: .7rem; }
188
- .test-picker { display: block; width: 100%; margin-top: .3rem; }
189
- .test-tree { display: none; }
190
- .criterion-groups { flex-direction: column; }
191
- .scenario-focus-header { grid-template-columns: 1fr; gap: .55rem; }
192
- .focus-verdict { justify-self: start; }
193
- }
194
- `;
15
+ function readStylex() {
16
+ const paths = [
17
+ new URL("./stylex.css", import.meta.url),
18
+ new URL("../../dist/viewer/stylex.css", import.meta.url),
19
+ ];
20
+ const path = paths.find((candidate) => existsSync(candidate));
21
+ return path ? readFileSync(path, "utf8").replaceAll("</style", "<\\/style") : "";
195
22
  }
196
- /** Render the self-contained shell used by both the live viewer and saved reports. */
197
- export function renderViewerPage(input, options = {}) {
198
- const bootstrap = "catalog" in input ? input : { catalog: input, runs: [], capabilities: { canRun: true } };
23
+ export function renderViewerPage(bootstrap, options = {}) {
199
24
  return `<!DOCTYPE html>
200
25
  <html lang="en">
201
26
  <head>
202
27
  <meta charset="utf-8">
203
28
  <meta name="viewport" content="width=device-width, initial-scale=1">
204
- <title>agent-test ${bootstrap.capabilities.canRun ? "viewer" : "report"}</title>
205
- <style>${options.baseCss ?? ""}${viewerCss()}</style>
29
+ <title>agent-test viewer</title>
30
+ <style>${options.baseCss ?? ""}${readStylex()}</style>
206
31
  </head>
207
32
  <body>
208
33
  <div id="viewer-root"></div>
209
- <script type="application/json" id="catalog-data">${embedJson(bootstrap.catalog)}</script>
210
34
  <script type="application/json" id="bootstrap-data">${embedJson(bootstrap)}</script>
211
- <script>${viewerClient()}</script>
35
+ <script>${readBuiltViewer()}</script>
212
36
  </body>
213
37
  </html>`;
214
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/viewer/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AASnD,SAAS,SAAS,CAAC,KAAc;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,YAAY;IACpB,MAAM,UAAU,GAAG;QAClB,IAAI,GAAG,CAAC,aAAa,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;QACvC,IAAI,GAAG,CAAC,6BAA6B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;KACvD,CAAC;IACF,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,SAAS;IACjB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiLP,CAAC;AACF,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAC/B,KAAsC,EACtC,OAAO,GAA4B,EAAE;IAErC,MAAM,SAAS,GACd,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;IAC3F,OAAO;;;;;sBAKc,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;WAC9D,OAAO,CAAC,OAAO,IAAI,EAAE,GAAG,SAAS,EAAE;;;;sDAIQ,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC;wDAC1B,SAAS,CAAC,SAAS,CAAC;YAChE,YAAY,EAAE;;QAElB,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/viewer/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAOnD,SAAS,SAAS,CAAC,KAAc;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,eAAe;IACvB,MAAM,KAAK,GAAG;QACb,IAAI,GAAG,CAAC,mBAAmB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;QAC7C,IAAI,GAAG,CAAC,mCAAmC,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;KAC7D,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI;QACR,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IACjG,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,UAAU;IAClB,MAAM,KAAK,GAAG;QACb,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;QACxC,IAAI,GAAG,CAAC,8BAA8B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;KACxD,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,SAA0B,EAC1B,OAAO,GAA4B,EAAE;IAErC,OAAO;;;;;;WAMG,OAAO,CAAC,OAAO,IAAI,EAAE,GAAG,UAAU,EAAE;;;;wDAIS,SAAS,CAAC,SAAS,CAAC;YAChE,eAAe,EAAE;;QAErB,CAAC;AACT,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function stripAnsi(value: string): string;
2
+ export declare function conversationPlaceholder(status: string): string;
3
+ export declare function preferredExecutionId(executions: Array<{
4
+ id: string;
5
+ status: string;
6
+ }>): string | undefined;
7
+ export type AssertionComparison = {
8
+ expected: string;
9
+ received: string;
10
+ };
11
+ export declare function assertionComparison(value: string): AssertionComparison | undefined;
12
+ //# sourceMappingURL=presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../src/viewer/presentation.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAe/C;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,MAAM,GAAG,SAAS,CAEpB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAgBlF"}
@@ -0,0 +1,48 @@
1
+ const EXPECTED_DIFF_HEADER = /^-\s+Expected\s+-\s+\d+\s*$/;
2
+ const RECEIVED_DIFF_HEADER = /^\+\s+Received\s+\+\s+\d+\s*$/;
3
+ export function stripAnsi(value) {
4
+ let output = "";
5
+ for (let index = 0; index < value.length; index++) {
6
+ if (value.charCodeAt(index) !== 27 || value[index + 1] !== "[") {
7
+ output += value[index];
8
+ continue;
9
+ }
10
+ index += 2;
11
+ while (index < value.length) {
12
+ const code = value.charCodeAt(index);
13
+ if (code >= 64 && code <= 126)
14
+ break;
15
+ index++;
16
+ }
17
+ }
18
+ return output;
19
+ }
20
+ export function conversationPlaceholder(status) {
21
+ return status === "running"
22
+ ? "Waiting for the first agent event…"
23
+ : "No conversation was captured.";
24
+ }
25
+ export function preferredExecutionId(executions) {
26
+ return executions.find((execution) => execution.status === "running")?.id ?? executions[0]?.id;
27
+ }
28
+ export function assertionComparison(value) {
29
+ const lines = stripAnsi(value).split("\n");
30
+ const expectedHeader = lines.findIndex((line) => EXPECTED_DIFF_HEADER.test(line));
31
+ const receivedHeader = lines.findIndex((line) => RECEIVED_DIFF_HEADER.test(line));
32
+ if (expectedHeader < 0 || receivedHeader !== expectedHeader + 1)
33
+ return undefined;
34
+ const expected = [];
35
+ const received = [];
36
+ for (const line of lines.slice(receivedHeader + 1)) {
37
+ if (line.startsWith("- "))
38
+ expected.push(line.slice(2));
39
+ if (line.startsWith("+ "))
40
+ received.push(line.slice(2));
41
+ if (line.startsWith(" ")) {
42
+ expected.push(line.slice(2));
43
+ received.push(line.slice(2));
44
+ }
45
+ }
46
+ return { expected: expected.join("\n"), received: received.join("\n") };
47
+ }
48
+ //# sourceMappingURL=presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../src/viewer/presentation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export { VIEWER_PROTOCOL_VERSION, type ViewerClientMessage, viewerClientMessage, } from "./generated-contracts.js";
2
+ import { type VIEWER_PROTOCOL_VERSION, type ViewerClientMessage } from "./generated-contracts.js";
3
+ export type ViewerServerMessage = {
4
+ type: "ready";
5
+ protocol: typeof VIEWER_PROTOCOL_VERSION;
6
+ } | {
7
+ type: "catalog.snapshot";
8
+ catalog: unknown;
9
+ } | {
10
+ type: "executions.snapshot";
11
+ executions: unknown[];
12
+ } | {
13
+ type: "execution.snapshot";
14
+ execution: unknown;
15
+ } | {
16
+ type: "error";
17
+ code: "invalid_message" | "incompatible_protocol";
18
+ message: string;
19
+ };
20
+ export declare function parseViewerClientMessage(input: unknown): ViewerClientMessage;
21
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/viewer/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,uBAAuB,EACvB,KAAK,mBAAmB,EACxB,mBAAmB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACN,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EAExB,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,mBAAmB,GAC5B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,uBAAuB,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,UAAU,EAAE,OAAO,EAAE,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,iBAAiB,GAAG,uBAAuB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAE5E"}
@@ -0,0 +1,6 @@
1
+ export { VIEWER_PROTOCOL_VERSION, viewerClientMessage, } from "./generated-contracts.js";
2
+ import { viewerClientMessage, } from "./generated-contracts.js";
3
+ export function parseViewerClientMessage(input) {
4
+ return viewerClientMessage.parse(input);
5
+ }
6
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/viewer/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,uBAAuB,EAEvB,mBAAmB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAGN,mBAAmB,GACnB,MAAM,0BAA0B,CAAC;AASlC,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACtD,OAAO,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC"}
@@ -1,18 +1,13 @@
1
- import type { ViewerCatalog } from "./catalog.js";
2
- import { type ViewerRunRecord } from "./events.js";
3
- import { type ViewerRunner } from "./run-controller.js";
1
+ import { type StartExecutionOptions, type StartedExecution } from "../sdk/execution-runner.js";
2
+ import type { TestCatalog } from "./test-catalog.js";
4
3
  export interface ListenViewerOptions {
5
- cwd: string;
6
4
  suitesDir: string;
7
- catalog: ViewerCatalog;
5
+ testCatalog: TestCatalog;
6
+ refreshTestCatalog?: () => Promise<TestCatalog>;
8
7
  port?: number;
9
- runner: ViewerRunner;
10
- /** Parallel live agents. Default 4. */
11
- workers?: number;
12
- initialRuns?: ViewerRunRecord[];
13
- selectedRunId?: string;
14
8
  idleMs?: number;
15
9
  onClose?: () => void | Promise<void>;
10
+ startExecution?: (options: StartExecutionOptions) => Promise<StartedExecution>;
16
11
  }
17
12
  export interface ViewerServerHandle {
18
13
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/viewer/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,cAAc,CAAC;AACpE,OAAO,EAIN,KAAK,eAAe,EACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAGN,KAAK,YAAY,EACjB,MAAM,qBAAqB,CAAC;AAS7B,MAAM,WAAW,mBAAmB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAoED,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAE5F"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/viewer/server.ts"],"names":[],"mappings":"AAIA,OAAO,EACN,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EAErB,MAAM,4BAA4B,CAAC;AAWpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUrD,MAAM,WAAW,mBAAmB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC/E;AACD,MAAM,WAAW,kBAAkB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAgQD,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAE5F"}