@empiricalrun/playwright-utils 0.65.0 → 0.65.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 (37) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/generated/api-worker-openapi.d.ts +1979 -1272
  3. package/dist/generated/api-worker-openapi.d.ts.map +1 -1
  4. package/dist/overlay-tests/typesafe.spec.js +5 -3
  5. package/dist/overlay-tests/visual.spec.js +1 -1
  6. package/dist/reporter/attachment-cleanup-test-reporter.d.ts +3 -1
  7. package/dist/reporter/attachment-cleanup-test-reporter.d.ts.map +1 -1
  8. package/dist/reporter/attachment-cleanup-test-reporter.js +5 -1
  9. package/dist/reporter/attachment-cleanup.d.ts +1 -1
  10. package/dist/reporter/attachment-cleanup.d.ts.map +1 -1
  11. package/dist/reporter/attachment-cleanup.js +14 -7
  12. package/dist/reporter/attachment-key.d.ts +3 -0
  13. package/dist/reporter/attachment-key.d.ts.map +1 -0
  14. package/dist/reporter/attachment-key.js +31 -0
  15. package/dist/reporter/empirical-reporter.d.ts +1 -1
  16. package/dist/reporter/empirical-reporter.d.ts.map +1 -1
  17. package/dist/reporter/empirical-reporter.js +7 -6
  18. package/dist/reporter/harness.d.ts +6 -1
  19. package/dist/reporter/harness.d.ts.map +1 -1
  20. package/dist/reporter/harness.js +22 -13
  21. package/dist/reporter/incremental-blob-reporter.d.ts +1 -0
  22. package/dist/reporter/incremental-blob-reporter.d.ts.map +1 -1
  23. package/dist/reporter/incremental-blob-reporter.js +8 -4
  24. package/dist/reporter/util.d.ts +3 -3
  25. package/dist/reporter/util.d.ts.map +1 -1
  26. package/dist/reporter/util.js +10 -8
  27. package/dist/test/expect/visual.d.ts.map +1 -1
  28. package/dist/test/expect/visual.js +6 -2
  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 +0 -2
  31. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/utils.d.ts +0 -1
  32. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/utils.d.ts.map +1 -1
  33. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/utils.js +0 -20
  34. package/dist/test/scripts/pw-locator-patch/vision/query.d.ts.map +1 -1
  35. package/dist/test/scripts/pw-locator-patch/vision/query.js +57 -5
  36. package/package.json +3 -4
  37. package/tsconfig.tsbuildinfo +1 -1
@@ -219,7 +219,7 @@ export interface paths {
219
219
  cookie?: never;
220
220
  };
221
221
  /**
222
- * ⚙️ 🧪 Get linked test changes for a run
222
+ * ⚙️ Get linked test changes for a run
223
223
  * @description For a run triggered by an app pull request, evaluates the same-name test branch live on GitHub (the state behind the "Empirical linked test changes" check) and returns the latest check written for the PR. Addressed by the database id. Serves the dashboard UI.
224
224
  */
225
225
  get: operations["getTestRunLinkedChanges"];
@@ -305,7 +305,7 @@ export interface paths {
305
305
  get?: never;
306
306
  put?: never;
307
307
  /**
308
- * ⚙️ 🧪 Store a test run's shard plan
308
+ * ⚙️ Store a test run's shard plan
309
309
  * @description Stores the partition of a run's test selection across its run_test shards, keyed by the external run_id. Each shard reads its own slice back from `/{id}/shards/{shard_index}/assigned-tests` to build a `--test-list`. Idempotent: the first plan for a run wins.
310
310
  */
311
311
  post: operations["createTestRunShardPlan"];
@@ -343,7 +343,7 @@ export interface paths {
343
343
  cookie?: never;
344
344
  };
345
345
  /**
346
- * ⚙️ 🧪 Get test run shard assigned tests
346
+ * ⚙️ Get test run shard assigned tests
347
347
  * @description Returns the duration-based shard plan's test-case ids for one shard, addressed by the run's external run_id. Used by the test-run-worker to build its `--test-list`. Returns 417 when the run has no plan, so the worker falls back to Playwright's `--shard=i/N` split.
348
348
  */
349
349
  get: operations["getTestRunShardAssignedTests"];
@@ -443,7 +443,7 @@ export interface paths {
443
443
  cookie?: never;
444
444
  };
445
445
  /**
446
- * ⚙️ 🧪 Get test case durations for shard planning
446
+ * ⚙️ Get test case durations for shard planning
447
447
  * @description Returns the run's project's 7-day and last-day average duration per test case (skipped results excluded), keyed by the normalized 41-char Playwright test id, addressed by the run's external run_id. Used by the `run_setup` container to pack a shard plan: the analytics token is account-scoped and cannot be handed to a sandbox running customer test code, so the api-worker holds it and serves the numbers. Project-wide rather than per-run — the container filters to the tests it listed. A project with no history returns an empty object; a broken analytics query returns 503, so the container can tell the two apart and fall back rather than plan off nothing.
448
448
  */
449
449
  get: operations["getTestRunTestCaseDurations"];
@@ -1310,7 +1310,7 @@ export interface paths {
1310
1310
  cookie?: never;
1311
1311
  };
1312
1312
  /**
1313
- * 🤖 🧪 List canonical Slack channels
1313
+ * 🤖 List canonical Slack channels
1314
1314
  * @description Lists active Slack channels registered for the scoped project's organization. Reporter configuration is intentionally not part of this resource.
1315
1315
  */
1316
1316
  get: operations["listSlackChannelsV2"];
@@ -1332,7 +1332,7 @@ export interface paths {
1332
1332
  get?: never;
1333
1333
  put?: never;
1334
1334
  /**
1335
- * 🤖 🧪 Refresh a canonical Slack channel's name
1335
+ * 🤖 Refresh a canonical Slack channel's name
1336
1336
  * @description Re-reads the channel from Slack and stores its current name when it changed. The canonical channel ID is stable, so environment reporter configs are unaffected. Access problems are reported in the validation result rather than as an error.
1337
1337
  */
1338
1338
  post: operations["refreshSlackChannelV2"];
@@ -1350,7 +1350,7 @@ export interface paths {
1350
1350
  cookie?: never;
1351
1351
  };
1352
1352
  /**
1353
- * 🤖 🧪 Validate canonical Slack channels
1353
+ * 🤖 Validate canonical Slack channels
1354
1354
  * @description Checks every active channel registered for the scoped project's organization against Slack. Validation is read-only and verifies bot access and the stored channel name.
1355
1355
  */
1356
1356
  get: operations["validateSlackChannelsV2"];
@@ -1709,158 +1709,6 @@ export interface paths {
1709
1709
  patch?: never;
1710
1710
  trace?: never;
1711
1711
  };
1712
- "/api/infra/static-ips": {
1713
- parameters: {
1714
- query?: never;
1715
- header?: never;
1716
- path?: never;
1717
- cookie?: never;
1718
- };
1719
- /**
1720
- * 🧪 Get static egress IPs for a region
1721
- * @description Returns the proxy endpoint and the egress IPs to allowlist for the given region.
1722
- */
1723
- get: operations["getStaticIps"];
1724
- put?: never;
1725
- post?: never;
1726
- delete?: never;
1727
- options?: never;
1728
- head?: never;
1729
- patch?: never;
1730
- trace?: never;
1731
- };
1732
- "/api/tasks": {
1733
- parameters: {
1734
- query?: never;
1735
- header?: never;
1736
- path?: never;
1737
- cookie?: never;
1738
- };
1739
- /**
1740
- * 🧪 List tasks
1741
- * @description Returns a paginated list of tasks for the scoped project.
1742
- */
1743
- get: operations["listTasks"];
1744
- put?: never;
1745
- /**
1746
- * 🧪 Create a task
1747
- * @description Creates a task for the scoped project. Every task is owed to a person: `created_by` defaults to the signed-in user or, for an agent, the person who started its session. An agent acting for someone else, such as the person who asked in Slack, passes their user ID as `created_by`. Track your own follow-ups elsewhere; a task with no person behind it is rejected. It does not start a chat session; use `POST /api/tasks/{id}/chat-sessions` for that.
1748
- */
1749
- post: operations["createTask"];
1750
- delete?: never;
1751
- options?: never;
1752
- head?: never;
1753
- patch?: never;
1754
- trace?: never;
1755
- };
1756
- "/api/tasks/{id}": {
1757
- parameters: {
1758
- query?: never;
1759
- header?: never;
1760
- path?: never;
1761
- cookie?: never;
1762
- };
1763
- /**
1764
- * 🧪 Get a task
1765
- * @description Retrieves a single task by ID.
1766
- */
1767
- get: operations["getTask"];
1768
- put?: never;
1769
- post?: never;
1770
- /**
1771
- * 🧪 Delete a task
1772
- * @description Permanently deletes a task.
1773
- */
1774
- delete: operations["deleteTask"];
1775
- options?: never;
1776
- head?: never;
1777
- /**
1778
- * 🧪 Update a task
1779
- * @description Updates a task's title, description, or status. A draft → open transition spawns a chat session.
1780
- */
1781
- patch: operations["updateTask"];
1782
- trace?: never;
1783
- };
1784
- "/api/v1/telemetry/overlay-dismissals": {
1785
- parameters: {
1786
- query?: never;
1787
- header?: never;
1788
- path?: never;
1789
- cookie?: never;
1790
- };
1791
- /**
1792
- * 🧪 Overlay-dismissal summary
1793
- * @description Returns aggregated overlay-dismissal metrics for the scoped project.
1794
- */
1795
- get: operations["getOverlayDismissalSummary"];
1796
- put?: never;
1797
- post?: never;
1798
- delete?: never;
1799
- options?: never;
1800
- head?: never;
1801
- patch?: never;
1802
- trace?: never;
1803
- };
1804
- "/api/v1/telemetry/overlay-dismissals/events": {
1805
- parameters: {
1806
- query?: never;
1807
- header?: never;
1808
- path?: never;
1809
- cookie?: never;
1810
- };
1811
- /**
1812
- * 🧪 Overlay-dismissal events
1813
- * @description Returns a paginated, filterable list of overlay-dismissal events for the scoped project.
1814
- */
1815
- get: operations["getOverlayDismissalEvents"];
1816
- put?: never;
1817
- post?: never;
1818
- delete?: never;
1819
- options?: never;
1820
- head?: never;
1821
- patch?: never;
1822
- trace?: never;
1823
- };
1824
- "/api/v2/test-runs/{id}/cases": {
1825
- parameters: {
1826
- query?: never;
1827
- header?: never;
1828
- path?: never;
1829
- cookie?: never;
1830
- };
1831
- /**
1832
- * 🧪 List test run cases
1833
- * @description Returns a paginated list of every case in a test run — passed, failed, flaky, and skipped — sourced from the run ledger. The project is derived from the run.
1834
- */
1835
- get: operations["listTestRunCases"];
1836
- put?: never;
1837
- post?: never;
1838
- delete?: never;
1839
- options?: never;
1840
- head?: never;
1841
- patch?: never;
1842
- trace?: never;
1843
- };
1844
- "/api/v2/test-runs/{id}/cases/{case_id}": {
1845
- parameters: {
1846
- query?: never;
1847
- header?: never;
1848
- path?: never;
1849
- cookie?: never;
1850
- };
1851
- /**
1852
- * 🧪 Get a test run case
1853
- * @description Retrieves a single case in a test run by its Playwright test ID. The project is derived from the run.
1854
- */
1855
- get: operations["getTestRunCase"];
1856
- put?: never;
1857
- post?: never;
1858
- delete?: never;
1859
- options?: never;
1860
- head?: never;
1861
- patch?: never;
1862
- trace?: never;
1863
- };
1864
1712
  "/api/chat-sessions/{id}/alarms": {
1865
1713
  parameters: {
1866
1714
  query?: never;
@@ -1928,13 +1776,13 @@ export interface paths {
1928
1776
  cookie?: never;
1929
1777
  };
1930
1778
  /**
1931
- * 🤖 🧪 List a session's event triggers
1779
+ * 🤖 List a session's event triggers
1932
1780
  * @description Lists active event triggers owned by this chat session. One-shot triggers are consumed after they fire; recurring wildcard triggers remain active.
1933
1781
  */
1934
1782
  get: operations["listChatSessionTriggers"];
1935
1783
  put?: never;
1936
1784
  /**
1937
- * 🤖 🧪 Create an event trigger
1785
+ * 🤖 Create an event trigger
1938
1786
  * @description Creates a trigger that resumes this session after the selected event occurs. Supply entity_id for an exact one-shot trigger, or omit it to match every entity; wildcard triggers may use recurring cardinality. Optional payload_filter fields must be allowed by the event catalog. Registration is edge-only and does not match historical events, so an exact trigger on a test run that already finished is rejected with 409.
1939
1787
  */
1940
1788
  post: operations["createChatSessionTrigger"];
@@ -1951,15 +1799,15 @@ export interface paths {
1951
1799
  path?: never;
1952
1800
  cookie?: never;
1953
1801
  };
1954
- /** 🤖 🧪 Get an event trigger */
1802
+ /** 🤖 Get an event trigger */
1955
1803
  get: operations["getChatSessionTrigger"];
1956
1804
  put?: never;
1957
1805
  post?: never;
1958
- /** 🤖 🧪 Delete an event trigger */
1806
+ /** 🤖 Delete an event trigger */
1959
1807
  delete: operations["deleteChatSessionTrigger"];
1960
1808
  options?: never;
1961
1809
  head?: never;
1962
- /** 🤖 🧪 Update an event trigger */
1810
+ /** 🤖 Update an event trigger */
1963
1811
  patch: operations["updateChatSessionTrigger"];
1964
1812
  trace?: never;
1965
1813
  };
@@ -2123,7 +1971,7 @@ export interface paths {
2123
1971
  patch?: never;
2124
1972
  trace?: never;
2125
1973
  };
2126
- "/api/playwright-versions": {
1974
+ "/api/infra/static-ips": {
2127
1975
  parameters: {
2128
1976
  query?: never;
2129
1977
  header?: never;
@@ -2131,10 +1979,10 @@ export interface paths {
2131
1979
  cookie?: never;
2132
1980
  };
2133
1981
  /**
2134
- * 🤖 List supported Playwright versions
2135
- * @description Returns the static list of supported Playwright versions and the default version. Public read — no authentication required.
1982
+ * 🤖 Get static egress IPs for a region
1983
+ * @description Returns the proxy endpoint and the egress IPs to allowlist for the given region.
2136
1984
  */
2137
- get: operations["listPlaywrightVersions"];
1985
+ get: operations["getStaticIps"];
2138
1986
  put?: never;
2139
1987
  post?: never;
2140
1988
  delete?: never;
@@ -2143,47 +1991,51 @@ export interface paths {
2143
1991
  patch?: never;
2144
1992
  trace?: never;
2145
1993
  };
2146
- "/api/traces/compare": {
1994
+ "/api/playwright-versions": {
2147
1995
  parameters: {
2148
1996
  query?: never;
2149
1997
  header?: never;
2150
1998
  path?: never;
2151
1999
  cookie?: never;
2152
2000
  };
2153
- get?: never;
2154
- put?: never;
2155
2001
  /**
2156
- * 🤖 🧪 Compare a failed attempt with a passing one, step by step
2157
- * @description Aligns the steps of a case's failed attempt with a passing attempt of the same test (the dashboard's Compare tab) and returns where they diverge: the step it failed on, steps that ran only on one side, steps that got much slower, and optionally the page as each side left that step.
2002
+ * 🤖 List supported Playwright versions
2003
+ * @description Returns the static list of supported Playwright versions and the default version. Public read — no authentication required.
2158
2004
  */
2159
- post: operations["compareTraceAgainstPass"];
2005
+ get: operations["listPlaywrightVersions"];
2006
+ put?: never;
2007
+ post?: never;
2160
2008
  delete?: never;
2161
2009
  options?: never;
2162
2010
  head?: never;
2163
2011
  patch?: never;
2164
2012
  trace?: never;
2165
2013
  };
2166
- "/api/traces/query": {
2014
+ "/api/rules": {
2167
2015
  parameters: {
2168
2016
  query?: never;
2169
2017
  header?: never;
2170
2018
  path?: never;
2171
2019
  cookie?: never;
2172
2020
  };
2173
- get?: never;
2021
+ /**
2022
+ * 🤖 List rules
2023
+ * @description Lists the scoped project's rules of every effect, newest first.
2024
+ */
2025
+ get: operations["listRules"];
2174
2026
  put?: never;
2175
2027
  /**
2176
- * 🤖 Run a trace-utils function on a case's trace
2177
- * @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.
2028
+ * 🤖 Create a rule
2029
+ * @description Creates a rule. It needs `test_ids` or a `matcher` (a matcher with no test_ids covers every test), and an `until`. Matcher rules must use effect `annotate`.
2178
2030
  */
2179
- post: operations["queryTrace"];
2031
+ post: operations["createRule"];
2180
2032
  delete?: never;
2181
2033
  options?: never;
2182
2034
  head?: never;
2183
2035
  patch?: never;
2184
2036
  trace?: never;
2185
2037
  };
2186
- "/api/triage-statuses": {
2038
+ "/api/rules/{id}": {
2187
2039
  parameters: {
2188
2040
  query?: never;
2189
2041
  header?: never;
@@ -2191,23 +2043,27 @@ export interface paths {
2191
2043
  cookie?: never;
2192
2044
  };
2193
2045
  /**
2194
- * 🤖 List a run's triage statuses
2195
- * @description Returns one entry per failing test the agent has triaged (or is triaging) in the run, most recently updated first.
2046
+ * 🤖 Get a rule
2047
+ * @description Retrieves a single rule by ID.
2196
2048
  */
2197
- get: operations["listTriageStatuses"];
2049
+ get: operations["getRule"];
2198
2050
  put?: never;
2051
+ post?: never;
2199
2052
  /**
2200
- * 🤖 Upsert a triage status
2201
- * @description Creates or updates the triage status for one failing test in a run, keyed by (test_run_id, pw_test_id) — latest write wins. Requires sandbox authentication; the owning chat session comes from the access token. An omitted `group_id` keeps the stored value.
2053
+ * 🤖 Delete a rule
2054
+ * @description Permanently deletes a rule. Its revisions are kept.
2202
2055
  */
2203
- post: operations["upsertTriageStatus"];
2204
- delete?: never;
2056
+ delete: operations["deleteRule"];
2205
2057
  options?: never;
2206
2058
  head?: never;
2207
- patch?: never;
2059
+ /**
2060
+ * 🤖 Update a rule
2061
+ * @description Updates a rule's fields, or ends it now with `expire_now`. `test_ids` and `matcher` replace the stored values; `matcher: null` removes the matcher.
2062
+ */
2063
+ patch: operations["updateRule"];
2208
2064
  trace?: never;
2209
2065
  };
2210
- "/api/users": {
2066
+ "/api/rules/{id}/revisions": {
2211
2067
  parameters: {
2212
2068
  query?: never;
2213
2069
  header?: never;
@@ -2215,10 +2071,10 @@ export interface paths {
2215
2071
  cookie?: never;
2216
2072
  };
2217
2073
  /**
2218
- * 🤖 Search users
2219
- * @description Searches users in the resolved project's organization, plus super admins, by name or email. The project is resolved from sandbox/project-api-key auth, x-project-id/x-project-slug, or single-project inference.
2074
+ * 🤖 List a rule's revisions
2075
+ * @description Every create, update and delete of the rule, oldest first, with who made it.
2220
2076
  */
2221
- get: operations["listUsers"];
2077
+ get: operations["listRuleRevisions"];
2222
2078
  put?: never;
2223
2079
  post?: never;
2224
2080
  delete?: never;
@@ -2227,27 +2083,27 @@ export interface paths {
2227
2083
  patch?: never;
2228
2084
  trace?: never;
2229
2085
  };
2230
- "/api/users/{id}": {
2086
+ "/api/rules/match": {
2231
2087
  parameters: {
2232
2088
  query?: never;
2233
2089
  header?: never;
2234
2090
  path?: never;
2235
2091
  cookie?: never;
2236
2092
  };
2093
+ get?: never;
2094
+ put?: never;
2237
2095
  /**
2238
- * 🤖 Get a user
2239
- * @description Returns a user's details along with their valid linked Slack and GitHub accounts.
2096
+ * 🤖 Match rules against a test case
2097
+ * @description Finds the rules active for the run (project, environment, run window) that cover the case: rules listing the test apply directly, and rules with a matcher apply when it returns true. Matcher results are cached per case and matcher version. Nothing else is stored.
2240
2098
  */
2241
- get: operations["getUser"];
2242
- put?: never;
2243
- post?: never;
2099
+ post: operations["matchRules"];
2244
2100
  delete?: never;
2245
2101
  options?: never;
2246
2102
  head?: never;
2247
2103
  patch?: never;
2248
2104
  trace?: never;
2249
2105
  };
2250
- "/api/activity": {
2106
+ "/api/tasks": {
2251
2107
  parameters: {
2252
2108
  query?: never;
2253
2109
  header?: never;
@@ -2255,64 +2111,71 @@ export interface paths {
2255
2111
  cookie?: never;
2256
2112
  };
2257
2113
  /**
2258
- * ⚙️ 🧪 List project activity
2259
- * @description The scoped project's activity grouped by local day, newest first. Each day has a summary of its test runs and a list of sessions, pull requests, tasks and failure groups. A session appears once, at its latest state, with its pull request folded in.
2114
+ * 🤖 List tasks
2115
+ * @description Returns a paginated list of tasks for the scoped project.
2260
2116
  */
2261
- get: operations["listActivity"];
2117
+ get: operations["listTasks"];
2262
2118
  put?: never;
2263
- post?: never;
2119
+ /**
2120
+ * 🤖 Create a task
2121
+ * @description Creates a task for the scoped project. Every task is owed to a person: `created_by` defaults to the signed-in user or, for an agent, the person who started its session. An agent acting for someone else, such as the person who asked in Slack, passes their user ID as `created_by`. Track your own follow-ups elsewhere; a task with no person behind it is rejected. It does not start a chat session; use `POST /api/tasks/{id}/chat-sessions` for that.
2122
+ */
2123
+ post: operations["createTask"];
2264
2124
  delete?: never;
2265
2125
  options?: never;
2266
2126
  head?: never;
2267
2127
  patch?: never;
2268
2128
  trace?: never;
2269
2129
  };
2270
- "/api/alarms": {
2130
+ "/api/tasks/{id}": {
2271
2131
  parameters: {
2272
2132
  query?: never;
2273
2133
  header?: never;
2274
2134
  path?: never;
2275
2135
  cookie?: never;
2276
2136
  };
2277
- get?: never;
2137
+ /**
2138
+ * 🤖 Get a task
2139
+ * @description Retrieves a single task by ID.
2140
+ */
2141
+ get: operations["getTask"];
2278
2142
  put?: never;
2143
+ post?: never;
2279
2144
  /**
2280
- * ⚙️ Schedule a wake-up for the calling session (deprecated)
2281
- * @deprecated
2282
- * @description Deprecated compatibility endpoint for already-running agents. Use `POST /api/chat-sessions/{id}/alarms`. Schedules a one-time wake-up for the caller's own chat session, `delay` from now.
2145
+ * 🤖 Delete a task
2146
+ * @description Permanently deletes a task.
2283
2147
  */
2284
- post: operations["createAlarm"];
2285
- delete?: never;
2148
+ delete: operations["deleteTask"];
2286
2149
  options?: never;
2287
2150
  head?: never;
2288
- patch?: never;
2151
+ /**
2152
+ * 🤖 Update a task
2153
+ * @description Updates a task's title, description, or status. A draft → open transition spawns a chat session.
2154
+ */
2155
+ patch: operations["updateTask"];
2289
2156
  trace?: never;
2290
2157
  };
2291
- "/api/api-keys": {
2158
+ "/api/traces/compare": {
2292
2159
  parameters: {
2293
2160
  query?: never;
2294
2161
  header?: never;
2295
2162
  path?: never;
2296
2163
  cookie?: never;
2297
2164
  };
2165
+ get?: never;
2166
+ put?: never;
2298
2167
  /**
2299
- * List API keys
2300
- * @description Returns the scoped project's API keys, with secrets truncated to a preview.
2301
- */
2302
- get: operations["listApiKeys"];
2303
- /**
2304
- * Create an API key
2305
- * @description Creates a new API key for the scoped project. The full secret is returned once in the response and cannot be retrieved again.
2168
+ * 🤖 Compare a failed attempt with a passing one, step by step
2169
+ * @description Aligns the steps of a case's failed attempt with a passing attempt of the same test (the dashboard's Compare tab) and returns where they diverge: the step it failed on, steps that ran only on one side, steps that got much slower, and optionally the page as each side left that step.
2306
2170
  */
2307
- put: operations["createApiKey"];
2308
- post?: never;
2171
+ post: operations["compareTraceAgainstPass"];
2309
2172
  delete?: never;
2310
2173
  options?: never;
2311
2174
  head?: never;
2312
2175
  patch?: never;
2313
2176
  trace?: never;
2314
2177
  };
2315
- "/api/api-keys/{id}": {
2178
+ "/api/traces/query": {
2316
2179
  parameters: {
2317
2180
  query?: never;
2318
2181
  header?: never;
@@ -2321,22 +2184,18 @@ export interface paths {
2321
2184
  };
2322
2185
  get?: never;
2323
2186
  put?: never;
2324
- post?: never;
2325
2187
  /**
2326
- * Delete an API key
2327
- * @description Permanently deletes an API key. The project is derived from the key itself.
2188
+ * 🤖 Run a trace-utils function on a case's trace
2189
+ * @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.
2328
2190
  */
2329
- delete: operations["deleteApiKey"];
2191
+ post: operations["queryTrace"];
2192
+ delete?: never;
2330
2193
  options?: never;
2331
2194
  head?: never;
2332
- /**
2333
- * Enable or disable an API key
2334
- * @description Enables or disables an API key. The project is derived from the key itself.
2335
- */
2336
- patch: operations["updateApiKey"];
2195
+ patch?: never;
2337
2196
  trace?: never;
2338
2197
  };
2339
- "/api/banners": {
2198
+ "/api/triage-statuses": {
2340
2199
  parameters: {
2341
2200
  query?: never;
2342
2201
  header?: never;
@@ -2344,7 +2203,240 @@ export interface paths {
2344
2203
  cookie?: never;
2345
2204
  };
2346
2205
  /**
2347
- * 🛡️ List the dashboard's warning banners
2206
+ * 🤖 List a run's triage statuses
2207
+ * @description Returns one entry per failing test the agent has triaged (or is triaging) in the run, most recently updated first.
2208
+ */
2209
+ get: operations["listTriageStatuses"];
2210
+ put?: never;
2211
+ /**
2212
+ * 🤖 Upsert a triage status
2213
+ * @description Creates or updates the triage status for one failing test in a run, keyed by (test_run_id, pw_test_id) — latest write wins. Requires sandbox authentication; the owning chat session comes from the access token. An omitted `group_id` keeps the stored value.
2214
+ */
2215
+ post: operations["upsertTriageStatus"];
2216
+ delete?: never;
2217
+ options?: never;
2218
+ head?: never;
2219
+ patch?: never;
2220
+ trace?: never;
2221
+ };
2222
+ "/api/users": {
2223
+ parameters: {
2224
+ query?: never;
2225
+ header?: never;
2226
+ path?: never;
2227
+ cookie?: never;
2228
+ };
2229
+ /**
2230
+ * 🤖 Search users
2231
+ * @description Searches users in the resolved project's organization, plus super admins, by name or email. The project is resolved from sandbox/project-api-key auth, x-project-id/x-project-slug, or single-project inference.
2232
+ */
2233
+ get: operations["listUsers"];
2234
+ put?: never;
2235
+ post?: never;
2236
+ delete?: never;
2237
+ options?: never;
2238
+ head?: never;
2239
+ patch?: never;
2240
+ trace?: never;
2241
+ };
2242
+ "/api/users/{id}": {
2243
+ parameters: {
2244
+ query?: never;
2245
+ header?: never;
2246
+ path?: never;
2247
+ cookie?: never;
2248
+ };
2249
+ /**
2250
+ * 🤖 Get a user
2251
+ * @description Returns a user's details along with their valid linked Slack and GitHub accounts.
2252
+ */
2253
+ get: operations["getUser"];
2254
+ put?: never;
2255
+ post?: never;
2256
+ delete?: never;
2257
+ options?: never;
2258
+ head?: never;
2259
+ patch?: never;
2260
+ trace?: never;
2261
+ };
2262
+ "/api/v1/telemetry/overlay-dismissals": {
2263
+ parameters: {
2264
+ query?: never;
2265
+ header?: never;
2266
+ path?: never;
2267
+ cookie?: never;
2268
+ };
2269
+ /**
2270
+ * 🤖 Overlay-dismissal summary
2271
+ * @description Returns aggregated overlay-dismissal metrics for the scoped project.
2272
+ */
2273
+ get: operations["getOverlayDismissalSummary"];
2274
+ put?: never;
2275
+ post?: never;
2276
+ delete?: never;
2277
+ options?: never;
2278
+ head?: never;
2279
+ patch?: never;
2280
+ trace?: never;
2281
+ };
2282
+ "/api/v1/telemetry/overlay-dismissals/events": {
2283
+ parameters: {
2284
+ query?: never;
2285
+ header?: never;
2286
+ path?: never;
2287
+ cookie?: never;
2288
+ };
2289
+ /**
2290
+ * 🤖 Overlay-dismissal events
2291
+ * @description Returns a paginated, filterable list of overlay-dismissal events for the scoped project.
2292
+ */
2293
+ get: operations["getOverlayDismissalEvents"];
2294
+ put?: never;
2295
+ post?: never;
2296
+ delete?: never;
2297
+ options?: never;
2298
+ head?: never;
2299
+ patch?: never;
2300
+ trace?: never;
2301
+ };
2302
+ "/api/v2/test-runs/{id}/cases": {
2303
+ parameters: {
2304
+ query?: never;
2305
+ header?: never;
2306
+ path?: never;
2307
+ cookie?: never;
2308
+ };
2309
+ /**
2310
+ * 🤖 List test run cases
2311
+ * @description Returns a paginated list of every case in a test run — passed, failed, flaky, and skipped — sourced from the run ledger. The project is derived from the run.
2312
+ */
2313
+ get: operations["listTestRunCases"];
2314
+ put?: never;
2315
+ post?: never;
2316
+ delete?: never;
2317
+ options?: never;
2318
+ head?: never;
2319
+ patch?: never;
2320
+ trace?: never;
2321
+ };
2322
+ "/api/v2/test-runs/{id}/cases/{case_id}": {
2323
+ parameters: {
2324
+ query?: never;
2325
+ header?: never;
2326
+ path?: never;
2327
+ cookie?: never;
2328
+ };
2329
+ /**
2330
+ * 🤖 Get a test run case
2331
+ * @description Retrieves a single case in a test run by its Playwright test ID. The project is derived from the run.
2332
+ */
2333
+ get: operations["getTestRunCase"];
2334
+ put?: never;
2335
+ post?: never;
2336
+ delete?: never;
2337
+ options?: never;
2338
+ head?: never;
2339
+ patch?: never;
2340
+ trace?: never;
2341
+ };
2342
+ "/api/activity": {
2343
+ parameters: {
2344
+ query?: never;
2345
+ header?: never;
2346
+ path?: never;
2347
+ cookie?: never;
2348
+ };
2349
+ /**
2350
+ * ⚙️ List project activity
2351
+ * @description The scoped project's activity grouped by local day, newest first. Each day has a summary of its test runs and a list of sessions, pull requests, tasks and failure groups. A session appears once, at its latest state, with its pull request folded in.
2352
+ */
2353
+ get: operations["listActivity"];
2354
+ put?: never;
2355
+ post?: never;
2356
+ delete?: never;
2357
+ options?: never;
2358
+ head?: never;
2359
+ patch?: never;
2360
+ trace?: never;
2361
+ };
2362
+ "/api/alarms": {
2363
+ parameters: {
2364
+ query?: never;
2365
+ header?: never;
2366
+ path?: never;
2367
+ cookie?: never;
2368
+ };
2369
+ get?: never;
2370
+ put?: never;
2371
+ /**
2372
+ * ⚙️ Schedule a wake-up for the calling session (deprecated)
2373
+ * @deprecated
2374
+ * @description Deprecated compatibility endpoint for already-running agents. Use `POST /api/chat-sessions/{id}/alarms`. Schedules a one-time wake-up for the caller's own chat session, `delay` from now.
2375
+ */
2376
+ post: operations["createAlarm"];
2377
+ delete?: never;
2378
+ options?: never;
2379
+ head?: never;
2380
+ patch?: never;
2381
+ trace?: never;
2382
+ };
2383
+ "/api/api-keys": {
2384
+ parameters: {
2385
+ query?: never;
2386
+ header?: never;
2387
+ path?: never;
2388
+ cookie?: never;
2389
+ };
2390
+ /**
2391
+ * List API keys
2392
+ * @description Returns the scoped project's API keys, with secrets truncated to a preview.
2393
+ */
2394
+ get: operations["listApiKeys"];
2395
+ /**
2396
+ * Create an API key
2397
+ * @description Creates a new API key for the scoped project. The full secret is returned once in the response and cannot be retrieved again.
2398
+ */
2399
+ put: operations["createApiKey"];
2400
+ post?: never;
2401
+ delete?: never;
2402
+ options?: never;
2403
+ head?: never;
2404
+ patch?: never;
2405
+ trace?: never;
2406
+ };
2407
+ "/api/api-keys/{id}": {
2408
+ parameters: {
2409
+ query?: never;
2410
+ header?: never;
2411
+ path?: never;
2412
+ cookie?: never;
2413
+ };
2414
+ get?: never;
2415
+ put?: never;
2416
+ post?: never;
2417
+ /**
2418
+ * Delete an API key
2419
+ * @description Permanently deletes an API key. The project is derived from the key itself.
2420
+ */
2421
+ delete: operations["deleteApiKey"];
2422
+ options?: never;
2423
+ head?: never;
2424
+ /**
2425
+ * Enable or disable an API key
2426
+ * @description Enables or disables an API key. The project is derived from the key itself.
2427
+ */
2428
+ patch: operations["updateApiKey"];
2429
+ trace?: never;
2430
+ };
2431
+ "/api/banners": {
2432
+ parameters: {
2433
+ query?: never;
2434
+ header?: never;
2435
+ path?: never;
2436
+ cookie?: never;
2437
+ };
2438
+ /**
2439
+ * 🛡️ List the dashboard's warning banners
2348
2440
  * @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.
2349
2441
  */
2350
2442
  get: operations["listDashboardBanners"];
@@ -2404,7 +2496,7 @@ export interface paths {
2404
2496
  cookie?: never;
2405
2497
  };
2406
2498
  /**
2407
- * 🛡️ 🧪 Compare a subscription's usage with Dodo's events
2499
+ * 🛡️ Compare a subscription's usage with Dodo's events
2408
2500
  * @description Compares our usage rows with the usage events Dodo has for the subscription's customer in one billing cycle, matched by event id: per-meter totals, plus events missing from Dodo, Dodo events with no usage row, and events whose quantity changed. Read-only; sends nothing. Defaults to the current cycle; a past cycle is named by its end (its renewal date) and starts a month earlier unless cycle_start is given.
2409
2501
  */
2410
2502
  get: operations["reconcileSubscriptionUsage"];
@@ -2426,7 +2518,7 @@ export interface paths {
2426
2518
  get?: never;
2427
2519
  put?: never;
2428
2520
  /**
2429
- * 🛡️ 🧪 Start a Dodo checkout for the org's plan
2521
+ * 🛡️ Start a Dodo checkout for the org's plan
2430
2522
  * @description Creates a Dodo hosted checkout that subscribes the scoped project's org to the current Dodo plan (the newest active shared plan with a Dodo product). For orgs without a plan that are not billed in INR. The plan takes effect when Dodo confirms the subscription by webhook.
2431
2523
  */
2432
2524
  post: operations["createSubscriptionCheckout"];
@@ -2446,7 +2538,7 @@ export interface paths {
2446
2538
  get?: never;
2447
2539
  put?: never;
2448
2540
  /**
2449
- * 🛡️ 🧪 End the org's plan now
2541
+ * 🛡️ End the org's plan now
2450
2542
  * @description Ends the scoped project's org's Dodo subscription now, with no undo: sends Dodo the usage it is missing, then cancels the subscription, or pauses it when the cycle has usage beyond the plan's allowance (Dodo charges it on pausing; a cron cancels the subscription once that charge succeeds). The plan ends at once, and the org can subscribe again. Emails the org's members and billing contacts. For an active or past-due subscription; an on-hold one must pay first.
2451
2543
  */
2452
2544
  post: operations["endSubscription"];
@@ -2464,7 +2556,7 @@ export interface paths {
2464
2556
  cookie?: never;
2465
2557
  };
2466
2558
  /**
2467
- * 🛡️ 🧪 Get the plan the org can subscribe to
2559
+ * 🛡️ Get the plan the org can subscribe to
2468
2560
  * @description Whether the scoped project's org can start a Dodo checkout now (same rules as the checkout endpoint), and the plan's terms if so. The billing page uses it to show its Continue to payment button.
2469
2561
  */
2470
2562
  get: operations["getSubscriptionOffer"];
@@ -2486,7 +2578,7 @@ export interface paths {
2486
2578
  get?: never;
2487
2579
  put?: never;
2488
2580
  /**
2489
- * 🛡️ 🧪 Open the org's Dodo billing portal
2581
+ * 🛡️ Open the org's Dodo billing portal
2490
2582
  * @description Creates a Dodo customer portal session for the scoped project's org, where the customer updates their card and downloads Dodo's invoices. A new session per call; nothing is stored. For orgs that have subscribed through Dodo.
2491
2583
  */
2492
2584
  post: operations["createSubscriptionPortalSession"];
@@ -2732,7 +2824,7 @@ export interface paths {
2732
2824
  cookie?: never;
2733
2825
  };
2734
2826
  /**
2735
- * ⚙️ 🧪 Get session log entries by log_seq range
2827
+ * ⚙️ Get session log entries by log_seq range
2736
2828
  * @description Returns the full log entries (tool arguments, results and media refs) between two log_seq values, for expanding a transcript row.
2737
2829
  */
2738
2830
  get: operations["getChatSessionEntryRange"];
@@ -2772,7 +2864,7 @@ export interface paths {
2772
2864
  cookie?: never;
2773
2865
  };
2774
2866
  /**
2775
- * ⚙️ 🧪 Get a chat session lineage
2867
+ * ⚙️ Get a chat session lineage
2776
2868
  * @description Returns a bounded graph of manager handoffs and agent delegations around the selected session.
2777
2869
  */
2778
2870
  get: operations["getChatSessionLineage"];
@@ -2793,7 +2885,7 @@ export interface paths {
2793
2885
  };
2794
2886
  get?: never;
2795
2887
  put?: never;
2796
- /** 🛡️ 🧪 Close a manager session and start its successor */
2888
+ /** 🛡️ Close a manager session and start its successor */
2797
2889
  post: operations["confirmManagerHandoff"];
2798
2890
  delete?: never;
2799
2891
  options?: never;
@@ -2810,7 +2902,7 @@ export interface paths {
2810
2902
  };
2811
2903
  get?: never;
2812
2904
  put?: never;
2813
- /** 🛡️ 🧪 Generate an ephemeral manager handoff note */
2905
+ /** 🛡️ Generate an ephemeral manager handoff note */
2814
2906
  post: operations["previewManagerHandoff"];
2815
2907
  delete?: never;
2816
2908
  options?: never;
@@ -2829,7 +2921,7 @@ export interface paths {
2829
2921
  put?: never;
2830
2922
  /**
2831
2923
  * ⚙️ Send a message to a chat session
2832
- * @description Forwards a user message to the session's running pi-worker agent.
2924
+ * @description Forwards a user message to the session's running pi-worker agent. A session cannot message itself; to send itself a future message it sets an alarm.
2833
2925
  */
2834
2926
  post: operations["forwardChatSessionMessage"];
2835
2927
  delete?: never;
@@ -2866,7 +2958,7 @@ export interface paths {
2866
2958
  cookie?: never;
2867
2959
  };
2868
2960
  /**
2869
- * ⚙️ 🧪 Get a commit from the sandbox
2961
+ * ⚙️ Get a commit from the sandbox
2870
2962
  * @description Reads a commit's message, line stats and (optionally) diff from the attached sandbox's repository. Works for commits that have not been pushed; requires a running sandbox.
2871
2963
  */
2872
2964
  get: operations["getChatSessionSandboxCommit"];
@@ -2966,7 +3058,7 @@ export interface paths {
2966
3058
  cookie?: never;
2967
3059
  };
2968
3060
  /**
2969
- * ⚙️ 🧪 Get a session's subagents
3061
+ * ⚙️ Get a session's subagents
2970
3062
  * @description Returns each subagent's own log entries: the call that started it, its result, start, end and async-end entries, and only its latest message.
2971
3063
  */
2972
3064
  get: operations["getChatSessionSubagents"];
@@ -2986,7 +3078,7 @@ export interface paths {
2986
3078
  cookie?: never;
2987
3079
  };
2988
3080
  /**
2989
- * ⚙️ 🧪 Get one subagent's log entries
3081
+ * ⚙️ Get one subagent's log entries
2990
3082
  * @description Returns every log entry of one subagent, including all of its messages.
2991
3083
  */
2992
3084
  get: operations["getChatSessionSubagentEntries"];
@@ -3026,7 +3118,7 @@ export interface paths {
3026
3118
  cookie?: never;
3027
3119
  };
3028
3120
  /**
3029
- * ⚙️ 🧪 Get a session's transcript rows
3121
+ * ⚙️ Get a session's transcript rows
3030
3122
  * @description Returns the whole session as display rows (messages, condensed tool runs, cards), each with the log_seq range it covers. Tool arguments and results are not included; read them from the entries in a row's seq range.
3031
3123
  */
3032
3124
  get: operations["getChatSessionTranscript"];
@@ -3078,26 +3170,6 @@ export interface paths {
3078
3170
  patch?: never;
3079
3171
  trace?: never;
3080
3172
  };
3081
- "/api/chat-sessions/users": {
3082
- parameters: {
3083
- query?: never;
3084
- header?: never;
3085
- path?: never;
3086
- cookie?: never;
3087
- };
3088
- /**
3089
- * ⚙️ List chat-session creators
3090
- * @description Returns the distinct users who created chat sessions in scope that were updated in the last 30 days, enriched with Supabase user details.
3091
- */
3092
- get: operations["listChatSessionUsers"];
3093
- put?: never;
3094
- post?: never;
3095
- delete?: never;
3096
- options?: never;
3097
- head?: never;
3098
- patch?: never;
3099
- trace?: never;
3100
- };
3101
3173
  "/api/credit-grants": {
3102
3174
  parameters: {
3103
3175
  query?: never;
@@ -3288,7 +3360,7 @@ export interface paths {
3288
3360
  get?: never;
3289
3361
  put?: never;
3290
3362
  /**
3291
- * ⚙️ 🧪 Import a Loom video
3363
+ * ⚙️ Import a Loom video
3292
3364
  * @description Downloads a Loom share video and stores it as a file.
3293
3365
  */
3294
3366
  post: operations["importLoomFile"];
@@ -3518,7 +3590,7 @@ export interface paths {
3518
3590
  cookie?: never;
3519
3591
  };
3520
3592
  /**
3521
- * ⚙️ 🧪 Get impacted tests for a pull request
3593
+ * ⚙️ Get impacted tests for a pull request
3522
3594
  * @description Returns the tests impacted by the pull request's diff against its merge base. Computed on every head push; the first read of an unseen pull request queues the computation and returns status `pending`.
3523
3595
  */
3524
3596
  get: operations["getPullRequestImpactedTests"];
@@ -3944,7 +4016,7 @@ export interface paths {
3944
4016
  get?: never;
3945
4017
  put?: never;
3946
4018
  /**
3947
- * ⚙️ 🧪 Seed a chat session with messages (preview only)
4019
+ * ⚙️ Seed a chat session with messages (preview only)
3948
4020
  * @description Creates a chat session in the scoped project whose history is the given messages, without starting an agent turn or checking billing. For e2e tests that need an ongoing session, such as the in-session billing block. Returns 404 outside preview and local.
3949
4021
  */
3950
4022
  post: operations["seedChatSession"];
@@ -4698,7 +4770,7 @@ export interface paths {
4698
4770
  cookie?: never;
4699
4771
  };
4700
4772
  /**
4701
- * 🛡️ 🧪 Memory activity across projects
4773
+ * 🛡️ Memory activity across projects
4702
4774
  * @description Returns every memory across all projects (soft-deleted included, content omitted) with edit statistics from its version history, plus daily create/edit/delete counts per project.
4703
4775
  */
4704
4776
  get: operations["listMemoryActivity"];
@@ -4718,7 +4790,7 @@ export interface paths {
4718
4790
  cookie?: never;
4719
4791
  };
4720
4792
  /**
4721
- * ⚙️ 🧪 Memory changes made by a chat session
4793
+ * ⚙️ Memory changes made by a chat session
4722
4794
  * @description Returns every create, update and delete one chat session made to the scoped project's memories, oldest first, with the reason given for each, the previous version for updates, and live memory counts before and after.
4723
4795
  */
4724
4796
  get: operations["listMemoryChanges"];
@@ -4738,7 +4810,7 @@ export interface paths {
4738
4810
  cookie?: never;
4739
4811
  };
4740
4812
  /**
4741
- * 🛡️ 🧪 Memory classifications across projects
4813
+ * 🛡️ Memory classifications across projects
4742
4814
  * @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.
4743
4815
  */
4744
4816
  get: operations["listMemoryClassifications"];
@@ -4758,7 +4830,7 @@ export interface paths {
4758
4830
  cookie?: never;
4759
4831
  };
4760
4832
  /**
4761
- * ⚙️ 🧪 Most read and most edited memories
4833
+ * ⚙️ Most read and most edited memories
4762
4834
  * @description Returns the scoped project's most read memories (read_memory calls, counted by Hive from agent sessions) and most edited memories over a recent window.
4763
4835
  */
4764
4836
  get: operations["getMemoryUsage"];
@@ -4820,7 +4892,7 @@ export interface paths {
4820
4892
  get?: never;
4821
4893
  put?: never;
4822
4894
  /**
4823
- * 🧪 Create a dummy notification (non-production only)
4895
+ * Create a dummy notification (non-production only)
4824
4896
  * @description Creates an unread notification for the signed-in user about the project's latest chat session or test run, and pushes it on the user's realtime channel. Not available in production.
4825
4897
  */
4826
4898
  post: operations["createDummyNotification"];
@@ -5262,7 +5334,7 @@ export interface paths {
5262
5334
  patch: operations["updatePlan"];
5263
5335
  trace?: never;
5264
5336
  };
5265
- "/api/project-addons": {
5337
+ "/api/platform-issues": {
5266
5338
  parameters: {
5267
5339
  query?: never;
5268
5340
  header?: never;
@@ -5270,19 +5342,23 @@ export interface paths {
5270
5342
  cookie?: never;
5271
5343
  };
5272
5344
  /**
5273
- * ⚙️ 🧪 List add-ons for the scoped project
5274
- * @description Returns every known add-on with its current state, plus the full period history for this project.
5345
+ * ⚙️ List platform issues
5346
+ * @description Returns platform issues newest first: the scoped project's, or every project's when no project is given (super admins and internal services only).
5275
5347
  */
5276
- get: operations["listProjectAddons"];
5348
+ get: operations["listPlatformIssues"];
5277
5349
  put?: never;
5278
- post?: never;
5350
+ /**
5351
+ * ⚙️ Report a platform issue
5352
+ * @description Records a platform bug or skill gap for the scoped project, with a snapshot of the memory that holds it. Reporting the same kind for a memory that already has an open issue returns that issue.
5353
+ */
5354
+ post: operations["reportPlatformIssue"];
5279
5355
  delete?: never;
5280
5356
  options?: never;
5281
5357
  head?: never;
5282
5358
  patch?: never;
5283
5359
  trace?: never;
5284
5360
  };
5285
- "/api/project-addons/{addon}/disable": {
5361
+ "/api/platform-issues/{id}/resolve": {
5286
5362
  parameters: {
5287
5363
  query?: never;
5288
5364
  header?: never;
@@ -5292,17 +5368,57 @@ export interface paths {
5292
5368
  get?: never;
5293
5369
  put?: never;
5294
5370
  /**
5295
- * 🧪 Disable an add-on
5296
- * @description Closes the open period, preserving it as history. Returns 409 when the add-on was not enabled, or when the add-on is still in use — repo ownership cannot be turned off while the repository lives outside Empirical's GitHub org.
5371
+ * 🛡️ Resolve a platform issue
5372
+ * @description Marks an issue fixed. Whoever fixes it also fixes what agents see: the skill, and any memory that is now wrong.
5297
5373
  */
5298
- post: operations["disableProjectAddon"];
5374
+ post: operations["resolvePlatformIssue"];
5299
5375
  delete?: never;
5300
5376
  options?: never;
5301
5377
  head?: never;
5302
5378
  patch?: never;
5303
5379
  trace?: never;
5304
5380
  };
5305
- "/api/project-addons/{addon}/enable": {
5381
+ "/api/project-addons": {
5382
+ parameters: {
5383
+ query?: never;
5384
+ header?: never;
5385
+ path?: never;
5386
+ cookie?: never;
5387
+ };
5388
+ /**
5389
+ * ⚙️ List add-ons for the scoped project
5390
+ * @description Returns every known add-on with its current state, plus the full period history for this project.
5391
+ */
5392
+ get: operations["listProjectAddons"];
5393
+ put?: never;
5394
+ post?: never;
5395
+ delete?: never;
5396
+ options?: never;
5397
+ head?: never;
5398
+ patch?: never;
5399
+ trace?: never;
5400
+ };
5401
+ "/api/project-addons/{addon}/disable": {
5402
+ parameters: {
5403
+ query?: never;
5404
+ header?: never;
5405
+ path?: never;
5406
+ cookie?: never;
5407
+ };
5408
+ get?: never;
5409
+ put?: never;
5410
+ /**
5411
+ * Disable an add-on
5412
+ * @description Closes the open period, preserving it as history. Returns 409 when the add-on was not enabled, or when the add-on is still in use — repo ownership cannot be turned off while the repository lives outside Empirical's GitHub org.
5413
+ */
5414
+ post: operations["disableProjectAddon"];
5415
+ delete?: never;
5416
+ options?: never;
5417
+ head?: never;
5418
+ patch?: never;
5419
+ trace?: never;
5420
+ };
5421
+ "/api/project-addons/{addon}/enable": {
5306
5422
  parameters: {
5307
5423
  query?: never;
5308
5424
  header?: never;
@@ -5312,7 +5428,7 @@ export interface paths {
5312
5428
  get?: never;
5313
5429
  put?: never;
5314
5430
  /**
5315
- * 🧪 Enable an add-on
5431
+ * Enable an add-on
5316
5432
  * @description Opens a new period effective now. Returns 409 when the add-on is already enabled, so a double submit cannot create overlapping periods.
5317
5433
  */
5318
5434
  post: operations["enableProjectAddon"];
@@ -5768,7 +5884,7 @@ export interface paths {
5768
5884
  get?: never;
5769
5885
  put?: never;
5770
5886
  /**
5771
- * 🧪 Presign node_modules snapshot URLs
5887
+ * Presign node_modules snapshot URLs
5772
5888
  * @description Returns presigned S3 URLs for the scoped project's node_modules tarball for a lockfile hash. Sandboxes restore from them at boot and upload after an npm ci on a miss.
5773
5889
  */
5774
5890
  post: operations["getProjectNpmSnapshotUrls"];
@@ -5872,7 +5988,7 @@ export interface paths {
5872
5988
  get?: never;
5873
5989
  put?: never;
5874
5990
  /**
5875
- * 🧪 Call home from an installation's stack
5991
+ * Call home from an installation's stack
5876
5992
  * @description Called by the registration Lambda in a Private Runner stack. On Create and Update it records the stack's resources and versions and verifies them; a pending backend that passes becomes active. Delete always succeeds: it releases an unverified claim so the link can be reused, or disables an active backend and moves its projects back to Empirical-hosted runs.
5877
5993
  */
5878
5994
  post: operations["claimRunnerBackend"];
@@ -5890,7 +6006,7 @@ export interface paths {
5890
6006
  cookie?: never;
5891
6007
  };
5892
6008
  /**
5893
- * 🧪 Get the scoped project's runner backend
6009
+ * Get the scoped project's runner backend
5894
6010
  * @description Returns the runner backend the scoped project is linked to, including its verification status, or null when the project runs on Empirical-hosted infrastructure.
5895
6011
  */
5896
6012
  get: operations["getProjectRunnerBackend"];
@@ -5913,14 +6029,14 @@ export interface paths {
5913
6029
  put?: never;
5914
6030
  post?: never;
5915
6031
  /**
5916
- * 🧪 Remove a private runner
6032
+ * Remove a private runner
5917
6033
  * @description Deletes an unfinished setup or a disconnected runner of the scoped project's organisation that no project uses. Its CloudFormation stack, if one exists, stays in the AWS account until deleted there.
5918
6034
  */
5919
6035
  delete: operations["removeProjectRunnerBackend"];
5920
6036
  options?: never;
5921
6037
  head?: never;
5922
6038
  /**
5923
- * 🧪 Rename a private runner
6039
+ * Rename a private runner
5924
6040
  * @description Renames a runner backend of the scoped project's organisation.
5925
6041
  */
5926
6042
  patch: operations["renameProjectRunnerBackend"];
@@ -5936,7 +6052,7 @@ export interface paths {
5936
6052
  get?: never;
5937
6053
  put?: never;
5938
6054
  /**
5939
- * 🧪 Disconnect a private runner
6055
+ * Disconnect a private runner
5940
6056
  * @description Stops sending runs to a runner backend of the scoped project's organisation and moves every project on it back to Empirical-hosted runs. The stack stays in the AWS account; delete it there to remove it. Re-enable restores the runner, but not the projects' links.
5941
6057
  */
5942
6058
  post: operations["disconnectProjectRunnerBackend"];
@@ -5956,7 +6072,7 @@ export interface paths {
5956
6072
  get?: never;
5957
6073
  put?: never;
5958
6074
  /**
5959
- * 🧪 Re-enable a disconnected private runner
6075
+ * Re-enable a disconnected private runner
5960
6076
  * @description Verifies a disabled runner backend of the scoped project's organisation and makes it active again if every check passes. Projects are not re-linked.
5961
6077
  */
5962
6078
  post: operations["enableProjectRunnerBackend"];
@@ -5976,7 +6092,7 @@ export interface paths {
5976
6092
  get?: never;
5977
6093
  put?: never;
5978
6094
  /**
5979
- * 🧪 Create a new setup link
6095
+ * Create a new setup link
5980
6096
  * @description Mints a new quick-create link for a pending runner backend of the scoped project's organisation, replacing any earlier unused link.
5981
6097
  */
5982
6098
  post: operations["createProjectRunnerBackendRegistration"];
@@ -5994,7 +6110,7 @@ export interface paths {
5994
6110
  cookie?: never;
5995
6111
  };
5996
6112
  /**
5997
- * 🧪 List the organisation's runner backends
6113
+ * List the organisation's runner backends
5998
6114
  * @description Every runner backend of the scoped project's organisation, in any status, so a project can use one another project set up or resume a setup in progress.
5999
6115
  */
6000
6116
  get: operations["listProjectOrgRunnerBackends"];
@@ -6015,7 +6131,7 @@ export interface paths {
6015
6131
  };
6016
6132
  get?: never;
6017
6133
  /**
6018
- * 🧪 Choose where the project's runs execute
6134
+ * Choose where the project's runs execute
6019
6135
  * @description Sends the scoped project's new runs to an active runner backend of its organisation, or back to Empirical-hosted infrastructure with null. Runs already created keep their placement.
6020
6136
  */
6021
6137
  put: operations["setScopedProjectRunnerBackend"];
@@ -6036,7 +6152,7 @@ export interface paths {
6036
6152
  get?: never;
6037
6153
  put?: never;
6038
6154
  /**
6039
- * 🧪 Start setting up a private runner
6155
+ * Start setting up a private runner
6040
6156
  * @description Registers a pending runner backend for the scoped project's organisation in the given AWS account and region, or reuses one whose stack hasn't called home yet or was deleted, and returns a quick-create link for it. The stack activates the backend when it is created.
6041
6157
  */
6042
6158
  post: operations["setupProjectRunnerBackend"];
@@ -6056,7 +6172,7 @@ export interface paths {
6056
6172
  get?: never;
6057
6173
  put?: never;
6058
6174
  /**
6059
- * 🧪 Re-check the scoped project's runner backend
6175
+ * Re-check the scoped project's runner backend
6060
6176
  * @description Assumes the role of the backend the scoped project is linked to, makes one read-only call to each queue, the cluster and the log group, and records the result, so a customer can confirm a fix to their role or stack. It never changes the backend's status; use `enable` for a disabled one.
6061
6177
  */
6062
6178
  post: operations["verifyProjectRunnerBackend"];
@@ -6093,11 +6209,11 @@ export interface paths {
6093
6209
  path?: never;
6094
6210
  cookie?: never;
6095
6211
  };
6096
- /** 🛡️ 🧪 List system messages with delivery and ack counts */
6212
+ /** 🛡️ List system messages with delivery and ack counts */
6097
6213
  get: operations["listSystemMessages"];
6098
6214
  put?: never;
6099
6215
  /**
6100
- * 🛡️ 🧪 Broadcast a system message to manager sessions
6216
+ * 🛡️ Broadcast a system message to manager sessions
6101
6217
  * @description Persists the message and delivers it to project manager sessions. With `project_ids`, every listed project gets a recipient row, and one without an open manager is recorded as failed. Without it, the message goes to every project with an open manager, and active projects without one are returned in `skipped_project_ids` (not persisted). Delivery is attempted before responding. Managers acknowledge through `POST /api/system-messages/{id}/ack`.
6102
6218
  */
6103
6219
  post: operations["createSystemMessage"];
@@ -6114,7 +6230,7 @@ export interface paths {
6114
6230
  path?: never;
6115
6231
  cookie?: never;
6116
6232
  };
6117
- /** 🛡️ 🧪 Get a system message's per-project delivery and ack status */
6233
+ /** 🛡️ Get a system message's per-project delivery and ack status */
6118
6234
  get: operations["getSystemMessage"];
6119
6235
  put?: never;
6120
6236
  post?: never;
@@ -6134,7 +6250,7 @@ export interface paths {
6134
6250
  get?: never;
6135
6251
  put?: never;
6136
6252
  /**
6137
- * 🧪 Acknowledge a system message from a manager session
6253
+ * Acknowledge a system message from a manager session
6138
6254
  * @description Records the calling manager session's acknowledgement for its project. Any manager session of the project may ack, so a successor can answer a message its predecessor received. Re-acking overwrites the previous status and note.
6139
6255
  */
6140
6256
  post: operations["ackSystemMessage"];
@@ -6178,7 +6294,7 @@ export interface paths {
6178
6294
  get?: never;
6179
6295
  put?: never;
6180
6296
  /**
6181
- * ⚙️ 🧪 Create report upload URLs
6297
+ * ⚙️ Create report upload URLs
6182
6298
  * @description Returns presigned PUT URLs for files of a Playwright report under the project's report folder `<repo_name>/<run_id>/`.
6183
6299
  */
6184
6300
  post: operations["createTestReportUploadUrls"];
@@ -6639,7 +6755,7 @@ export interface components {
6639
6755
  /** @enum {string} */
6640
6756
  kind: "chat_session";
6641
6757
  /**
6642
- * @description The session's latest state: started, closed, or what happened to its pull request.
6758
+ * @description The session's latest state, or what last happened to one of its pull requests. A session with pull requests appears once per pull request.
6643
6759
  * @enum {string}
6644
6760
  */
6645
6761
  action: "created" | "closed" | "pr_opened" | "pr_reopened" | "pr_merged" | "pr_closed";
@@ -7145,8 +7261,6 @@ export interface components {
7145
7261
  }[];
7146
7262
  /** @description Whether the agent is awaiting user input. */
7147
7263
  ask_user_for_input: boolean | null;
7148
- /** @description Langfuse trace ID. */
7149
- langfuse_trace_id: string | null;
7150
7264
  /** @description Whether the session is closed. */
7151
7265
  is_closed: boolean;
7152
7266
  /** @description For a manager closed by rollover, the manager session that took over. */
@@ -7351,8 +7465,6 @@ export interface components {
7351
7465
  model: string | null;
7352
7466
  /** @description Whether the agent is awaiting user input. */
7353
7467
  ask_user_for_input: boolean | null;
7354
- /** @description Langfuse trace ID. */
7355
- langfuse_trace_id: string | null;
7356
7468
  /** @description Whether the session is closed. */
7357
7469
  is_closed: boolean;
7358
7470
  /** @description For a manager closed by rollover, the manager session that took over. */
@@ -7384,6 +7496,8 @@ export interface components {
7384
7496
  * @enum {string}
7385
7497
  */
7386
7498
  pr_status: "unopened" | "open" | "opened" | "closed" | "merged";
7499
+ /** @description Number of PRs the session has opened. */
7500
+ pr_count: number;
7387
7501
  /** @description Name of the owning project. */
7388
7502
  project_name: string | null;
7389
7503
  /** @description Repository name of the owning project. */
@@ -7480,20 +7594,6 @@ export interface components {
7480
7594
  ChatSessionTranscriptResponse: {
7481
7595
  data: components["schemas"]["SessionTranscript"];
7482
7596
  };
7483
- ChatSessionUserDetail: {
7484
- /** @description Supabase user ID. */
7485
- id: string;
7486
- /** @description User email. */
7487
- email: string;
7488
- /** @description Display name. */
7489
- name: string;
7490
- /** @description Avatar URL. */
7491
- picture: string;
7492
- };
7493
- ChatSessionUsersResponse: {
7494
- /** @description Response payload. */
7495
- data: components["schemas"]["ChatSessionUserDetail"][];
7496
- };
7497
7597
  ChatSessionWithUser: {
7498
7598
  /** @description Chat session ID. */
7499
7599
  id: number;
@@ -7538,8 +7638,6 @@ export interface components {
7538
7638
  }[];
7539
7639
  /** @description Whether the agent is awaiting user input. */
7540
7640
  ask_user_for_input: boolean | null;
7541
- /** @description Langfuse trace ID. */
7542
- langfuse_trace_id: string | null;
7543
7641
  /** @description Whether the session is closed. */
7544
7642
  is_closed: boolean;
7545
7643
  /** @description For a manager closed by rollover, the manager session that took over. */
@@ -7654,7 +7752,7 @@ export interface components {
7654
7752
  team_id: string;
7655
7753
  };
7656
7754
  CreateAlarmRequest: {
7657
- /** @description Why the alarm fires, in at most 200 characters, e.g. "check run 152810 finished". It is set once and cannot be edited. Keep state and rules out of it. */
7755
+ /** @description Why the alarm fires, in at most 200 characters, e.g. "retry the export once the rate limit resets". It is set once and cannot be edited. Keep state and rules out of it. */
7658
7756
  message: string;
7659
7757
  /** @description Whole minutes, hours or days (m/h/d), e.g. "15m", "2h", "1d" or "1h30m", between 5m and 72h. Seconds are not supported: use "5m", not "90s" or "300s". */
7660
7758
  delay: string;
@@ -8024,6 +8122,30 @@ export interface components {
8024
8122
  /** @description Channel names to subscribe to, e.g. `chat-sessions-project-<id>-<env>`, `test-run-<id>-<env>` or `user-<user uuid>-<env>`. */
8025
8123
  channels: string[];
8026
8124
  };
8125
+ CreateRuleRequest: {
8126
+ /** @enum {string|null} */
8127
+ verdict?: "app" | "test" | "env" | null;
8128
+ description: string;
8129
+ /** @description Playwright test IDs in scope. Leave empty with a matcher to cover every test. */
8130
+ test_ids?: string[];
8131
+ matcher?: {
8132
+ /** @description Plain-JS async function source: `async ({ testRun, testCase, traceUtils }) => boolean`. */
8133
+ source: string;
8134
+ /** @description Human-readable summary of what the matcher matches and why; re-articulated on every edit. */
8135
+ description: string;
8136
+ /**
8137
+ * @description Input-contract version the source was written against.
8138
+ * @default 1
8139
+ */
8140
+ contract_version: number;
8141
+ } | null;
8142
+ /** Format: date-time */
8143
+ until: string;
8144
+ scoped_to_environment_id?: number | null;
8145
+ /** @enum {string} */
8146
+ effect: "snooze" | "annotate";
8147
+ created_from_test_run_id?: number;
8148
+ };
8027
8149
  CreateSlackThreadEntityLinkRequest: {
8028
8150
  /**
8029
8151
  * @description Entity type to link.
@@ -8526,6 +8648,8 @@ export interface components {
8526
8648
  DeleteMemoryRequest: {
8527
8649
  /** @description Why this change was made (max 500 characters). Shown in the session's memory change report. */
8528
8650
  reason?: string | null;
8651
+ /** @description The memory `version` this write is based on. When set and the memory has moved past it, the write is refused with a 409 carrying the current memory. Omit to write unconditionally. */
8652
+ expected_version?: number;
8529
8653
  };
8530
8654
  DeleteProjectResourceResponse: {
8531
8655
  /** @description Response payload. */
@@ -9243,6 +9367,12 @@ export interface components {
9243
9367
  failing_line: string | null;
9244
9368
  /** @description ISO 8601 test completion time from the run ledger. */
9245
9369
  created_at: string | null;
9370
+ /** @description ISO 8601 start time of the latest attempt reported by the runner. While `is_retrying` is true and `started_retry` equals the number of recorded attempts, that attempt is still running. */
9371
+ started_at: string | null;
9372
+ /** @description 0-based retry index of the attempt `started_at` belongs to; null when no start was reported. */
9373
+ started_retry: number | null;
9374
+ /** @description Configured retry budget (`test.retries`); the case runs at most `max_retries + 1` attempts. */
9375
+ max_retries: number | null;
9246
9376
  /** @description SHA of the last commit before the run started. */
9247
9377
  last_commit_before_run_started_at: string | null;
9248
9378
  /** @description Snoozes matching this case at read time. */
@@ -10500,6 +10630,48 @@ export interface components {
10500
10630
  */
10501
10631
  seen_at?: string;
10502
10632
  };
10633
+ MatchRulesRequest: {
10634
+ test_run_id: number;
10635
+ /** @description Case (Playwright test id) to match. */
10636
+ pw_test_id: string;
10637
+ /** @description Dry-run this matcher source on the case instead of the project's rules. Not scoped and not cached. */
10638
+ source?: string;
10639
+ };
10640
+ MatchRulesResponse: {
10641
+ /** @description Response payload. */
10642
+ data: {
10643
+ test_run_id: number;
10644
+ pw_test_id: string;
10645
+ applying_rule_ids: number[];
10646
+ results: {
10647
+ /** @description Null for a dry-run source. */
10648
+ rule_id: number | null;
10649
+ description: string | null;
10650
+ /** @enum {string|null} */
10651
+ effect: "snooze" | "annotate" | null;
10652
+ /** @enum {string|null} */
10653
+ verdict: "app" | "test" | "env" | null;
10654
+ /**
10655
+ * @description `scope`: the rule lists this test and has no matcher. `matcher`: the rule's matcher ran.
10656
+ * @enum {string}
10657
+ */
10658
+ via: "scope" | "matcher";
10659
+ applies: boolean;
10660
+ /** @description The matcher result came from an earlier run on this case. */
10661
+ cached: boolean;
10662
+ error?: string;
10663
+ error_kind?: string;
10664
+ duration_ms?: number;
10665
+ logs: string[];
10666
+ /** @description Trace reads that threw: a false with trace errors means the matcher could not tell. */
10667
+ trace_errors: {
10668
+ fn: string;
10669
+ message: string;
10670
+ swallowed?: boolean;
10671
+ }[];
10672
+ }[];
10673
+ };
10674
+ };
10503
10675
  MemberByTestRun: {
10504
10676
  /** @description Test case ID (normalized 41-character Playwright test id). */
10505
10677
  test_case_id: string;
@@ -10541,6 +10713,8 @@ export interface components {
10541
10713
  name: string | null;
10542
10714
  description: string | null;
10543
10715
  content: string;
10716
+ /** @description Latest version number (1 = create); every saved edit increments it. Send it back as `expected_version` to update or delete only if nobody else wrote in between. */
10717
+ version: number;
10544
10718
  source: string | null;
10545
10719
  source_path: string | null;
10546
10720
  /** @description ID of the chat session the memory was created in, or null if not written from a sandbox session. */
@@ -10732,6 +10906,41 @@ export interface components {
10732
10906
  /** @description ISO 8601 timestamp. */
10733
10907
  created_at: string;
10734
10908
  };
10909
+ MemoryVersionConflictResponse: {
10910
+ data: unknown;
10911
+ error: {
10912
+ message: string;
10913
+ /** @description The memory as it is now, with its current `version` and content. */
10914
+ memory: {
10915
+ id: number;
10916
+ project_id: number;
10917
+ format_version: number;
10918
+ name: string | null;
10919
+ description: string | null;
10920
+ content: string;
10921
+ /** @description Latest version number (1 = create); every saved edit increments it. Send it back as `expected_version` to update or delete only if nobody else wrote in between. */
10922
+ version: number;
10923
+ source: string | null;
10924
+ source_path: string | null;
10925
+ /** @description ID of the chat session the memory was created in, or null if not written from a sandbox session. */
10926
+ source_chat_session_id: number | null;
10927
+ created_by: string | null;
10928
+ updated_by: string | null;
10929
+ /** @description ISO 8601 timestamp. */
10930
+ created_at: string;
10931
+ /** @description ISO 8601 timestamp. */
10932
+ updated_at: string;
10933
+ /** @description ISO 8601 timestamp when the memory was soft-deleted, or null if live. */
10934
+ deleted_at: string | null;
10935
+ /** @description User who deleted the memory, or null. */
10936
+ deleted_by: string | null;
10937
+ /** @description Chat session that deleted the memory, or null if not deleted from a sandbox session. */
10938
+ deleted_by_chat_session_id: number | null;
10939
+ /** @description Reason given for the delete, or null. */
10940
+ delete_reason: string | null;
10941
+ };
10942
+ };
10943
+ };
10735
10944
  MemoryVersionListResponse: {
10736
10945
  /** @description Response payload. */
10737
10946
  data: {
@@ -11751,6 +11960,42 @@ export interface components {
11751
11960
  plan: components["schemas"]["Plan"];
11752
11961
  };
11753
11962
  };
11963
+ PlatformIssue: {
11964
+ id: number;
11965
+ project_id: number;
11966
+ /**
11967
+ * @description `bug`: the platform misbehaves and the memory holds a workaround; fixed in code. `missing_from_skill`: platform how-to that no skill covers; fixed by updating a skill.
11968
+ * @enum {string}
11969
+ */
11970
+ kind: "bug" | "missing_from_skill";
11971
+ title: string;
11972
+ detail: string;
11973
+ skill: string | null;
11974
+ memory_id: number | null;
11975
+ memory_version: number | null;
11976
+ memory_name: string | null;
11977
+ memory_description: string | null;
11978
+ memory_content: string | null;
11979
+ /** @description Chat sessions that wrote any version of the memory. */
11980
+ memory_source_chat_session_ids: number[];
11981
+ reported_by: string | null;
11982
+ reported_by_chat_session_id: number | null;
11983
+ created_at: string;
11984
+ resolved_at: string | null;
11985
+ resolved_by: string | null;
11986
+ };
11987
+ PlatformIssueListResponse: {
11988
+ /** @description Response payload. */
11989
+ data: {
11990
+ issues: components["schemas"]["PlatformIssue"][];
11991
+ };
11992
+ };
11993
+ PlatformIssueResponse: {
11994
+ /** @description Response payload. */
11995
+ data: {
11996
+ issue: components["schemas"]["PlatformIssue"];
11997
+ };
11998
+ };
11754
11999
  PlaywrightUtilsProxyError: {
11755
12000
  /** @description Error message — the provider API key is not configured, or the proxied request failed. */
11756
12001
  error: string;
@@ -12530,6 +12775,27 @@ export interface components {
12530
12775
  updated_at: string | null;
12531
12776
  };
12532
12777
  };
12778
+ ReportPlatformIssueRequest: {
12779
+ /**
12780
+ * @description `bug`: the platform misbehaves and the memory holds a workaround; fixed in code. `missing_from_skill`: platform how-to that no skill covers; fixed by updating a skill.
12781
+ * @enum {string}
12782
+ */
12783
+ kind: "bug" | "missing_from_skill";
12784
+ title: string;
12785
+ detail: string;
12786
+ /** @description Skill that should cover this, if one exists or should exist. */
12787
+ skill?: string | null;
12788
+ /** @description Memory that records the gap. Its id, current version and content are stored with the issue. */
12789
+ memory_name?: string | null;
12790
+ };
12791
+ ReportPlatformIssueResponse: {
12792
+ /** @description Response payload. */
12793
+ data: {
12794
+ issue: components["schemas"]["PlatformIssue"];
12795
+ /** @description False when an open issue of the same kind already exists for this memory; that issue is returned unchanged. */
12796
+ created: boolean;
12797
+ };
12798
+ };
12533
12799
  ReporterSlackChannel: {
12534
12800
  /** @description Registered channel id, as used in `slack_channel_ids` of a reporter config. */
12535
12801
  id: number;
@@ -12730,6 +12996,83 @@ export interface components {
12730
12996
  description?: string;
12731
12997
  }[];
12732
12998
  };
12999
+ Rule: {
13000
+ id: number;
13001
+ /**
13002
+ * @description `snooze` counts matching failures as snoozed; `annotate` only labels them.
13003
+ * @enum {string}
13004
+ */
13005
+ effect: "snooze" | "annotate";
13006
+ /** @enum {string|null} */
13007
+ verdict: "app" | "test" | "env" | null;
13008
+ /** @description One-line title. */
13009
+ description: string | null;
13010
+ test_ids: string[];
13011
+ matcher: {
13012
+ /** @description Plain-JS async function source: `async ({ testRun, testCase, traceUtils }) => boolean`. */
13013
+ source: string;
13014
+ /** @description Human-readable summary of what the matcher matches and why; re-articulated on every edit. */
13015
+ description: string;
13016
+ /**
13017
+ * @description Input-contract version the source was written against.
13018
+ * @default 1
13019
+ */
13020
+ contract_version: number;
13021
+ } | null;
13022
+ /** @description ISO timestamp the rule ends at. */
13023
+ until: string;
13024
+ scoped_to_environment_id: number | null;
13025
+ created_from_test_run_id: number | null;
13026
+ created_by: string | null;
13027
+ created_via_chat_session_id: number | null;
13028
+ created_at: string;
13029
+ updated_at: string;
13030
+ };
13031
+ RuleListResponse: {
13032
+ data: {
13033
+ rules: components["schemas"]["Rule"][];
13034
+ };
13035
+ pagination: components["schemas"]["Pagination"];
13036
+ };
13037
+ RuleResponse: {
13038
+ /** @description Response payload. */
13039
+ data: {
13040
+ rule: components["schemas"]["Rule"];
13041
+ };
13042
+ };
13043
+ RuleRevision: {
13044
+ id: number;
13045
+ /** @enum {string} */
13046
+ action: "created" | "updated" | "deleted";
13047
+ /** @enum {string} */
13048
+ effect: "snooze" | "annotate";
13049
+ /** @enum {string|null} */
13050
+ verdict: "app" | "test" | "env" | null;
13051
+ description: string | null;
13052
+ test_ids: string[];
13053
+ matcher: {
13054
+ /** @description Plain-JS async function source: `async ({ testRun, testCase, traceUtils }) => boolean`. */
13055
+ source: string;
13056
+ /** @description Human-readable summary of what the matcher matches and why; re-articulated on every edit. */
13057
+ description: string;
13058
+ /**
13059
+ * @description Input-contract version the source was written against.
13060
+ * @default 1
13061
+ */
13062
+ contract_version: number;
13063
+ } | null;
13064
+ until: string | null;
13065
+ scoped_to_environment_id: number | null;
13066
+ changed_by: string | null;
13067
+ changed_via_chat_session_id: number | null;
13068
+ created_at: string;
13069
+ };
13070
+ RuleRevisionListResponse: {
13071
+ /** @description Response payload. */
13072
+ data: {
13073
+ revisions: components["schemas"]["RuleRevision"][];
13074
+ };
13075
+ };
12733
13076
  RunManifestResponse: {
12734
13077
  /** @description Response payload. */
12735
13078
  data: {
@@ -13109,6 +13452,7 @@ export interface components {
13109
13452
  signal: string | null;
13110
13453
  timedOut: boolean;
13111
13454
  durationMs: number;
13455
+ lost?: boolean;
13112
13456
  };
13113
13457
  };
13114
13458
  failed: boolean;
@@ -13263,6 +13607,7 @@ export interface components {
13263
13607
  signal: string | null;
13264
13608
  timedOut: boolean;
13265
13609
  durationMs: number;
13610
+ lost?: boolean;
13266
13611
  };
13267
13612
  } | {
13268
13613
  id: string;
@@ -14066,8 +14411,6 @@ export interface components {
14066
14411
  impacted_tests: unknown[];
14067
14412
  /** @description Whether the agent is awaiting user input. */
14068
14413
  ask_user_for_input: boolean | null;
14069
- /** @description Langfuse trace ID for observability. */
14070
- langfuse_trace_id: string | null;
14071
14414
  /** @description Whether the session is closed. */
14072
14415
  is_closed: boolean;
14073
14416
  /** @description Feature flags active for this session. */
@@ -14096,8 +14439,6 @@ export interface components {
14096
14439
  impacted_tests: unknown[];
14097
14440
  /** @description Whether the agent is awaiting user input. */
14098
14441
  ask_user_for_input: boolean | null;
14099
- /** @description Langfuse trace ID for observability. */
14100
- langfuse_trace_id: string | null;
14101
14442
  /** @description Whether the session is closed. */
14102
14443
  is_closed: boolean;
14103
14444
  /** @description Feature flags active for this session. */
@@ -14523,6 +14864,12 @@ export interface components {
14523
14864
  failing_line: string | null;
14524
14865
  /** @description ISO 8601 test completion time from the run ledger. */
14525
14866
  created_at: string | null;
14867
+ /** @description ISO 8601 start time of the latest attempt reported by the runner. While `is_retrying` is true and `started_retry` equals the number of recorded attempts, that attempt is still running. */
14868
+ started_at: string | null;
14869
+ /** @description 0-based retry index of the attempt `started_at` belongs to; null when no start was reported. */
14870
+ started_retry: number | null;
14871
+ /** @description Configured retry budget (`test.retries`); the case runs at most `max_retries + 1` attempts. */
14872
+ max_retries: number | null;
14526
14873
  /** @description SHA of the last commit before the run started. */
14527
14874
  last_commit_before_run_started_at: string | null;
14528
14875
  /** @description Snoozes matching this case at read time. */
@@ -14639,8 +14986,6 @@ export interface components {
14639
14986
  model: string | null;
14640
14987
  /** @description Whether the agent is awaiting user input. */
14641
14988
  ask_user_for_input: boolean | null;
14642
- /** @description Langfuse trace ID. */
14643
- langfuse_trace_id: string | null;
14644
14989
  /** @description Whether the session is closed. */
14645
14990
  is_closed: boolean;
14646
14991
  /** @description For a manager closed by rollover, the manager session that took over. */
@@ -14672,6 +15017,8 @@ export interface components {
14672
15017
  * @enum {string}
14673
15018
  */
14674
15019
  pr_status: "unopened" | "open" | "opened" | "closed" | "merged";
15020
+ /** @description Number of PRs the session has opened. */
15021
+ pr_count: number;
14675
15022
  /** @description Name of the owning project. */
14676
15023
  project_name: string | null;
14677
15024
  /** @description Repository name of the owning project. */
@@ -14685,10 +15032,10 @@ export interface components {
14685
15032
  /** @description Unique identifier. */
14686
15033
  id: number;
14687
15034
  /**
14688
- * @description Current state of the test run.
15035
+ * @description Current state of the test run. `finalizing`: every test has finished and results are being merged.
14689
15036
  * @enum {string}
14690
15037
  */
14691
- state: "pending" | "queued" | "started" | "ended" | "error" | "cancelled" | "cancelling";
15038
+ state: "pending" | "queued" | "cancelling" | "cancelled" | "ended" | "started" | "finalizing" | "error" | "interrupted";
14692
15039
  /** @description Total number of test cases. */
14693
15040
  total_count: number;
14694
15041
  /** @description Number of passed tests. */
@@ -14848,10 +15195,10 @@ export interface components {
14848
15195
  /** @description Unique identifier. */
14849
15196
  id: number;
14850
15197
  /**
14851
- * @description Current state of the test run.
15198
+ * @description Current state of the test run. `finalizing`: every test has finished and results are being merged.
14852
15199
  * @enum {string}
14853
15200
  */
14854
- state: "pending" | "queued" | "started" | "ended" | "error" | "cancelled" | "cancelling";
15201
+ state: "pending" | "queued" | "cancelling" | "cancelled" | "ended" | "started" | "finalizing" | "error" | "interrupted";
14855
15202
  /** @description Total number of test cases. */
14856
15203
  total_count: number;
14857
15204
  /** @description Number of passed tests. */
@@ -15165,7 +15512,7 @@ export interface components {
15165
15512
  * @description Current run state (e.g. queued, started, ended).
15166
15513
  * @enum {string|null}
15167
15514
  */
15168
- status: "pending" | "queued" | "cancelling" | "cancelled" | "ended" | "started" | "error" | "interrupted" | null;
15515
+ status: "pending" | "queued" | "cancelling" | "cancelled" | "ended" | "started" | "finalizing" | "error" | "interrupted" | null;
15169
15516
  /** @description Arbitrary run metadata key/value pairs. */
15170
15517
  metadata: {
15171
15518
  [key: string]: string;
@@ -15726,6 +16073,8 @@ export interface components {
15726
16073
  description?: string | null;
15727
16074
  /** @description Why this change was made (max 500 characters). Shown in the session's memory change report. */
15728
16075
  reason?: string | null;
16076
+ /** @description The memory `version` this write is based on. When set and the memory has moved past it, the write is refused with a 409 carrying the current memory. Omit to write unconditionally. */
16077
+ expected_version?: number;
15729
16078
  };
15730
16079
  UpdateOrderFormRequest: {
15731
16080
  org_id?: number;
@@ -15797,6 +16146,31 @@ export interface components {
15797
16146
  */
15798
16147
  status?: "uploaded";
15799
16148
  };
16149
+ UpdateRuleRequest: {
16150
+ /** @enum {string|null} */
16151
+ verdict?: "app" | "test" | "env" | null;
16152
+ description?: string;
16153
+ /** @description Playwright test IDs in scope. Leave empty with a matcher to cover every test. */
16154
+ test_ids?: string[];
16155
+ matcher?: {
16156
+ /** @description Plain-JS async function source: `async ({ testRun, testCase, traceUtils }) => boolean`. */
16157
+ source: string;
16158
+ /** @description Human-readable summary of what the matcher matches and why; re-articulated on every edit. */
16159
+ description: string;
16160
+ /**
16161
+ * @description Input-contract version the source was written against.
16162
+ * @default 1
16163
+ */
16164
+ contract_version: number;
16165
+ } | null;
16166
+ /** Format: date-time */
16167
+ until?: string;
16168
+ scoped_to_environment_id?: number | null;
16169
+ /** @enum {string} */
16170
+ effect?: "snooze" | "annotate";
16171
+ /** @description End the rule now. */
16172
+ expire_now?: boolean;
16173
+ };
15800
16174
  UpdateShardStateResponse: {
15801
16175
  /** @description Response payload. */
15802
16176
  data: {
@@ -16211,7 +16585,7 @@ export interface operations {
16211
16585
  created_after?: string;
16212
16586
  /** @description Restrict to runs created before this time. */
16213
16587
  created_before?: string;
16214
- /** @description Filter by run state (e.g. `queued`, `ended`). */
16588
+ /** @description Filter by run state (e.g. `queued`, `ended`); comma-separated for several. */
16215
16589
  state?: string;
16216
16590
  /** @description Filter by overall run result. */
16217
16591
  result?: "passed" | "failed";
@@ -20980,29 +21354,59 @@ export interface operations {
20980
21354
  };
20981
21355
  };
20982
21356
  };
20983
- getStaticIps: {
21357
+ listChatSessionAlarms: {
20984
21358
  parameters: {
20985
- query: {
20986
- /** @description Region to look up. One of: ap-south-1. */
20987
- region: string;
20988
- };
21359
+ query?: never;
20989
21360
  header?: never;
20990
- path?: never;
21361
+ path: {
21362
+ id: number;
21363
+ };
20991
21364
  cookie?: never;
20992
21365
  };
20993
21366
  requestBody?: never;
20994
21367
  responses: {
20995
- /** @description Static IPs for the region. */
21368
+ /** @description Alarms */
20996
21369
  200: {
20997
21370
  headers: {
20998
21371
  [name: string]: unknown;
20999
21372
  };
21000
21373
  content: {
21001
- "application/json": components["schemas"]["StaticIpsResponse"];
21374
+ "application/json": {
21375
+ alarms: {
21376
+ id: number;
21377
+ /** @description Compatibility alias for id. */
21378
+ alarm_id: string;
21379
+ /** @description One-time wake time; null for recurring cron alarms. */
21380
+ wake_at: string | null;
21381
+ chat_session_id: number;
21382
+ message: string;
21383
+ timing: {
21384
+ /** @enum {string} */
21385
+ type: "once";
21386
+ /**
21387
+ * Format: date-time
21388
+ * @description ISO 8601 UTC time at least 5m in the future.
21389
+ */
21390
+ run_at: string;
21391
+ } | {
21392
+ /** @enum {string} */
21393
+ type: "cron";
21394
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21395
+ cron: string;
21396
+ /** Format: date-time */
21397
+ ends_at?: string;
21398
+ };
21399
+ /** @enum {string} */
21400
+ status: "active" | "completed";
21401
+ last_run_at: string | null;
21402
+ created_at: string;
21403
+ updated_at: string;
21404
+ }[];
21405
+ };
21002
21406
  };
21003
21407
  };
21004
- /** @description Missing or unknown region. */
21005
- 400: {
21408
+ /** @description Session not found */
21409
+ 404: {
21006
21410
  headers: {
21007
21411
  [name: string]: unknown;
21008
21412
  };
@@ -21012,83 +21416,95 @@ export interface operations {
21012
21416
  };
21013
21417
  };
21014
21418
  };
21015
- listTasks: {
21016
- parameters: {
21017
- query?: {
21018
- /** @description Page number (1-indexed). */
21019
- page?: number;
21020
- /** @description Items per page. */
21021
- per_page?: number;
21022
- /** @description URL-encoded JSON array of generic filter conditions; malformed input is ignored. */
21023
- filters?: string;
21024
- };
21025
- header?: never;
21026
- path?: never;
21027
- cookie?: never;
21028
- };
21029
- requestBody?: never;
21030
- responses: {
21031
- /** @description Paginated list of tasks. */
21032
- 200: {
21033
- headers: {
21034
- [name: string]: unknown;
21035
- };
21036
- content: {
21037
- "application/json": components["schemas"]["TaskListResponse"];
21038
- };
21039
- };
21040
- /** @description Invalid request or missing project scope. */
21041
- 400: {
21042
- headers: {
21043
- [name: string]: unknown;
21044
- };
21045
- content: {
21046
- "application/json": components["schemas"]["ErrorResponse"];
21047
- };
21048
- };
21049
- /** @description Project not found or inaccessible. */
21050
- 404: {
21051
- headers: {
21052
- [name: string]: unknown;
21053
- };
21054
- content: {
21055
- "application/json": components["schemas"]["ErrorResponse"];
21056
- };
21057
- };
21058
- };
21059
- };
21060
- createTask: {
21419
+ createChatSessionAlarm: {
21061
21420
  parameters: {
21062
21421
  query?: never;
21063
21422
  header?: never;
21064
- path?: never;
21423
+ path: {
21424
+ id: number;
21425
+ };
21065
21426
  cookie?: never;
21066
21427
  };
21067
21428
  requestBody?: {
21068
21429
  content: {
21069
- "application/json": components["schemas"]["CreateTaskRequest"];
21430
+ "application/json": {
21431
+ /** @description Why the alarm fires, in at most 200 characters, e.g. "retry the export once the rate limit resets". It is set once and cannot be edited. Keep state and rules out of it. */
21432
+ message: string;
21433
+ timing: {
21434
+ /** @enum {string} */
21435
+ type: "delay";
21436
+ /** @description Whole minutes, hours or days (m/h/d), e.g. "15m", "2h", "1d" or "1h30m", between 5m and 72h. Seconds are not supported: use "5m", not "90s" or "300s". */
21437
+ delay: string;
21438
+ } | {
21439
+ /** @enum {string} */
21440
+ type: "once";
21441
+ /**
21442
+ * Format: date-time
21443
+ * @description ISO 8601 UTC time at least 5m in the future.
21444
+ */
21445
+ run_at: string;
21446
+ } | {
21447
+ /** @enum {string} */
21448
+ type: "cron";
21449
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21450
+ cron: string;
21451
+ /** Format: date-time */
21452
+ ends_at?: string;
21453
+ };
21454
+ };
21070
21455
  };
21071
21456
  };
21072
21457
  responses: {
21073
- /** @description The created task. */
21458
+ /** @description Created alarm */
21074
21459
  201: {
21075
21460
  headers: {
21076
21461
  [name: string]: unknown;
21077
21462
  };
21078
21463
  content: {
21079
- "application/json": components["schemas"]["CreateTaskResponse"];
21464
+ "application/json": {
21465
+ data: {
21466
+ id: number;
21467
+ /** @description Compatibility alias for id. */
21468
+ alarm_id: string;
21469
+ /** @description One-time wake time; null for recurring cron alarms. */
21470
+ wake_at: string | null;
21471
+ chat_session_id: number;
21472
+ message: string;
21473
+ timing: {
21474
+ /** @enum {string} */
21475
+ type: "once";
21476
+ /**
21477
+ * Format: date-time
21478
+ * @description ISO 8601 UTC time at least 5m in the future.
21479
+ */
21480
+ run_at: string;
21481
+ } | {
21482
+ /** @enum {string} */
21483
+ type: "cron";
21484
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21485
+ cron: string;
21486
+ /** Format: date-time */
21487
+ ends_at?: string;
21488
+ };
21489
+ /** @enum {string} */
21490
+ status: "active" | "completed";
21491
+ last_run_at: string | null;
21492
+ created_at: string;
21493
+ updated_at: string;
21494
+ };
21495
+ };
21080
21496
  };
21081
21497
  };
21082
- /** @description Missing required fields, no person to own the task, or invalid input. */
21498
+ /** @description Invalid alarm */
21083
21499
  400: {
21084
21500
  headers: {
21085
21501
  [name: string]: unknown;
21086
21502
  };
21087
21503
  content: {
21088
- "application/json": components["schemas"]["CreateTaskError"];
21504
+ "application/json": components["schemas"]["ErrorResponse"];
21089
21505
  };
21090
21506
  };
21091
- /** @description Project not found or inaccessible. */
21507
+ /** @description Session not found */
21092
21508
  404: {
21093
21509
  headers: {
21094
21510
  [name: string]: unknown;
@@ -21097,8 +21513,8 @@ export interface operations {
21097
21513
  "application/json": components["schemas"]["ErrorResponse"];
21098
21514
  };
21099
21515
  };
21100
- /** @description Failed to create task. */
21101
- 500: {
21516
+ /** @description Session is closed */
21517
+ 409: {
21102
21518
  headers: {
21103
21519
  [name: string]: unknown;
21104
21520
  };
@@ -21108,37 +21524,26 @@ export interface operations {
21108
21524
  };
21109
21525
  };
21110
21526
  };
21111
- getTask: {
21527
+ deleteChatSessionAlarm: {
21112
21528
  parameters: {
21113
21529
  query?: never;
21114
21530
  header?: never;
21115
21531
  path: {
21116
- /** @description Task ID. */
21117
21532
  id: number;
21533
+ alarm_id: number;
21118
21534
  };
21119
21535
  cookie?: never;
21120
21536
  };
21121
21537
  requestBody?: never;
21122
21538
  responses: {
21123
- /** @description The task. */
21124
- 200: {
21125
- headers: {
21126
- [name: string]: unknown;
21127
- };
21128
- content: {
21129
- "application/json": components["schemas"]["TaskResponse"];
21130
- };
21131
- };
21132
- /** @description Invalid task ID. */
21133
- 400: {
21539
+ /** @description Deleted */
21540
+ 204: {
21134
21541
  headers: {
21135
21542
  [name: string]: unknown;
21136
21543
  };
21137
- content: {
21138
- "application/json": components["schemas"]["ErrorResponse"];
21139
- };
21544
+ content?: never;
21140
21545
  };
21141
- /** @description Task not found. */
21546
+ /** @description Alarm not found */
21142
21547
  404: {
21143
21548
  headers: {
21144
21549
  [name: string]: unknown;
@@ -21149,28 +21554,81 @@ export interface operations {
21149
21554
  };
21150
21555
  };
21151
21556
  };
21152
- deleteTask: {
21557
+ updateChatSessionAlarm: {
21153
21558
  parameters: {
21154
21559
  query?: never;
21155
21560
  header?: never;
21156
21561
  path: {
21157
- /** @description Task ID. */
21158
21562
  id: number;
21563
+ alarm_id: number;
21159
21564
  };
21160
21565
  cookie?: never;
21161
21566
  };
21162
- requestBody?: never;
21567
+ requestBody?: {
21568
+ content: {
21569
+ "application/json": {
21570
+ /** @description New schedule. The message is fixed at creation; delete the alarm and create a new one to change it. */
21571
+ timing: {
21572
+ /** @enum {string} */
21573
+ type: "once";
21574
+ /**
21575
+ * Format: date-time
21576
+ * @description ISO 8601 UTC time at least 5m in the future.
21577
+ */
21578
+ run_at: string;
21579
+ } | {
21580
+ /** @enum {string} */
21581
+ type: "cron";
21582
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21583
+ cron: string;
21584
+ /** Format: date-time */
21585
+ ends_at?: string;
21586
+ };
21587
+ };
21588
+ };
21589
+ };
21163
21590
  responses: {
21164
- /** @description The deleted task ID. */
21591
+ /** @description Updated alarm */
21165
21592
  200: {
21166
21593
  headers: {
21167
21594
  [name: string]: unknown;
21168
21595
  };
21169
21596
  content: {
21170
- "application/json": components["schemas"]["DeletedTaskResponse"];
21597
+ "application/json": {
21598
+ data: {
21599
+ id: number;
21600
+ /** @description Compatibility alias for id. */
21601
+ alarm_id: string;
21602
+ /** @description One-time wake time; null for recurring cron alarms. */
21603
+ wake_at: string | null;
21604
+ chat_session_id: number;
21605
+ message: string;
21606
+ timing: {
21607
+ /** @enum {string} */
21608
+ type: "once";
21609
+ /**
21610
+ * Format: date-time
21611
+ * @description ISO 8601 UTC time at least 5m in the future.
21612
+ */
21613
+ run_at: string;
21614
+ } | {
21615
+ /** @enum {string} */
21616
+ type: "cron";
21617
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21618
+ cron: string;
21619
+ /** Format: date-time */
21620
+ ends_at?: string;
21621
+ };
21622
+ /** @enum {string} */
21623
+ status: "active" | "completed";
21624
+ last_run_at: string | null;
21625
+ created_at: string;
21626
+ updated_at: string;
21627
+ };
21628
+ };
21171
21629
  };
21172
21630
  };
21173
- /** @description Invalid task ID. */
21631
+ /** @description Invalid alarm */
21174
21632
  400: {
21175
21633
  headers: {
21176
21634
  [name: string]: unknown;
@@ -21179,7 +21637,7 @@ export interface operations {
21179
21637
  "application/json": components["schemas"]["ErrorResponse"];
21180
21638
  };
21181
21639
  };
21182
- /** @description Task not found or not deleted. */
21640
+ /** @description Alarm not found */
21183
21641
  404: {
21184
21642
  headers: {
21185
21643
  [name: string]: unknown;
@@ -21190,41 +21648,33 @@ export interface operations {
21190
21648
  };
21191
21649
  };
21192
21650
  };
21193
- updateTask: {
21651
+ getChatSessionState: {
21194
21652
  parameters: {
21195
- query?: never;
21653
+ query?: {
21654
+ /** @description Page number (1-indexed). Default 1. */
21655
+ page?: number;
21656
+ /** @description Entries per page (1-100). Default 50. */
21657
+ per_page?: number;
21658
+ };
21196
21659
  header?: never;
21197
21660
  path: {
21198
- /** @description Task ID. */
21661
+ /** @description Chat session ID. */
21199
21662
  id: number;
21200
21663
  };
21201
21664
  cookie?: never;
21202
21665
  };
21203
- requestBody?: {
21204
- content: {
21205
- "application/json": components["schemas"]["UpdateTaskRequest"];
21206
- };
21207
- };
21666
+ requestBody?: never;
21208
21667
  responses: {
21209
- /** @description The updated task. */
21668
+ /** @description A page of log entries (newest block first), plus user messages and sandbox state. */
21210
21669
  200: {
21211
21670
  headers: {
21212
21671
  [name: string]: unknown;
21213
21672
  };
21214
21673
  content: {
21215
- "application/json": components["schemas"]["UpdatedTaskResponse"];
21216
- };
21217
- };
21218
- /** @description No fields to update or invalid input. */
21219
- 400: {
21220
- headers: {
21221
- [name: string]: unknown;
21222
- };
21223
- content: {
21224
- "application/json": components["schemas"]["ErrorResponse"];
21674
+ "application/json": components["schemas"]["ChatSessionStateResponse"];
21225
21675
  };
21226
21676
  };
21227
- /** @description Task not found or not updated. */
21677
+ /** @description Chat session not found. */
21228
21678
  404: {
21229
21679
  headers: {
21230
21680
  [name: string]: unknown;
@@ -21235,47 +21685,58 @@ export interface operations {
21235
21685
  };
21236
21686
  };
21237
21687
  };
21238
- getOverlayDismissalSummary: {
21688
+ listChatSessionTriggers: {
21239
21689
  parameters: {
21240
- query?: {
21241
- /** @description Page number (1-indexed). Default 1. */
21242
- page?: string;
21243
- /** @description Items per page (1-100). Default 50. */
21244
- per_page?: string;
21245
- /** @description Look-back window in days (1-90, default 7). Ignored when `start_date` and `end_date` are set. */
21246
- days?: string;
21247
- /** @description Start of a custom date range (ISO 8601). */
21248
- start_date?: string;
21249
- /** @description End of a custom date range (ISO 8601). */
21250
- end_date?: string;
21251
- /** @description Filter by environment name. */
21252
- environment?: string;
21253
- /** @description Filter by test run ID. */
21254
- test_run_id?: string;
21255
- /** @description Case-insensitive substring filter on test name. */
21256
- test_name?: string;
21257
- /** @description Filter by success: `true` or `false`. Other values ignored. */
21258
- success?: string;
21259
- /** @description Filter by cache hit: `true` or `false`. Other values ignored. */
21260
- cache_hit?: string;
21261
- };
21690
+ query?: never;
21262
21691
  header?: never;
21263
- path?: never;
21692
+ path: {
21693
+ id: number;
21694
+ };
21264
21695
  cookie?: never;
21265
21696
  };
21266
21697
  requestBody?: never;
21267
21698
  responses: {
21268
- /** @description Overlay-dismissal summary for the project. */
21699
+ /** @description Active triggers */
21269
21700
  200: {
21270
21701
  headers: {
21271
21702
  [name: string]: unknown;
21272
21703
  };
21273
21704
  content: {
21274
- "application/json": components["schemas"]["OverlayDismissalSummaryResponse"];
21705
+ "application/json": {
21706
+ data: {
21707
+ triggers: {
21708
+ id: number;
21709
+ /** @enum {string} */
21710
+ type: "event";
21711
+ chat_session_id: number;
21712
+ event_type: string;
21713
+ entity_type: string;
21714
+ /** @description Exact entity id, or null when this trigger matches every entity. */
21715
+ entity_id: string | null;
21716
+ /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21717
+ payload_filter: {
21718
+ [key: string]: (string | number | boolean | {
21719
+ gt?: number;
21720
+ gte?: number;
21721
+ lt?: number;
21722
+ lte?: number;
21723
+ }) | null;
21724
+ };
21725
+ /**
21726
+ * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21727
+ * @enum {string}
21728
+ */
21729
+ cardinality: "one_shot" | "recurring";
21730
+ /** @enum {string} */
21731
+ status: "active";
21732
+ created_at: string;
21733
+ }[];
21734
+ };
21735
+ };
21275
21736
  };
21276
21737
  };
21277
- /** @description Failed to query telemetry. */
21278
- 500: {
21738
+ /** @description Session not found */
21739
+ 404: {
21279
21740
  headers: {
21280
21741
  [name: string]: unknown;
21281
21742
  };
@@ -21285,47 +21746,99 @@ export interface operations {
21285
21746
  };
21286
21747
  };
21287
21748
  };
21288
- getOverlayDismissalEvents: {
21749
+ createChatSessionTrigger: {
21289
21750
  parameters: {
21290
- query?: {
21291
- /** @description Page number (1-indexed). Default 1. */
21292
- page?: string;
21293
- /** @description Items per page (1-100). Default 50. */
21294
- per_page?: string;
21295
- /** @description Look-back window in days (1-90, default 7). Ignored when `start_date` and `end_date` are set. */
21296
- days?: string;
21297
- /** @description Start of a custom date range (ISO 8601). */
21298
- start_date?: string;
21299
- /** @description End of a custom date range (ISO 8601). */
21300
- end_date?: string;
21301
- /** @description Filter by environment name. */
21302
- environment?: string;
21303
- /** @description Filter by test run ID. */
21304
- test_run_id?: string;
21305
- /** @description Case-insensitive substring filter on test name. */
21306
- test_name?: string;
21307
- /** @description Filter by success: `true` or `false`. Other values ignored. */
21308
- success?: string;
21309
- /** @description Filter by cache hit: `true` or `false`. Other values ignored. */
21310
- cache_hit?: string;
21311
- };
21751
+ query?: never;
21312
21752
  header?: never;
21313
- path?: never;
21753
+ path: {
21754
+ id: number;
21755
+ };
21314
21756
  cookie?: never;
21315
21757
  };
21316
- requestBody?: never;
21758
+ requestBody?: {
21759
+ content: {
21760
+ "application/json": {
21761
+ /** @enum {string} */
21762
+ type: "event";
21763
+ /** @description A subscribable event_type from the canonical Empirical event catalog. */
21764
+ event_type: string;
21765
+ /** @description Exact canonical entity id to match. Omit on create, or set null on update, to match every entity. */
21766
+ entity_id?: string;
21767
+ /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21768
+ payload_filter?: {
21769
+ [key: string]: (string | number | boolean | {
21770
+ gt?: number;
21771
+ gte?: number;
21772
+ lt?: number;
21773
+ lte?: number;
21774
+ }) | null;
21775
+ };
21776
+ /**
21777
+ * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21778
+ * @enum {string}
21779
+ */
21780
+ cardinality?: "one_shot" | "recurring";
21781
+ };
21782
+ };
21783
+ };
21317
21784
  responses: {
21318
- /** @description Paginated overlay-dismissal events for the project. */
21319
- 200: {
21785
+ /** @description Created trigger */
21786
+ 201: {
21320
21787
  headers: {
21321
21788
  [name: string]: unknown;
21322
21789
  };
21323
21790
  content: {
21324
- "application/json": components["schemas"]["OverlayDismissalEventsResponse"];
21791
+ "application/json": {
21792
+ data: {
21793
+ id: number;
21794
+ /** @enum {string} */
21795
+ type: "event";
21796
+ chat_session_id: number;
21797
+ event_type: string;
21798
+ entity_type: string;
21799
+ /** @description Exact entity id, or null when this trigger matches every entity. */
21800
+ entity_id: string | null;
21801
+ /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21802
+ payload_filter: {
21803
+ [key: string]: (string | number | boolean | {
21804
+ gt?: number;
21805
+ gte?: number;
21806
+ lt?: number;
21807
+ lte?: number;
21808
+ }) | null;
21809
+ };
21810
+ /**
21811
+ * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21812
+ * @enum {string}
21813
+ */
21814
+ cardinality: "one_shot" | "recurring";
21815
+ /** @enum {string} */
21816
+ status: "active";
21817
+ created_at: string;
21818
+ };
21819
+ };
21325
21820
  };
21326
21821
  };
21327
- /** @description Failed to query telemetry. */
21328
- 500: {
21822
+ /** @description Invalid or unsubscribable event type */
21823
+ 400: {
21824
+ headers: {
21825
+ [name: string]: unknown;
21826
+ };
21827
+ content: {
21828
+ "application/json": components["schemas"]["ErrorResponse"];
21829
+ };
21830
+ };
21831
+ /** @description Session not found */
21832
+ 404: {
21833
+ headers: {
21834
+ [name: string]: unknown;
21835
+ };
21836
+ content: {
21837
+ "application/json": components["schemas"]["ErrorResponse"];
21838
+ };
21839
+ };
21840
+ /** @description Session is closed, or the test run already finished */
21841
+ 409: {
21329
21842
  headers: {
21330
21843
  [name: string]: unknown;
21331
21844
  };
@@ -21335,50 +21848,56 @@ export interface operations {
21335
21848
  };
21336
21849
  };
21337
21850
  };
21338
- listTestRunCases: {
21851
+ getChatSessionTrigger: {
21339
21852
  parameters: {
21340
- query?: {
21341
- /** @description Filter to cases with this status. */
21342
- status?: "passed" | "failed" | "flaky" | "skipped";
21343
- /** @description Page number (1-indexed). Default 1. */
21344
- page?: number;
21345
- /** @description Items per page (capped at 200). Default 50. */
21346
- per_page?: number;
21347
- /** @description Row order. `scheduled` (default) is manifest order — stable for a finished run. `recent` is most-recently-completed first, for the live view of an active run. `duration` is slowest first (total time across attempts). `start_time` is earliest first attempt first; skipped tests last. */
21348
- order?: "scheduled" | "recent" | "duration" | "start_time";
21349
- /** @description Case-insensitive substring search over the test's full name (project, file, describe blocks, title), Playwright test id and failing line. Combines with `status`, `order` and paging; `pagination.total` counts the matches. Failing lines are searchable only for cases recorded after this parameter was added. */
21350
- q?: string;
21351
- /** @description When `true`, also returns cases that have reported at least one attempt but still have retries outstanding, marked `is_retrying: true`. Their `status` is provisional (from the attempts so far) and can change when the remaining retries land. Defaults to `false`. */
21352
- include_retrying?: "true" | "false";
21353
- };
21853
+ query?: never;
21354
21854
  header?: never;
21355
21855
  path: {
21356
- /** @description Test run database ID. */
21357
21856
  id: number;
21857
+ trigger_id: number;
21358
21858
  };
21359
21859
  cookie?: never;
21360
21860
  };
21361
21861
  requestBody?: never;
21362
21862
  responses: {
21363
- /** @description Paginated list of test run cases. */
21863
+ /** @description Trigger */
21364
21864
  200: {
21365
21865
  headers: {
21366
21866
  [name: string]: unknown;
21367
21867
  };
21368
21868
  content: {
21369
- "application/json": components["schemas"]["ListTestRunCasesResponse"];
21370
- };
21371
- };
21372
- /** @description Invalid request. */
21373
- 400: {
21374
- headers: {
21375
- [name: string]: unknown;
21376
- };
21377
- content: {
21378
- "application/json": components["schemas"]["ErrorResponse"];
21869
+ "application/json": {
21870
+ data: {
21871
+ id: number;
21872
+ /** @enum {string} */
21873
+ type: "event";
21874
+ chat_session_id: number;
21875
+ event_type: string;
21876
+ entity_type: string;
21877
+ /** @description Exact entity id, or null when this trigger matches every entity. */
21878
+ entity_id: string | null;
21879
+ /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21880
+ payload_filter: {
21881
+ [key: string]: (string | number | boolean | {
21882
+ gt?: number;
21883
+ gte?: number;
21884
+ lt?: number;
21885
+ lte?: number;
21886
+ }) | null;
21887
+ };
21888
+ /**
21889
+ * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21890
+ * @enum {string}
21891
+ */
21892
+ cardinality: "one_shot" | "recurring";
21893
+ /** @enum {string} */
21894
+ status: "active";
21895
+ created_at: string;
21896
+ };
21897
+ };
21379
21898
  };
21380
21899
  };
21381
- /** @description Test run not found. */
21900
+ /** @description Session or trigger not found */
21382
21901
  404: {
21383
21902
  headers: {
21384
21903
  [name: string]: unknown;
@@ -21389,42 +21908,26 @@ export interface operations {
21389
21908
  };
21390
21909
  };
21391
21910
  };
21392
- getTestRunCase: {
21911
+ deleteChatSessionTrigger: {
21393
21912
  parameters: {
21394
- query?: {
21395
- /** @description When `true`, also returns cases that have reported at least one attempt but still have retries outstanding, marked `is_retrying: true`. Their `status` is provisional (from the attempts so far) and can change when the remaining retries land. Defaults to `false`. */
21396
- include_retrying?: "true" | "false";
21397
- };
21913
+ query?: never;
21398
21914
  header?: never;
21399
21915
  path: {
21400
- /** @description Test run database ID. */
21401
21916
  id: number;
21402
- /** @description Playwright test ID (`pw_test_id`) of the case. */
21403
- case_id: string;
21917
+ trigger_id: number;
21404
21918
  };
21405
21919
  cookie?: never;
21406
21920
  };
21407
21921
  requestBody?: never;
21408
21922
  responses: {
21409
- /** @description The test run case. */
21410
- 200: {
21411
- headers: {
21412
- [name: string]: unknown;
21413
- };
21414
- content: {
21415
- "application/json": components["schemas"]["GetTestRunCaseResponse"];
21416
- };
21417
- };
21418
- /** @description Invalid request. */
21419
- 400: {
21923
+ /** @description Deleted */
21924
+ 204: {
21420
21925
  headers: {
21421
21926
  [name: string]: unknown;
21422
21927
  };
21423
- content: {
21424
- "application/json": components["schemas"]["ErrorResponse"];
21425
- };
21928
+ content?: never;
21426
21929
  };
21427
- /** @description Test run or test case not found. */
21930
+ /** @description Session or trigger not found */
21428
21931
  404: {
21429
21932
  headers: {
21430
21933
  [name: string]: unknown;
@@ -21435,58 +21938,88 @@ export interface operations {
21435
21938
  };
21436
21939
  };
21437
21940
  };
21438
- listChatSessionAlarms: {
21941
+ updateChatSessionTrigger: {
21439
21942
  parameters: {
21440
21943
  query?: never;
21441
21944
  header?: never;
21442
21945
  path: {
21443
21946
  id: number;
21947
+ trigger_id: number;
21444
21948
  };
21445
21949
  cookie?: never;
21446
21950
  };
21447
- requestBody?: never;
21951
+ requestBody?: {
21952
+ content: {
21953
+ "application/json": {
21954
+ /** @description A subscribable event_type from the canonical Empirical event catalog. */
21955
+ event_type?: string;
21956
+ /** @description Exact canonical entity id to match. Omit on create, or set null on update, to match every entity. */
21957
+ entity_id?: string | null;
21958
+ /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21959
+ payload_filter?: {
21960
+ [key: string]: (string | number | boolean | {
21961
+ gt?: number;
21962
+ gte?: number;
21963
+ lt?: number;
21964
+ lte?: number;
21965
+ }) | null;
21966
+ };
21967
+ /**
21968
+ * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21969
+ * @enum {string}
21970
+ */
21971
+ cardinality?: "one_shot" | "recurring";
21972
+ };
21973
+ };
21974
+ };
21448
21975
  responses: {
21449
- /** @description Alarms */
21976
+ /** @description Updated trigger */
21450
21977
  200: {
21451
21978
  headers: {
21452
21979
  [name: string]: unknown;
21453
21980
  };
21454
21981
  content: {
21455
21982
  "application/json": {
21456
- alarms: {
21983
+ data: {
21457
21984
  id: number;
21458
- /** @description Compatibility alias for id. */
21459
- alarm_id: string;
21460
- /** @description One-time wake time; null for recurring cron alarms. */
21461
- wake_at: string | null;
21985
+ /** @enum {string} */
21986
+ type: "event";
21462
21987
  chat_session_id: number;
21463
- message: string;
21464
- timing: {
21465
- /** @enum {string} */
21466
- type: "once";
21467
- /**
21468
- * Format: date-time
21469
- * @description ISO 8601 UTC time at least 5m in the future.
21470
- */
21471
- run_at: string;
21472
- } | {
21473
- /** @enum {string} */
21474
- type: "cron";
21475
- /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21476
- cron: string;
21477
- /** Format: date-time */
21478
- ends_at?: string;
21988
+ event_type: string;
21989
+ entity_type: string;
21990
+ /** @description Exact entity id, or null when this trigger matches every entity. */
21991
+ entity_id: string | null;
21992
+ /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21993
+ payload_filter: {
21994
+ [key: string]: (string | number | boolean | {
21995
+ gt?: number;
21996
+ gte?: number;
21997
+ lt?: number;
21998
+ lte?: number;
21999
+ }) | null;
21479
22000
  };
22001
+ /**
22002
+ * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
22003
+ * @enum {string}
22004
+ */
22005
+ cardinality: "one_shot" | "recurring";
21480
22006
  /** @enum {string} */
21481
- status: "active" | "completed";
21482
- last_run_at: string | null;
22007
+ status: "active";
21483
22008
  created_at: string;
21484
- updated_at: string;
21485
- }[];
22009
+ };
21486
22010
  };
21487
22011
  };
21488
22012
  };
21489
- /** @description Session not found */
22013
+ /** @description Invalid or unsubscribable event type */
22014
+ 400: {
22015
+ headers: {
22016
+ [name: string]: unknown;
22017
+ };
22018
+ content: {
22019
+ "application/json": components["schemas"]["ErrorResponse"];
22020
+ };
22021
+ };
22022
+ /** @description Session or trigger not found */
21490
22023
  404: {
21491
22024
  headers: {
21492
22025
  [name: string]: unknown;
@@ -21495,89 +22028,195 @@ export interface operations {
21495
22028
  "application/json": components["schemas"]["ErrorResponse"];
21496
22029
  };
21497
22030
  };
22031
+ /** @description The test run already finished */
22032
+ 409: {
22033
+ headers: {
22034
+ [name: string]: unknown;
22035
+ };
22036
+ content: {
22037
+ "application/json": components["schemas"]["ErrorResponse"];
22038
+ };
22039
+ };
21498
22040
  };
21499
22041
  };
21500
- createChatSessionAlarm: {
22042
+ checkFailureGroupMatcherOverlap: {
21501
22043
  parameters: {
21502
22044
  query?: never;
21503
22045
  header?: never;
21504
22046
  path: {
21505
- id: number;
22047
+ /** @description Failure group ID. */
22048
+ id: string;
21506
22049
  };
21507
22050
  cookie?: never;
21508
22051
  };
21509
22052
  requestBody?: {
21510
22053
  content: {
21511
22054
  "application/json": {
21512
- /** @description Why the alarm fires, in at most 200 characters, e.g. "check run 152810 finished". It is set once and cannot be edited. Keep state and rules out of it. */
21513
- message: string;
21514
- timing: {
21515
- /** @enum {string} */
21516
- type: "delay";
21517
- /** @description Whole minutes, hours or days (m/h/d), e.g. "15m", "2h", "1d" or "1h30m", between 5m and 72h. Seconds are not supported: use "5m", not "90s" or "300s". */
21518
- delay: string;
21519
- } | {
21520
- /** @enum {string} */
21521
- type: "once";
21522
- /**
21523
- * Format: date-time
21524
- * @description ISO 8601 UTC time at least 5m in the future.
21525
- */
21526
- run_at: string;
21527
- } | {
21528
- /** @enum {string} */
21529
- type: "cron";
21530
- /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21531
- cron: string;
21532
- /** Format: date-time */
21533
- ends_at?: string;
22055
+ /** @description Candidate matcher source for this group: `async ({ testRun, testCase, traceUtils }) => boolean`. */
22056
+ source: string;
22057
+ };
22058
+ };
22059
+ };
22060
+ responses: {
22061
+ /** @description The other groups' cases the source claims. */
22062
+ 200: {
22063
+ headers: {
22064
+ [name: string]: unknown;
22065
+ };
22066
+ content: {
22067
+ "application/json": {
22068
+ /** @description Response payload. */
22069
+ data: {
22070
+ /** @description Cases the source was run against. */
22071
+ checked_cases: number;
22072
+ /** @description Candidate cases whose run or case could not be loaded. */
22073
+ skipped_cases: number;
22074
+ /** @description True when candidates were dropped: more than 40 cases, or more than 500 open groups. */
22075
+ truncated: boolean;
22076
+ /** @description Other groups' members the source returned true for. Empty means no overlap was found among the checked cases. */
22077
+ claims: {
22078
+ group_id: string;
22079
+ label: string | null;
22080
+ test_run_id: number;
22081
+ pw_test_id: string;
22082
+ }[];
22083
+ /** @description Cases where the source errored or was not run: no verdict, not a claim. */
22084
+ errors: {
22085
+ group_id: string;
22086
+ label: string | null;
22087
+ test_run_id: number;
22088
+ pw_test_id: string;
22089
+ /** @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. */
22090
+ error_kind: string;
22091
+ error: string;
22092
+ }[];
22093
+ };
21534
22094
  };
21535
22095
  };
21536
22096
  };
22097
+ /** @description Group not found. */
22098
+ 404: {
22099
+ headers: {
22100
+ [name: string]: unknown;
22101
+ };
22102
+ content: {
22103
+ "application/json": components["schemas"]["ErrorResponse"];
22104
+ };
22105
+ };
21537
22106
  };
22107
+ };
22108
+ detachFailureGroupMember: {
22109
+ parameters: {
22110
+ query?: never;
22111
+ header?: never;
22112
+ path: {
22113
+ /** @description Failure group id. */
22114
+ id: string;
22115
+ /** @description Member test to detach. */
22116
+ test_case_id: string;
22117
+ };
22118
+ cookie?: never;
22119
+ };
22120
+ requestBody?: never;
21538
22121
  responses: {
21539
- /** @description Created alarm */
21540
- 201: {
22122
+ /** @description Membership detached. */
22123
+ 200: {
22124
+ headers: {
22125
+ [name: string]: unknown;
22126
+ };
22127
+ content: {
22128
+ "application/json": components["schemas"]["FailureGroupDetachMemberResponse"];
22129
+ };
22130
+ };
22131
+ /** @description Only humans and agents may detach a membership. */
22132
+ 403: {
22133
+ headers: {
22134
+ [name: string]: unknown;
22135
+ };
22136
+ content: {
22137
+ "application/json": components["schemas"]["ErrorResponse"];
22138
+ };
22139
+ };
22140
+ /** @description Group not found. */
22141
+ 404: {
22142
+ headers: {
22143
+ [name: string]: unknown;
22144
+ };
22145
+ content: {
22146
+ "application/json": components["schemas"]["ErrorResponse"];
22147
+ };
22148
+ };
22149
+ };
22150
+ };
22151
+ matchFailureGroups: {
22152
+ parameters: {
22153
+ query?: never;
22154
+ header?: never;
22155
+ path?: never;
22156
+ cookie?: never;
22157
+ };
22158
+ requestBody?: {
22159
+ content: {
22160
+ "application/json": {
22161
+ /** @description Run holding the case to match. */
22162
+ test_run_id: number;
22163
+ /** @description Case (Playwright test id) to match. Any status: failed or flaky. */
22164
+ pw_test_id: string;
22165
+ /** @description Dry-run this matcher source instead of the groups' matchers: `async ({ testRun, testCase, traceUtils }) => boolean`. */
22166
+ source?: string;
22167
+ /** @description Only run these groups' matchers. Default: every open group with a matcher. */
22168
+ group_ids?: string[];
22169
+ };
22170
+ };
22171
+ };
22172
+ responses: {
22173
+ /** @description Matcher results for the case. */
22174
+ 200: {
21541
22175
  headers: {
21542
22176
  [name: string]: unknown;
21543
22177
  };
21544
22178
  content: {
21545
22179
  "application/json": {
22180
+ /** @description Response payload. */
21546
22181
  data: {
21547
- id: number;
21548
- /** @description Compatibility alias for id. */
21549
- alarm_id: string;
21550
- /** @description One-time wake time; null for recurring cron alarms. */
21551
- wake_at: string | null;
21552
- chat_session_id: number;
21553
- message: string;
21554
- timing: {
21555
- /** @enum {string} */
21556
- type: "once";
21557
- /**
21558
- * Format: date-time
21559
- * @description ISO 8601 UTC time at least 5m in the future.
21560
- */
21561
- run_at: string;
21562
- } | {
21563
- /** @enum {string} */
21564
- type: "cron";
21565
- /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21566
- cron: string;
21567
- /** Format: date-time */
21568
- ends_at?: string;
21569
- };
21570
- /** @enum {string} */
21571
- status: "active" | "completed";
21572
- last_run_at: string | null;
21573
- created_at: string;
21574
- updated_at: string;
22182
+ test_run_id: number;
22183
+ pw_test_id: string;
22184
+ /**
22185
+ * @description How many matchers returned true: one, several, or none.
22186
+ * @enum {string}
22187
+ */
22188
+ decision: "single" | "multiple" | "none";
22189
+ matched_group_ids: string[];
22190
+ candidate_count: number;
22191
+ /** @description True when the project has more than 500 open groups and only the most recently seen were run. */
22192
+ truncated: boolean;
22193
+ /** @description Matcher input contract the matchers ran under; store it with a matcher. */
22194
+ contract_version: number;
22195
+ results: {
22196
+ /** @description The group whose matcher ran; null for a dry-run source. */
22197
+ group_id: string | null;
22198
+ label: string | null;
22199
+ /** @description The matcher returned true. False on any error. */
22200
+ matched: boolean;
22201
+ error?: string;
22202
+ /** @description compile, runtime, not_a_function, not_boolean, timeout, out_of_memory, or executor. */
22203
+ error_kind?: string;
22204
+ duration_ms?: number;
22205
+ /** @description The matcher's console output. */
22206
+ logs: string[];
22207
+ /** @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. */
22208
+ trace_errors: {
22209
+ fn: string;
22210
+ message: string;
22211
+ swallowed?: boolean;
22212
+ }[];
22213
+ }[];
21575
22214
  };
21576
22215
  };
21577
22216
  };
21578
22217
  };
21579
- /** @description Invalid alarm */
21580
- 400: {
22218
+ /** @description Test run or case not found. */
22219
+ 404: {
21581
22220
  headers: {
21582
22221
  [name: string]: unknown;
21583
22222
  };
@@ -21585,17 +22224,48 @@ export interface operations {
21585
22224
  "application/json": components["schemas"]["ErrorResponse"];
21586
22225
  };
21587
22226
  };
21588
- /** @description Session not found */
21589
- 404: {
22227
+ };
22228
+ };
22229
+ convertPullRequestToDraft: {
22230
+ parameters: {
22231
+ query?: never;
22232
+ header?: never;
22233
+ path?: never;
22234
+ cookie?: never;
22235
+ };
22236
+ requestBody?: {
22237
+ content: {
22238
+ "application/json": {
22239
+ /** @description Repository owner. */
22240
+ owner: string;
22241
+ /** @description Repository name. */
22242
+ repo: string;
22243
+ /** @description Pull request number. */
22244
+ pull_number: number;
22245
+ };
22246
+ };
22247
+ };
22248
+ responses: {
22249
+ /** @description The PR is a draft. */
22250
+ 200: {
21590
22251
  headers: {
21591
22252
  [name: string]: unknown;
21592
22253
  };
21593
22254
  content: {
21594
- "application/json": components["schemas"]["ErrorResponse"];
22255
+ "application/json": components["schemas"]["GithubPrConvertToDraftResponse"];
21595
22256
  };
21596
22257
  };
21597
- /** @description Session is closed */
21598
- 409: {
22258
+ /** @description The PR is not open. */
22259
+ 400: {
22260
+ headers: {
22261
+ [name: string]: unknown;
22262
+ };
22263
+ content: {
22264
+ "application/json": components["schemas"]["GithubActionError"];
22265
+ };
22266
+ };
22267
+ /** @description Caller cannot access the project. */
22268
+ 403: {
21599
22269
  headers: {
21600
22270
  [name: string]: unknown;
21601
22271
  };
@@ -21605,27 +22275,46 @@ export interface operations {
21605
22275
  };
21606
22276
  };
21607
22277
  };
21608
- deleteChatSessionAlarm: {
22278
+ markPullRequestReadyForReview: {
21609
22279
  parameters: {
21610
22280
  query?: never;
21611
22281
  header?: never;
21612
- path: {
21613
- id: number;
21614
- alarm_id: number;
21615
- };
22282
+ path?: never;
21616
22283
  cookie?: never;
21617
22284
  };
21618
- requestBody?: never;
22285
+ requestBody?: {
22286
+ content: {
22287
+ "application/json": {
22288
+ /** @description Repository owner. */
22289
+ owner: string;
22290
+ /** @description Repository name. */
22291
+ repo: string;
22292
+ /** @description Pull request number. */
22293
+ pull_number: number;
22294
+ };
22295
+ };
22296
+ };
21619
22297
  responses: {
21620
- /** @description Deleted */
21621
- 204: {
22298
+ /** @description The PR is ready for review. */
22299
+ 200: {
21622
22300
  headers: {
21623
22301
  [name: string]: unknown;
21624
22302
  };
21625
- content?: never;
22303
+ content: {
22304
+ "application/json": components["schemas"]["GithubPrReadyForReviewResponse"];
22305
+ };
21626
22306
  };
21627
- /** @description Alarm not found */
21628
- 404: {
22307
+ /** @description The PR is not open. */
22308
+ 400: {
22309
+ headers: {
22310
+ [name: string]: unknown;
22311
+ };
22312
+ content: {
22313
+ "application/json": components["schemas"]["GithubActionError"];
22314
+ };
22315
+ };
22316
+ /** @description Caller cannot access the project. */
22317
+ 403: {
21629
22318
  headers: {
21630
22319
  [name: string]: unknown;
21631
22320
  };
@@ -21635,128 +22324,89 @@ export interface operations {
21635
22324
  };
21636
22325
  };
21637
22326
  };
21638
- updateChatSessionAlarm: {
22327
+ githubProxy: {
21639
22328
  parameters: {
21640
22329
  query?: never;
21641
22330
  header?: never;
21642
- path: {
21643
- id: number;
21644
- alarm_id: number;
21645
- };
22331
+ path?: never;
21646
22332
  cookie?: never;
21647
22333
  };
21648
22334
  requestBody?: {
21649
22335
  content: {
21650
22336
  "application/json": {
21651
- /** @description New schedule. The message is fixed at creation; delete the alarm and create a new one to change it. */
21652
- timing: {
21653
- /** @enum {string} */
21654
- type: "once";
21655
- /**
21656
- * Format: date-time
21657
- * @description ISO 8601 UTC time at least 5m in the future.
21658
- */
21659
- run_at: string;
21660
- } | {
21661
- /** @enum {string} */
21662
- type: "cron";
21663
- /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21664
- cron: string;
21665
- /** Format: date-time */
21666
- ends_at?: string;
22337
+ /** @description HTTP method for the GitHub request. */
22338
+ method: string;
22339
+ /** @description GitHub API path, e.g. `/repos/o/r`. */
22340
+ url: string;
22341
+ /** @description Request body for write methods. */
22342
+ body?: {
22343
+ [key: string]: unknown;
21667
22344
  };
22345
+ /** @description GitHub App installation owner. Inferred from `/repos/{owner}/{repo}` URLs when omitted; otherwise defaults to `empirical-run`. */
22346
+ owner?: string;
21668
22347
  };
21669
22348
  };
21670
22349
  };
21671
22350
  responses: {
21672
- /** @description Updated alarm */
22351
+ /** @description The GitHub API JSON response, forwarded verbatim. */
21673
22352
  200: {
21674
22353
  headers: {
21675
22354
  [name: string]: unknown;
21676
22355
  };
21677
22356
  content: {
21678
- "application/json": {
21679
- data: {
21680
- id: number;
21681
- /** @description Compatibility alias for id. */
21682
- alarm_id: string;
21683
- /** @description One-time wake time; null for recurring cron alarms. */
21684
- wake_at: string | null;
21685
- chat_session_id: number;
21686
- message: string;
21687
- timing: {
21688
- /** @enum {string} */
21689
- type: "once";
21690
- /**
21691
- * Format: date-time
21692
- * @description ISO 8601 UTC time at least 5m in the future.
21693
- */
21694
- run_at: string;
21695
- } | {
21696
- /** @enum {string} */
21697
- type: "cron";
21698
- /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21699
- cron: string;
21700
- /** Format: date-time */
21701
- ends_at?: string;
21702
- };
21703
- /** @enum {string} */
21704
- status: "active" | "completed";
21705
- last_run_at: string | null;
21706
- created_at: string;
21707
- updated_at: string;
21708
- };
21709
- };
22357
+ "application/json": unknown;
21710
22358
  };
21711
22359
  };
21712
- /** @description Invalid alarm */
22360
+ /** @description A proxy rule rejected the request (including a squash or rebase PR merge), or GitHub returned a client error. */
21713
22361
  400: {
21714
22362
  headers: {
21715
22363
  [name: string]: unknown;
21716
22364
  };
21717
22365
  content: {
21718
- "application/json": components["schemas"]["ErrorResponse"];
22366
+ "application/json": components["schemas"]["GithubProxyError"];
21719
22367
  };
21720
22368
  };
21721
- /** @description Alarm not found */
21722
- 404: {
22369
+ /** @description The URL uses a numeric repository id, the request writes to a protected branch, a project API key attempted a write, or a sandbox proxy rule forbade the request. */
22370
+ 403: {
21723
22371
  headers: {
21724
22372
  [name: string]: unknown;
21725
22373
  };
21726
22374
  content: {
21727
- "application/json": components["schemas"]["ErrorResponse"];
22375
+ "application/json": components["schemas"]["GithubProxyError"];
22376
+ };
22377
+ };
22378
+ /** @description Any other GitHub upstream status is forwarded verbatim with an `{ error }` body. */
22379
+ 502: {
22380
+ headers: {
22381
+ [name: string]: unknown;
21728
22382
  };
22383
+ content?: never;
21729
22384
  };
21730
22385
  };
21731
22386
  };
21732
- getChatSessionState: {
22387
+ getGsheetMetadata: {
21733
22388
  parameters: {
21734
- query?: {
21735
- /** @description Page number (1-indexed). Default 1. */
21736
- page?: number;
21737
- /** @description Entries per page (1-100). Default 50. */
21738
- per_page?: number;
22389
+ query: {
22390
+ /** @description ID of the Google spreadsheet to inspect. */
22391
+ spreadsheet_id: string;
21739
22392
  };
21740
22393
  header?: never;
21741
- path: {
21742
- /** @description Chat session ID. */
21743
- id: number;
21744
- };
22394
+ path?: never;
21745
22395
  cookie?: never;
21746
22396
  };
21747
22397
  requestBody?: never;
21748
22398
  responses: {
21749
- /** @description A page of log entries (newest block first), plus user messages and sandbox state. */
22399
+ /** @description Spreadsheet metadata and access level. */
21750
22400
  200: {
21751
22401
  headers: {
21752
22402
  [name: string]: unknown;
21753
22403
  };
21754
22404
  content: {
21755
- "application/json": components["schemas"]["ChatSessionStateResponse"];
22405
+ "application/json": components["schemas"]["GsheetMetadataResponse"];
21756
22406
  };
21757
22407
  };
21758
- /** @description Chat session not found. */
21759
- 404: {
22408
+ /** @description Invalid request. */
22409
+ 400: {
21760
22410
  headers: {
21761
22411
  [name: string]: unknown;
21762
22412
  };
@@ -21764,222 +22414,109 @@ export interface operations {
21764
22414
  "application/json": components["schemas"]["ErrorResponse"];
21765
22415
  };
21766
22416
  };
21767
- };
21768
- };
21769
- listChatSessionTriggers: {
21770
- parameters: {
21771
- query?: never;
21772
- header?: never;
21773
- path: {
21774
- id: number;
21775
- };
21776
- cookie?: never;
21777
- };
21778
- requestBody?: never;
21779
- responses: {
21780
- /** @description Active triggers */
21781
- 200: {
22417
+ /** @description Unexpected error. */
22418
+ 500: {
21782
22419
  headers: {
21783
22420
  [name: string]: unknown;
21784
22421
  };
21785
22422
  content: {
21786
- "application/json": {
21787
- data: {
21788
- triggers: {
21789
- id: number;
21790
- /** @enum {string} */
21791
- type: "event";
21792
- chat_session_id: number;
21793
- event_type: string;
21794
- entity_type: string;
21795
- /** @description Exact entity id, or null when this trigger matches every entity. */
21796
- entity_id: string | null;
21797
- /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21798
- payload_filter: {
21799
- [key: string]: (string | number | boolean | {
21800
- gt?: number;
21801
- gte?: number;
21802
- lt?: number;
21803
- lte?: number;
21804
- }) | null;
21805
- };
21806
- /**
21807
- * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21808
- * @enum {string}
21809
- */
21810
- cardinality: "one_shot" | "recurring";
21811
- /** @enum {string} */
21812
- status: "active";
21813
- created_at: string;
21814
- }[];
21815
- };
21816
- };
22423
+ "application/json": components["schemas"]["GsheetPlainError"];
21817
22424
  };
21818
22425
  };
21819
- /** @description Session not found */
21820
- 404: {
22426
+ /** @description Upstream Google Sheets API error. */
22427
+ 502: {
21821
22428
  headers: {
21822
22429
  [name: string]: unknown;
21823
22430
  };
21824
22431
  content: {
21825
- "application/json": components["schemas"]["ErrorResponse"];
22432
+ "application/json": components["schemas"]["GsheetPlainError"];
21826
22433
  };
21827
22434
  };
21828
22435
  };
21829
22436
  };
21830
- createChatSessionTrigger: {
22437
+ proxyGsheetRequest: {
21831
22438
  parameters: {
21832
- query?: never;
21833
- header?: never;
21834
- path: {
21835
- id: number;
21836
- };
22439
+ query?: never;
22440
+ header?: never;
22441
+ path?: never;
21837
22442
  cookie?: never;
21838
22443
  };
21839
22444
  requestBody?: {
21840
22445
  content: {
21841
22446
  "application/json": {
21842
- /** @enum {string} */
21843
- type: "event";
21844
- /** @description A subscribable event_type from the canonical Empirical event catalog. */
21845
- event_type: string;
21846
- /** @description Exact canonical entity id to match. Omit on create, or set null on update, to match every entity. */
21847
- entity_id?: string;
21848
- /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21849
- payload_filter?: {
21850
- [key: string]: (string | number | boolean | {
21851
- gt?: number;
21852
- gte?: number;
21853
- lt?: number;
21854
- lte?: number;
21855
- }) | null;
22447
+ /** @description HTTP method to forward to the Google API. */
22448
+ method: string;
22449
+ /** @description Absolute Google API URL to proxy. Must start with an allowed origin. */
22450
+ url: string;
22451
+ /** @description Optional JSON body to forward with the request. */
22452
+ body?: {
22453
+ [key: string]: unknown;
21856
22454
  };
21857
- /**
21858
- * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21859
- * @enum {string}
21860
- */
21861
- cardinality?: "one_shot" | "recurring";
21862
22455
  };
21863
22456
  };
21864
22457
  };
21865
22458
  responses: {
21866
- /** @description Created trigger */
21867
- 201: {
22459
+ /** @description Proxied Google API response. */
22460
+ 200: {
21868
22461
  headers: {
21869
22462
  [name: string]: unknown;
21870
22463
  };
21871
22464
  content: {
21872
- "application/json": {
21873
- data: {
21874
- id: number;
21875
- /** @enum {string} */
21876
- type: "event";
21877
- chat_session_id: number;
21878
- event_type: string;
21879
- entity_type: string;
21880
- /** @description Exact entity id, or null when this trigger matches every entity. */
21881
- entity_id: string | null;
21882
- /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21883
- payload_filter: {
21884
- [key: string]: (string | number | boolean | {
21885
- gt?: number;
21886
- gte?: number;
21887
- lt?: number;
21888
- lte?: number;
21889
- }) | null;
21890
- };
21891
- /**
21892
- * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21893
- * @enum {string}
21894
- */
21895
- cardinality: "one_shot" | "recurring";
21896
- /** @enum {string} */
21897
- status: "active";
21898
- created_at: string;
21899
- };
21900
- };
22465
+ "application/json": components["schemas"]["GsheetProxyResponse"];
21901
22466
  };
21902
22467
  };
21903
- /** @description Invalid or unsubscribable event type */
22468
+ /** @description Invalid request. */
21904
22469
  400: {
21905
22470
  headers: {
21906
22471
  [name: string]: unknown;
21907
22472
  };
21908
22473
  content: {
21909
- "application/json": components["schemas"]["ErrorResponse"];
22474
+ "application/json": components["schemas"]["GsheetProxyBadRequest"];
21910
22475
  };
21911
22476
  };
21912
- /** @description Session not found */
21913
- 404: {
22477
+ /** @description Unexpected error. */
22478
+ 500: {
21914
22479
  headers: {
21915
22480
  [name: string]: unknown;
21916
22481
  };
21917
22482
  content: {
21918
- "application/json": components["schemas"]["ErrorResponse"];
22483
+ "application/json": components["schemas"]["GsheetPlainError"];
21919
22484
  };
21920
22485
  };
21921
- /** @description Session is closed, or the test run already finished */
21922
- 409: {
22486
+ /** @description Upstream Google API error. */
22487
+ 502: {
21923
22488
  headers: {
21924
22489
  [name: string]: unknown;
21925
22490
  };
21926
22491
  content: {
21927
- "application/json": components["schemas"]["ErrorResponse"];
22492
+ "application/json": components["schemas"]["GsheetPlainError"];
21928
22493
  };
21929
22494
  };
21930
22495
  };
21931
22496
  };
21932
- getChatSessionTrigger: {
22497
+ getStaticIps: {
21933
22498
  parameters: {
21934
- query?: never;
21935
- header?: never;
21936
- path: {
21937
- id: number;
21938
- trigger_id: number;
22499
+ query: {
22500
+ /** @description Region to look up. One of: ap-south-1. */
22501
+ region: string;
21939
22502
  };
22503
+ header?: never;
22504
+ path?: never;
21940
22505
  cookie?: never;
21941
22506
  };
21942
22507
  requestBody?: never;
21943
22508
  responses: {
21944
- /** @description Trigger */
22509
+ /** @description Static IPs for the region. */
21945
22510
  200: {
21946
22511
  headers: {
21947
22512
  [name: string]: unknown;
21948
22513
  };
21949
22514
  content: {
21950
- "application/json": {
21951
- data: {
21952
- id: number;
21953
- /** @enum {string} */
21954
- type: "event";
21955
- chat_session_id: number;
21956
- event_type: string;
21957
- entity_type: string;
21958
- /** @description Exact entity id, or null when this trigger matches every entity. */
21959
- entity_id: string | null;
21960
- /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
21961
- payload_filter: {
21962
- [key: string]: (string | number | boolean | {
21963
- gt?: number;
21964
- gte?: number;
21965
- lt?: number;
21966
- lte?: number;
21967
- }) | null;
21968
- };
21969
- /**
21970
- * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21971
- * @enum {string}
21972
- */
21973
- cardinality: "one_shot" | "recurring";
21974
- /** @enum {string} */
21975
- status: "active";
21976
- created_at: string;
21977
- };
21978
- };
22515
+ "application/json": components["schemas"]["StaticIpsResponse"];
21979
22516
  };
21980
22517
  };
21981
- /** @description Session or trigger not found */
21982
- 404: {
22518
+ /** @description Missing or unknown region. */
22519
+ 400: {
21983
22520
  headers: {
21984
22521
  [name: string]: unknown;
21985
22522
  };
@@ -21989,27 +22526,52 @@ export interface operations {
21989
22526
  };
21990
22527
  };
21991
22528
  };
21992
- deleteChatSessionTrigger: {
22529
+ listPlaywrightVersions: {
21993
22530
  parameters: {
21994
22531
  query?: never;
21995
22532
  header?: never;
21996
- path: {
21997
- id: number;
21998
- trigger_id: number;
22533
+ path?: never;
22534
+ cookie?: never;
22535
+ };
22536
+ requestBody?: never;
22537
+ responses: {
22538
+ /** @description Supported Playwright versions and the default version. */
22539
+ 200: {
22540
+ headers: {
22541
+ [name: string]: unknown;
22542
+ };
22543
+ content: {
22544
+ "application/json": components["schemas"]["PlaywrightVersionsResponse"];
22545
+ };
22546
+ };
22547
+ };
22548
+ };
22549
+ listRules: {
22550
+ parameters: {
22551
+ query?: {
22552
+ page?: number;
22553
+ per_page?: number;
22554
+ effect?: "snooze" | "annotate";
22555
+ environment_id?: number;
22556
+ status?: "active" | "expired" | "all";
21999
22557
  };
22558
+ header?: never;
22559
+ path?: never;
22000
22560
  cookie?: never;
22001
22561
  };
22002
22562
  requestBody?: never;
22003
22563
  responses: {
22004
- /** @description Deleted */
22005
- 204: {
22564
+ /** @description Paginated list of rules. */
22565
+ 200: {
22006
22566
  headers: {
22007
22567
  [name: string]: unknown;
22008
22568
  };
22009
- content?: never;
22569
+ content: {
22570
+ "application/json": components["schemas"]["RuleListResponse"];
22571
+ };
22010
22572
  };
22011
- /** @description Session or trigger not found */
22012
- 404: {
22573
+ /** @description Invalid request. */
22574
+ 400: {
22013
22575
  headers: {
22014
22576
  [name: string]: unknown;
22015
22577
  };
@@ -22019,79 +22581,29 @@ export interface operations {
22019
22581
  };
22020
22582
  };
22021
22583
  };
22022
- updateChatSessionTrigger: {
22584
+ createRule: {
22023
22585
  parameters: {
22024
22586
  query?: never;
22025
22587
  header?: never;
22026
- path: {
22027
- id: number;
22028
- trigger_id: number;
22029
- };
22588
+ path?: never;
22030
22589
  cookie?: never;
22031
22590
  };
22032
22591
  requestBody?: {
22033
22592
  content: {
22034
- "application/json": {
22035
- /** @description A subscribable event_type from the canonical Empirical event catalog. */
22036
- event_type?: string;
22037
- /** @description Exact canonical entity id to match. Omit on create, or set null on update, to match every entity. */
22038
- entity_id?: string | null;
22039
- /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
22040
- payload_filter?: {
22041
- [key: string]: (string | number | boolean | {
22042
- gt?: number;
22043
- gte?: number;
22044
- lt?: number;
22045
- lte?: number;
22046
- }) | null;
22047
- };
22048
- /**
22049
- * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
22050
- * @enum {string}
22051
- */
22052
- cardinality?: "one_shot" | "recurring";
22053
- };
22593
+ "application/json": components["schemas"]["CreateRuleRequest"];
22054
22594
  };
22055
22595
  };
22056
22596
  responses: {
22057
- /** @description Updated trigger */
22597
+ /** @description The created rule. */
22058
22598
  200: {
22059
22599
  headers: {
22060
22600
  [name: string]: unknown;
22061
22601
  };
22062
22602
  content: {
22063
- "application/json": {
22064
- data: {
22065
- id: number;
22066
- /** @enum {string} */
22067
- type: "event";
22068
- chat_session_id: number;
22069
- event_type: string;
22070
- entity_type: string;
22071
- /** @description Exact entity id, or null when this trigger matches every entity. */
22072
- entity_id: string | null;
22073
- /** @description Optional payload filters. Keys must be allowed for the selected event in the canonical event catalog. A primitive value is an equality match, and enum-like fields only accept the values the event emits. Numeric fields also accept a comparison object such as {"gt": 2} or {"gte": 1, "lte": 5}; operators combine with AND and never match null. */
22074
- payload_filter: {
22075
- [key: string]: (string | number | boolean | {
22076
- gt?: number;
22077
- gte?: number;
22078
- lt?: number;
22079
- lte?: number;
22080
- }) | null;
22081
- };
22082
- /**
22083
- * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
22084
- * @enum {string}
22085
- */
22086
- cardinality: "one_shot" | "recurring";
22087
- /** @enum {string} */
22088
- status: "active";
22089
- created_at: string;
22090
- };
22091
- };
22603
+ "application/json": components["schemas"]["RuleResponse"];
22092
22604
  };
22093
22605
  };
22094
- /** @description Invalid or unsubscribable event type */
22606
+ /** @description Invalid request. */
22095
22607
  400: {
22096
22608
  headers: {
22097
22609
  [name: string]: unknown;
@@ -22100,17 +22612,31 @@ export interface operations {
22100
22612
  "application/json": components["schemas"]["ErrorResponse"];
22101
22613
  };
22102
22614
  };
22103
- /** @description Session or trigger not found */
22104
- 404: {
22615
+ };
22616
+ };
22617
+ getRule: {
22618
+ parameters: {
22619
+ query?: never;
22620
+ header?: never;
22621
+ path: {
22622
+ /** @description Rule ID. */
22623
+ id: number;
22624
+ };
22625
+ cookie?: never;
22626
+ };
22627
+ requestBody?: never;
22628
+ responses: {
22629
+ /** @description The rule. */
22630
+ 200: {
22105
22631
  headers: {
22106
22632
  [name: string]: unknown;
22107
22633
  };
22108
22634
  content: {
22109
- "application/json": components["schemas"]["ErrorResponse"];
22635
+ "application/json": components["schemas"]["RuleResponse"];
22110
22636
  };
22111
22637
  };
22112
- /** @description The test run already finished */
22113
- 409: {
22638
+ /** @description Rule not found. */
22639
+ 404: {
22114
22640
  headers: {
22115
22641
  [name: string]: unknown;
22116
22642
  };
@@ -22120,62 +22646,28 @@ export interface operations {
22120
22646
  };
22121
22647
  };
22122
22648
  };
22123
- checkFailureGroupMatcherOverlap: {
22649
+ deleteRule: {
22124
22650
  parameters: {
22125
22651
  query?: never;
22126
22652
  header?: never;
22127
22653
  path: {
22128
- /** @description Failure group ID. */
22129
- id: string;
22654
+ /** @description Rule ID. */
22655
+ id: number;
22130
22656
  };
22131
22657
  cookie?: never;
22132
22658
  };
22133
- requestBody?: {
22134
- content: {
22135
- "application/json": {
22136
- /** @description Candidate matcher source for this group: `async ({ testRun, testCase, traceUtils }) => boolean`. */
22137
- source: string;
22138
- };
22139
- };
22140
- };
22659
+ requestBody?: never;
22141
22660
  responses: {
22142
- /** @description The other groups' cases the source claims. */
22661
+ /** @description The deleted rule. */
22143
22662
  200: {
22144
22663
  headers: {
22145
22664
  [name: string]: unknown;
22146
22665
  };
22147
22666
  content: {
22148
- "application/json": {
22149
- /** @description Response payload. */
22150
- data: {
22151
- /** @description Cases the source was run against. */
22152
- checked_cases: number;
22153
- /** @description Candidate cases whose run or case could not be loaded. */
22154
- skipped_cases: number;
22155
- /** @description True when candidates were dropped: more than 40 cases, or more than 500 open groups. */
22156
- truncated: boolean;
22157
- /** @description Other groups' members the source returned true for. Empty means no overlap was found among the checked cases. */
22158
- claims: {
22159
- group_id: string;
22160
- label: string | null;
22161
- test_run_id: number;
22162
- pw_test_id: string;
22163
- }[];
22164
- /** @description Cases where the source errored or was not run: no verdict, not a claim. */
22165
- errors: {
22166
- group_id: string;
22167
- label: string | null;
22168
- test_run_id: number;
22169
- pw_test_id: string;
22170
- /** @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. */
22171
- error_kind: string;
22172
- error: string;
22173
- }[];
22174
- };
22175
- };
22667
+ "application/json": components["schemas"]["RuleResponse"];
22176
22668
  };
22177
22669
  };
22178
- /** @description Group not found. */
22670
+ /** @description Rule not found. */
22179
22671
  404: {
22180
22672
  headers: {
22181
22673
  [name: string]: unknown;
@@ -22186,31 +22678,33 @@ export interface operations {
22186
22678
  };
22187
22679
  };
22188
22680
  };
22189
- detachFailureGroupMember: {
22681
+ updateRule: {
22190
22682
  parameters: {
22191
22683
  query?: never;
22192
22684
  header?: never;
22193
22685
  path: {
22194
- /** @description Failure group id. */
22195
- id: string;
22196
- /** @description Member test to detach. */
22197
- test_case_id: string;
22686
+ /** @description Rule ID. */
22687
+ id: number;
22198
22688
  };
22199
22689
  cookie?: never;
22200
22690
  };
22201
- requestBody?: never;
22691
+ requestBody?: {
22692
+ content: {
22693
+ "application/json": components["schemas"]["UpdateRuleRequest"];
22694
+ };
22695
+ };
22202
22696
  responses: {
22203
- /** @description Membership detached. */
22697
+ /** @description The updated rule. */
22204
22698
  200: {
22205
22699
  headers: {
22206
22700
  [name: string]: unknown;
22207
22701
  };
22208
22702
  content: {
22209
- "application/json": components["schemas"]["FailureGroupDetachMemberResponse"];
22703
+ "application/json": components["schemas"]["RuleResponse"];
22210
22704
  };
22211
22705
  };
22212
- /** @description Only humans and agents may detach a membership. */
22213
- 403: {
22706
+ /** @description Invalid request. */
22707
+ 400: {
22214
22708
  headers: {
22215
22709
  [name: string]: unknown;
22216
22710
  };
@@ -22218,7 +22712,7 @@ export interface operations {
22218
22712
  "application/json": components["schemas"]["ErrorResponse"];
22219
22713
  };
22220
22714
  };
22221
- /** @description Group not found. */
22715
+ /** @description Rule not found. */
22222
22716
  404: {
22223
22717
  headers: {
22224
22718
  [name: string]: unknown;
@@ -22229,74 +22723,28 @@ export interface operations {
22229
22723
  };
22230
22724
  };
22231
22725
  };
22232
- matchFailureGroups: {
22726
+ listRuleRevisions: {
22233
22727
  parameters: {
22234
22728
  query?: never;
22235
22729
  header?: never;
22236
- path?: never;
22237
- cookie?: never;
22238
- };
22239
- requestBody?: {
22240
- content: {
22241
- "application/json": {
22242
- /** @description Run holding the case to match. */
22243
- test_run_id: number;
22244
- /** @description Case (Playwright test id) to match. Any status: failed or flaky. */
22245
- pw_test_id: string;
22246
- /** @description Dry-run this matcher source instead of the groups' matchers: `async ({ testRun, testCase, traceUtils }) => boolean`. */
22247
- source?: string;
22248
- /** @description Only run these groups' matchers. Default: every open group with a matcher. */
22249
- group_ids?: string[];
22250
- };
22730
+ path: {
22731
+ /** @description Rule ID. */
22732
+ id: number;
22251
22733
  };
22734
+ cookie?: never;
22252
22735
  };
22736
+ requestBody?: never;
22253
22737
  responses: {
22254
- /** @description Matcher results for the case. */
22738
+ /** @description The rule's revisions. */
22255
22739
  200: {
22256
22740
  headers: {
22257
22741
  [name: string]: unknown;
22258
22742
  };
22259
22743
  content: {
22260
- "application/json": {
22261
- /** @description Response payload. */
22262
- data: {
22263
- test_run_id: number;
22264
- pw_test_id: string;
22265
- /**
22266
- * @description How many matchers returned true: one, several, or none.
22267
- * @enum {string}
22268
- */
22269
- decision: "single" | "multiple" | "none";
22270
- matched_group_ids: string[];
22271
- candidate_count: number;
22272
- /** @description True when the project has more than 500 open groups and only the most recently seen were run. */
22273
- truncated: boolean;
22274
- /** @description Matcher input contract the matchers ran under; store it with a matcher. */
22275
- contract_version: number;
22276
- results: {
22277
- /** @description The group whose matcher ran; null for a dry-run source. */
22278
- group_id: string | null;
22279
- label: string | null;
22280
- /** @description The matcher returned true. False on any error. */
22281
- matched: boolean;
22282
- error?: string;
22283
- /** @description compile, runtime, not_a_function, not_boolean, timeout, out_of_memory, or executor. */
22284
- error_kind?: string;
22285
- duration_ms?: number;
22286
- /** @description The matcher's console output. */
22287
- logs: string[];
22288
- /** @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. */
22289
- trace_errors: {
22290
- fn: string;
22291
- message: string;
22292
- swallowed?: boolean;
22293
- }[];
22294
- }[];
22295
- };
22296
- };
22744
+ "application/json": components["schemas"]["RuleRevisionListResponse"];
22297
22745
  };
22298
22746
  };
22299
- /** @description Test run or case not found. */
22747
+ /** @description Rule not found. */
22300
22748
  404: {
22301
22749
  headers: {
22302
22750
  [name: string]: unknown;
@@ -22307,7 +22755,7 @@ export interface operations {
22307
22755
  };
22308
22756
  };
22309
22757
  };
22310
- convertPullRequestToDraft: {
22758
+ matchRules: {
22311
22759
  parameters: {
22312
22760
  query?: never;
22313
22761
  header?: never;
@@ -22316,37 +22764,21 @@ export interface operations {
22316
22764
  };
22317
22765
  requestBody?: {
22318
22766
  content: {
22319
- "application/json": {
22320
- /** @description Repository owner. */
22321
- owner: string;
22322
- /** @description Repository name. */
22323
- repo: string;
22324
- /** @description Pull request number. */
22325
- pull_number: number;
22326
- };
22767
+ "application/json": components["schemas"]["MatchRulesRequest"];
22327
22768
  };
22328
22769
  };
22329
22770
  responses: {
22330
- /** @description The PR is a draft. */
22771
+ /** @description Rules that cover the case. */
22331
22772
  200: {
22332
22773
  headers: {
22333
22774
  [name: string]: unknown;
22334
22775
  };
22335
22776
  content: {
22336
- "application/json": components["schemas"]["GithubPrConvertToDraftResponse"];
22337
- };
22338
- };
22339
- /** @description The PR is not open. */
22340
- 400: {
22341
- headers: {
22342
- [name: string]: unknown;
22343
- };
22344
- content: {
22345
- "application/json": components["schemas"]["GithubActionError"];
22777
+ "application/json": components["schemas"]["MatchRulesResponse"];
22346
22778
  };
22347
22779
  };
22348
- /** @description Caller cannot access the project. */
22349
- 403: {
22780
+ /** @description Test run or case not found. */
22781
+ 404: {
22350
22782
  headers: {
22351
22783
  [name: string]: unknown;
22352
22784
  };
@@ -22356,46 +22788,42 @@ export interface operations {
22356
22788
  };
22357
22789
  };
22358
22790
  };
22359
- markPullRequestReadyForReview: {
22791
+ listTasks: {
22360
22792
  parameters: {
22361
- query?: never;
22793
+ query?: {
22794
+ /** @description Page number (1-indexed). */
22795
+ page?: number;
22796
+ /** @description Items per page. */
22797
+ per_page?: number;
22798
+ /** @description URL-encoded JSON array of generic filter conditions; malformed input is ignored. */
22799
+ filters?: string;
22800
+ };
22362
22801
  header?: never;
22363
22802
  path?: never;
22364
22803
  cookie?: never;
22365
22804
  };
22366
- requestBody?: {
22367
- content: {
22368
- "application/json": {
22369
- /** @description Repository owner. */
22370
- owner: string;
22371
- /** @description Repository name. */
22372
- repo: string;
22373
- /** @description Pull request number. */
22374
- pull_number: number;
22375
- };
22376
- };
22377
- };
22805
+ requestBody?: never;
22378
22806
  responses: {
22379
- /** @description The PR is ready for review. */
22807
+ /** @description Paginated list of tasks. */
22380
22808
  200: {
22381
22809
  headers: {
22382
22810
  [name: string]: unknown;
22383
22811
  };
22384
22812
  content: {
22385
- "application/json": components["schemas"]["GithubPrReadyForReviewResponse"];
22813
+ "application/json": components["schemas"]["TaskListResponse"];
22386
22814
  };
22387
22815
  };
22388
- /** @description The PR is not open. */
22816
+ /** @description Invalid request or missing project scope. */
22389
22817
  400: {
22390
22818
  headers: {
22391
22819
  [name: string]: unknown;
22392
22820
  };
22393
22821
  content: {
22394
- "application/json": components["schemas"]["GithubActionError"];
22822
+ "application/json": components["schemas"]["ErrorResponse"];
22395
22823
  };
22396
22824
  };
22397
- /** @description Caller cannot access the project. */
22398
- 403: {
22825
+ /** @description Project not found or inaccessible. */
22826
+ 404: {
22399
22827
  headers: {
22400
22828
  [name: string]: unknown;
22401
22829
  };
@@ -22405,7 +22833,7 @@ export interface operations {
22405
22833
  };
22406
22834
  };
22407
22835
  };
22408
- githubProxy: {
22836
+ createTask: {
22409
22837
  parameters: {
22410
22838
  query?: never;
22411
22839
  header?: never;
@@ -22414,79 +22842,70 @@ export interface operations {
22414
22842
  };
22415
22843
  requestBody?: {
22416
22844
  content: {
22417
- "application/json": {
22418
- /** @description HTTP method for the GitHub request. */
22419
- method: string;
22420
- /** @description GitHub API path, e.g. `/repos/o/r`. */
22421
- url: string;
22422
- /** @description Request body for write methods. */
22423
- body?: {
22424
- [key: string]: unknown;
22425
- };
22426
- /** @description GitHub App installation owner. Inferred from `/repos/{owner}/{repo}` URLs when omitted; otherwise defaults to `empirical-run`. */
22427
- owner?: string;
22428
- };
22845
+ "application/json": components["schemas"]["CreateTaskRequest"];
22429
22846
  };
22430
22847
  };
22431
22848
  responses: {
22432
- /** @description The GitHub API JSON response, forwarded verbatim. */
22433
- 200: {
22849
+ /** @description The created task. */
22850
+ 201: {
22434
22851
  headers: {
22435
22852
  [name: string]: unknown;
22436
22853
  };
22437
22854
  content: {
22438
- "application/json": unknown;
22855
+ "application/json": components["schemas"]["CreateTaskResponse"];
22439
22856
  };
22440
22857
  };
22441
- /** @description A proxy rule rejected the request (including a squash or rebase PR merge), or GitHub returned a client error. */
22858
+ /** @description Missing required fields, no person to own the task, or invalid input. */
22442
22859
  400: {
22443
22860
  headers: {
22444
22861
  [name: string]: unknown;
22445
22862
  };
22446
22863
  content: {
22447
- "application/json": components["schemas"]["GithubProxyError"];
22864
+ "application/json": components["schemas"]["CreateTaskError"];
22448
22865
  };
22449
22866
  };
22450
- /** @description The URL uses a numeric repository id, the request writes to a protected branch, a project API key attempted a write, or a sandbox proxy rule forbade the request. */
22451
- 403: {
22867
+ /** @description Project not found or inaccessible. */
22868
+ 404: {
22452
22869
  headers: {
22453
22870
  [name: string]: unknown;
22454
22871
  };
22455
22872
  content: {
22456
- "application/json": components["schemas"]["GithubProxyError"];
22873
+ "application/json": components["schemas"]["ErrorResponse"];
22457
22874
  };
22458
22875
  };
22459
- /** @description Any other GitHub upstream status is forwarded verbatim with an `{ error }` body. */
22460
- 502: {
22876
+ /** @description Failed to create task. */
22877
+ 500: {
22461
22878
  headers: {
22462
22879
  [name: string]: unknown;
22463
22880
  };
22464
- content?: never;
22881
+ content: {
22882
+ "application/json": components["schemas"]["ErrorResponse"];
22883
+ };
22465
22884
  };
22466
22885
  };
22467
22886
  };
22468
- getGsheetMetadata: {
22887
+ getTask: {
22469
22888
  parameters: {
22470
- query: {
22471
- /** @description ID of the Google spreadsheet to inspect. */
22472
- spreadsheet_id: string;
22473
- };
22889
+ query?: never;
22474
22890
  header?: never;
22475
- path?: never;
22891
+ path: {
22892
+ /** @description Task ID. */
22893
+ id: number;
22894
+ };
22476
22895
  cookie?: never;
22477
22896
  };
22478
22897
  requestBody?: never;
22479
22898
  responses: {
22480
- /** @description Spreadsheet metadata and access level. */
22899
+ /** @description The task. */
22481
22900
  200: {
22482
22901
  headers: {
22483
22902
  [name: string]: unknown;
22484
22903
  };
22485
22904
  content: {
22486
- "application/json": components["schemas"]["GsheetMetadataResponse"];
22905
+ "application/json": components["schemas"]["TaskResponse"];
22487
22906
  };
22488
22907
  };
22489
- /** @description Invalid request. */
22908
+ /** @description Invalid task ID. */
22490
22909
  400: {
22491
22910
  headers: {
22492
22911
  [name: string]: unknown;
@@ -22495,102 +22914,99 @@ export interface operations {
22495
22914
  "application/json": components["schemas"]["ErrorResponse"];
22496
22915
  };
22497
22916
  };
22498
- /** @description Unexpected error. */
22499
- 500: {
22500
- headers: {
22501
- [name: string]: unknown;
22502
- };
22503
- content: {
22504
- "application/json": components["schemas"]["GsheetPlainError"];
22505
- };
22506
- };
22507
- /** @description Upstream Google Sheets API error. */
22508
- 502: {
22917
+ /** @description Task not found. */
22918
+ 404: {
22509
22919
  headers: {
22510
22920
  [name: string]: unknown;
22511
22921
  };
22512
22922
  content: {
22513
- "application/json": components["schemas"]["GsheetPlainError"];
22923
+ "application/json": components["schemas"]["ErrorResponse"];
22514
22924
  };
22515
22925
  };
22516
22926
  };
22517
22927
  };
22518
- proxyGsheetRequest: {
22928
+ deleteTask: {
22519
22929
  parameters: {
22520
22930
  query?: never;
22521
22931
  header?: never;
22522
- path?: never;
22523
- cookie?: never;
22524
- };
22525
- requestBody?: {
22526
- content: {
22527
- "application/json": {
22528
- /** @description HTTP method to forward to the Google API. */
22529
- method: string;
22530
- /** @description Absolute Google API URL to proxy. Must start with an allowed origin. */
22531
- url: string;
22532
- /** @description Optional JSON body to forward with the request. */
22533
- body?: {
22534
- [key: string]: unknown;
22535
- };
22536
- };
22932
+ path: {
22933
+ /** @description Task ID. */
22934
+ id: number;
22537
22935
  };
22936
+ cookie?: never;
22538
22937
  };
22938
+ requestBody?: never;
22539
22939
  responses: {
22540
- /** @description Proxied Google API response. */
22940
+ /** @description The deleted task ID. */
22541
22941
  200: {
22542
22942
  headers: {
22543
22943
  [name: string]: unknown;
22544
22944
  };
22545
22945
  content: {
22546
- "application/json": components["schemas"]["GsheetProxyResponse"];
22946
+ "application/json": components["schemas"]["DeletedTaskResponse"];
22547
22947
  };
22548
22948
  };
22549
- /** @description Invalid request. */
22949
+ /** @description Invalid task ID. */
22550
22950
  400: {
22551
22951
  headers: {
22552
22952
  [name: string]: unknown;
22553
22953
  };
22554
22954
  content: {
22555
- "application/json": components["schemas"]["GsheetProxyBadRequest"];
22556
- };
22557
- };
22558
- /** @description Unexpected error. */
22559
- 500: {
22560
- headers: {
22561
- [name: string]: unknown;
22562
- };
22563
- content: {
22564
- "application/json": components["schemas"]["GsheetPlainError"];
22955
+ "application/json": components["schemas"]["ErrorResponse"];
22565
22956
  };
22566
22957
  };
22567
- /** @description Upstream Google API error. */
22568
- 502: {
22958
+ /** @description Task not found or not deleted. */
22959
+ 404: {
22569
22960
  headers: {
22570
22961
  [name: string]: unknown;
22571
22962
  };
22572
22963
  content: {
22573
- "application/json": components["schemas"]["GsheetPlainError"];
22964
+ "application/json": components["schemas"]["ErrorResponse"];
22574
22965
  };
22575
22966
  };
22576
22967
  };
22577
22968
  };
22578
- listPlaywrightVersions: {
22969
+ updateTask: {
22579
22970
  parameters: {
22580
22971
  query?: never;
22581
22972
  header?: never;
22582
- path?: never;
22973
+ path: {
22974
+ /** @description Task ID. */
22975
+ id: number;
22976
+ };
22583
22977
  cookie?: never;
22584
22978
  };
22585
- requestBody?: never;
22979
+ requestBody?: {
22980
+ content: {
22981
+ "application/json": components["schemas"]["UpdateTaskRequest"];
22982
+ };
22983
+ };
22586
22984
  responses: {
22587
- /** @description Supported Playwright versions and the default version. */
22985
+ /** @description The updated task. */
22588
22986
  200: {
22589
22987
  headers: {
22590
22988
  [name: string]: unknown;
22591
22989
  };
22592
22990
  content: {
22593
- "application/json": components["schemas"]["PlaywrightVersionsResponse"];
22991
+ "application/json": components["schemas"]["UpdatedTaskResponse"];
22992
+ };
22993
+ };
22994
+ /** @description No fields to update or invalid input. */
22995
+ 400: {
22996
+ headers: {
22997
+ [name: string]: unknown;
22998
+ };
22999
+ content: {
23000
+ "application/json": components["schemas"]["ErrorResponse"];
23001
+ };
23002
+ };
23003
+ /** @description Task not found or not updated. */
23004
+ 404: {
23005
+ headers: {
23006
+ [name: string]: unknown;
23007
+ };
23008
+ content: {
23009
+ "application/json": components["schemas"]["ErrorResponse"];
22594
23010
  };
22595
23011
  };
22596
23012
  };
@@ -22826,41 +23242,216 @@ export interface operations {
22826
23242
  path?: never;
22827
23243
  cookie?: never;
22828
23244
  };
22829
- requestBody?: {
22830
- content: {
22831
- "application/json": components["schemas"]["UpsertTriageStatusRequest"];
22832
- };
22833
- };
23245
+ requestBody?: {
23246
+ content: {
23247
+ "application/json": components["schemas"]["UpsertTriageStatusRequest"];
23248
+ };
23249
+ };
23250
+ responses: {
23251
+ /** @description The triage status. */
23252
+ 200: {
23253
+ headers: {
23254
+ [name: string]: unknown;
23255
+ };
23256
+ content: {
23257
+ "application/json": components["schemas"]["TriageStatusResponse"];
23258
+ };
23259
+ };
23260
+ /** @description Invalid request. */
23261
+ 400: {
23262
+ headers: {
23263
+ [name: string]: unknown;
23264
+ };
23265
+ content: {
23266
+ "application/json": components["schemas"]["ErrorResponse"];
23267
+ };
23268
+ };
23269
+ /** @description Sandbox authentication required. */
23270
+ 403: {
23271
+ headers: {
23272
+ [name: string]: unknown;
23273
+ };
23274
+ content: {
23275
+ "application/json": components["schemas"]["ErrorResponse"];
23276
+ };
23277
+ };
23278
+ /** @description Test run or failure group not found. */
23279
+ 404: {
23280
+ headers: {
23281
+ [name: string]: unknown;
23282
+ };
23283
+ content: {
23284
+ "application/json": components["schemas"]["ErrorResponse"];
23285
+ };
23286
+ };
23287
+ };
23288
+ };
23289
+ listUsers: {
23290
+ parameters: {
23291
+ query: {
23292
+ /** @description Search term matched against user name or email. */
23293
+ query: string;
23294
+ /** @description Maximum users to return. Default 10; max 10. */
23295
+ limit?: number;
23296
+ };
23297
+ header?: never;
23298
+ path?: never;
23299
+ cookie?: never;
23300
+ };
23301
+ requestBody?: never;
23302
+ responses: {
23303
+ /** @description Matching users. */
23304
+ 200: {
23305
+ headers: {
23306
+ [name: string]: unknown;
23307
+ };
23308
+ content: {
23309
+ "application/json": components["schemas"]["UsersListResponse"];
23310
+ };
23311
+ };
23312
+ /** @description Invalid request or ambiguous project scope. */
23313
+ 400: {
23314
+ headers: {
23315
+ [name: string]: unknown;
23316
+ };
23317
+ content: {
23318
+ "application/json": components["schemas"]["ErrorResponse"];
23319
+ };
23320
+ };
23321
+ /** @description Project not found or not accessible. */
23322
+ 404: {
23323
+ headers: {
23324
+ [name: string]: unknown;
23325
+ };
23326
+ content: {
23327
+ "application/json": components["schemas"]["ErrorResponse"];
23328
+ };
23329
+ };
23330
+ };
23331
+ };
23332
+ getUser: {
23333
+ parameters: {
23334
+ query?: never;
23335
+ header?: never;
23336
+ path: {
23337
+ /** @description User ID. */
23338
+ id: string;
23339
+ };
23340
+ cookie?: never;
23341
+ };
23342
+ requestBody?: never;
23343
+ responses: {
23344
+ /** @description User details with connected accounts. */
23345
+ 200: {
23346
+ headers: {
23347
+ [name: string]: unknown;
23348
+ };
23349
+ content: {
23350
+ "application/json": components["schemas"]["UserDetailResponse"];
23351
+ };
23352
+ };
23353
+ /** @description User not found. */
23354
+ 404: {
23355
+ headers: {
23356
+ [name: string]: unknown;
23357
+ };
23358
+ content: {
23359
+ "application/json": components["schemas"]["ErrorResponse"];
23360
+ };
23361
+ };
23362
+ };
23363
+ };
23364
+ getOverlayDismissalSummary: {
23365
+ parameters: {
23366
+ query?: {
23367
+ /** @description Page number (1-indexed). Default 1. */
23368
+ page?: string;
23369
+ /** @description Items per page (1-100). Default 50. */
23370
+ per_page?: string;
23371
+ /** @description Look-back window in days (1-90, default 7). Ignored when `start_date` and `end_date` are set. */
23372
+ days?: string;
23373
+ /** @description Start of a custom date range (ISO 8601). */
23374
+ start_date?: string;
23375
+ /** @description End of a custom date range (ISO 8601). */
23376
+ end_date?: string;
23377
+ /** @description Filter by environment name. */
23378
+ environment?: string;
23379
+ /** @description Filter by test run ID. */
23380
+ test_run_id?: string;
23381
+ /** @description Case-insensitive substring filter on test name. */
23382
+ test_name?: string;
23383
+ /** @description Filter by success: `true` or `false`. Other values ignored. */
23384
+ success?: string;
23385
+ /** @description Filter by cache hit: `true` or `false`. Other values ignored. */
23386
+ cache_hit?: string;
23387
+ };
23388
+ header?: never;
23389
+ path?: never;
23390
+ cookie?: never;
23391
+ };
23392
+ requestBody?: never;
23393
+ responses: {
23394
+ /** @description Overlay-dismissal summary for the project. */
23395
+ 200: {
23396
+ headers: {
23397
+ [name: string]: unknown;
23398
+ };
23399
+ content: {
23400
+ "application/json": components["schemas"]["OverlayDismissalSummaryResponse"];
23401
+ };
23402
+ };
23403
+ /** @description Failed to query telemetry. */
23404
+ 500: {
23405
+ headers: {
23406
+ [name: string]: unknown;
23407
+ };
23408
+ content: {
23409
+ "application/json": components["schemas"]["ErrorResponse"];
23410
+ };
23411
+ };
23412
+ };
23413
+ };
23414
+ getOverlayDismissalEvents: {
23415
+ parameters: {
23416
+ query?: {
23417
+ /** @description Page number (1-indexed). Default 1. */
23418
+ page?: string;
23419
+ /** @description Items per page (1-100). Default 50. */
23420
+ per_page?: string;
23421
+ /** @description Look-back window in days (1-90, default 7). Ignored when `start_date` and `end_date` are set. */
23422
+ days?: string;
23423
+ /** @description Start of a custom date range (ISO 8601). */
23424
+ start_date?: string;
23425
+ /** @description End of a custom date range (ISO 8601). */
23426
+ end_date?: string;
23427
+ /** @description Filter by environment name. */
23428
+ environment?: string;
23429
+ /** @description Filter by test run ID. */
23430
+ test_run_id?: string;
23431
+ /** @description Case-insensitive substring filter on test name. */
23432
+ test_name?: string;
23433
+ /** @description Filter by success: `true` or `false`. Other values ignored. */
23434
+ success?: string;
23435
+ /** @description Filter by cache hit: `true` or `false`. Other values ignored. */
23436
+ cache_hit?: string;
23437
+ };
23438
+ header?: never;
23439
+ path?: never;
23440
+ cookie?: never;
23441
+ };
23442
+ requestBody?: never;
22834
23443
  responses: {
22835
- /** @description The triage status. */
23444
+ /** @description Paginated overlay-dismissal events for the project. */
22836
23445
  200: {
22837
23446
  headers: {
22838
23447
  [name: string]: unknown;
22839
23448
  };
22840
23449
  content: {
22841
- "application/json": components["schemas"]["TriageStatusResponse"];
22842
- };
22843
- };
22844
- /** @description Invalid request. */
22845
- 400: {
22846
- headers: {
22847
- [name: string]: unknown;
22848
- };
22849
- content: {
22850
- "application/json": components["schemas"]["ErrorResponse"];
22851
- };
22852
- };
22853
- /** @description Sandbox authentication required. */
22854
- 403: {
22855
- headers: {
22856
- [name: string]: unknown;
22857
- };
22858
- content: {
22859
- "application/json": components["schemas"]["ErrorResponse"];
23450
+ "application/json": components["schemas"]["OverlayDismissalEventsResponse"];
22860
23451
  };
22861
23452
  };
22862
- /** @description Test run or failure group not found. */
22863
- 404: {
23453
+ /** @description Failed to query telemetry. */
23454
+ 500: {
22864
23455
  headers: {
22865
23456
  [name: string]: unknown;
22866
23457
  };
@@ -22870,30 +23461,41 @@ export interface operations {
22870
23461
  };
22871
23462
  };
22872
23463
  };
22873
- listUsers: {
23464
+ listTestRunCases: {
22874
23465
  parameters: {
22875
- query: {
22876
- /** @description Search term matched against user name or email. */
22877
- query: string;
22878
- /** @description Maximum users to return. Default 10; max 10. */
22879
- limit?: number;
23466
+ query?: {
23467
+ /** @description Filter to cases with this status. */
23468
+ status?: "passed" | "failed" | "flaky" | "skipped";
23469
+ /** @description Page number (1-indexed). Default 1. */
23470
+ page?: number;
23471
+ /** @description Items per page (capped at 200). Default 50. */
23472
+ per_page?: number;
23473
+ /** @description Row order. `scheduled` (default) is manifest order — stable for a finished run. `recent` is most-recently-completed first, for the live view of an active run. `duration` is slowest first (total time across attempts). `start_time` is earliest first attempt first; skipped tests last. */
23474
+ order?: "scheduled" | "recent" | "duration" | "start_time";
23475
+ /** @description Case-insensitive substring search over the test's full name (project, file, describe blocks, title), Playwright test id and failing line. Combines with `status`, `order` and paging; `pagination.total` counts the matches. Failing lines are searchable only for cases recorded after this parameter was added. */
23476
+ q?: string;
23477
+ /** @description When `true`, also returns cases that have reported at least one attempt but still have retries outstanding, marked `is_retrying: true`. Their `status` is provisional (from the attempts so far) and can change when the remaining retries land. Defaults to `false`. */
23478
+ include_retrying?: "true" | "false";
22880
23479
  };
22881
23480
  header?: never;
22882
- path?: never;
23481
+ path: {
23482
+ /** @description Test run database ID. */
23483
+ id: number;
23484
+ };
22883
23485
  cookie?: never;
22884
23486
  };
22885
23487
  requestBody?: never;
22886
23488
  responses: {
22887
- /** @description Matching users. */
23489
+ /** @description Paginated list of test run cases. */
22888
23490
  200: {
22889
23491
  headers: {
22890
23492
  [name: string]: unknown;
22891
23493
  };
22892
23494
  content: {
22893
- "application/json": components["schemas"]["UsersListResponse"];
23495
+ "application/json": components["schemas"]["ListTestRunCasesResponse"];
22894
23496
  };
22895
23497
  };
22896
- /** @description Invalid request or ambiguous project scope. */
23498
+ /** @description Invalid request. */
22897
23499
  400: {
22898
23500
  headers: {
22899
23501
  [name: string]: unknown;
@@ -22902,7 +23504,7 @@ export interface operations {
22902
23504
  "application/json": components["schemas"]["ErrorResponse"];
22903
23505
  };
22904
23506
  };
22905
- /** @description Project not found or not accessible. */
23507
+ /** @description Test run not found. */
22906
23508
  404: {
22907
23509
  headers: {
22908
23510
  [name: string]: unknown;
@@ -22913,28 +23515,42 @@ export interface operations {
22913
23515
  };
22914
23516
  };
22915
23517
  };
22916
- getUser: {
23518
+ getTestRunCase: {
22917
23519
  parameters: {
22918
- query?: never;
23520
+ query?: {
23521
+ /** @description When `true`, also returns cases that have reported at least one attempt but still have retries outstanding, marked `is_retrying: true`. Their `status` is provisional (from the attempts so far) and can change when the remaining retries land. Defaults to `false`. */
23522
+ include_retrying?: "true" | "false";
23523
+ };
22919
23524
  header?: never;
22920
23525
  path: {
22921
- /** @description User ID. */
22922
- id: string;
23526
+ /** @description Test run database ID. */
23527
+ id: number;
23528
+ /** @description Playwright test ID (`pw_test_id`) of the case. */
23529
+ case_id: string;
22923
23530
  };
22924
23531
  cookie?: never;
22925
23532
  };
22926
23533
  requestBody?: never;
22927
23534
  responses: {
22928
- /** @description User details with connected accounts. */
23535
+ /** @description The test run case. */
22929
23536
  200: {
22930
23537
  headers: {
22931
23538
  [name: string]: unknown;
22932
23539
  };
22933
23540
  content: {
22934
- "application/json": components["schemas"]["UserDetailResponse"];
23541
+ "application/json": components["schemas"]["GetTestRunCaseResponse"];
22935
23542
  };
22936
23543
  };
22937
- /** @description User not found. */
23544
+ /** @description Invalid request. */
23545
+ 400: {
23546
+ headers: {
23547
+ [name: string]: unknown;
23548
+ };
23549
+ content: {
23550
+ "application/json": components["schemas"]["ErrorResponse"];
23551
+ };
23552
+ };
23553
+ /** @description Test run or test case not found. */
22938
23554
  404: {
22939
23555
  headers: {
22940
23556
  [name: string]: unknown;
@@ -23660,6 +24276,8 @@ export interface operations {
23660
24276
  exclude_project_ids?: string;
23661
24277
  /** @description Comma-separated creator user IDs to filter by. */
23662
24278
  user_ids?: string;
24279
+ /** @description Matches the session title, the creator's name or email, or the session ID. */
24280
+ search?: string;
23663
24281
  /** @description Only sessions updated within this many days. */
23664
24282
  updated_within_days?: number;
23665
24283
  /** @description URL-encoded JSON array of generic filter conditions. */
@@ -24454,7 +25072,7 @@ export interface operations {
24454
25072
  "application/json": components["schemas"]["ChatSessionForwardMessageResponse"];
24455
25073
  };
24456
25074
  };
24457
- /** @description Invalid request. */
25075
+ /** @description Invalid request, or the caller is the target session. */
24458
25076
  400: {
24459
25077
  headers: {
24460
25078
  [name: string]: unknown;
@@ -25044,51 +25662,6 @@ export interface operations {
25044
25662
  };
25045
25663
  };
25046
25664
  };
25047
- listChatSessionUsers: {
25048
- parameters: {
25049
- query?: {
25050
- /** @description Restrict to a single project (ignored for bound principals). */
25051
- project_id?: number;
25052
- /** @description Include closed sessions when `true`. */
25053
- show_closed?: boolean | null;
25054
- /** @description Filter sessions by preset (all, active, merged). */
25055
- preset?: "all" | "active" | "merged";
25056
- };
25057
- header?: never;
25058
- path?: never;
25059
- cookie?: never;
25060
- };
25061
- requestBody?: never;
25062
- responses: {
25063
- /** @description Distinct chat-session creators. */
25064
- 200: {
25065
- headers: {
25066
- [name: string]: unknown;
25067
- };
25068
- content: {
25069
- "application/json": components["schemas"]["ChatSessionUsersResponse"];
25070
- };
25071
- };
25072
- /** @description Invalid request. */
25073
- 400: {
25074
- headers: {
25075
- [name: string]: unknown;
25076
- };
25077
- content: {
25078
- "application/json": components["schemas"]["ErrorResponse"];
25079
- };
25080
- };
25081
- /** @description Project not found or not accessible. */
25082
- 404: {
25083
- headers: {
25084
- [name: string]: unknown;
25085
- };
25086
- content: {
25087
- "application/json": components["schemas"]["ErrorResponse"];
25088
- };
25089
- };
25090
- };
25091
- };
25092
25665
  listCreditGrants: {
25093
25666
  parameters: {
25094
25667
  query?: {
@@ -29185,6 +29758,15 @@ export interface operations {
29185
29758
  "application/json": components["schemas"]["ErrorResponse"];
29186
29759
  };
29187
29760
  };
29761
+ /** @description `expected_version` is behind the memory's current version; nothing was deleted. */
29762
+ 409: {
29763
+ headers: {
29764
+ [name: string]: unknown;
29765
+ };
29766
+ content: {
29767
+ "application/json": components["schemas"]["MemoryVersionConflictResponse"];
29768
+ };
29769
+ };
29188
29770
  };
29189
29771
  };
29190
29772
  updateMemory: {
@@ -29221,6 +29803,15 @@ export interface operations {
29221
29803
  "application/json": components["schemas"]["ErrorResponse"];
29222
29804
  };
29223
29805
  };
29806
+ /** @description `expected_version` is behind the memory's current version; nothing was written. */
29807
+ 409: {
29808
+ headers: {
29809
+ [name: string]: unknown;
29810
+ };
29811
+ content: {
29812
+ "application/json": components["schemas"]["MemoryVersionConflictResponse"];
29813
+ };
29814
+ };
29224
29815
  /** @description Refused by the memory write gate: classified as failure/incident state. */
29225
29816
  422: {
29226
29817
  headers: {
@@ -30690,6 +31281,122 @@ export interface operations {
30690
31281
  };
30691
31282
  };
30692
31283
  };
31284
+ listPlatformIssues: {
31285
+ parameters: {
31286
+ query?: {
31287
+ /** @description Only open or only resolved issues. Omit for both. */
31288
+ status?: "open" | "resolved";
31289
+ limit?: number;
31290
+ };
31291
+ header?: never;
31292
+ path?: never;
31293
+ cookie?: never;
31294
+ };
31295
+ requestBody?: never;
31296
+ responses: {
31297
+ /** @description The issues. */
31298
+ 200: {
31299
+ headers: {
31300
+ [name: string]: unknown;
31301
+ };
31302
+ content: {
31303
+ "application/json": components["schemas"]["PlatformIssueListResponse"];
31304
+ };
31305
+ };
31306
+ /** @description Listing every project's issues needs super admin. */
31307
+ 403: {
31308
+ headers: {
31309
+ [name: string]: unknown;
31310
+ };
31311
+ content: {
31312
+ "application/json": components["schemas"]["ErrorResponse"];
31313
+ };
31314
+ };
31315
+ /** @description Project not found or not accessible. */
31316
+ 404: {
31317
+ headers: {
31318
+ [name: string]: unknown;
31319
+ };
31320
+ content: {
31321
+ "application/json": components["schemas"]["ErrorResponse"];
31322
+ };
31323
+ };
31324
+ };
31325
+ };
31326
+ reportPlatformIssue: {
31327
+ parameters: {
31328
+ query?: never;
31329
+ header?: never;
31330
+ path?: never;
31331
+ cookie?: never;
31332
+ };
31333
+ requestBody?: {
31334
+ content: {
31335
+ "application/json": components["schemas"]["ReportPlatformIssueRequest"];
31336
+ };
31337
+ };
31338
+ responses: {
31339
+ /** @description The reported (or already open) issue. */
31340
+ 200: {
31341
+ headers: {
31342
+ [name: string]: unknown;
31343
+ };
31344
+ content: {
31345
+ "application/json": components["schemas"]["ReportPlatformIssueResponse"];
31346
+ };
31347
+ };
31348
+ /** @description Invalid request or missing project scope. */
31349
+ 400: {
31350
+ headers: {
31351
+ [name: string]: unknown;
31352
+ };
31353
+ content: {
31354
+ "application/json": components["schemas"]["ErrorResponse"];
31355
+ };
31356
+ };
31357
+ /** @description Project or memory not found. */
31358
+ 404: {
31359
+ headers: {
31360
+ [name: string]: unknown;
31361
+ };
31362
+ content: {
31363
+ "application/json": components["schemas"]["ErrorResponse"];
31364
+ };
31365
+ };
31366
+ };
31367
+ };
31368
+ resolvePlatformIssue: {
31369
+ parameters: {
31370
+ query?: never;
31371
+ header?: never;
31372
+ path: {
31373
+ /** @description Issue ID. */
31374
+ id: number;
31375
+ };
31376
+ cookie?: never;
31377
+ };
31378
+ requestBody?: never;
31379
+ responses: {
31380
+ /** @description The resolved issue. */
31381
+ 200: {
31382
+ headers: {
31383
+ [name: string]: unknown;
31384
+ };
31385
+ content: {
31386
+ "application/json": components["schemas"]["PlatformIssueResponse"];
31387
+ };
31388
+ };
31389
+ /** @description Issue not found. */
31390
+ 404: {
31391
+ headers: {
31392
+ [name: string]: unknown;
31393
+ };
31394
+ content: {
31395
+ "application/json": components["schemas"]["ErrorResponse"];
31396
+ };
31397
+ };
31398
+ };
31399
+ };
30693
31400
  listProjectAddons: {
30694
31401
  parameters: {
30695
31402
  query?: never;