@empiricalrun/playwright-utils 0.58.4 → 0.58.6

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 (36) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/api-worker-client.d.ts +17 -0
  3. package/dist/api-worker-client.d.ts.map +1 -1
  4. package/dist/api-worker-client.js +34 -2
  5. package/dist/generated/api-worker-openapi.d.ts +96 -177
  6. package/dist/generated/api-worker-openapi.d.ts.map +1 -1
  7. package/dist/overlay-tests/cache.spec.js +28 -4
  8. package/dist/reporter/harness.d.ts +4 -0
  9. package/dist/reporter/harness.d.ts.map +1 -1
  10. package/dist/reporter/harness.js +20 -8
  11. package/dist/reporter/ibr-utils.d.ts +3 -0
  12. package/dist/reporter/ibr-utils.d.ts.map +1 -1
  13. package/dist/reporter/ibr-utils.js +25 -18
  14. package/dist/reporter/incremental-blob-reporter.d.ts +1 -0
  15. package/dist/reporter/incremental-blob-reporter.d.ts.map +1 -1
  16. package/dist/reporter/incremental-blob-reporter.js +5 -4
  17. package/dist/reporter/lifecycle-events.d.ts +15 -5
  18. package/dist/reporter/lifecycle-events.d.ts.map +1 -1
  19. package/dist/reporter/lifecycle-events.js +91 -64
  20. package/dist/reporter/parity-utils.d.ts +21 -0
  21. package/dist/reporter/parity-utils.d.ts.map +1 -1
  22. package/dist/reporter/parity-utils.js +73 -1
  23. package/dist/reporter/test-case-sync.d.ts +2 -25
  24. package/dist/reporter/test-case-sync.d.ts.map +1 -1
  25. package/dist/reporter/uploader.d.ts.map +1 -1
  26. package/dist/reporter/uploader.js +22 -1
  27. package/dist/test/expect/visual.d.ts.map +1 -1
  28. package/dist/test/expect/visual.js +4 -1
  29. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/index.d.ts.map +1 -1
  30. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/index.js +5 -0
  31. package/dist/test/scripts/pw-locator-patch/vision/query.d.ts.map +1 -1
  32. package/dist/test/scripts/pw-locator-patch/vision/query.js +4 -1
  33. package/package.json +5 -5
  34. package/upstream-oracle/README.md +36 -7
  35. package/upstream-oracle/ibr-adapter.js +60 -5
  36. package/upstream-oracle/run.mjs +84 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @empiricalrun/playwright-utils
2
2
 
3
+ ## 0.58.6
4
+
5
+ ### Patch Changes
6
+
7
+ - bcf5ed7: chore: drop fallbacks for LLM proxy
8
+ - 68091d9: feat: route LLM calls via api-worker proxy for usage attribution
9
+ - Updated dependencies [bcf5ed7]
10
+ - Updated dependencies [68091d9]
11
+ - Updated dependencies [ed03fc8]
12
+ - @empiricalrun/llm@0.27.1
13
+ - @empiricalrun/cua@0.4.2
14
+ - @empiricalrun/reporter@0.30.0
15
+
16
+ ## 0.58.5
17
+
18
+ ### Patch Changes
19
+
20
+ - 157ea19: fix: incremental blob reporter serializes config and projects like the built-in blob reporter
21
+ - 8e8cea6: fix: incremental blob reporter passes error objects through unmodified, preserving value, cause and AggregateError sub-errors
22
+ - ff99f5e: fix: incremental blob reporter emits step attachments at onStepEnd and relativizes step locations
23
+ - 15e769c: feat: log pending upload counts around run end
24
+ - Updated dependencies [15e769c]
25
+ - @empiricalrun/r2-uploader@0.10.2
26
+
3
27
  ## 0.58.4
4
28
 
5
29
  ### Patch Changes
@@ -9,6 +9,23 @@ export type TwoCaptchaProxyResponse = components["schemas"]["TwoCaptchaProxyResp
9
9
  export type ProjectKvGetResponse = components["schemas"]["ProjectKvGetResponse"];
10
10
  export type ProjectKvSetRequest = NonNullable<paths["/api/projects/kv"]["post"]["requestBody"]>["content"]["application/json"];
11
11
  export type ProjectKvSetResponse = components["schemas"]["ProjectKvSetResponse"];
12
+ /**
13
+ * OpenAI client config for the LLM calls playwright-utils makes from inside a
14
+ * test run — the overlay-dismissal browser agent and the toLookRight visual
15
+ * assertion. Both go through api-worker's proxy, which holds the provider key
16
+ * and forwards via the Cloudflare AI Gateway; the run worker puts
17
+ * EMPIRICALRUN_API_KEY and DASHBOARD_DOMAIN in the Playwright child process.
18
+ *
19
+ * There is deliberately no fallback to a direct OPENAI_API_KEY. A fallback
20
+ * makes the transport depend on ambient env, which hides a broken proxy behind
21
+ * a working direct call and lets a test that clears one credential still reach
22
+ * the model. Returns undefined only for a pi sandbox, whose OPENAI_BASE_URL
23
+ * already points at the sidecar's own keyless proxy route.
24
+ */
25
+ export declare function llmProxyOpenAIConfig(): {
26
+ baseURL: string;
27
+ apiKey: string;
28
+ } | undefined;
12
29
  export declare class HTTPError extends Error {
13
30
  status: number;
14
31
  constructor(message: string, status: number);
@@ -1 +1 @@
1
- {"version":3,"file":"api-worker-client.d.ts","sourceRoot":"","sources":["../src/api-worker-client.ts"],"names":[],"mappings":"AACA,OAAqB,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAExE,KAAK,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAEzC,KAAK,iBAAiB,GAClB,kBAAkB,GAClB,sBAAsB,GACtB,yBAAyB,CAAC;AAE9B,MAAM,MAAM,oBAAoB,GAC9B,UAAU,CAAC,SAAS,CAAC,CAAC,6BAA6B,CAAC,CAAC;AACvD,MAAM,MAAM,qBAAqB,GAC/B,UAAU,CAAC,SAAS,CAAC,CAAC,8BAA8B,CAAC,CAAC;AACxD,MAAM,MAAM,sBAAsB,GAChC,UAAU,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,CAAC;AAClD,MAAM,MAAM,uBAAuB,GACjC,UAAU,CAAC,SAAS,CAAC,CAAC,yBAAyB,CAAC,CAAC;AACnD,MAAM,MAAM,oBAAoB,GAC9B,UAAU,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC;AAChD,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAC3C,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CACjD,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AACjC,MAAM,MAAM,oBAAoB,GAC9B,UAAU,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC;AAEhD,qBAAa,SAAU,SAAQ,KAAK;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAG1C;CACF;AAED,qBAAa,qBAAsB,SAAQ,SAAS;CAAG;AACvD,qBAAa,kBAAmB,SAAQ,SAAS;CAAG;AA+CpD,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAErC,YAAY,EACV,aAAa,EACb,OAAO,GACR,GAAE;QACD,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KACb,EAiBL;IAED,UAAU,IAAI,MAAM,CAEnB;IAEK,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAK7D;IAEK,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAK3E;IAEK,iBAAiB,CACrB,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,qBAAqB,CAAC,CAKhC;IAED,MAAM,CAAC,CAAC,EACN,MAAM,EAAE;QACN,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,QAAQ,CAAC;KACpB,EACD,KAAK,EAAE,MAAM,GACZ,CAAC,CAUH;CACF"}
1
+ {"version":3,"file":"api-worker-client.d.ts","sourceRoot":"","sources":["../src/api-worker-client.ts"],"names":[],"mappings":"AACA,OAAqB,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAExE,KAAK,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAEzC,KAAK,iBAAiB,GAClB,kBAAkB,GAClB,sBAAsB,GACtB,yBAAyB,CAAC;AAE9B,MAAM,MAAM,oBAAoB,GAC9B,UAAU,CAAC,SAAS,CAAC,CAAC,6BAA6B,CAAC,CAAC;AACvD,MAAM,MAAM,qBAAqB,GAC/B,UAAU,CAAC,SAAS,CAAC,CAAC,8BAA8B,CAAC,CAAC;AACxD,MAAM,MAAM,sBAAsB,GAChC,UAAU,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,CAAC;AAClD,MAAM,MAAM,uBAAuB,GACjC,UAAU,CAAC,SAAS,CAAC,CAAC,yBAAyB,CAAC,CAAC;AACnD,MAAM,MAAM,oBAAoB,GAC9B,UAAU,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC;AAChD,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAC3C,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CACjD,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AACjC,MAAM,MAAM,oBAAoB,GAC9B,UAAU,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC;AAQhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,IAChC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC,SAAS,CAgBZ;AAED,qBAAa,SAAU,SAAQ,KAAK;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAG1C;CACF;AAED,qBAAa,qBAAsB,SAAQ,SAAS;CAAG;AACvD,qBAAa,kBAAmB,SAAQ,SAAS;CAAG;AA+CpD,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAErC,YAAY,EACV,aAAa,EACb,OAAO,GACR,GAAE;QACD,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KACb,EAgBL;IAED,UAAU,IAAI,MAAM,CAEnB;IAEK,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAK7D;IAEK,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAK3E;IAEK,iBAAiB,CACrB,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,qBAAqB,CAAC,CAKhC;IAED,MAAM,CAAC,CAAC,EACN,MAAM,EAAE;QACN,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,QAAQ,CAAC;KACpB,EACD,KAAK,EAAE,MAAM,GACZ,CAAC,CAUH;CACF"}
@@ -4,8 +4,41 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ApiWorkerClient = exports.RetryableHTTPError = exports.NonRetryableHTTPError = exports.HTTPError = void 0;
7
+ exports.llmProxyOpenAIConfig = llmProxyOpenAIConfig;
7
8
  const async_retry_1 = __importDefault(require("async-retry"));
8
9
  const openapi_fetch_1 = __importDefault(require("openapi-fetch"));
10
+ const DEFAULT_API_WORKER_URL = "https://api.empirical.run";
11
+ function apiWorkerBaseUrl() {
12
+ return process.env.DASHBOARD_DOMAIN || DEFAULT_API_WORKER_URL;
13
+ }
14
+ /**
15
+ * OpenAI client config for the LLM calls playwright-utils makes from inside a
16
+ * test run — the overlay-dismissal browser agent and the toLookRight visual
17
+ * assertion. Both go through api-worker's proxy, which holds the provider key
18
+ * and forwards via the Cloudflare AI Gateway; the run worker puts
19
+ * EMPIRICALRUN_API_KEY and DASHBOARD_DOMAIN in the Playwright child process.
20
+ *
21
+ * There is deliberately no fallback to a direct OPENAI_API_KEY. A fallback
22
+ * makes the transport depend on ambient env, which hides a broken proxy behind
23
+ * a working direct call and lets a test that clears one credential still reach
24
+ * the model. Returns undefined only for a pi sandbox, whose OPENAI_BASE_URL
25
+ * already points at the sidecar's own keyless proxy route.
26
+ */
27
+ function llmProxyOpenAIConfig() {
28
+ if (process.env.OPENAI_BASE_URL) {
29
+ return undefined;
30
+ }
31
+ const apiKey = process.env.EMPIRICALRUN_API_KEY;
32
+ if (!apiKey) {
33
+ throw new Error("EMPIRICALRUN_API_KEY is required to reach Empirical's LLM proxy. Set it, " +
34
+ "or point OPENAI_BASE_URL at a proxy of your own — playwright-utils no " +
35
+ "longer calls OpenAI directly with OPENAI_API_KEY.");
36
+ }
37
+ return {
38
+ baseURL: `${apiWorkerBaseUrl()}/api/llm/openai/v1`,
39
+ apiKey,
40
+ };
41
+ }
9
42
  class HTTPError extends Error {
10
43
  status;
11
44
  constructor(message, status) {
@@ -63,8 +96,7 @@ class ApiWorkerClient {
63
96
  baseUrl;
64
97
  client;
65
98
  constructor({ projectApiKey, baseUrl, } = {}) {
66
- this.baseUrl =
67
- baseUrl || process.env.DASHBOARD_DOMAIN || "https://api.empirical.run";
99
+ this.baseUrl = baseUrl || apiWorkerBaseUrl();
68
100
  const apiKey = projectApiKey || process.env.EMPIRICALRUN_API_KEY;
69
101
  if (!apiKey) {
70
102
  throw new Error("EMPIRICALRUN_API_KEY environment variable is required");
@@ -2433,26 +2433,6 @@ export interface paths {
2433
2433
  patch?: never;
2434
2434
  trace?: never;
2435
2435
  };
2436
- "/api/chat-sessions/{id}/sandbox/terminal-session": {
2437
- parameters: {
2438
- query?: never;
2439
- header?: never;
2440
- path?: never;
2441
- cookie?: never;
2442
- };
2443
- get?: never;
2444
- put?: never;
2445
- /**
2446
- * ⚙️ Create a sandbox terminal session
2447
- * @description Creates a PTY session on the sandbox and returns the WebSocket URL and token to connect to it. Super-admin only.
2448
- */
2449
- post: operations["createChatSessionSandboxTerminalSession"];
2450
- delete?: never;
2451
- options?: never;
2452
- head?: never;
2453
- patch?: never;
2454
- trace?: never;
2455
- };
2456
2436
  "/api/chat-sessions/{id}/session-state": {
2457
2437
  parameters: {
2458
2438
  query?: never;
@@ -2593,6 +2573,26 @@ export interface paths {
2593
2573
  patch?: never;
2594
2574
  trace?: never;
2595
2575
  };
2576
+ "/api/chat-sessions/sandbox/protected-branches": {
2577
+ parameters: {
2578
+ query?: never;
2579
+ header?: never;
2580
+ path?: never;
2581
+ cookie?: never;
2582
+ };
2583
+ /**
2584
+ * ⚙️ List branches the sandbox may not push to
2585
+ * @description Returns the project's default branch and the chat session's base branch. The sandbox git proxy blocks pushes to these. The session is derived from the sandbox-delegation principal.
2586
+ */
2587
+ get: operations["getChatSessionSandboxProtectedBranches"];
2588
+ put?: never;
2589
+ post?: never;
2590
+ delete?: never;
2591
+ options?: never;
2592
+ head?: never;
2593
+ patch?: never;
2594
+ trace?: never;
2595
+ };
2596
2596
  "/api/chat-sessions/users": {
2597
2597
  parameters: {
2598
2598
  query?: never;
@@ -4729,26 +4729,6 @@ export interface paths {
4729
4729
  patch?: never;
4730
4730
  trace?: never;
4731
4731
  };
4732
- "/api/projects/check-prompt": {
4733
- parameters: {
4734
- query?: never;
4735
- header?: never;
4736
- path?: never;
4737
- cookie?: never;
4738
- };
4739
- get?: never;
4740
- put?: never;
4741
- /**
4742
- * ⚙️ Validate a prompt against criteria
4743
- * @description Uses an LLM to validate whether a prompt satisfies the given criteria.
4744
- */
4745
- post: operations["checkPrompt"];
4746
- delete?: never;
4747
- options?: never;
4748
- head?: never;
4749
- patch?: never;
4750
- trace?: never;
4751
- };
4752
4732
  "/api/projects/check-slug": {
4753
4733
  parameters: {
4754
4734
  query?: never;
@@ -6479,27 +6459,6 @@ export interface components {
6479
6459
  test_cases_sync_error_at: string | null;
6480
6460
  };
6481
6461
  };
6482
- CheckPromptResponse: {
6483
- /** @description Response payload. */
6484
- data: {
6485
- validation: components["schemas"]["PromptValidationResult"];
6486
- };
6487
- };
6488
- PromptValidationResult: {
6489
- /**
6490
- * @description Validation outcome.
6491
- * @enum {string}
6492
- */
6493
- status: "pass" | "needs_more";
6494
- /** @description Human-readable feedback. */
6495
- assistant_message: string;
6496
- /** @description Requirements still missing. */
6497
- missing_items: string[];
6498
- /** @description Requirements already covered. */
6499
- covered_items: string[];
6500
- /** @description Model confidence (0-1). */
6501
- confidence: number;
6502
- };
6503
6462
  ProjectKvGetResponse: {
6504
6463
  /** @description Response payload. */
6505
6464
  data: {
@@ -8961,6 +8920,10 @@ export interface components {
8961
8920
  /** @description Human-readable error message. */
8962
8921
  error: string;
8963
8922
  };
8923
+ SandboxProtectedBranches: {
8924
+ /** @description Branch names the sandbox must not push to. */
8925
+ branches: string[];
8926
+ };
8964
8927
  SandboxActionSuccess: {
8965
8928
  /** @description Always true when the action succeeded. */
8966
8929
  success: boolean;
@@ -9027,14 +8990,6 @@ export interface components {
9027
8990
  /** @description Human-readable error message. */
9028
8991
  error: string;
9029
8992
  };
9030
- SandboxTerminalSession: {
9031
- /** @description WebSocket URL for the PTY session. */
9032
- ws_url: string;
9033
- /** @description Auth token for the terminal WebSocket. */
9034
- token: string;
9035
- /** @description Error message, or null on success. */
9036
- error: string | null;
9037
- };
9038
8993
  SubscribeChatSessionResponse: {
9039
8994
  data: {
9040
8995
  already_waiting: boolean;
@@ -10184,8 +10139,6 @@ export interface components {
10184
10139
  id: number;
10185
10140
  /** @description ISO 8601 creation timestamp. */
10186
10141
  created_at: string;
10187
- /** @description Test case slug. */
10188
- slug: string | null;
10189
10142
  /** @description Playwright test ID. */
10190
10143
  pw_test_id: string | null;
10191
10144
  /** @description Test run ID. */
@@ -10703,6 +10656,23 @@ export interface components {
10703
10656
  /** @description Playwright test id, if known. */
10704
10657
  pw_test_id?: string | null;
10705
10658
  }[];
10659
+ /** @description Scheduled dependency groups (serial blocks). */
10660
+ dependency_groups?: {
10661
+ /** @description Stable group id. */
10662
+ id: string;
10663
+ /**
10664
+ * @description Only Playwright serial groups today.
10665
+ * @enum {string}
10666
+ */
10667
+ kind: "playwright_serial";
10668
+ /** @description Members in execution order. */
10669
+ members: {
10670
+ /** @description Playwright test id of the member. */
10671
+ test_case_id: string;
10672
+ /** @description 0-based execution order within the group. */
10673
+ dependency_order: number;
10674
+ }[];
10675
+ }[];
10706
10676
  /** @description Legacy base64-gzip manifest blob. Ignored when `tests` is present. */
10707
10677
  run_manifest?: string;
10708
10678
  /** @description Zero-based shard index, when the run is sharded. */
@@ -10772,6 +10742,8 @@ export interface components {
10772
10742
  last_commit_before_run_started_at: string | null;
10773
10743
  /** @description Snoozes matching this case at read time. */
10774
10744
  snooze_info: components["schemas"]["TestRunCaseSnoozeInfo"][];
10745
+ /** @description Attempts that never ran because an earlier member of this case's Playwright serial group failed on the same attempt. Null when the case is not in a snapshotted group or when nothing was blocked. */
10746
+ skipped_attempts: components["schemas"]["TestRunCaseSkippedAttempt"][] | null;
10775
10747
  };
10776
10748
  TestRunCaseRetryDetail: {
10777
10749
  /** @description Zero-based retry attempt index. */
@@ -10845,6 +10817,19 @@ export interface components {
10845
10817
  /** @description Environment the snooze is scoped to, if any. */
10846
10818
  scoped_to_environment_id: number | null;
10847
10819
  };
10820
+ TestRunCaseSkippedAttempt: {
10821
+ /** @description Attempt index this explains. */
10822
+ retry_index: number;
10823
+ /** @description The serial-group member that blocked this attempt. */
10824
+ blocked_by: {
10825
+ /** @description Playwright test id of the blocking test. */
10826
+ pw_test_id: string | null;
10827
+ /** @description Title of the blocking test. */
10828
+ name: string;
10829
+ /** @description The blocking test's outcome on this attempt. */
10830
+ status: string;
10831
+ };
10832
+ };
10848
10833
  GetTestRunCaseResponse: {
10849
10834
  /** @description Response payload. */
10850
10835
  data: {
@@ -10886,6 +10871,8 @@ export interface components {
10886
10871
  last_commit_before_run_started_at: string | null;
10887
10872
  /** @description Snoozes matching this case at read time. */
10888
10873
  snooze_info: components["schemas"]["TestRunCaseSnoozeInfo"][];
10874
+ /** @description Attempts that never ran because an earlier member of this case's Playwright serial group failed on the same attempt. Null when the case is not in a snapshotted group or when nothing was blocked. */
10875
+ skipped_attempts: components["schemas"]["TestRunCaseSkippedAttempt"][] | null;
10889
10876
  };
10890
10877
  };
10891
10878
  UiGetTestRunResponse: {
@@ -19253,65 +19240,6 @@ export interface operations {
19253
19240
  };
19254
19241
  };
19255
19242
  };
19256
- createChatSessionSandboxTerminalSession: {
19257
- parameters: {
19258
- query?: never;
19259
- header?: never;
19260
- path: {
19261
- /** @description Chat session ID. */
19262
- id: number;
19263
- };
19264
- cookie?: never;
19265
- };
19266
- requestBody?: never;
19267
- responses: {
19268
- /** @description Terminal session connection details. */
19269
- 200: {
19270
- headers: {
19271
- [name: string]: unknown;
19272
- };
19273
- content: {
19274
- "application/json": components["schemas"]["SandboxTerminalSession"];
19275
- };
19276
- };
19277
- /** @description Invalid request. */
19278
- 400: {
19279
- headers: {
19280
- [name: string]: unknown;
19281
- };
19282
- content: {
19283
- "application/json": components["schemas"]["ErrorResponse"];
19284
- };
19285
- };
19286
- /** @description Forbidden. */
19287
- 403: {
19288
- headers: {
19289
- [name: string]: unknown;
19290
- };
19291
- content: {
19292
- "application/json": components["schemas"]["SandboxTerminalSession"];
19293
- };
19294
- };
19295
- /** @description Sandbox not found. */
19296
- 404: {
19297
- headers: {
19298
- [name: string]: unknown;
19299
- };
19300
- content: {
19301
- "application/json": components["schemas"]["SandboxTerminalSession"];
19302
- };
19303
- };
19304
- /** @description Failed to create terminal session. */
19305
- 500: {
19306
- headers: {
19307
- [name: string]: unknown;
19308
- };
19309
- content: {
19310
- "application/json": components["schemas"]["SandboxTerminalSession"];
19311
- };
19312
- };
19313
- };
19314
- };
19315
19243
  getChatSessionState: {
19316
19244
  parameters: {
19317
19245
  query?: {
@@ -19617,6 +19545,44 @@ export interface operations {
19617
19545
  };
19618
19546
  };
19619
19547
  };
19548
+ getChatSessionSandboxProtectedBranches: {
19549
+ parameters: {
19550
+ query?: never;
19551
+ header?: never;
19552
+ path?: never;
19553
+ cookie?: never;
19554
+ };
19555
+ requestBody?: never;
19556
+ responses: {
19557
+ /** @description Protected branches. */
19558
+ 200: {
19559
+ headers: {
19560
+ [name: string]: unknown;
19561
+ };
19562
+ content: {
19563
+ "application/json": components["schemas"]["SandboxProtectedBranches"];
19564
+ };
19565
+ };
19566
+ /** @description The caller is not a sandbox principal. */
19567
+ 400: {
19568
+ headers: {
19569
+ [name: string]: unknown;
19570
+ };
19571
+ content: {
19572
+ "application/json": components["schemas"]["SandboxErrorMessage"];
19573
+ };
19574
+ };
19575
+ /** @description Chat session not found. */
19576
+ 404: {
19577
+ headers: {
19578
+ [name: string]: unknown;
19579
+ };
19580
+ content: {
19581
+ "application/json": components["schemas"]["SandboxErrorMessage"];
19582
+ };
19583
+ };
19584
+ };
19585
+ };
19620
19586
  listChatSessionUsers: {
19621
19587
  parameters: {
19622
19588
  query?: {
@@ -25087,53 +25053,6 @@ export interface operations {
25087
25053
  };
25088
25054
  };
25089
25055
  };
25090
- checkPrompt: {
25091
- parameters: {
25092
- query?: never;
25093
- header?: never;
25094
- path?: never;
25095
- cookie?: never;
25096
- };
25097
- requestBody?: {
25098
- content: {
25099
- "application/json": {
25100
- /** @description Criterion the prompt must satisfy. */
25101
- criteria: string;
25102
- /** @description Latest user prompt to validate. */
25103
- prompt: string;
25104
- /**
25105
- * @description Prior conversation messages for context.
25106
- * @default []
25107
- */
25108
- messages?: {
25109
- /** @enum {string} */
25110
- role: "user" | "assistant";
25111
- content: string;
25112
- }[];
25113
- };
25114
- };
25115
- };
25116
- responses: {
25117
- /** @description Validation result. */
25118
- 200: {
25119
- headers: {
25120
- [name: string]: unknown;
25121
- };
25122
- content: {
25123
- "application/json": components["schemas"]["CheckPromptResponse"];
25124
- };
25125
- };
25126
- /** @description Invalid request. */
25127
- 400: {
25128
- headers: {
25129
- [name: string]: unknown;
25130
- };
25131
- content: {
25132
- "application/json": components["schemas"]["ErrorResponse"];
25133
- };
25134
- };
25135
- };
25136
- };
25137
25056
  checkProjectSlug: {
25138
25057
  parameters: {
25139
25058
  query: {