@prismatic-io/lux 0.0.2-preview.4 → 0.0.2-preview.7

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/lib/assertions/authoring.d.ts +2 -2
  2. package/lib/assertions/authoring.d.ts.map +1 -1
  3. package/lib/assertions/authoring.js.map +1 -1
  4. package/lib/assertions/core/index.d.ts.map +1 -1
  5. package/lib/assertions/core/index.js +2 -1
  6. package/lib/assertions/core/index.js.map +1 -1
  7. package/lib/assertions/core/resource-checks.d.ts +19 -0
  8. package/lib/assertions/core/resource-checks.d.ts.map +1 -1
  9. package/lib/assertions/core/resource-checks.js +32 -0
  10. package/lib/assertions/core/resource-checks.js.map +1 -1
  11. package/lib/cli/program.d.ts.map +1 -1
  12. package/lib/cli/program.js +6 -65
  13. package/lib/cli/program.js.map +1 -1
  14. package/lib/cli/view.d.ts +13 -0
  15. package/lib/cli/view.d.ts.map +1 -0
  16. package/lib/cli/view.js +126 -0
  17. package/lib/cli/view.js.map +1 -0
  18. package/lib/core/action-events.d.ts +29 -0
  19. package/lib/core/action-events.d.ts.map +1 -0
  20. package/lib/core/action-events.js +51 -0
  21. package/lib/core/action-events.js.map +1 -0
  22. package/lib/core/agent-activity.d.ts +49 -0
  23. package/lib/core/agent-activity.d.ts.map +1 -0
  24. package/lib/core/agent-activity.js +206 -0
  25. package/lib/core/agent-activity.js.map +1 -0
  26. package/lib/core/agent-events.d.ts +26 -0
  27. package/lib/core/agent-events.d.ts.map +1 -0
  28. package/lib/core/agent-events.js +13 -0
  29. package/lib/core/agent-events.js.map +1 -0
  30. package/lib/core/driver-metrics.d.ts +98 -0
  31. package/lib/core/driver-metrics.d.ts.map +1 -0
  32. package/lib/core/driver-metrics.js +36 -0
  33. package/lib/core/driver-metrics.js.map +1 -0
  34. package/lib/core/events.d.ts +34 -0
  35. package/lib/core/events.d.ts.map +1 -1
  36. package/lib/core/events.js +11 -2
  37. package/lib/core/events.js.map +1 -1
  38. package/lib/core/experiment.d.ts +19 -0
  39. package/lib/core/experiment.d.ts.map +1 -1
  40. package/lib/core/experiment.js +2 -0
  41. package/lib/core/experiment.js.map +1 -1
  42. package/lib/core/index.d.ts +4 -0
  43. package/lib/core/index.d.ts.map +1 -1
  44. package/lib/core/index.js +4 -0
  45. package/lib/core/index.js.map +1 -1
  46. package/lib/core/run.d.ts +149 -0
  47. package/lib/core/run.d.ts.map +1 -1
  48. package/lib/core/run.js +9 -0
  49. package/lib/core/run.js.map +1 -1
  50. package/lib/core/wire.d.ts +11 -0
  51. package/lib/core/wire.d.ts.map +1 -1
  52. package/lib/drivers/claude-code/parse-events.d.ts.map +1 -1
  53. package/lib/drivers/claude-code/parse-events.js +73 -8
  54. package/lib/drivers/claude-code/parse-events.js.map +1 -1
  55. package/lib/drivers/codex/app-events.d.ts +9 -2
  56. package/lib/drivers/codex/app-events.d.ts.map +1 -1
  57. package/lib/drivers/codex/app-events.js +93 -12
  58. package/lib/drivers/codex/app-events.js.map +1 -1
  59. package/lib/drivers/codex/index.d.ts.map +1 -1
  60. package/lib/drivers/codex/index.js +10 -14
  61. package/lib/drivers/codex/index.js.map +1 -1
  62. package/lib/index.d.ts +6 -2
  63. package/lib/index.d.ts.map +1 -1
  64. package/lib/index.js +6 -2
  65. package/lib/index.js.map +1 -1
  66. package/lib/orchestrator/compare.d.ts +13 -1
  67. package/lib/orchestrator/compare.d.ts.map +1 -1
  68. package/lib/orchestrator/compare.js +12 -0
  69. package/lib/orchestrator/compare.js.map +1 -1
  70. package/lib/orchestrator/experiment-contracts.d.ts +19 -0
  71. package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
  72. package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
  73. package/lib/orchestrator/experiment-evaluation.js +17 -0
  74. package/lib/orchestrator/experiment-evaluation.js.map +1 -1
  75. package/lib/orchestrator/experiment-report.d.ts +19 -0
  76. package/lib/orchestrator/experiment-report.d.ts.map +1 -1
  77. package/lib/orchestrator/experiment-runs.d.ts +38 -0
  78. package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
  79. package/lib/orchestrator/index.d.ts +1 -1
  80. package/lib/orchestrator/index.d.ts.map +1 -1
  81. package/lib/orchestrator/index.js +1 -1
  82. package/lib/orchestrator/index.js.map +1 -1
  83. package/lib/orchestrator/list-runs.d.ts +7 -1
  84. package/lib/orchestrator/list-runs.d.ts.map +1 -1
  85. package/lib/orchestrator/list-runs.js +50 -6
  86. package/lib/orchestrator/list-runs.js.map +1 -1
  87. package/lib/orchestrator/run-execution.d.ts.map +1 -1
  88. package/lib/orchestrator/run-execution.js +17 -3
  89. package/lib/orchestrator/run-execution.js.map +1 -1
  90. package/lib/orchestrator/suite-compare.d.ts +34 -0
  91. package/lib/orchestrator/suite-compare.d.ts.map +1 -1
  92. package/lib/orchestrator/suite-summary.d.ts +68 -0
  93. package/lib/orchestrator/suite-summary.d.ts.map +1 -1
  94. package/lib/orchestrator/suite-summary.js +45 -7
  95. package/lib/orchestrator/suite-summary.js.map +1 -1
  96. package/lib/previewer/artifacts.d.ts +25 -0
  97. package/lib/previewer/artifacts.d.ts.map +1 -0
  98. package/lib/previewer/artifacts.js +180 -0
  99. package/lib/previewer/artifacts.js.map +1 -0
  100. package/lib/previewer/server.d.ts +105 -0
  101. package/lib/previewer/server.d.ts.map +1 -0
  102. package/lib/previewer/server.js +542 -0
  103. package/lib/previewer/server.js.map +1 -0
  104. package/package.json +2 -1
  105. package/skills/lux/references/eval-authoring.md +4 -2
  106. package/skills/lux-answerer/SKILL.md +1 -1
  107. package/src/assertions/authoring.ts +2 -0
  108. package/src/assertions/core/index.ts +2 -0
  109. package/src/assertions/core/resource-checks.ts +35 -0
  110. package/src/cli/program.ts +5 -91
  111. package/src/cli/view.ts +168 -0
  112. package/src/core/action-events.ts +59 -0
  113. package/src/core/agent-activity.ts +236 -0
  114. package/src/core/agent-events.ts +17 -0
  115. package/src/core/driver-metrics.ts +51 -0
  116. package/src/core/events.ts +13 -2
  117. package/src/core/experiment.ts +2 -0
  118. package/src/core/index.ts +4 -0
  119. package/src/core/run.ts +9 -0
  120. package/src/drivers/claude-code/parse-events.ts +98 -12
  121. package/src/drivers/codex/app-events.ts +116 -16
  122. package/src/drivers/codex/index.ts +16 -14
  123. package/src/index.ts +40 -0
  124. package/src/orchestrator/compare.ts +18 -0
  125. package/src/orchestrator/experiment-evaluation.ts +23 -0
  126. package/src/orchestrator/index.ts +1 -0
  127. package/src/orchestrator/list-runs.ts +66 -5
  128. package/src/orchestrator/run-execution.ts +19 -2
  129. package/src/orchestrator/suite-summary.ts +101 -8
  130. package/src/previewer/artifacts.ts +221 -0
  131. package/src/previewer/server.ts +765 -0
  132. package/viewer/app.css +2075 -0
  133. package/viewer/app.js +606 -0
  134. package/viewer/artifact-view.js +48 -0
  135. package/viewer/charts.js +86 -0
  136. package/viewer/detail.js +1214 -0
  137. package/viewer/format.js +129 -0
  138. package/viewer/index.html +151 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/previewer/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prismatic-io/lux",
3
- "version": "0.0.2-preview.4",
3
+ "version": "0.0.2-preview.7",
4
4
  "description": "Coding-agent evaluation and improvement with deterministic assertions, optional LLM judges, and first-class human-in-the-loop runs.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/prismatic-io/lux",
@@ -57,6 +57,7 @@
57
57
  "lib",
58
58
  "skills",
59
59
  "src",
60
+ "viewer",
60
61
  "!**/*.test.ts",
61
62
  "!**/test-helpers.ts",
62
63
  "!src/**/fixtures/**"
@@ -64,8 +64,10 @@ Use the more specific bundled evidence checks when they match the contract:
64
64
  `tool-result-json-pointer-equals`, `tool-result-is-error`, and
65
65
  `no-error-results`. Prefer these when result status or payload matters; a tool
66
66
  call without a paired result is unresolved, not successful.
67
- - Budgets: `latency-under`, `tokens-under`, `cost-under`, and
68
- `artifact-bytes-under`.
67
+ - Budgets: `latency-under`, `time-to-first-action-under`, `tokens-under`,
68
+ `cost-under`, and `artifact-bytes-under`. Time to first action requires the
69
+ driver to emit semantic `action` progress events; use `category: "mutation"`
70
+ to exclude queries and outer code-mode executor calls.
69
71
  - MCP discovery: `server-info-equals`, `tool-listed`,
70
72
  `tools-listed-count`, and `capability-absent`.
71
73
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: lux-answerer
3
- version: 0.0.2-preview.4
3
+ version: 0.0.2-preview.7
4
4
  description: Play the persona for a running Lux orchestrator that uses the claude-code answerer. Read structured events on stdout, decide answers from persona + context, write JSON to its answer channel.
5
5
  user-invocable: false
6
6
  allowed-tools: Bash, Read
@@ -19,6 +19,7 @@ import type {
19
19
  PredicateConfigSchema,
20
20
  RegexConfigSchema,
21
21
  RunSucceededConfigSchema,
22
+ TimeToFirstActionUnderConfigSchema,
22
23
  TokensUnderConfigSchema,
23
24
  ToolCallCountConfigSchema,
24
25
  ToolCalledConfigSchema,
@@ -57,6 +58,7 @@ type BuiltinAssertionSchema =
57
58
  | typeof RegexConfigSchema
58
59
  | typeof RubricConfigSchema
59
60
  | typeof RunSucceededConfigSchema
61
+ | typeof TimeToFirstActionUnderConfigSchema
60
62
  | typeof ServerInfoEqualsConfigSchema
61
63
  | typeof TokensUnderConfigSchema
62
64
  | typeof ToolCalledConfigSchema
@@ -21,6 +21,7 @@ import {
21
21
  costUnderAssertion,
22
22
  latencyUnderAssertion,
23
23
  runSucceededAssertion,
24
+ timeToFirstActionUnderAssertion,
24
25
  tokensUnderAssertion,
25
26
  } from "./resource-checks.js";
26
27
  import { toolCalledWithAssertion } from "./tool-called-with.js";
@@ -66,6 +67,7 @@ export const allCoreAssertions: AssertionImpl[] = [
66
67
  regexAssertion,
67
68
  jsonPointerEqualsAssertion,
68
69
  latencyUnderAssertion,
70
+ timeToFirstActionUnderAssertion,
69
71
  artifactBytesUnderAssertion,
70
72
  tokensUnderAssertion,
71
73
  costUnderAssertion,
@@ -44,6 +44,41 @@ export const latencyUnderAssertion: AssertionImpl<LatencyUnderConfig> = {
44
44
  },
45
45
  };
46
46
 
47
+ export const TimeToFirstActionUnderConfigSchema = z
48
+ .object({
49
+ type: z.literal("time-to-first-action-under"),
50
+ maxMs: z.number().nonnegative(),
51
+ category: z.enum(["any", "mutation", "durable-mutation"]).default("any"),
52
+ onUnavailable: UnavailablePolicySchema.default("fail"),
53
+ ...baseFields,
54
+ })
55
+ .strict();
56
+ export type TimeToFirstActionUnderConfig = z.infer<typeof TimeToFirstActionUnderConfigSchema>;
57
+
58
+ export const timeToFirstActionUnderAssertion: AssertionImpl<TimeToFirstActionUnderConfig> = {
59
+ type: "time-to-first-action-under",
60
+ configSchema: TimeToFirstActionUnderConfigSchema,
61
+ evaluate: async (config, run) => {
62
+ const fields = {
63
+ any: "timeToFirstActionMs",
64
+ mutation: "timeToFirstMutationMs",
65
+ "durable-mutation": "timeToFirstDurableMutationMs",
66
+ } as const;
67
+ const field = fields[config.category];
68
+ const value = run.metadata.actionTiming?.[field];
69
+ if (value === undefined) {
70
+ return unavailable(`time to first ${config.category} action`, config.onUnavailable);
71
+ }
72
+ const passed = value <= config.maxMs;
73
+ return {
74
+ passed,
75
+ score: passed ? 1 : 0,
76
+ comment: `${config.category} action at ${value}ms ${passed ? "<=" : ">"} ${config.maxMs}ms`,
77
+ detail: { category: config.category, timeToFirstActionMs: value },
78
+ };
79
+ },
80
+ };
81
+
47
82
  export const TokensUnderConfigSchema = z
48
83
  .object({
49
84
  type: z.literal("tokens-under"),
@@ -24,25 +24,15 @@ import {
24
24
  formatDoctorReport,
25
25
  formatExperimentDecisionMarkdown,
26
26
  formatExperimentRun,
27
- formatExperimentRunsTable,
28
- formatRunDetail,
29
- formatRunsTable,
30
27
  formatSuiteComparisonText,
31
- formatSuiteRunDetail,
32
- formatSuiteRunsTable,
33
28
  hasRegression,
34
29
  hasSuiteRegression,
35
- isExperimentRun,
36
- listExperimentRuns,
37
- listRuns,
38
- listSuiteRuns,
39
30
  loadEvalCase,
40
31
  loadExperimentCampaign,
41
32
  loadExperimentRun,
42
33
  loadFrozenRegradableRun,
43
34
  loadLuxConfig,
44
35
  loadRubricDefinition,
45
- loadRunDetail,
46
36
  loadSuiteRun,
47
37
  loadVerifiedExperimentDecisionSnapshot,
48
38
  Orchestrator,
@@ -84,6 +74,7 @@ import {
84
74
  installSkills,
85
75
  type SkillsPlatform,
86
76
  } from "./skills.js";
77
+ import { parsePreviewPort, viewCommand } from "./view.js";
87
78
 
88
79
  const requireFromHere = createRequire(import.meta.url);
89
80
  // From lib/cli/program.js (or src/cli/program.ts under test) to the package root.
@@ -496,88 +487,11 @@ const registerReportingCommands = (program: Command): void => {
496
487
  .option("--case <id>", "filter the run list to one case slug (list mode only)")
497
488
  .option("--suites", "list logical suite runs instead of individual runs")
498
489
  .option("--experiments", "list experiment runs instead of individual runs")
490
+ .option("--web", "open the local Lux Review web app")
491
+ .option("--port <n>", "listen on a specific local port in web mode", parsePreviewPort)
492
+ .option("--no-open", "start web mode without opening a browser")
499
493
  .option("--json", "emit machine-readable JSON")
500
- .action(
501
- async (
502
- runDirArg: string | undefined,
503
- options: {
504
- runsRoot?: string;
505
- case?: string;
506
- suites?: boolean;
507
- experiments?: boolean;
508
- json?: boolean;
509
- },
510
- ) => {
511
- if (runDirArg) {
512
- const path = resolve(runDirArg);
513
- if (!(await ensureDirectory("view", path))) return;
514
- if (isExperimentRun(path)) {
515
- const experiment = await loadExperimentRun(path);
516
- if (!experiment) {
517
- process.stderr.write(`lux view: invalid experiment at ${path}\n`);
518
- failWith(1);
519
- return;
520
- }
521
- process.stdout.write(
522
- options.json
523
- ? `${JSON.stringify({ experimentDir: path, ...experiment }, null, 2)}\n`
524
- : `${formatExperimentRun(path, experiment)}\n`,
525
- );
526
- return;
527
- }
528
- const suite = await loadSuiteRun(path);
529
- if (suite) {
530
- process.stdout.write(
531
- options.json
532
- ? `${JSON.stringify({ suiteDir: path, ...suite }, null, 2)}\n`
533
- : `${formatSuiteRunDetail(path, suite)}\n`,
534
- );
535
- return;
536
- }
537
- const detail = await loadRunDetail(path);
538
- if (options.json) {
539
- process.stdout.write(`${JSON.stringify(detail, null, 2)}\n`);
540
- } else {
541
- process.stdout.write(`${formatRunDetail(detail)}\n`);
542
- }
543
- return;
544
- }
545
-
546
- const cwd = process.cwd();
547
- const config = await loadLuxConfig(cwd);
548
- const runsRoot = options.runsRoot ? resolve(options.runsRoot) : config.runsRoot;
549
- if (options.experiments) {
550
- const experiments = await listExperimentRuns(runsRoot);
551
- process.stdout.write(
552
- options.json
553
- ? `${JSON.stringify(experiments, null, 2)}\n`
554
- : `experiments at ${runsRoot}:\n${formatExperimentRunsTable(experiments)}\n`,
555
- );
556
- return;
557
- }
558
- if (options.suites) {
559
- const suites = await listSuiteRuns(runsRoot);
560
- process.stdout.write(
561
- options.json
562
- ? `${JSON.stringify(suites, null, 2)}\n`
563
- : `suite runs at ${runsRoot}:\n${formatSuiteRunsTable(suites)}\n`,
564
- );
565
- return;
566
- }
567
- const all = await listRuns(runsRoot);
568
- const runs = options.case ? all.filter((r) => r.caseSlug === options.case) : all;
569
- if (options.json) {
570
- process.stdout.write(`${JSON.stringify(runs, null, 2)}\n`);
571
- } else {
572
- if (!options.case) {
573
- process.stdout.write(`suite runs at ${runsRoot}:\n`);
574
- process.stdout.write(`${formatSuiteRunsTable(await listSuiteRuns(runsRoot))}\n\n`);
575
- }
576
- process.stdout.write(`runs at ${runsRoot}:\n`);
577
- process.stdout.write(`${formatRunsTable(runs)}\n`);
578
- }
579
- },
580
- );
494
+ .action(viewCommand);
581
495
 
582
496
  program
583
497
  .command("compare <runA> <runB>")
@@ -0,0 +1,168 @@
1
+ import { resolve } from "node:path";
2
+ import { InvalidArgumentError } from "commander";
3
+ import {
4
+ formatExperimentRun,
5
+ formatExperimentRunsTable,
6
+ formatRunDetail,
7
+ formatRunsTable,
8
+ formatSuiteRunDetail,
9
+ formatSuiteRunsTable,
10
+ isExperimentRun,
11
+ listExperimentRuns,
12
+ listRuns,
13
+ listSuiteRuns,
14
+ loadExperimentRun,
15
+ loadLuxConfig,
16
+ loadRunDetail,
17
+ loadSuiteRun,
18
+ } from "../orchestrator/index.js";
19
+ import { openPreviewUrl, startPreviewServer } from "../previewer/server.js";
20
+ import { abortOnInterrupt, ensureDirectory, failWith } from "./command-runtime.js";
21
+
22
+ const SIGINT_EXIT_CODE = 130;
23
+
24
+ export type ViewOptions = {
25
+ runsRoot?: string;
26
+ case?: string;
27
+ suites?: boolean;
28
+ experiments?: boolean;
29
+ web?: boolean;
30
+ port?: number;
31
+ open?: boolean;
32
+ json?: boolean;
33
+ };
34
+
35
+ const previewKind = async (
36
+ initialPath: string | undefined,
37
+ options: ViewOptions,
38
+ ): Promise<"run" | "suite" | "experiment" | undefined> => {
39
+ if (initialPath) {
40
+ if (isExperimentRun(initialPath)) return "experiment";
41
+ if (await loadSuiteRun(initialPath)) return "suite";
42
+ return "run";
43
+ }
44
+ if (options.experiments) return "experiment";
45
+ if (options.suites) return "suite";
46
+ return undefined;
47
+ };
48
+
49
+ const webViewCommand = async (
50
+ runDirArg: string | undefined,
51
+ options: ViewOptions,
52
+ ): Promise<void> => {
53
+ if (options.json) {
54
+ throw new InvalidArgumentError("--web and --json are mutually exclusive");
55
+ }
56
+ const config = await loadLuxConfig(process.cwd());
57
+ const runsRoot = options.runsRoot ? resolve(options.runsRoot) : config.runsRoot;
58
+ const initialPath = runDirArg ? resolve(runDirArg) : undefined;
59
+ if (initialPath && !(await ensureDirectory("view", initialPath))) return;
60
+ const initialKind = await previewKind(initialPath, options);
61
+ const controller = abortOnInterrupt();
62
+ const preview = await startPreviewServer({
63
+ runsRoot,
64
+ ...(options.port !== undefined ? { port: options.port } : {}),
65
+ ...(initialPath ? { initialPath } : {}),
66
+ ...(initialKind ? { initialKind } : {}),
67
+ ...(options.case ? { caseFilter: options.case } : {}),
68
+ signal: controller.signal,
69
+ });
70
+ process.stdout.write(`Lux Review: ${preview.url}\n`);
71
+ process.stdout.write(`Reading evidence from ${runsRoot}\n`);
72
+ if (options.open !== false) {
73
+ try {
74
+ await openPreviewUrl(preview.url);
75
+ } catch (error) {
76
+ const message = error instanceof Error ? error.message : String(error);
77
+ process.stderr.write(`lux view: could not open a browser (${message})\n`);
78
+ }
79
+ }
80
+ await preview.closed;
81
+ if (controller.signal.aborted) failWith(SIGINT_EXIT_CODE);
82
+ };
83
+
84
+ export const viewCommand = async (
85
+ runDirArg: string | undefined,
86
+ options: ViewOptions,
87
+ ): Promise<void> => {
88
+ if (options.web) {
89
+ await webViewCommand(runDirArg, options);
90
+ return;
91
+ }
92
+ if (options.port !== undefined || options.open === false) {
93
+ throw new InvalidArgumentError("--port and --no-open require --web");
94
+ }
95
+ if (runDirArg) {
96
+ const path = resolve(runDirArg);
97
+ if (!(await ensureDirectory("view", path))) return;
98
+ if (isExperimentRun(path)) {
99
+ const experiment = await loadExperimentRun(path);
100
+ if (!experiment) {
101
+ process.stderr.write(`lux view: invalid experiment at ${path}\n`);
102
+ failWith(1);
103
+ return;
104
+ }
105
+ process.stdout.write(
106
+ options.json
107
+ ? `${JSON.stringify({ experimentDir: path, ...experiment }, null, 2)}\n`
108
+ : `${formatExperimentRun(path, experiment)}\n`,
109
+ );
110
+ return;
111
+ }
112
+ const suite = await loadSuiteRun(path);
113
+ if (suite) {
114
+ process.stdout.write(
115
+ options.json
116
+ ? `${JSON.stringify({ suiteDir: path, ...suite }, null, 2)}\n`
117
+ : `${formatSuiteRunDetail(path, suite)}\n`,
118
+ );
119
+ return;
120
+ }
121
+ const detail = await loadRunDetail(path);
122
+ process.stdout.write(
123
+ options.json ? `${JSON.stringify(detail, null, 2)}\n` : `${formatRunDetail(detail)}\n`,
124
+ );
125
+ return;
126
+ }
127
+
128
+ const config = await loadLuxConfig(process.cwd());
129
+ const runsRoot = options.runsRoot ? resolve(options.runsRoot) : config.runsRoot;
130
+ if (options.experiments) {
131
+ const experiments = await listExperimentRuns(runsRoot);
132
+ process.stdout.write(
133
+ options.json
134
+ ? `${JSON.stringify(experiments, null, 2)}\n`
135
+ : `experiments at ${runsRoot}:\n${formatExperimentRunsTable(experiments)}\n`,
136
+ );
137
+ return;
138
+ }
139
+ if (options.suites) {
140
+ const suites = await listSuiteRuns(runsRoot);
141
+ process.stdout.write(
142
+ options.json
143
+ ? `${JSON.stringify(suites, null, 2)}\n`
144
+ : `suite runs at ${runsRoot}:\n${formatSuiteRunsTable(suites)}\n`,
145
+ );
146
+ return;
147
+ }
148
+ const all = await listRuns(runsRoot);
149
+ const runs = options.case ? all.filter((run) => run.caseSlug === options.case) : all;
150
+ if (options.json) {
151
+ process.stdout.write(`${JSON.stringify(runs, null, 2)}\n`);
152
+ return;
153
+ }
154
+ if (!options.case) {
155
+ process.stdout.write(`suite runs at ${runsRoot}:\n`);
156
+ process.stdout.write(`${formatSuiteRunsTable(await listSuiteRuns(runsRoot))}\n\n`);
157
+ }
158
+ process.stdout.write(`runs at ${runsRoot}:\n`);
159
+ process.stdout.write(`${formatRunsTable(runs)}\n`);
160
+ };
161
+
162
+ export const parsePreviewPort = (value: string): number => {
163
+ const port = Number(value);
164
+ if (!Number.isInteger(port) || port < 0 || port > 65_535) {
165
+ throw new InvalidArgumentError("port must be an integer from 0 to 65535");
166
+ }
167
+ return port;
168
+ };
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ import type { RunEvent } from "./events.js";
3
+
4
+ export const ActionCategorySchema = z.enum([
5
+ "query",
6
+ "mutation",
7
+ "durable-mutation",
8
+ "execution",
9
+ "interaction",
10
+ ]);
11
+ export type ActionCategory = z.infer<typeof ActionCategorySchema>;
12
+
13
+ export const ActionProgressPayloadSchema = z
14
+ .object({
15
+ name: z.string(),
16
+ category: ActionCategorySchema,
17
+ })
18
+ .strict();
19
+ export type ActionProgressPayload = z.infer<typeof ActionProgressPayloadSchema>;
20
+
21
+ export const ActionTimingSchema = z.object({
22
+ timeToFirstActionMs: z.exactOptional(z.number().nonnegative()),
23
+ timeToFirstMutationMs: z.exactOptional(z.number().nonnegative()),
24
+ timeToFirstDurableMutationMs: z.exactOptional(z.number().nonnegative()),
25
+ });
26
+ export type ActionTiming = z.infer<typeof ActionTimingSchema>;
27
+
28
+ export const actionTiming = (events: readonly RunEvent[]): ActionTiming => {
29
+ const startEvent = events.find(
30
+ (event) => event.type === "lifecycle" && event.stage === "start-driver",
31
+ );
32
+ const startedAt = startEvent?.type === "lifecycle" ? startEvent.ts : undefined;
33
+ if (startedAt === undefined) return {};
34
+
35
+ const actions = events.flatMap((event) => {
36
+ if (event.type !== "progress" || event.kind !== "action") return [];
37
+ const payload = ActionProgressPayloadSchema.safeParse(event.payload).data;
38
+ return payload ? [{ ...payload, ts: event.ts }] : [];
39
+ });
40
+ const elapsed = (category: "any" | "mutation" | "durable-mutation") => {
41
+ const timestamps = actions.flatMap(({ category: candidate, ts }) => {
42
+ if (category === "any") return [ts];
43
+ if (category === "mutation") {
44
+ return candidate === "mutation" || candidate === "durable-mutation" ? [ts] : [];
45
+ }
46
+ return candidate === category ? [ts] : [];
47
+ });
48
+ return timestamps.length > 0 ? Math.max(0, Math.min(...timestamps) - startedAt) : undefined;
49
+ };
50
+
51
+ const timeToFirstActionMs = elapsed("any");
52
+ const timeToFirstMutationMs = elapsed("mutation");
53
+ const timeToFirstDurableMutationMs = elapsed("durable-mutation");
54
+ return {
55
+ ...(timeToFirstActionMs === undefined ? {} : { timeToFirstActionMs }),
56
+ ...(timeToFirstMutationMs === undefined ? {} : { timeToFirstMutationMs }),
57
+ ...(timeToFirstDurableMutationMs === undefined ? {} : { timeToFirstDurableMutationMs }),
58
+ };
59
+ };