@empiricalrun/playwright-utils 0.61.3 → 0.62.1

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 (29) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/generated/api-worker-openapi.d.ts +835 -221
  3. package/dist/generated/api-worker-openapi.d.ts.map +1 -1
  4. package/dist/test/expect/visual.d.ts.map +1 -1
  5. package/dist/test/expect/visual.js +0 -7
  6. package/dist/test/index.d.ts.map +1 -1
  7. package/dist/test/index.js +10 -8
  8. package/dist/test/scripts/index.d.ts.map +1 -1
  9. package/dist/test/scripts/index.js +1 -6
  10. package/dist/test/scripts/pw-locator-patch/highlight/expect.js +1 -1
  11. package/dist/test/scripts/pw-locator-patch/highlight/hover.d.ts.map +1 -1
  12. package/dist/test/scripts/pw-locator-patch/highlight/hover.js +0 -1
  13. package/dist/test/scripts/pw-locator-patch/highlight/inner-text.js +1 -1
  14. package/dist/test/scripts/pw-locator-patch/highlight/input-value.js +1 -1
  15. package/dist/test/scripts/pw-locator-patch/highlight/is-checked.js +1 -1
  16. package/dist/test/scripts/pw-locator-patch/highlight/is-disabled.js +1 -1
  17. package/dist/test/scripts/pw-locator-patch/highlight/is-editable.js +1 -1
  18. package/dist/test/scripts/pw-locator-patch/highlight/text-content.js +1 -1
  19. package/dist/test/scripts/pw-locator-patch/utils/index.d.ts +1 -2
  20. package/dist/test/scripts/pw-locator-patch/utils/index.d.ts.map +1 -1
  21. package/dist/test/scripts/pw-locator-patch/utils/index.js +3 -25
  22. package/dist/test/types.d.ts +1 -0
  23. package/dist/test/types.d.ts.map +1 -1
  24. package/docs/fixtures.md +10 -8
  25. package/package.json +3 -3
  26. package/tsconfig.tsbuildinfo +1 -1
  27. package/dist/test/scripts/mouse-pointer.d.ts +0 -5
  28. package/dist/test/scripts/mouse-pointer.d.ts.map +0 -1
  29. package/dist/test/scripts/mouse-pointer.js +0 -125
@@ -1772,6 +1772,86 @@ export interface paths {
1772
1772
  patch: operations["updateChatSessionTrigger"];
1773
1773
  trace?: never;
1774
1774
  };
1775
+ "/api/failure-groups/{id}/matcher-overlap": {
1776
+ parameters: {
1777
+ query?: never;
1778
+ header?: never;
1779
+ path?: never;
1780
+ cookie?: never;
1781
+ };
1782
+ get?: never;
1783
+ put?: never;
1784
+ /**
1785
+ * 🤖 Check a matcher against other groups' members
1786
+ * @description Runs a candidate matcher source for this group against the 2 most recently seen active members of every other open group in the project (round-robin, at most 40 cases) and reports the ones it returns true for. A claim means the matcher overlaps that group. Nothing is persisted.
1787
+ */
1788
+ post: operations["checkFailureGroupMatcherOverlap"];
1789
+ delete?: never;
1790
+ options?: never;
1791
+ head?: never;
1792
+ patch?: never;
1793
+ trace?: never;
1794
+ };
1795
+ "/api/failure-groups/{id}/members/{test_case_id}": {
1796
+ parameters: {
1797
+ query?: never;
1798
+ header?: never;
1799
+ path?: never;
1800
+ cookie?: never;
1801
+ };
1802
+ get?: never;
1803
+ put?: never;
1804
+ post?: never;
1805
+ /**
1806
+ * 🤖 Detach a test from a failure group
1807
+ * @description Records that this test does not belong to the group. Detaching as an agent is a correction the agent may undo by attaching again. A human detach is sticky: agent attaches will not re-attach the test; only a later human attach supersedes it.
1808
+ */
1809
+ delete: operations["detachFailureGroupMember"];
1810
+ options?: never;
1811
+ head?: never;
1812
+ patch?: never;
1813
+ trace?: never;
1814
+ };
1815
+ "/api/failure-groups/{id}/share": {
1816
+ parameters: {
1817
+ query?: never;
1818
+ header?: never;
1819
+ path?: never;
1820
+ cookie?: never;
1821
+ };
1822
+ get?: never;
1823
+ put?: never;
1824
+ /**
1825
+ * 🤖 Share a failure group's diagnosis
1826
+ * @description Posts this group's diagnosis to a chosen Slack destination, with a link back to the failure group. The diagnosis and header are read from the stored group, never the client. A thread reply must belong to a run in this project; the channel must be accessible to the project's organization.
1827
+ */
1828
+ post: operations["shareFailureGroup"];
1829
+ delete?: never;
1830
+ options?: never;
1831
+ head?: never;
1832
+ patch?: never;
1833
+ trace?: never;
1834
+ };
1835
+ "/api/failure-groups/match": {
1836
+ parameters: {
1837
+ query?: never;
1838
+ header?: never;
1839
+ path?: never;
1840
+ cookie?: never;
1841
+ };
1842
+ get?: never;
1843
+ put?: never;
1844
+ /**
1845
+ * 🤖 Run failure-group matchers against a case
1846
+ * @description Runs every open group's matcher (or the given group_ids, or one dry-run source) against a failed or flaky case and reports which returned true. Nothing is persisted: attach the case with POST /{id}/members. Matchers run in an isolated Worker with network limited to report storage, under a per-matcher time limit and the isolate's memory and CPU limits.
1847
+ */
1848
+ post: operations["matchFailureGroups"];
1849
+ delete?: never;
1850
+ options?: never;
1851
+ head?: never;
1852
+ patch?: never;
1853
+ trace?: never;
1854
+ };
1775
1855
  "/api/github/proxy": {
1776
1856
  parameters: {
1777
1857
  query?: never;
@@ -1783,7 +1863,7 @@ export interface paths {
1783
1863
  put?: never;
1784
1864
  /**
1785
1865
  * 🤖 Proxy a GitHub API request
1786
- * @description Forwards an authenticated request to the GitHub API and returns the GitHub response verbatim. The request's project (bound token, or the `x-project-id`/`x-project-slug` header) picks the GitHub App: its own repo goes through the main App; another repo the project's org installed the reporter App on is read through the reporter App, and writes to it are rejected. Without a project, the main App is used. Merging a pull request with `merge_method` `squash` or `rebase` is rejected; only merge commits are allowed. Other writes to a project's default or protected branches are refused, as git-worker refuses the equivalent push. Project API keys are read-only. Sandbox-delegation principals are additionally constrained by per-session proxy rules.
1866
+ * @description Forwards an authenticated request to the GitHub API and returns the GitHub response verbatim. The request's project (bound token, or the `x-project-id`/`x-project-slug` header) picks the GitHub App: its own repo goes through the main App; another repo the project's org installed the reporter App on is read through the reporter App, and writes to it are rejected. Without a project, the main App is used. Merging a pull request with `merge_method` `squash` or `rebase` is rejected; only merge commits are allowed, and creating a draft pull request is rejected. Other writes to a project's default or protected branches are refused, as git-worker refuses the equivalent push. Project API keys are read-only. Sandbox-delegation principals are additionally constrained by per-session proxy rules.
1787
1867
  */
1788
1868
  post: operations["githubProxy"];
1789
1869
  delete?: never;
@@ -1852,6 +1932,26 @@ export interface paths {
1852
1932
  patch?: never;
1853
1933
  trace?: never;
1854
1934
  };
1935
+ "/api/traces/query": {
1936
+ parameters: {
1937
+ query?: never;
1938
+ header?: never;
1939
+ path?: never;
1940
+ cookie?: never;
1941
+ };
1942
+ get?: never;
1943
+ put?: never;
1944
+ /**
1945
+ * 🤖 Run a trace-utils function on a case's trace
1946
+ * @description Calls one trace-utils function on the trace of a run's case (by default its last attempt with a trace) and returns the result. The trace is read in an isolated Worker with ranged reads; nothing is downloaded or stored.
1947
+ */
1948
+ post: operations["queryTrace"];
1949
+ delete?: never;
1950
+ options?: never;
1951
+ head?: never;
1952
+ patch?: never;
1953
+ trace?: never;
1954
+ };
1855
1955
  "/api/triage-statuses": {
1856
1956
  parameters: {
1857
1957
  query?: never;
@@ -1985,6 +2085,26 @@ export interface paths {
1985
2085
  patch: operations["updateApiKey"];
1986
2086
  trace?: never;
1987
2087
  };
2088
+ "/api/banners": {
2089
+ parameters: {
2090
+ query?: never;
2091
+ header?: never;
2092
+ path?: never;
2093
+ cookie?: never;
2094
+ };
2095
+ /**
2096
+ * 🛡️ List the dashboard's warning banners
2097
+ * @description The warnings shown at the top of the dashboard for the scoped project's org (unpaid invoices, failed renewal, usage limit, no plan, Jira and Slack reconnects). Reads stored state only, so it is cheap enough to call while server-rendering a page.
2098
+ */
2099
+ get: operations["listDashboardBanners"];
2100
+ put?: never;
2101
+ post?: never;
2102
+ delete?: never;
2103
+ options?: never;
2104
+ head?: never;
2105
+ patch?: never;
2106
+ trace?: never;
2107
+ };
1988
2108
  "/api/billing/month-summary": {
1989
2109
  parameters: {
1990
2110
  query?: never;
@@ -2587,26 +2707,6 @@ export interface paths {
2587
2707
  patch?: never;
2588
2708
  trace?: never;
2589
2709
  };
2590
- "/api/chat-sessions/analytics/combined": {
2591
- parameters: {
2592
- query?: never;
2593
- header?: never;
2594
- path?: never;
2595
- cookie?: never;
2596
- };
2597
- /**
2598
- * ⚙️ Combined chat-session analytics
2599
- * @description Returns the caller's own and overall chat-session creation/merge charts. Super admins see global stats; other users are scoped to their orgs.
2600
- */
2601
- get: operations["getChatSessionCombinedAnalytics"];
2602
- put?: never;
2603
- post?: never;
2604
- delete?: never;
2605
- options?: never;
2606
- head?: never;
2607
- patch?: never;
2608
- trace?: never;
2609
- };
2610
2710
  "/api/chat-sessions/sandbox/branches": {
2611
2711
  parameters: {
2612
2712
  query?: never;
@@ -2779,46 +2879,6 @@ export interface paths {
2779
2879
  patch?: never;
2780
2880
  trace?: never;
2781
2881
  };
2782
- "/api/failure-groups/{id}/members/{test_case_id}": {
2783
- parameters: {
2784
- query?: never;
2785
- header?: never;
2786
- path?: never;
2787
- cookie?: never;
2788
- };
2789
- get?: never;
2790
- put?: never;
2791
- post?: never;
2792
- /**
2793
- * ⚙️ Detach a test from a failure group
2794
- * @description Records a human correction: this test does not belong to the group. Sticky — machine and agent attaches will not re-attach it; a later human attach supersedes the detach. Human-only.
2795
- */
2796
- delete: operations["detachFailureGroupMember"];
2797
- options?: never;
2798
- head?: never;
2799
- patch?: never;
2800
- trace?: never;
2801
- };
2802
- "/api/failure-groups/{id}/share": {
2803
- parameters: {
2804
- query?: never;
2805
- header?: never;
2806
- path?: never;
2807
- cookie?: never;
2808
- };
2809
- get?: never;
2810
- put?: never;
2811
- /**
2812
- * ⚙️ Share a failure group's diagnosis
2813
- * @description Posts this group's diagnosis to a chosen Slack destination, with a link back to the failure group. The diagnosis and header are read from the stored group, never the client. A thread reply must belong to a run in this project; the channel must be accessible to the project's organization.
2814
- */
2815
- post: operations["shareFailureGroup"];
2816
- delete?: never;
2817
- options?: never;
2818
- head?: never;
2819
- patch?: never;
2820
- trace?: never;
2821
- };
2822
2882
  "/api/flags": {
2823
2883
  parameters: {
2824
2884
  query?: never;
@@ -3071,6 +3131,26 @@ export interface paths {
3071
3131
  patch?: never;
3072
3132
  trace?: never;
3073
3133
  };
3134
+ "/api/github/pr/ready-for-review": {
3135
+ parameters: {
3136
+ query?: never;
3137
+ header?: never;
3138
+ path?: never;
3139
+ cookie?: never;
3140
+ };
3141
+ get?: never;
3142
+ put?: never;
3143
+ /**
3144
+ * ⚙️ Mark a pull request ready for review
3145
+ * @description Converts an open draft pull request to ready for review.
3146
+ */
3147
+ post: operations["markPullRequestReadyForReview"];
3148
+ delete?: never;
3149
+ options?: never;
3150
+ head?: never;
3151
+ patch?: never;
3152
+ trace?: never;
3153
+ };
3074
3154
  "/api/github/pr/review": {
3075
3155
  parameters: {
3076
3156
  query?: never;
@@ -4171,6 +4251,26 @@ export interface paths {
4171
4251
  patch?: never;
4172
4252
  trace?: never;
4173
4253
  };
4254
+ "/api/memories/classifications": {
4255
+ parameters: {
4256
+ query?: never;
4257
+ header?: never;
4258
+ path?: never;
4259
+ cookie?: never;
4260
+ };
4261
+ /**
4262
+ * 🛡️ 🧪 Memory classifications across projects
4263
+ * @description Returns every stored JEV classification under one vocabulary version, for all versions of all memories (soft-deleted included). A memory's current labels are the row for its latest version; rows for older versions mean it was edited since.
4264
+ */
4265
+ get: operations["listMemoryClassifications"];
4266
+ put?: never;
4267
+ post?: never;
4268
+ delete?: never;
4269
+ options?: never;
4270
+ head?: never;
4271
+ patch?: never;
4272
+ trace?: never;
4273
+ };
4174
4274
  "/api/metrics/project-last-7-days": {
4175
4275
  parameters: {
4176
4276
  query?: never;
@@ -5183,12 +5283,17 @@ export interface paths {
5183
5283
  cookie?: never;
5184
5284
  };
5185
5285
  /**
5186
- * ⚙️ Issue a realtime token
5187
- * @description Mints a short-lived token (1 hour TTL) the caller uses to open the realtime-worker WebSocket channel.
5286
+ * ⚙️ Issue an unscoped realtime token (deprecated)
5287
+ * @deprecated
5288
+ * @description Deprecated: use `POST /api/realtime/token`, which scopes the token to the channels the caller may read. Mints a short-lived token (1 hour TTL) the caller uses to open the realtime-worker WebSocket channel.
5188
5289
  */
5189
5290
  get: operations["getRealtimeToken"];
5190
5291
  put?: never;
5191
- post?: never;
5292
+ /**
5293
+ * ⚙️ Issue a channel-scoped realtime token
5294
+ * @description Mints a short-lived token (1 hour TTL) that opens only the requested realtime-worker WebSocket channels the caller may read: project channels for projects the caller can access, test-run channels for runs in those projects. Inaccessible or unknown channels are left out of the token; if none remain the request is refused.
5295
+ */
5296
+ post: operations["createRealtimeToken"];
5192
5297
  delete?: never;
5193
5298
  options?: never;
5194
5299
  head?: never;
@@ -6976,6 +7081,135 @@ export interface components {
6976
7081
  }[];
6977
7082
  };
6978
7083
  };
7084
+ DashboardBannersResponse: {
7085
+ /** @description Response payload. */
7086
+ data: {
7087
+ /** @description Active banners, highest priority first. */
7088
+ banners: components["schemas"]["DashboardBanner"][];
7089
+ };
7090
+ };
7091
+ DashboardBanner: {
7092
+ /** @enum {string} */
7093
+ kind: "unpaid_invoices";
7094
+ params: {
7095
+ /** @description Sent invoices still unpaid at least a day past their due date. */
7096
+ overdue_count: number;
7097
+ /** @description How many of those are past the billing gate's overdue threshold. */
7098
+ escalated_count: number;
7099
+ };
7100
+ /** @description Higher shows first; the dashboard shows one at a time. */
7101
+ priority: number;
7102
+ /** @description Null when the banner can't be dismissed. */
7103
+ dismissal: {
7104
+ /** @description Stable for the fact the banner is about; a new fact (period, limit, missing scopes) makes a new key. */
7105
+ key: string;
7106
+ /** @description How long a dismissal lasts; null means until the key changes. */
7107
+ ttl_seconds: number | null;
7108
+ } | null;
7109
+ desktop_only: boolean;
7110
+ } | {
7111
+ /** @enum {string} */
7112
+ kind: "renewal_failed";
7113
+ params: Record<string, never>;
7114
+ /** @description Higher shows first; the dashboard shows one at a time. */
7115
+ priority: number;
7116
+ /** @description Null when the banner can't be dismissed. */
7117
+ dismissal: {
7118
+ /** @description Stable for the fact the banner is about; a new fact (period, limit, missing scopes) makes a new key. */
7119
+ key: string;
7120
+ /** @description How long a dismissal lasts; null means until the key changes. */
7121
+ ttl_seconds: number | null;
7122
+ } | null;
7123
+ desktop_only: boolean;
7124
+ } | {
7125
+ /** @enum {string} */
7126
+ kind: "usage_limit_reached";
7127
+ params: {
7128
+ /** @description The limit as a bill: plan price + cap. */
7129
+ limit_bill_cents: number;
7130
+ };
7131
+ /** @description Higher shows first; the dashboard shows one at a time. */
7132
+ priority: number;
7133
+ /** @description Null when the banner can't be dismissed. */
7134
+ dismissal: {
7135
+ /** @description Stable for the fact the banner is about; a new fact (period, limit, missing scopes) makes a new key. */
7136
+ key: string;
7137
+ /** @description How long a dismissal lasts; null means until the key changes. */
7138
+ ttl_seconds: number | null;
7139
+ } | null;
7140
+ desktop_only: boolean;
7141
+ } | {
7142
+ /** @enum {string} */
7143
+ kind: "usage_limit_warning";
7144
+ params: {
7145
+ /** @description Plan price + overage so far, as last evaluated. */
7146
+ bill_cents: number;
7147
+ /** @description The limit as a bill: plan price + cap. */
7148
+ limit_bill_cents: number;
7149
+ /** @enum {string} */
7150
+ period_kind: "month" | "cycle";
7151
+ period_start: string;
7152
+ /** @description Exclusive (ISO 8601). */
7153
+ period_end: string;
7154
+ };
7155
+ /** @description Higher shows first; the dashboard shows one at a time. */
7156
+ priority: number;
7157
+ /** @description Null when the banner can't be dismissed. */
7158
+ dismissal: {
7159
+ /** @description Stable for the fact the banner is about; a new fact (period, limit, missing scopes) makes a new key. */
7160
+ key: string;
7161
+ /** @description How long a dismissal lasts; null means until the key changes. */
7162
+ ttl_seconds: number | null;
7163
+ } | null;
7164
+ desktop_only: boolean;
7165
+ } | {
7166
+ /** @enum {string} */
7167
+ kind: "jira_reauthorization";
7168
+ params: {
7169
+ installation_id: number;
7170
+ };
7171
+ /** @description Higher shows first; the dashboard shows one at a time. */
7172
+ priority: number;
7173
+ /** @description Null when the banner can't be dismissed. */
7174
+ dismissal: {
7175
+ /** @description Stable for the fact the banner is about; a new fact (period, limit, missing scopes) makes a new key. */
7176
+ key: string;
7177
+ /** @description How long a dismissal lasts; null means until the key changes. */
7178
+ ttl_seconds: number | null;
7179
+ } | null;
7180
+ desktop_only: boolean;
7181
+ } | {
7182
+ /** @enum {string} */
7183
+ kind: "slack_permissions";
7184
+ params: {
7185
+ team_id: string;
7186
+ missing_scopes: string[];
7187
+ };
7188
+ /** @description Higher shows first; the dashboard shows one at a time. */
7189
+ priority: number;
7190
+ /** @description Null when the banner can't be dismissed. */
7191
+ dismissal: {
7192
+ /** @description Stable for the fact the banner is about; a new fact (period, limit, missing scopes) makes a new key. */
7193
+ key: string;
7194
+ /** @description How long a dismissal lasts; null means until the key changes. */
7195
+ ttl_seconds: number | null;
7196
+ } | null;
7197
+ desktop_only: boolean;
7198
+ } | {
7199
+ /** @enum {string} */
7200
+ kind: "no_billing_plan";
7201
+ params: Record<string, never>;
7202
+ /** @description Higher shows first; the dashboard shows one at a time. */
7203
+ priority: number;
7204
+ /** @description Null when the banner can't be dismissed. */
7205
+ dismissal: {
7206
+ /** @description Stable for the fact the banner is about; a new fact (period, limit, missing scopes) makes a new key. */
7207
+ key: string;
7208
+ /** @description How long a dismissal lasts; null means until the key changes. */
7209
+ ttl_seconds: number | null;
7210
+ } | null;
7211
+ desktop_only: boolean;
7212
+ };
6979
7213
  ClaimRunnerBackendResponse: {
6980
7214
  /** @description Response payload. */
6981
7215
  data: {
@@ -8033,6 +8267,8 @@ export interface components {
8033
8267
  langfuse_trace_id: string | null;
8034
8268
  /** @description Whether the session is closed. */
8035
8269
  is_closed: boolean;
8270
+ /** @description For a manager closed by rollover, the manager session that took over. */
8271
+ superseded_by_session_id: number | null;
8036
8272
  /** @description Feature flags enabled for the session. */
8037
8273
  feature_flags: string[];
8038
8274
  /** @description Durable outbox row for the first message. */
@@ -9435,6 +9671,36 @@ export interface components {
9435
9671
  edited: number;
9436
9672
  deleted: number;
9437
9673
  };
9674
+ MemoryClassificationsResponse: {
9675
+ /** @description Response payload. */
9676
+ data: {
9677
+ vocabulary_version: number;
9678
+ classifications: components["schemas"]["MemoryClassification"][];
9679
+ };
9680
+ };
9681
+ MemoryClassification: {
9682
+ memory_id: number;
9683
+ /** @description Memory version number the labels apply to (v1 = create). */
9684
+ version: number;
9685
+ vocabulary_version: number;
9686
+ project_id: number;
9687
+ /** @description JEV model that answered, e.g. "jev-1.13.0". */
9688
+ model: string;
9689
+ retention: string;
9690
+ retention_confidence: number;
9691
+ subject: string;
9692
+ subject_confidence: number;
9693
+ role: string;
9694
+ role_confidence: number;
9695
+ /** @description Per-option probabilities for each axis. */
9696
+ probabilities: {
9697
+ [key: string]: {
9698
+ [key: string]: number;
9699
+ };
9700
+ };
9701
+ /** @description ISO 8601 timestamp. */
9702
+ classified_at: string;
9703
+ };
9438
9704
  MemoryWriteResponse: {
9439
9705
  /** @description Response payload. */
9440
9706
  data: {
@@ -10068,33 +10334,6 @@ export interface components {
10068
10334
  /** @description Avatar URL. */
10069
10335
  picture: string;
10070
10336
  };
10071
- ChatSessionCombinedAnalyticsResponse: {
10072
- /** @description Response payload. */
10073
- data: {
10074
- my: components["schemas"]["ChatSessionChartData"];
10075
- overall: components["schemas"]["ChatSessionChartData"];
10076
- /** @description Label for the `overall` chart. */
10077
- overallLabel: string;
10078
- };
10079
- };
10080
- ChatSessionChartData: {
10081
- /** @description Per-day session counts. */
10082
- daily: {
10083
- /** @description Day (ISO date). */
10084
- date: string;
10085
- /** @description Sessions created that day. */
10086
- created: number;
10087
- /** @description Sessions merged that day. */
10088
- merged: number;
10089
- }[];
10090
- /** @description Totals across the window. */
10091
- summary: {
10092
- total_created: number;
10093
- total_merged: number;
10094
- /** @description Merge rate as a percentage (0-100). */
10095
- merge_rate: number;
10096
- };
10097
- };
10098
10337
  ChatSessionListResponse: {
10099
10338
  /** @description The page of chat sessions. */
10100
10339
  data: components["schemas"]["ChatSessionListItem"][];
@@ -10151,6 +10390,8 @@ export interface components {
10151
10390
  langfuse_trace_id: string | null;
10152
10391
  /** @description Whether the session is closed. */
10153
10392
  is_closed: boolean;
10393
+ /** @description For a manager closed by rollover, the manager session that took over. */
10394
+ superseded_by_session_id: number | null;
10154
10395
  /** @description Feature flags enabled for the session. */
10155
10396
  feature_flags: string[];
10156
10397
  /** @description Resolved Supabase details for the creator. */
@@ -10250,6 +10491,8 @@ export interface components {
10250
10491
  langfuse_trace_id: string | null;
10251
10492
  /** @description Whether the session is closed. */
10252
10493
  is_closed: boolean;
10494
+ /** @description For a manager closed by rollover, the manager session that took over. */
10495
+ superseded_by_session_id: number | null;
10253
10496
  /** @description Feature flags enabled for the session. */
10254
10497
  feature_flags: string[];
10255
10498
  /** @description Durable outbox row for the first message. */
@@ -10576,6 +10819,15 @@ export interface components {
10576
10819
  };
10577
10820
  error: unknown;
10578
10821
  };
10822
+ GithubPrReadyForReviewResponse: {
10823
+ data: {
10824
+ /** @description Whether the PR is now ready for review. */
10825
+ ready: boolean;
10826
+ /** @description Human-readable status. */
10827
+ message: string;
10828
+ };
10829
+ error: unknown;
10830
+ };
10579
10831
  GithubPrReviewResponse: {
10580
10832
  /** @description Response payload. */
10581
10833
  data: {
@@ -10586,6 +10838,8 @@ export interface components {
10586
10838
  number: number;
10587
10839
  /** @enum {string} */
10588
10840
  status: "open" | "closed" | "merged";
10841
+ /** @description Whether the PR is a draft. */
10842
+ draft: boolean;
10589
10843
  url: string;
10590
10844
  title: string;
10591
10845
  description: string;
@@ -10621,6 +10875,8 @@ export interface components {
10621
10875
  status: "not_open" | "mergeable" | "not_mergeable" | "calculating";
10622
10876
  /** @description GitHub's mergeable_state value. */
10623
10877
  mergeable_state: string;
10878
+ /** @description Whether the PR is a draft. */
10879
+ draft: boolean;
10624
10880
  /** @description Base branch of the PR. */
10625
10881
  base: string;
10626
10882
  };
@@ -13973,9 +14229,21 @@ export interface components {
13973
14229
  /** @description Reason the realtime service is unavailable. */
13974
14230
  error: string;
13975
14231
  };
13976
- UsersListResponse: {
13977
- /** @description Response payload. */
13978
- data: components["schemas"]["UserWithConnectedAccounts"][];
14232
+ ScopedRealtimeTokenResponse: {
14233
+ /** @description Signed token to authenticate the WebSocket. Opens only the channels listed in `channels`. */
14234
+ token: string;
14235
+ /** @description Unix epoch (seconds) when the token expires. */
14236
+ expires_at: number;
14237
+ /** @description The requested channels the caller may subscribe to. Channels left out are unknown, for another environment, or not accessible. */
14238
+ channels: string[];
14239
+ };
14240
+ CreateRealtimeTokenBody: {
14241
+ /** @description Channel names to subscribe to, e.g. `chat-sessions-project-<id>-<env>` or `test-run-<id>-<env>`. */
14242
+ channels: string[];
14243
+ };
14244
+ UsersListResponse: {
14245
+ /** @description Response payload. */
14246
+ data: components["schemas"]["UserWithConnectedAccounts"][];
13979
14247
  };
13980
14248
  UserWithConnectedAccounts: {
13981
14249
  /** @description Supabase user ID. */
@@ -19414,6 +19682,247 @@ export interface operations {
19414
19682
  };
19415
19683
  };
19416
19684
  };
19685
+ checkFailureGroupMatcherOverlap: {
19686
+ parameters: {
19687
+ query?: never;
19688
+ header?: never;
19689
+ path: {
19690
+ /** @description Failure group ID. */
19691
+ id: string;
19692
+ };
19693
+ cookie?: never;
19694
+ };
19695
+ requestBody?: {
19696
+ content: {
19697
+ "application/json": {
19698
+ /** @description Candidate matcher source for this group: `async ({ testRun, testCase, traceUtils }) => boolean`. */
19699
+ source: string;
19700
+ };
19701
+ };
19702
+ };
19703
+ responses: {
19704
+ /** @description The other groups' cases the source claims. */
19705
+ 200: {
19706
+ headers: {
19707
+ [name: string]: unknown;
19708
+ };
19709
+ content: {
19710
+ "application/json": {
19711
+ /** @description Response payload. */
19712
+ data: {
19713
+ /** @description Cases the source was run against. */
19714
+ checked_cases: number;
19715
+ /** @description Candidate cases whose run or case could not be loaded. */
19716
+ skipped_cases: number;
19717
+ /** @description True when candidates were dropped: more than 40 cases, or more than 500 open groups. */
19718
+ truncated: boolean;
19719
+ /** @description Other groups' members the source returned true for. Empty means no overlap was found among the checked cases. */
19720
+ claims: {
19721
+ group_id: string;
19722
+ label: string | null;
19723
+ test_run_id: number;
19724
+ pw_test_id: string;
19725
+ }[];
19726
+ /** @description Cases where the source errored or was not run: no verdict, not a claim. */
19727
+ errors: {
19728
+ group_id: string;
19729
+ label: string | null;
19730
+ test_run_id: number;
19731
+ pw_test_id: string;
19732
+ /** @description The matcher's error kind (compile, runtime, not_boolean, timeout, out_of_memory, executor), or budget when the check ran out of time before reaching the case. */
19733
+ error_kind: string;
19734
+ error: string;
19735
+ }[];
19736
+ };
19737
+ };
19738
+ };
19739
+ };
19740
+ /** @description Group not found. */
19741
+ 404: {
19742
+ headers: {
19743
+ [name: string]: unknown;
19744
+ };
19745
+ content: {
19746
+ "application/json": components["schemas"]["ErrorResponse"];
19747
+ };
19748
+ };
19749
+ };
19750
+ };
19751
+ detachFailureGroupMember: {
19752
+ parameters: {
19753
+ query?: never;
19754
+ header?: never;
19755
+ path: {
19756
+ /** @description Failure group id. */
19757
+ id: string;
19758
+ /** @description Member test to detach. */
19759
+ test_case_id: string;
19760
+ };
19761
+ cookie?: never;
19762
+ };
19763
+ requestBody?: never;
19764
+ responses: {
19765
+ /** @description Membership detached. */
19766
+ 200: {
19767
+ headers: {
19768
+ [name: string]: unknown;
19769
+ };
19770
+ content: {
19771
+ "application/json": components["schemas"]["FailureGroupDetachMemberResponse"];
19772
+ };
19773
+ };
19774
+ /** @description Only humans and agents may detach a membership. */
19775
+ 403: {
19776
+ headers: {
19777
+ [name: string]: unknown;
19778
+ };
19779
+ content: {
19780
+ "application/json": components["schemas"]["ErrorResponse"];
19781
+ };
19782
+ };
19783
+ /** @description Group not found. */
19784
+ 404: {
19785
+ headers: {
19786
+ [name: string]: unknown;
19787
+ };
19788
+ content: {
19789
+ "application/json": components["schemas"]["ErrorResponse"];
19790
+ };
19791
+ };
19792
+ };
19793
+ };
19794
+ shareFailureGroup: {
19795
+ parameters: {
19796
+ query?: never;
19797
+ header?: never;
19798
+ path: {
19799
+ /** @description Failure group ID. */
19800
+ id: string;
19801
+ };
19802
+ cookie?: never;
19803
+ };
19804
+ requestBody?: {
19805
+ content: {
19806
+ "application/json": components["schemas"]["ShareFailureGroupRequest"];
19807
+ };
19808
+ };
19809
+ responses: {
19810
+ /** @description Diagnosis shared. */
19811
+ 200: {
19812
+ headers: {
19813
+ [name: string]: unknown;
19814
+ };
19815
+ content: {
19816
+ "application/json": components["schemas"]["FailureGroupShareResponse"];
19817
+ };
19818
+ };
19819
+ /** @description Invalid request or destination. */
19820
+ 400: {
19821
+ headers: {
19822
+ [name: string]: unknown;
19823
+ };
19824
+ content: {
19825
+ "application/json": components["schemas"]["ErrorResponse"];
19826
+ };
19827
+ };
19828
+ /** @description Group not found, or it has no diagnosis. */
19829
+ 404: {
19830
+ headers: {
19831
+ [name: string]: unknown;
19832
+ };
19833
+ content: {
19834
+ "application/json": components["schemas"]["ErrorResponse"];
19835
+ };
19836
+ };
19837
+ /** @description Failed to post message. */
19838
+ 500: {
19839
+ headers: {
19840
+ [name: string]: unknown;
19841
+ };
19842
+ content: {
19843
+ "application/json": components["schemas"]["ErrorResponse"];
19844
+ };
19845
+ };
19846
+ };
19847
+ };
19848
+ matchFailureGroups: {
19849
+ parameters: {
19850
+ query?: never;
19851
+ header?: never;
19852
+ path?: never;
19853
+ cookie?: never;
19854
+ };
19855
+ requestBody?: {
19856
+ content: {
19857
+ "application/json": {
19858
+ /** @description Run holding the case to match. */
19859
+ test_run_id: number;
19860
+ /** @description Case (Playwright test id) to match. Any status: failed or flaky. */
19861
+ pw_test_id: string;
19862
+ /** @description Dry-run this matcher source instead of the groups' matchers: `async ({ testRun, testCase, traceUtils }) => boolean`. */
19863
+ source?: string;
19864
+ /** @description Only run these groups' matchers. Default: every open group with a matcher. */
19865
+ group_ids?: string[];
19866
+ };
19867
+ };
19868
+ };
19869
+ responses: {
19870
+ /** @description Matcher results for the case. */
19871
+ 200: {
19872
+ headers: {
19873
+ [name: string]: unknown;
19874
+ };
19875
+ content: {
19876
+ "application/json": {
19877
+ /** @description Response payload. */
19878
+ data: {
19879
+ test_run_id: number;
19880
+ pw_test_id: string;
19881
+ /**
19882
+ * @description How many matchers returned true: one, several, or none.
19883
+ * @enum {string}
19884
+ */
19885
+ decision: "single" | "multiple" | "none";
19886
+ matched_group_ids: string[];
19887
+ candidate_count: number;
19888
+ /** @description True when the project has more than 500 open groups and only the most recently seen were run. */
19889
+ truncated: boolean;
19890
+ /** @description Matcher input contract the matchers ran under; store it with a matcher. */
19891
+ contract_version: number;
19892
+ results: {
19893
+ /** @description The group whose matcher ran; null for a dry-run source. */
19894
+ group_id: string | null;
19895
+ label: string | null;
19896
+ /** @description The matcher returned true. False on any error. */
19897
+ matched: boolean;
19898
+ error?: string;
19899
+ /** @description compile, runtime, not_a_function, not_boolean, timeout, out_of_memory, or executor. */
19900
+ error_kind?: string;
19901
+ duration_ms?: number;
19902
+ /** @description The matcher's console output. */
19903
+ logs: string[];
19904
+ /** @description Trace reads that threw, including ones the matcher caught: a false with trace errors means it could not tell, not that it did not match. */
19905
+ trace_errors: {
19906
+ fn: string;
19907
+ message: string;
19908
+ swallowed?: boolean;
19909
+ }[];
19910
+ }[];
19911
+ };
19912
+ };
19913
+ };
19914
+ };
19915
+ /** @description Test run or case not found. */
19916
+ 404: {
19917
+ headers: {
19918
+ [name: string]: unknown;
19919
+ };
19920
+ content: {
19921
+ "application/json": components["schemas"]["ErrorResponse"];
19922
+ };
19923
+ };
19924
+ };
19925
+ };
19417
19926
  githubProxy: {
19418
19927
  parameters: {
19419
19928
  query?: never;
@@ -19604,6 +20113,74 @@ export interface operations {
19604
20113
  };
19605
20114
  };
19606
20115
  };
20116
+ queryTrace: {
20117
+ parameters: {
20118
+ query?: never;
20119
+ header?: never;
20120
+ path?: never;
20121
+ cookie?: never;
20122
+ };
20123
+ requestBody?: {
20124
+ content: {
20125
+ "application/json": {
20126
+ /** @description Run holding the case. */
20127
+ test_run_id: number;
20128
+ /** @description Case (Playwright test id) whose trace to read. */
20129
+ pw_test_id: string;
20130
+ /** @description Attempt to read (retry_details.retries[].retryIndex). Default: the last attempt with a trace. */
20131
+ retry?: number;
20132
+ /**
20133
+ * @description trace-utils function to call: listSteps, getUniquePageIds, searchNetwork, getConsoleLogs, getWebSocketFrames, getDomSnapshot or extractScreenshots.
20134
+ * @enum {string}
20135
+ */
20136
+ fn: "listSteps" | "getUniquePageIds" | "searchNetwork" | "getConsoleLogs" | "getWebSocketFrames" | "getDomSnapshot" | "extractScreenshots";
20137
+ /** @description The function's arguments without `file` (e.g. { urlPattern, status, bodies } for searchNetwork). See the trace-utils skill. */
20138
+ args?: {
20139
+ [key: string]: unknown;
20140
+ };
20141
+ };
20142
+ };
20143
+ };
20144
+ responses: {
20145
+ /** @description The function's result. */
20146
+ 200: {
20147
+ headers: {
20148
+ [name: string]: unknown;
20149
+ };
20150
+ content: {
20151
+ "application/json": {
20152
+ /** @description Response payload. */
20153
+ data: {
20154
+ /** @description The trace.zip that was read. */
20155
+ file: string;
20156
+ retry: number;
20157
+ fn: string;
20158
+ /** @description What the trace-utils function returned (screenshots carry base64 image data). */
20159
+ result?: unknown;
20160
+ };
20161
+ };
20162
+ };
20163
+ };
20164
+ /** @description Test run, case, or trace not found. */
20165
+ 404: {
20166
+ headers: {
20167
+ [name: string]: unknown;
20168
+ };
20169
+ content: {
20170
+ "application/json": components["schemas"]["ErrorResponse"];
20171
+ };
20172
+ };
20173
+ /** @description The trace-utils call failed. */
20174
+ 422: {
20175
+ headers: {
20176
+ [name: string]: unknown;
20177
+ };
20178
+ content: {
20179
+ "application/json": components["schemas"]["ErrorResponse"];
20180
+ };
20181
+ };
20182
+ };
20183
+ };
19607
20184
  listTriageStatuses: {
19608
20185
  parameters: {
19609
20186
  query: {
@@ -20024,6 +20601,35 @@ export interface operations {
20024
20601
  };
20025
20602
  };
20026
20603
  };
20604
+ listDashboardBanners: {
20605
+ parameters: {
20606
+ query?: never;
20607
+ header?: never;
20608
+ path?: never;
20609
+ cookie?: never;
20610
+ };
20611
+ requestBody?: never;
20612
+ responses: {
20613
+ /** @description Active banners. */
20614
+ 200: {
20615
+ headers: {
20616
+ [name: string]: unknown;
20617
+ };
20618
+ content: {
20619
+ "application/json": components["schemas"]["DashboardBannersResponse"];
20620
+ };
20621
+ };
20622
+ /** @description Missing project scope. */
20623
+ 400: {
20624
+ headers: {
20625
+ [name: string]: unknown;
20626
+ };
20627
+ content: {
20628
+ "application/json": components["schemas"]["ErrorResponse"];
20629
+ };
20630
+ };
20631
+ };
20632
+ };
20027
20633
  getBillingMonthSummary: {
20028
20634
  parameters: {
20029
20635
  query?: {
@@ -21512,35 +22118,6 @@ export interface operations {
21512
22118
  };
21513
22119
  };
21514
22120
  };
21515
- getChatSessionCombinedAnalytics: {
21516
- parameters: {
21517
- query?: never;
21518
- header?: never;
21519
- path?: never;
21520
- cookie?: never;
21521
- };
21522
- requestBody?: never;
21523
- responses: {
21524
- /** @description Combined analytics charts. */
21525
- 200: {
21526
- headers: {
21527
- [name: string]: unknown;
21528
- };
21529
- content: {
21530
- "application/json": components["schemas"]["ChatSessionCombinedAnalyticsResponse"];
21531
- };
21532
- };
21533
- /** @description Unauthorized. */
21534
- 403: {
21535
- headers: {
21536
- [name: string]: unknown;
21537
- };
21538
- content: {
21539
- "application/json": components["schemas"]["ErrorResponse"];
21540
- };
21541
- };
21542
- };
21543
- };
21544
22121
  registerChatSessionSandboxBranches: {
21545
22122
  parameters: {
21546
22123
  query?: never;
@@ -22053,103 +22630,6 @@ export interface operations {
22053
22630
  };
22054
22631
  };
22055
22632
  };
22056
- detachFailureGroupMember: {
22057
- parameters: {
22058
- query?: never;
22059
- header?: never;
22060
- path: {
22061
- /** @description Failure group id. */
22062
- id: string;
22063
- /** @description Member test to detach. */
22064
- test_case_id: string;
22065
- };
22066
- cookie?: never;
22067
- };
22068
- requestBody?: never;
22069
- responses: {
22070
- /** @description Membership detached. */
22071
- 200: {
22072
- headers: {
22073
- [name: string]: unknown;
22074
- };
22075
- content: {
22076
- "application/json": components["schemas"]["FailureGroupDetachMemberResponse"];
22077
- };
22078
- };
22079
- /** @description Only humans may detach a membership. */
22080
- 403: {
22081
- headers: {
22082
- [name: string]: unknown;
22083
- };
22084
- content: {
22085
- "application/json": components["schemas"]["ErrorResponse"];
22086
- };
22087
- };
22088
- /** @description Group not found. */
22089
- 404: {
22090
- headers: {
22091
- [name: string]: unknown;
22092
- };
22093
- content: {
22094
- "application/json": components["schemas"]["ErrorResponse"];
22095
- };
22096
- };
22097
- };
22098
- };
22099
- shareFailureGroup: {
22100
- parameters: {
22101
- query?: never;
22102
- header?: never;
22103
- path: {
22104
- /** @description Failure group ID. */
22105
- id: string;
22106
- };
22107
- cookie?: never;
22108
- };
22109
- requestBody?: {
22110
- content: {
22111
- "application/json": components["schemas"]["ShareFailureGroupRequest"];
22112
- };
22113
- };
22114
- responses: {
22115
- /** @description Diagnosis shared. */
22116
- 200: {
22117
- headers: {
22118
- [name: string]: unknown;
22119
- };
22120
- content: {
22121
- "application/json": components["schemas"]["FailureGroupShareResponse"];
22122
- };
22123
- };
22124
- /** @description Invalid request or destination. */
22125
- 400: {
22126
- headers: {
22127
- [name: string]: unknown;
22128
- };
22129
- content: {
22130
- "application/json": components["schemas"]["ErrorResponse"];
22131
- };
22132
- };
22133
- /** @description Group not found, or it has no diagnosis. */
22134
- 404: {
22135
- headers: {
22136
- [name: string]: unknown;
22137
- };
22138
- content: {
22139
- "application/json": components["schemas"]["ErrorResponse"];
22140
- };
22141
- };
22142
- /** @description Failed to post message. */
22143
- 500: {
22144
- headers: {
22145
- [name: string]: unknown;
22146
- };
22147
- content: {
22148
- "application/json": components["schemas"]["ErrorResponse"];
22149
- };
22150
- };
22151
- };
22152
- };
22153
22633
  evaluateFlags: {
22154
22634
  parameters: {
22155
22635
  query: {
@@ -22722,7 +23202,7 @@ export interface operations {
22722
23202
  "application/json": components["schemas"]["GithubPrMergeResponse"];
22723
23203
  };
22724
23204
  };
22725
- /** @description The PR is not open, not mergeable, or GitHub refused the merge. */
23205
+ /** @description The PR is not open, is a draft, is not mergeable, or GitHub refused the merge. */
22726
23206
  400: {
22727
23207
  headers: {
22728
23208
  [name: string]: unknown;
@@ -22778,6 +23258,55 @@ export interface operations {
22778
23258
  };
22779
23259
  };
22780
23260
  };
23261
+ markPullRequestReadyForReview: {
23262
+ parameters: {
23263
+ query?: never;
23264
+ header?: never;
23265
+ path?: never;
23266
+ cookie?: never;
23267
+ };
23268
+ requestBody?: {
23269
+ content: {
23270
+ "application/json": {
23271
+ /** @description Repository owner. */
23272
+ owner: string;
23273
+ /** @description Repository name. */
23274
+ repo: string;
23275
+ /** @description Pull request number. */
23276
+ pull_number: number;
23277
+ };
23278
+ };
23279
+ };
23280
+ responses: {
23281
+ /** @description The PR is ready for review. */
23282
+ 200: {
23283
+ headers: {
23284
+ [name: string]: unknown;
23285
+ };
23286
+ content: {
23287
+ "application/json": components["schemas"]["GithubPrReadyForReviewResponse"];
23288
+ };
23289
+ };
23290
+ /** @description The PR is not open. */
23291
+ 400: {
23292
+ headers: {
23293
+ [name: string]: unknown;
23294
+ };
23295
+ content: {
23296
+ "application/json": components["schemas"]["GithubActionError"];
23297
+ };
23298
+ };
23299
+ /** @description Caller cannot access the project. */
23300
+ 403: {
23301
+ headers: {
23302
+ [name: string]: unknown;
23303
+ };
23304
+ content: {
23305
+ "application/json": components["schemas"]["ErrorResponse"];
23306
+ };
23307
+ };
23308
+ };
23309
+ };
22781
23310
  getPullRequestReview: {
22782
23311
  parameters: {
22783
23312
  query: {
@@ -25637,6 +26166,40 @@ export interface operations {
25637
26166
  };
25638
26167
  };
25639
26168
  };
26169
+ listMemoryClassifications: {
26170
+ parameters: {
26171
+ query?: {
26172
+ /** @description Limit to memories in this project. Defaults to all projects. */
26173
+ project_id?: number;
26174
+ /** @description Vocabulary version to read labels for. Defaults to the current vocabulary. */
26175
+ vocabulary_version?: number;
26176
+ };
26177
+ header?: never;
26178
+ path?: never;
26179
+ cookie?: never;
26180
+ };
26181
+ requestBody?: never;
26182
+ responses: {
26183
+ /** @description Memory classifications. */
26184
+ 200: {
26185
+ headers: {
26186
+ [name: string]: unknown;
26187
+ };
26188
+ content: {
26189
+ "application/json": components["schemas"]["MemoryClassificationsResponse"];
26190
+ };
26191
+ };
26192
+ /** @description Invalid request. */
26193
+ 400: {
26194
+ headers: {
26195
+ [name: string]: unknown;
26196
+ };
26197
+ content: {
26198
+ "application/json": components["schemas"]["ErrorResponse"];
26199
+ };
26200
+ };
26201
+ };
26202
+ };
25640
26203
  getProjectMetricsLast7Days: {
25641
26204
  parameters: {
25642
26205
  query?: never;
@@ -28186,6 +28749,57 @@ export interface operations {
28186
28749
  };
28187
28750
  };
28188
28751
  };
28752
+ createRealtimeToken: {
28753
+ parameters: {
28754
+ query?: never;
28755
+ header?: never;
28756
+ path?: never;
28757
+ cookie?: never;
28758
+ };
28759
+ requestBody?: {
28760
+ content: {
28761
+ "application/json": components["schemas"]["CreateRealtimeTokenBody"];
28762
+ };
28763
+ };
28764
+ responses: {
28765
+ /** @description The issued token and the channels it opens. */
28766
+ 200: {
28767
+ headers: {
28768
+ [name: string]: unknown;
28769
+ };
28770
+ content: {
28771
+ "application/json": components["schemas"]["ScopedRealtimeTokenResponse"];
28772
+ };
28773
+ };
28774
+ /** @description Invalid request. */
28775
+ 400: {
28776
+ headers: {
28777
+ [name: string]: unknown;
28778
+ };
28779
+ content: {
28780
+ "application/json": components["schemas"]["ErrorResponse"];
28781
+ };
28782
+ };
28783
+ /** @description None of the requested channels is accessible. */
28784
+ 403: {
28785
+ headers: {
28786
+ [name: string]: unknown;
28787
+ };
28788
+ content: {
28789
+ "application/json": components["schemas"]["ErrorResponse"];
28790
+ };
28791
+ };
28792
+ /** @description Realtime service is not configured. */
28793
+ 503: {
28794
+ headers: {
28795
+ [name: string]: unknown;
28796
+ };
28797
+ content: {
28798
+ "application/json": components["schemas"]["RealtimeUnavailableResponse"];
28799
+ };
28800
+ };
28801
+ };
28802
+ };
28189
28803
  listRecentPages: {
28190
28804
  parameters: {
28191
28805
  query?: never;