@empiricalrun/playwright-utils 0.64.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 (46) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/api-worker-client.d.ts +3 -0
  3. package/dist/api-worker-client.d.ts.map +1 -1
  4. package/dist/api-worker-client.js +6 -0
  5. package/dist/generated/api-worker-openapi.d.ts +1775 -1279
  6. package/dist/generated/api-worker-openapi.d.ts.map +1 -1
  7. package/dist/overlay-tests/typesafe.spec.js +5 -3
  8. package/dist/overlay-tests/visual.spec.js +1 -1
  9. package/dist/reporter/attachment-cleanup-test-reporter.d.ts +3 -1
  10. package/dist/reporter/attachment-cleanup-test-reporter.d.ts.map +1 -1
  11. package/dist/reporter/attachment-cleanup-test-reporter.js +5 -1
  12. package/dist/reporter/attachment-cleanup.d.ts +1 -1
  13. package/dist/reporter/attachment-cleanup.d.ts.map +1 -1
  14. package/dist/reporter/attachment-cleanup.js +14 -7
  15. package/dist/reporter/attachment-key.d.ts +3 -0
  16. package/dist/reporter/attachment-key.d.ts.map +1 -0
  17. package/dist/reporter/attachment-key.js +31 -0
  18. package/dist/reporter/empirical-reporter.d.ts +1 -1
  19. package/dist/reporter/empirical-reporter.d.ts.map +1 -1
  20. package/dist/reporter/empirical-reporter.js +7 -6
  21. package/dist/reporter/harness.d.ts +6 -1
  22. package/dist/reporter/harness.d.ts.map +1 -1
  23. package/dist/reporter/harness.js +22 -13
  24. package/dist/reporter/incremental-blob-reporter.d.ts +1 -0
  25. package/dist/reporter/incremental-blob-reporter.d.ts.map +1 -1
  26. package/dist/reporter/incremental-blob-reporter.js +8 -4
  27. package/dist/reporter/presigned-upload.d.ts +15 -0
  28. package/dist/reporter/presigned-upload.d.ts.map +1 -0
  29. package/dist/reporter/presigned-upload.js +96 -0
  30. package/dist/reporter/uploader.d.ts +10 -1
  31. package/dist/reporter/uploader.d.ts.map +1 -1
  32. package/dist/reporter/uploader.js +51 -2
  33. package/dist/reporter/util.d.ts +3 -3
  34. package/dist/reporter/util.d.ts.map +1 -1
  35. package/dist/reporter/util.js +10 -8
  36. package/dist/test/expect/visual.d.ts.map +1 -1
  37. package/dist/test/expect/visual.js +6 -2
  38. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/index.d.ts.map +1 -1
  39. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/index.js +0 -2
  40. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/utils.d.ts +0 -1
  41. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/utils.d.ts.map +1 -1
  42. package/dist/test/scripts/pw-locator-patch/dismiss-overlays/utils.js +0 -20
  43. package/dist/test/scripts/pw-locator-patch/vision/query.d.ts.map +1 -1
  44. package/dist/test/scripts/pw-locator-patch/vision/query.js +57 -5
  45. package/package.json +4 -5
  46. 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,51 +1709,46 @@ export interface paths {
1709
1709
  patch?: never;
1710
1710
  trace?: never;
1711
1711
  };
1712
- "/api/infra/static-ips": {
1712
+ "/api/chat-sessions/{id}/alarms": {
1713
1713
  parameters: {
1714
1714
  query?: never;
1715
1715
  header?: never;
1716
1716
  path?: never;
1717
1717
  cookie?: never;
1718
1718
  };
1719
+ /** 🤖 List a session's alarms */
1720
+ get: operations["listChatSessionAlarms"];
1721
+ put?: never;
1719
1722
  /**
1720
- * 🧪 Get static egress IPs for a region
1721
- * @description Returns the proxy endpoint and the egress IPs to allowlist for the given region.
1723
+ * 🤖 Create a session alarm
1724
+ * @description Creates a relative-delay, absolute-time, or recurring UTC alarm owned by the chat session.
1722
1725
  */
1723
- get: operations["getStaticIps"];
1724
- put?: never;
1725
- post?: never;
1726
+ post: operations["createChatSessionAlarm"];
1726
1727
  delete?: never;
1727
1728
  options?: never;
1728
1729
  head?: never;
1729
1730
  patch?: never;
1730
1731
  trace?: never;
1731
1732
  };
1732
- "/api/tasks": {
1733
+ "/api/chat-sessions/{id}/alarms/{alarm_id}": {
1733
1734
  parameters: {
1734
1735
  query?: never;
1735
1736
  header?: never;
1736
1737
  path?: never;
1737
1738
  cookie?: never;
1738
1739
  };
1739
- /**
1740
- * 🧪 List tasks
1741
- * @description Returns a paginated list of tasks for the scoped project.
1742
- */
1743
- get: operations["listTasks"];
1740
+ get?: never;
1744
1741
  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;
1742
+ post?: never;
1743
+ /** 🤖 Delete a session alarm */
1744
+ delete: operations["deleteChatSessionAlarm"];
1751
1745
  options?: never;
1752
1746
  head?: never;
1753
- patch?: never;
1747
+ /** 🤖 Update a session alarm */
1748
+ patch: operations["updateChatSessionAlarm"];
1754
1749
  trace?: never;
1755
1750
  };
1756
- "/api/tasks/{id}": {
1751
+ "/api/chat-sessions/{id}/session-state": {
1757
1752
  parameters: {
1758
1753
  query?: never;
1759
1754
  header?: never;
@@ -1761,27 +1756,19 @@ export interface paths {
1761
1756
  cookie?: never;
1762
1757
  };
1763
1758
  /**
1764
- * 🧪 Get a task
1765
- * @description Retrieves a single task by ID.
1759
+ * 🤖 Get a session's initial state
1760
+ * @description Returns a session's recent log entries, user messages, and current sandbox state, read from pi-worker over the service binding.
1766
1761
  */
1767
- get: operations["getTask"];
1762
+ get: operations["getChatSessionState"];
1768
1763
  put?: never;
1769
1764
  post?: never;
1770
- /**
1771
- * 🧪 Delete a task
1772
- * @description Permanently deletes a task.
1773
- */
1774
- delete: operations["deleteTask"];
1765
+ delete?: never;
1775
1766
  options?: never;
1776
1767
  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"];
1768
+ patch?: never;
1782
1769
  trace?: never;
1783
1770
  };
1784
- "/api/v1/telemetry/overlay-dismissals": {
1771
+ "/api/chat-sessions/{id}/triggers": {
1785
1772
  parameters: {
1786
1773
  query?: never;
1787
1774
  header?: never;
@@ -1789,100 +1776,102 @@ export interface paths {
1789
1776
  cookie?: never;
1790
1777
  };
1791
1778
  /**
1792
- * 🧪 Overlay-dismissal summary
1793
- * @description Returns aggregated overlay-dismissal metrics for the scoped project.
1779
+ * 🤖 List a session's event triggers
1780
+ * @description Lists active event triggers owned by this chat session. One-shot triggers are consumed after they fire; recurring wildcard triggers remain active.
1794
1781
  */
1795
- get: operations["getOverlayDismissalSummary"];
1782
+ get: operations["listChatSessionTriggers"];
1796
1783
  put?: never;
1797
- post?: never;
1784
+ /**
1785
+ * 🤖 Create an event trigger
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.
1787
+ */
1788
+ post: operations["createChatSessionTrigger"];
1798
1789
  delete?: never;
1799
1790
  options?: never;
1800
1791
  head?: never;
1801
1792
  patch?: never;
1802
1793
  trace?: never;
1803
1794
  };
1804
- "/api/v1/telemetry/overlay-dismissals/events": {
1795
+ "/api/chat-sessions/{id}/triggers/{trigger_id}": {
1805
1796
  parameters: {
1806
1797
  query?: never;
1807
1798
  header?: never;
1808
1799
  path?: never;
1809
1800
  cookie?: never;
1810
1801
  };
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"];
1802
+ /** 🤖 Get an event trigger */
1803
+ get: operations["getChatSessionTrigger"];
1816
1804
  put?: never;
1817
1805
  post?: never;
1818
- delete?: never;
1806
+ /** 🤖 Delete an event trigger */
1807
+ delete: operations["deleteChatSessionTrigger"];
1819
1808
  options?: never;
1820
1809
  head?: never;
1821
- patch?: never;
1810
+ /** 🤖 Update an event trigger */
1811
+ patch: operations["updateChatSessionTrigger"];
1822
1812
  trace?: never;
1823
1813
  };
1824
- "/api/v2/test-runs/{id}/cases": {
1814
+ "/api/failure-groups/{id}/matcher-overlap": {
1825
1815
  parameters: {
1826
1816
  query?: never;
1827
1817
  header?: never;
1828
1818
  path?: never;
1829
1819
  cookie?: never;
1830
1820
  };
1821
+ get?: never;
1822
+ put?: never;
1831
1823
  /**
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.
1824
+ * 🤖 Check a matcher against other groups' members
1825
+ * @description Runs a candidate matcher source for this group against the 2 most recently seen active members of every other open group in the project (round-robin, at most 40 cases) and reports the ones it returns true for. A claim means the matcher overlaps that group. Nothing is persisted.
1834
1826
  */
1835
- get: operations["listTestRunCases"];
1836
- put?: never;
1837
- post?: never;
1827
+ post: operations["checkFailureGroupMatcherOverlap"];
1838
1828
  delete?: never;
1839
1829
  options?: never;
1840
1830
  head?: never;
1841
1831
  patch?: never;
1842
1832
  trace?: never;
1843
1833
  };
1844
- "/api/v2/test-runs/{id}/cases/{case_id}": {
1834
+ "/api/failure-groups/{id}/members/{test_case_id}": {
1845
1835
  parameters: {
1846
1836
  query?: never;
1847
1837
  header?: never;
1848
1838
  path?: never;
1849
1839
  cookie?: never;
1850
1840
  };
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"];
1841
+ get?: never;
1856
1842
  put?: never;
1857
1843
  post?: never;
1858
- delete?: never;
1844
+ /**
1845
+ * 🤖 Detach a test from a failure group
1846
+ * @description Records that this test does not belong to the group. Detaching as an agent is a correction the agent may undo by attaching again. A human detach is sticky: agent attaches will not re-attach the test; only a later human attach supersedes it.
1847
+ */
1848
+ delete: operations["detachFailureGroupMember"];
1859
1849
  options?: never;
1860
1850
  head?: never;
1861
1851
  patch?: never;
1862
1852
  trace?: never;
1863
1853
  };
1864
- "/api/chat-sessions/{id}/alarms": {
1854
+ "/api/failure-groups/match": {
1865
1855
  parameters: {
1866
1856
  query?: never;
1867
1857
  header?: never;
1868
1858
  path?: never;
1869
1859
  cookie?: never;
1870
1860
  };
1871
- /** 🤖 List a session's alarms */
1872
- get: operations["listChatSessionAlarms"];
1861
+ get?: never;
1873
1862
  put?: never;
1874
1863
  /**
1875
- * 🤖 Create a session alarm
1876
- * @description Creates a relative-delay, absolute-time, or recurring UTC alarm owned by the chat session.
1864
+ * 🤖 Run failure-group matchers against a case
1865
+ * @description Runs every open group's matcher (or the given group_ids, or one dry-run source) against a failed or flaky case and reports which returned true. Nothing is persisted: attach the case with POST /{id}/members. Matchers run in an isolated Worker with network limited to report storage, under a per-matcher time limit and the isolate's memory and CPU limits.
1877
1866
  */
1878
- post: operations["createChatSessionAlarm"];
1867
+ post: operations["matchFailureGroups"];
1879
1868
  delete?: never;
1880
1869
  options?: never;
1881
1870
  head?: never;
1882
1871
  patch?: never;
1883
1872
  trace?: never;
1884
1873
  };
1885
- "/api/chat-sessions/{id}/alarms/{alarm_id}": {
1874
+ "/api/github/pr/convert-to-draft": {
1886
1875
  parameters: {
1887
1876
  query?: never;
1888
1877
  header?: never;
@@ -1891,79 +1880,78 @@ export interface paths {
1891
1880
  };
1892
1881
  get?: never;
1893
1882
  put?: never;
1894
- post?: never;
1895
- /** 🤖 Delete a session alarm */
1896
- delete: operations["deleteChatSessionAlarm"];
1883
+ /**
1884
+ * 🤖 Convert a pull request to draft
1885
+ * @description Converts an open pull request to a draft, so it cannot be merged until it is marked ready for review.
1886
+ */
1887
+ post: operations["convertPullRequestToDraft"];
1888
+ delete?: never;
1897
1889
  options?: never;
1898
1890
  head?: never;
1899
- /** 🤖 Update a session alarm */
1900
- patch: operations["updateChatSessionAlarm"];
1891
+ patch?: never;
1901
1892
  trace?: never;
1902
1893
  };
1903
- "/api/chat-sessions/{id}/session-state": {
1894
+ "/api/github/pr/ready-for-review": {
1904
1895
  parameters: {
1905
1896
  query?: never;
1906
1897
  header?: never;
1907
1898
  path?: never;
1908
1899
  cookie?: never;
1909
1900
  };
1901
+ get?: never;
1902
+ put?: never;
1910
1903
  /**
1911
- * 🤖 Get a session's initial state
1912
- * @description Returns a session's recent log entries, user messages, and current sandbox state, read from pi-worker over the service binding.
1904
+ * 🤖 Mark a pull request ready for review
1905
+ * @description Converts an open draft pull request to ready for review.
1913
1906
  */
1914
- get: operations["getChatSessionState"];
1915
- put?: never;
1916
- post?: never;
1907
+ post: operations["markPullRequestReadyForReview"];
1917
1908
  delete?: never;
1918
1909
  options?: never;
1919
1910
  head?: never;
1920
1911
  patch?: never;
1921
1912
  trace?: never;
1922
1913
  };
1923
- "/api/chat-sessions/{id}/triggers": {
1914
+ "/api/github/proxy": {
1924
1915
  parameters: {
1925
1916
  query?: never;
1926
1917
  header?: never;
1927
1918
  path?: never;
1928
1919
  cookie?: never;
1929
1920
  };
1930
- /**
1931
- * 🤖 🧪 List a session's event triggers
1932
- * @description Lists active event triggers owned by this chat session. One-shot triggers are consumed after they fire; recurring wildcard triggers remain active.
1933
- */
1934
- get: operations["listChatSessionTriggers"];
1921
+ get?: never;
1935
1922
  put?: never;
1936
1923
  /**
1937
- * 🤖 🧪 Create an event trigger
1938
- * @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.
1924
+ * 🤖 Proxy a GitHub API request
1925
+ * @description Forwards an authenticated request to the GitHub API and returns the GitHub response verbatim. The request's project (bound token, or the `x-project-id`/`x-project-slug` header) picks the GitHub App: its own repo goes through the main App; another repo the project's org installed the reporter App on is read through the reporter App, and writes to it are rejected. Without a project, the main App is used. Merging a pull request with `merge_method` `squash` or `rebase` is rejected; only merge commits are allowed, and creating a draft pull request is rejected. Other writes to a project's default or protected branches are refused, as git-worker refuses the equivalent push. Project API keys are read-only. Sandbox-delegation principals are additionally constrained by per-session proxy rules.
1939
1926
  */
1940
- post: operations["createChatSessionTrigger"];
1927
+ post: operations["githubProxy"];
1941
1928
  delete?: never;
1942
1929
  options?: never;
1943
1930
  head?: never;
1944
1931
  patch?: never;
1945
1932
  trace?: never;
1946
1933
  };
1947
- "/api/chat-sessions/{id}/triggers/{trigger_id}": {
1934
+ "/api/gsheet/metadata": {
1948
1935
  parameters: {
1949
1936
  query?: never;
1950
1937
  header?: never;
1951
1938
  path?: never;
1952
1939
  cookie?: never;
1953
1940
  };
1954
- /** 🤖 🧪 Get an event trigger */
1955
- get: operations["getChatSessionTrigger"];
1941
+ /**
1942
+ * 🤖 Get spreadsheet metadata
1943
+ * @description Returns the title of a Google spreadsheet and the access level the service account has on it.
1944
+ */
1945
+ get: operations["getGsheetMetadata"];
1956
1946
  put?: never;
1957
1947
  post?: never;
1958
- /** 🤖 🧪 Delete an event trigger */
1959
- delete: operations["deleteChatSessionTrigger"];
1948
+ delete?: never;
1960
1949
  options?: never;
1961
1950
  head?: never;
1962
- /** 🤖 🧪 Update an event trigger */
1963
- patch: operations["updateChatSessionTrigger"];
1951
+ patch?: never;
1964
1952
  trace?: never;
1965
1953
  };
1966
- "/api/failure-groups/{id}/matcher-overlap": {
1954
+ "/api/gsheet/proxy": {
1967
1955
  parameters: {
1968
1956
  query?: never;
1969
1957
  header?: never;
@@ -1973,157 +1961,173 @@ export interface paths {
1973
1961
  get?: never;
1974
1962
  put?: never;
1975
1963
  /**
1976
- * 🤖 Check a matcher against other groups' members
1977
- * @description Runs a candidate matcher source for this group against the 2 most recently seen active members of every other open group in the project (round-robin, at most 40 cases) and reports the ones it returns true for. A claim means the matcher overlaps that group. Nothing is persisted.
1964
+ * 🤖 Proxy a Google API request
1965
+ * @description Forwards an authenticated request to an allowed Google API origin using the service account's credentials and returns the JSON response.
1978
1966
  */
1979
- post: operations["checkFailureGroupMatcherOverlap"];
1967
+ post: operations["proxyGsheetRequest"];
1980
1968
  delete?: never;
1981
1969
  options?: never;
1982
1970
  head?: never;
1983
1971
  patch?: never;
1984
1972
  trace?: never;
1985
1973
  };
1986
- "/api/failure-groups/{id}/members/{test_case_id}": {
1974
+ "/api/infra/static-ips": {
1987
1975
  parameters: {
1988
1976
  query?: never;
1989
1977
  header?: never;
1990
1978
  path?: never;
1991
1979
  cookie?: never;
1992
1980
  };
1993
- get?: never;
1994
- put?: never;
1995
- post?: never;
1996
1981
  /**
1997
- * 🤖 Detach a test from a failure group
1998
- * @description Records that this test does not belong to the group. Detaching as an agent is a correction the agent may undo by attaching again. A human detach is sticky: agent attaches will not re-attach the test; only a later human attach supersedes it.
1982
+ * 🤖 Get static egress IPs for a region
1983
+ * @description Returns the proxy endpoint and the egress IPs to allowlist for the given region.
1999
1984
  */
2000
- delete: operations["detachFailureGroupMember"];
1985
+ get: operations["getStaticIps"];
1986
+ put?: never;
1987
+ post?: never;
1988
+ delete?: never;
2001
1989
  options?: never;
2002
1990
  head?: never;
2003
1991
  patch?: never;
2004
1992
  trace?: never;
2005
1993
  };
2006
- "/api/failure-groups/match": {
1994
+ "/api/playwright-versions": {
2007
1995
  parameters: {
2008
1996
  query?: never;
2009
1997
  header?: never;
2010
1998
  path?: never;
2011
1999
  cookie?: never;
2012
2000
  };
2013
- get?: never;
2014
- put?: never;
2015
2001
  /**
2016
- * 🤖 Run failure-group matchers against a case
2017
- * @description Runs every open group's matcher (or the given group_ids, or one dry-run source) against a failed or flaky case and reports which returned true. Nothing is persisted: attach the case with POST /{id}/members. Matchers run in an isolated Worker with network limited to report storage, under a per-matcher time limit and the isolate's memory and CPU limits.
2002
+ * 🤖 List supported Playwright versions
2003
+ * @description Returns the static list of supported Playwright versions and the default version. Public read — no authentication required.
2018
2004
  */
2019
- post: operations["matchFailureGroups"];
2005
+ get: operations["listPlaywrightVersions"];
2006
+ put?: never;
2007
+ post?: never;
2020
2008
  delete?: never;
2021
2009
  options?: never;
2022
2010
  head?: never;
2023
2011
  patch?: never;
2024
2012
  trace?: never;
2025
2013
  };
2026
- "/api/github/pr/convert-to-draft": {
2014
+ "/api/rules": {
2027
2015
  parameters: {
2028
2016
  query?: never;
2029
2017
  header?: never;
2030
2018
  path?: never;
2031
2019
  cookie?: never;
2032
2020
  };
2033
- get?: never;
2021
+ /**
2022
+ * 🤖 List rules
2023
+ * @description Lists the scoped project's rules of every effect, newest first.
2024
+ */
2025
+ get: operations["listRules"];
2034
2026
  put?: never;
2035
2027
  /**
2036
- * 🤖 Convert a pull request to draft
2037
- * @description Converts an open pull request to a draft, so it cannot be merged until it is marked ready for review.
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`.
2038
2030
  */
2039
- post: operations["convertPullRequestToDraft"];
2031
+ post: operations["createRule"];
2040
2032
  delete?: never;
2041
2033
  options?: never;
2042
2034
  head?: never;
2043
2035
  patch?: never;
2044
2036
  trace?: never;
2045
2037
  };
2046
- "/api/github/pr/ready-for-review": {
2038
+ "/api/rules/{id}": {
2047
2039
  parameters: {
2048
2040
  query?: never;
2049
2041
  header?: never;
2050
2042
  path?: never;
2051
2043
  cookie?: never;
2052
2044
  };
2053
- get?: never;
2045
+ /**
2046
+ * 🤖 Get a rule
2047
+ * @description Retrieves a single rule by ID.
2048
+ */
2049
+ get: operations["getRule"];
2054
2050
  put?: never;
2051
+ post?: never;
2055
2052
  /**
2056
- * 🤖 Mark a pull request ready for review
2057
- * @description Converts an open draft pull request to ready for review.
2053
+ * 🤖 Delete a rule
2054
+ * @description Permanently deletes a rule. Its revisions are kept.
2058
2055
  */
2059
- post: operations["markPullRequestReadyForReview"];
2060
- delete?: never;
2056
+ delete: operations["deleteRule"];
2061
2057
  options?: never;
2062
2058
  head?: never;
2063
- 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"];
2064
2064
  trace?: never;
2065
2065
  };
2066
- "/api/github/proxy": {
2066
+ "/api/rules/{id}/revisions": {
2067
2067
  parameters: {
2068
2068
  query?: never;
2069
2069
  header?: never;
2070
2070
  path?: never;
2071
2071
  cookie?: never;
2072
2072
  };
2073
- get?: never;
2074
- put?: never;
2075
2073
  /**
2076
- * 🤖 Proxy a GitHub API request
2077
- * @description Forwards an authenticated request to the GitHub API and returns the GitHub response verbatim. The request's project (bound token, or the `x-project-id`/`x-project-slug` header) picks the GitHub App: its own repo goes through the main App; another repo the project's org installed the reporter App on is read through the reporter App, and writes to it are rejected. Without a project, the main App is used. Merging a pull request with `merge_method` `squash` or `rebase` is rejected; only merge commits are allowed, and creating a draft pull request is rejected. Other writes to a project's default or protected branches are refused, as git-worker refuses the equivalent push. Project API keys are read-only. Sandbox-delegation principals are additionally constrained by per-session proxy rules.
2074
+ * 🤖 List a rule's revisions
2075
+ * @description Every create, update and delete of the rule, oldest first, with who made it.
2078
2076
  */
2079
- post: operations["githubProxy"];
2077
+ get: operations["listRuleRevisions"];
2078
+ put?: never;
2079
+ post?: never;
2080
2080
  delete?: never;
2081
2081
  options?: never;
2082
2082
  head?: never;
2083
2083
  patch?: never;
2084
2084
  trace?: never;
2085
2085
  };
2086
- "/api/gsheet/metadata": {
2086
+ "/api/rules/match": {
2087
2087
  parameters: {
2088
2088
  query?: never;
2089
2089
  header?: never;
2090
2090
  path?: never;
2091
2091
  cookie?: never;
2092
2092
  };
2093
+ get?: never;
2094
+ put?: never;
2093
2095
  /**
2094
- * 🤖 Get spreadsheet metadata
2095
- * @description Returns the title of a Google spreadsheet and the access level the service account has on it.
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.
2096
2098
  */
2097
- get: operations["getGsheetMetadata"];
2098
- put?: never;
2099
- post?: never;
2099
+ post: operations["matchRules"];
2100
2100
  delete?: never;
2101
2101
  options?: never;
2102
2102
  head?: never;
2103
2103
  patch?: never;
2104
2104
  trace?: never;
2105
2105
  };
2106
- "/api/gsheet/proxy": {
2106
+ "/api/tasks": {
2107
2107
  parameters: {
2108
2108
  query?: never;
2109
2109
  header?: never;
2110
2110
  path?: never;
2111
2111
  cookie?: never;
2112
2112
  };
2113
- get?: never;
2113
+ /**
2114
+ * 🤖 List tasks
2115
+ * @description Returns a paginated list of tasks for the scoped project.
2116
+ */
2117
+ get: operations["listTasks"];
2114
2118
  put?: never;
2115
2119
  /**
2116
- * 🤖 Proxy a Google API request
2117
- * @description Forwards an authenticated request to an allowed Google API origin using the service account's credentials and returns the JSON response.
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.
2118
2122
  */
2119
- post: operations["proxyGsheetRequest"];
2123
+ post: operations["createTask"];
2120
2124
  delete?: never;
2121
2125
  options?: never;
2122
2126
  head?: never;
2123
2127
  patch?: never;
2124
2128
  trace?: never;
2125
2129
  };
2126
- "/api/playwright-versions": {
2130
+ "/api/tasks/{id}": {
2127
2131
  parameters: {
2128
2132
  query?: never;
2129
2133
  header?: never;
@@ -2131,16 +2135,24 @@ export interface paths {
2131
2135
  cookie?: never;
2132
2136
  };
2133
2137
  /**
2134
- * 🤖 List supported Playwright versions
2135
- * @description Returns the static list of supported Playwright versions and the default version. Public read — no authentication required.
2138
+ * 🤖 Get a task
2139
+ * @description Retrieves a single task by ID.
2136
2140
  */
2137
- get: operations["listPlaywrightVersions"];
2141
+ get: operations["getTask"];
2138
2142
  put?: never;
2139
2143
  post?: never;
2140
- delete?: never;
2144
+ /**
2145
+ * 🤖 Delete a task
2146
+ * @description Permanently deletes a task.
2147
+ */
2148
+ delete: operations["deleteTask"];
2141
2149
  options?: never;
2142
2150
  head?: never;
2143
- 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"];
2144
2156
  trace?: never;
2145
2157
  };
2146
2158
  "/api/traces/compare": {
@@ -2153,7 +2165,7 @@ export interface paths {
2153
2165
  get?: never;
2154
2166
  put?: never;
2155
2167
  /**
2156
- * 🤖 🧪 Compare a failed attempt with a passing one, step by step
2168
+ * 🤖 Compare a failed attempt with a passing one, step by step
2157
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.
2158
2170
  */
2159
2171
  post: operations["compareTraceAgainstPass"];
@@ -2247,6 +2259,86 @@ export interface paths {
2247
2259
  patch?: never;
2248
2260
  trace?: never;
2249
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
+ };
2250
2342
  "/api/activity": {
2251
2343
  parameters: {
2252
2344
  query?: never;
@@ -2255,7 +2347,7 @@ export interface paths {
2255
2347
  cookie?: never;
2256
2348
  };
2257
2349
  /**
2258
- * ⚙️ 🧪 List project activity
2350
+ * ⚙️ List project activity
2259
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.
2260
2352
  */
2261
2353
  get: operations["listActivity"];
@@ -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"];
@@ -3018,26 +3110,6 @@ export interface paths {
3018
3110
  patch?: never;
3019
3111
  trace?: never;
3020
3112
  };
3021
- "/api/chat-sessions/{id}/timeline": {
3022
- parameters: {
3023
- query?: never;
3024
- header?: never;
3025
- path?: never;
3026
- cookie?: never;
3027
- };
3028
- /**
3029
- * ⚙️ Get a session's timeline
3030
- * @description Returns the chronological timeline events for a chat session.
3031
- */
3032
- get: operations["getChatSessionTimeline"];
3033
- put?: never;
3034
- post?: never;
3035
- delete?: never;
3036
- options?: never;
3037
- head?: never;
3038
- patch?: never;
3039
- trace?: never;
3040
- };
3041
3113
  "/api/chat-sessions/{id}/transcript": {
3042
3114
  parameters: {
3043
3115
  query?: never;
@@ -3046,7 +3118,7 @@ export interface paths {
3046
3118
  cookie?: never;
3047
3119
  };
3048
3120
  /**
3049
- * ⚙️ 🧪 Get a session's transcript rows
3121
+ * ⚙️ Get a session's transcript rows
3050
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.
3051
3123
  */
3052
3124
  get: operations["getChatSessionTranscript"];
@@ -3098,26 +3170,6 @@ export interface paths {
3098
3170
  patch?: never;
3099
3171
  trace?: never;
3100
3172
  };
3101
- "/api/chat-sessions/users": {
3102
- parameters: {
3103
- query?: never;
3104
- header?: never;
3105
- path?: never;
3106
- cookie?: never;
3107
- };
3108
- /**
3109
- * ⚙️ List chat-session creators
3110
- * @description Returns the distinct users who created chat sessions in scope that were updated in the last 30 days, enriched with Supabase user details.
3111
- */
3112
- get: operations["listChatSessionUsers"];
3113
- put?: never;
3114
- post?: never;
3115
- delete?: never;
3116
- options?: never;
3117
- head?: never;
3118
- patch?: never;
3119
- trace?: never;
3120
- };
3121
3173
  "/api/credit-grants": {
3122
3174
  parameters: {
3123
3175
  query?: never;
@@ -3308,7 +3360,7 @@ export interface paths {
3308
3360
  get?: never;
3309
3361
  put?: never;
3310
3362
  /**
3311
- * ⚙️ 🧪 Import a Loom video
3363
+ * ⚙️ Import a Loom video
3312
3364
  * @description Downloads a Loom share video and stores it as a file.
3313
3365
  */
3314
3366
  post: operations["importLoomFile"];
@@ -3538,7 +3590,7 @@ export interface paths {
3538
3590
  cookie?: never;
3539
3591
  };
3540
3592
  /**
3541
- * ⚙️ 🧪 Get impacted tests for a pull request
3593
+ * ⚙️ Get impacted tests for a pull request
3542
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`.
3543
3595
  */
3544
3596
  get: operations["getPullRequestImpactedTests"];
@@ -3964,7 +4016,7 @@ export interface paths {
3964
4016
  get?: never;
3965
4017
  put?: never;
3966
4018
  /**
3967
- * ⚙️ 🧪 Seed a chat session with messages (preview only)
4019
+ * ⚙️ Seed a chat session with messages (preview only)
3968
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.
3969
4021
  */
3970
4022
  post: operations["seedChatSession"];
@@ -4718,7 +4770,7 @@ export interface paths {
4718
4770
  cookie?: never;
4719
4771
  };
4720
4772
  /**
4721
- * 🛡️ 🧪 Memory activity across projects
4773
+ * 🛡️ Memory activity across projects
4722
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.
4723
4775
  */
4724
4776
  get: operations["listMemoryActivity"];
@@ -4738,7 +4790,7 @@ export interface paths {
4738
4790
  cookie?: never;
4739
4791
  };
4740
4792
  /**
4741
- * ⚙️ 🧪 Memory changes made by a chat session
4793
+ * ⚙️ Memory changes made by a chat session
4742
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.
4743
4795
  */
4744
4796
  get: operations["listMemoryChanges"];
@@ -4758,7 +4810,7 @@ export interface paths {
4758
4810
  cookie?: never;
4759
4811
  };
4760
4812
  /**
4761
- * 🛡️ 🧪 Memory classifications across projects
4813
+ * 🛡️ Memory classifications across projects
4762
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.
4763
4815
  */
4764
4816
  get: operations["listMemoryClassifications"];
@@ -4778,7 +4830,7 @@ export interface paths {
4778
4830
  cookie?: never;
4779
4831
  };
4780
4832
  /**
4781
- * ⚙️ 🧪 Most read and most edited memories
4833
+ * ⚙️ Most read and most edited memories
4782
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.
4783
4835
  */
4784
4836
  get: operations["getMemoryUsage"];
@@ -4840,7 +4892,7 @@ export interface paths {
4840
4892
  get?: never;
4841
4893
  put?: never;
4842
4894
  /**
4843
- * 🧪 Create a dummy notification (non-production only)
4895
+ * Create a dummy notification (non-production only)
4844
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.
4845
4897
  */
4846
4898
  post: operations["createDummyNotification"];
@@ -5282,6 +5334,50 @@ export interface paths {
5282
5334
  patch: operations["updatePlan"];
5283
5335
  trace?: never;
5284
5336
  };
5337
+ "/api/platform-issues": {
5338
+ parameters: {
5339
+ query?: never;
5340
+ header?: never;
5341
+ path?: never;
5342
+ cookie?: never;
5343
+ };
5344
+ /**
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).
5347
+ */
5348
+ get: operations["listPlatformIssues"];
5349
+ put?: 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"];
5355
+ delete?: never;
5356
+ options?: never;
5357
+ head?: never;
5358
+ patch?: never;
5359
+ trace?: never;
5360
+ };
5361
+ "/api/platform-issues/{id}/resolve": {
5362
+ parameters: {
5363
+ query?: never;
5364
+ header?: never;
5365
+ path?: never;
5366
+ cookie?: never;
5367
+ };
5368
+ get?: never;
5369
+ put?: never;
5370
+ /**
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.
5373
+ */
5374
+ post: operations["resolvePlatformIssue"];
5375
+ delete?: never;
5376
+ options?: never;
5377
+ head?: never;
5378
+ patch?: never;
5379
+ trace?: never;
5380
+ };
5285
5381
  "/api/project-addons": {
5286
5382
  parameters: {
5287
5383
  query?: never;
@@ -5290,7 +5386,7 @@ export interface paths {
5290
5386
  cookie?: never;
5291
5387
  };
5292
5388
  /**
5293
- * ⚙️ 🧪 List add-ons for the scoped project
5389
+ * ⚙️ List add-ons for the scoped project
5294
5390
  * @description Returns every known add-on with its current state, plus the full period history for this project.
5295
5391
  */
5296
5392
  get: operations["listProjectAddons"];
@@ -5312,7 +5408,7 @@ export interface paths {
5312
5408
  get?: never;
5313
5409
  put?: never;
5314
5410
  /**
5315
- * 🧪 Disable an add-on
5411
+ * Disable an add-on
5316
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.
5317
5413
  */
5318
5414
  post: operations["disableProjectAddon"];
@@ -5332,7 +5428,7 @@ export interface paths {
5332
5428
  get?: never;
5333
5429
  put?: never;
5334
5430
  /**
5335
- * 🧪 Enable an add-on
5431
+ * Enable an add-on
5336
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.
5337
5433
  */
5338
5434
  post: operations["enableProjectAddon"];
@@ -5539,7 +5635,7 @@ export interface paths {
5539
5635
  };
5540
5636
  /**
5541
5637
  * ⚙️ Check test repository settings
5542
- * @description Checks the project's GitHub repository (or a repo transfer destination) against the settings Empirical needs: merge commits only, app access, matching default branch, and no rulesets blocking Empirical's branches.
5638
+ * @description Checks the project's GitHub repository (or a repo transfer destination) against the settings Empirical needs: merge commits only, app access, and a matching default branch. Also reports the rulesets and classic protection on the default branch.
5543
5639
  */
5544
5640
  get: operations["checkProjectRepoSettings"];
5545
5641
  put?: never;
@@ -5550,26 +5646,6 @@ export interface paths {
5550
5646
  patch?: never;
5551
5647
  trace?: never;
5552
5648
  };
5553
- "/api/projects/{id}/repo-settings-check/fix": {
5554
- parameters: {
5555
- query?: never;
5556
- header?: never;
5557
- path?: never;
5558
- cookie?: never;
5559
- };
5560
- get?: never;
5561
- put?: never;
5562
- /**
5563
- * 🛡️ Fix test repository merge settings
5564
- * @description For repositories owned by empirical-run only: turns on merge commits and turns off squash and rebase merging, then returns the re-checked result. Rulesets are reported, never changed.
5565
- */
5566
- post: operations["fixProjectRepoSettings"];
5567
- delete?: never;
5568
- options?: never;
5569
- head?: never;
5570
- patch?: never;
5571
- trace?: never;
5572
- };
5573
5649
  "/api/projects/{id}/test-cases-sync/trigger": {
5574
5650
  parameters: {
5575
5651
  query?: never;
@@ -5798,6 +5874,26 @@ export interface paths {
5798
5874
  patch?: never;
5799
5875
  trace?: never;
5800
5876
  };
5877
+ "/api/projects/npm-snapshot-urls": {
5878
+ parameters: {
5879
+ query?: never;
5880
+ header?: never;
5881
+ path?: never;
5882
+ cookie?: never;
5883
+ };
5884
+ get?: never;
5885
+ put?: never;
5886
+ /**
5887
+ * Presign node_modules snapshot URLs
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.
5889
+ */
5890
+ post: operations["getProjectNpmSnapshotUrls"];
5891
+ delete?: never;
5892
+ options?: never;
5893
+ head?: never;
5894
+ patch?: never;
5895
+ trace?: never;
5896
+ };
5801
5897
  "/api/projects/static-ip-proxy-token": {
5802
5898
  parameters: {
5803
5899
  query?: never;
@@ -5892,7 +5988,7 @@ export interface paths {
5892
5988
  get?: never;
5893
5989
  put?: never;
5894
5990
  /**
5895
- * 🧪 Call home from an installation's stack
5991
+ * Call home from an installation's stack
5896
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.
5897
5993
  */
5898
5994
  post: operations["claimRunnerBackend"];
@@ -5910,7 +6006,7 @@ export interface paths {
5910
6006
  cookie?: never;
5911
6007
  };
5912
6008
  /**
5913
- * 🧪 Get the scoped project's runner backend
6009
+ * Get the scoped project's runner backend
5914
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.
5915
6011
  */
5916
6012
  get: operations["getProjectRunnerBackend"];
@@ -5933,14 +6029,14 @@ export interface paths {
5933
6029
  put?: never;
5934
6030
  post?: never;
5935
6031
  /**
5936
- * 🧪 Remove a private runner
6032
+ * Remove a private runner
5937
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.
5938
6034
  */
5939
6035
  delete: operations["removeProjectRunnerBackend"];
5940
6036
  options?: never;
5941
6037
  head?: never;
5942
6038
  /**
5943
- * 🧪 Rename a private runner
6039
+ * Rename a private runner
5944
6040
  * @description Renames a runner backend of the scoped project's organisation.
5945
6041
  */
5946
6042
  patch: operations["renameProjectRunnerBackend"];
@@ -5956,7 +6052,7 @@ export interface paths {
5956
6052
  get?: never;
5957
6053
  put?: never;
5958
6054
  /**
5959
- * 🧪 Disconnect a private runner
6055
+ * Disconnect a private runner
5960
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.
5961
6057
  */
5962
6058
  post: operations["disconnectProjectRunnerBackend"];
@@ -5976,7 +6072,7 @@ export interface paths {
5976
6072
  get?: never;
5977
6073
  put?: never;
5978
6074
  /**
5979
- * 🧪 Re-enable a disconnected private runner
6075
+ * Re-enable a disconnected private runner
5980
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.
5981
6077
  */
5982
6078
  post: operations["enableProjectRunnerBackend"];
@@ -5996,7 +6092,7 @@ export interface paths {
5996
6092
  get?: never;
5997
6093
  put?: never;
5998
6094
  /**
5999
- * 🧪 Create a new setup link
6095
+ * Create a new setup link
6000
6096
  * @description Mints a new quick-create link for a pending runner backend of the scoped project's organisation, replacing any earlier unused link.
6001
6097
  */
6002
6098
  post: operations["createProjectRunnerBackendRegistration"];
@@ -6014,7 +6110,7 @@ export interface paths {
6014
6110
  cookie?: never;
6015
6111
  };
6016
6112
  /**
6017
- * 🧪 List the organisation's runner backends
6113
+ * List the organisation's runner backends
6018
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.
6019
6115
  */
6020
6116
  get: operations["listProjectOrgRunnerBackends"];
@@ -6035,7 +6131,7 @@ export interface paths {
6035
6131
  };
6036
6132
  get?: never;
6037
6133
  /**
6038
- * 🧪 Choose where the project's runs execute
6134
+ * Choose where the project's runs execute
6039
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.
6040
6136
  */
6041
6137
  put: operations["setScopedProjectRunnerBackend"];
@@ -6056,7 +6152,7 @@ export interface paths {
6056
6152
  get?: never;
6057
6153
  put?: never;
6058
6154
  /**
6059
- * 🧪 Start setting up a private runner
6155
+ * Start setting up a private runner
6060
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.
6061
6157
  */
6062
6158
  post: operations["setupProjectRunnerBackend"];
@@ -6076,7 +6172,7 @@ export interface paths {
6076
6172
  get?: never;
6077
6173
  put?: never;
6078
6174
  /**
6079
- * 🧪 Re-check the scoped project's runner backend
6175
+ * Re-check the scoped project's runner backend
6080
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.
6081
6177
  */
6082
6178
  post: operations["verifyProjectRunnerBackend"];
@@ -6086,90 +6182,6 @@ export interface paths {
6086
6182
  patch?: never;
6087
6183
  trace?: never;
6088
6184
  };
6089
- "/api/sandbox-snapshots": {
6090
- parameters: {
6091
- query?: never;
6092
- header?: never;
6093
- path?: never;
6094
- cookie?: never;
6095
- };
6096
- /**
6097
- * ⚙️ List sandbox snapshots
6098
- * @description Returns the most recent sandbox snapshots for the scoped project.
6099
- */
6100
- get: operations["listSandboxSnapshots"];
6101
- put?: never;
6102
- /**
6103
- * ⚙️ Create a sandbox snapshot
6104
- * @description Enqueues a snapshot-create job for the scoped project and base template.
6105
- */
6106
- post: operations["createSandboxSnapshot"];
6107
- delete?: never;
6108
- options?: never;
6109
- head?: never;
6110
- patch?: never;
6111
- trace?: never;
6112
- };
6113
- "/api/sandbox-snapshots/projects/{project_id}": {
6114
- parameters: {
6115
- query?: never;
6116
- header?: never;
6117
- path?: never;
6118
- cookie?: never;
6119
- };
6120
- /**
6121
- * ⚙️ List a project's sandbox snapshots
6122
- * @description Returns the most recent sandbox snapshots for a project; used by sandbox-template CI to wait for a rebuild.
6123
- */
6124
- get: operations["listProjectSandboxSnapshots"];
6125
- put?: never;
6126
- post?: never;
6127
- delete?: never;
6128
- options?: never;
6129
- head?: never;
6130
- patch?: never;
6131
- trace?: never;
6132
- };
6133
- "/api/sandbox-snapshots/rebuild": {
6134
- parameters: {
6135
- query?: never;
6136
- header?: never;
6137
- path?: never;
6138
- cookie?: never;
6139
- };
6140
- get?: never;
6141
- put?: never;
6142
- /**
6143
- * ⚙️ Rebuild project sandbox snapshots
6144
- * @description Enqueues snapshot-create jobs for every project that already has a snapshot for the given provider and base template. Only `e2b` is supported.
6145
- */
6146
- post: operations["rebuildSandboxSnapshots"];
6147
- delete?: never;
6148
- options?: never;
6149
- head?: never;
6150
- patch?: never;
6151
- trace?: never;
6152
- };
6153
- "/api/sandbox-snapshots/rebuild-by-template": {
6154
- parameters: {
6155
- query?: never;
6156
- header?: never;
6157
- path?: never;
6158
- cookie?: never;
6159
- };
6160
- get?: never;
6161
- put?: never;
6162
- /**
6163
- * ⚙️ Rebuild sandbox snapshots by template
6164
- * @description Enqueues snapshot-create jobs for every project that has an `e2b` snapshot for the given base template.
6165
- */
6166
- post: operations["rebuildSandboxSnapshotsByTemplate"];
6167
- delete?: never;
6168
- options?: never;
6169
- head?: never;
6170
- patch?: never;
6171
- trace?: never;
6172
- };
6173
6185
  "/api/sandbox-snapshots/sources/upsert": {
6174
6186
  parameters: {
6175
6187
  query?: never;
@@ -6197,11 +6209,11 @@ export interface paths {
6197
6209
  path?: never;
6198
6210
  cookie?: never;
6199
6211
  };
6200
- /** 🛡️ 🧪 List system messages with delivery and ack counts */
6212
+ /** 🛡️ List system messages with delivery and ack counts */
6201
6213
  get: operations["listSystemMessages"];
6202
6214
  put?: never;
6203
6215
  /**
6204
- * 🛡️ 🧪 Broadcast a system message to manager sessions
6216
+ * 🛡️ Broadcast a system message to manager sessions
6205
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`.
6206
6218
  */
6207
6219
  post: operations["createSystemMessage"];
@@ -6218,7 +6230,7 @@ export interface paths {
6218
6230
  path?: never;
6219
6231
  cookie?: never;
6220
6232
  };
6221
- /** 🛡️ 🧪 Get a system message's per-project delivery and ack status */
6233
+ /** 🛡️ Get a system message's per-project delivery and ack status */
6222
6234
  get: operations["getSystemMessage"];
6223
6235
  put?: never;
6224
6236
  post?: never;
@@ -6238,7 +6250,7 @@ export interface paths {
6238
6250
  get?: never;
6239
6251
  put?: never;
6240
6252
  /**
6241
- * 🧪 Acknowledge a system message from a manager session
6253
+ * Acknowledge a system message from a manager session
6242
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.
6243
6255
  */
6244
6256
  post: operations["ackSystemMessage"];
@@ -6272,6 +6284,26 @@ export interface paths {
6272
6284
  patch?: never;
6273
6285
  trace?: never;
6274
6286
  };
6287
+ "/api/test-reports/upload-urls": {
6288
+ parameters: {
6289
+ query?: never;
6290
+ header?: never;
6291
+ path?: never;
6292
+ cookie?: never;
6293
+ };
6294
+ get?: never;
6295
+ put?: never;
6296
+ /**
6297
+ * ⚙️ Create report upload URLs
6298
+ * @description Returns presigned PUT URLs for files of a Playwright report under the project's report folder `<repo_name>/<run_id>/`.
6299
+ */
6300
+ post: operations["createTestReportUploadUrls"];
6301
+ delete?: never;
6302
+ options?: never;
6303
+ head?: never;
6304
+ patch?: never;
6305
+ trace?: never;
6306
+ };
6275
6307
  "/api/test-runs/events": {
6276
6308
  parameters: {
6277
6309
  query?: never;
@@ -6677,7 +6709,7 @@ export interface components {
6677
6709
  ActivityDay: {
6678
6710
  /** @description Local date, YYYY-MM-DD. */
6679
6711
  date: string;
6680
- /** @description Every test run of the day, summarized. */
6712
+ /** @description Every test run created that day, summarized by its latest state. */
6681
6713
  test_runs: {
6682
6714
  count: number;
6683
6715
  outcomes: {
@@ -6689,12 +6721,12 @@ export interface components {
6689
6721
  cancelled: number;
6690
6722
  ended: number;
6691
6723
  };
6692
- /** @description The latest run's time. */
6724
+ /** @description When the day's newest run was created. */
6693
6725
  occurred_at: string;
6694
- /** @description The earliest run's time. */
6726
+ /** @description When the day's oldest run was created. */
6695
6727
  since: string;
6696
6728
  locations: {
6697
- branch: string;
6729
+ environment_id: number | null;
6698
6730
  environment: string | null;
6699
6731
  count: number;
6700
6732
  outcomes: {
@@ -6709,6 +6741,8 @@ export interface components {
6709
6741
  }[];
6710
6742
  } | null;
6711
6743
  items: components["schemas"]["ActivityItem"][];
6744
+ /** @description Items past the per-day limit, not listed in `items`. */
6745
+ more_items: number;
6712
6746
  };
6713
6747
  ActivityItem: {
6714
6748
  id: string;
@@ -6721,7 +6755,7 @@ export interface components {
6721
6755
  /** @enum {string} */
6722
6756
  kind: "chat_session";
6723
6757
  /**
6724
- * @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.
6725
6759
  * @enum {string}
6726
6760
  */
6727
6761
  action: "created" | "closed" | "pr_opened" | "pr_reopened" | "pr_merged" | "pr_closed";
@@ -7029,7 +7063,7 @@ export interface components {
7029
7063
  */
7030
7064
  reporter_type: "github_check";
7031
7065
  /**
7032
- * @description `available`: the GitHub Reporter app is installed with the permission this reporter needs. `not_installed`: no install for the organization. `install_requested`: an install is waiting for a GitHub owner's approval. `missing_permission`: installed, but without the permission this reporter needs (`checks` for check runs, `pull_requests` for PR comments).
7066
+ * @description `available`: the GitHub Reporter app is installed with the permission this reporter needs. `not_installed`: no install for the organization. `install_requested`: an install is waiting for a GitHub owner's approval. `missing_permission`: installed, but without the permission this reporter needs (`checks` for check runs and the linked test changes check, `pull_requests` for PR comments).
7033
7067
  * @enum {string}
7034
7068
  */
7035
7069
  status: "available" | "not_installed" | "install_requested" | "missing_permission";
@@ -7042,7 +7076,20 @@ export interface components {
7042
7076
  */
7043
7077
  reporter_type: "github_pr_comment";
7044
7078
  /**
7045
- * @description `available`: the GitHub Reporter app is installed with the permission this reporter needs. `not_installed`: no install for the organization. `install_requested`: an install is waiting for a GitHub owner's approval. `missing_permission`: installed, but without the permission this reporter needs (`checks` for check runs, `pull_requests` for PR comments).
7079
+ * @description `available`: the GitHub Reporter app is installed with the permission this reporter needs. `not_installed`: no install for the organization. `install_requested`: an install is waiting for a GitHub owner's approval. `missing_permission`: installed, but without the permission this reporter needs (`checks` for check runs and the linked test changes check, `pull_requests` for PR comments).
7080
+ * @enum {string}
7081
+ */
7082
+ status: "available" | "not_installed" | "install_requested" | "missing_permission";
7083
+ /** @description Repositories (`owner/name`) the install covers. The reporter posts only for runs whose `build.repo` is one of these. */
7084
+ repositories: string[];
7085
+ } | {
7086
+ /**
7087
+ * @description Tracks the test branch of the app pull request a run was triggered for, and keeps the linked test changes check on that pull request up to date.
7088
+ * @enum {string}
7089
+ */
7090
+ reporter_type: "github_linked_changes";
7091
+ /**
7092
+ * @description `available`: the GitHub Reporter app is installed with the permission this reporter needs. `not_installed`: no install for the organization. `install_requested`: an install is waiting for a GitHub owner's approval. `missing_permission`: installed, but without the permission this reporter needs (`checks` for check runs and the linked test changes check, `pull_requests` for PR comments).
7046
7093
  * @enum {string}
7047
7094
  */
7048
7095
  status: "available" | "not_installed" | "install_requested" | "missing_permission";
@@ -7214,8 +7261,6 @@ export interface components {
7214
7261
  }[];
7215
7262
  /** @description Whether the agent is awaiting user input. */
7216
7263
  ask_user_for_input: boolean | null;
7217
- /** @description Langfuse trace ID. */
7218
- langfuse_trace_id: string | null;
7219
7264
  /** @description Whether the session is closed. */
7220
7265
  is_closed: boolean;
7221
7266
  /** @description For a manager closed by rollover, the manager session that took over. */
@@ -7420,8 +7465,6 @@ export interface components {
7420
7465
  model: string | null;
7421
7466
  /** @description Whether the agent is awaiting user input. */
7422
7467
  ask_user_for_input: boolean | null;
7423
- /** @description Langfuse trace ID. */
7424
- langfuse_trace_id: string | null;
7425
7468
  /** @description Whether the session is closed. */
7426
7469
  is_closed: boolean;
7427
7470
  /** @description For a manager closed by rollover, the manager session that took over. */
@@ -7453,6 +7496,8 @@ export interface components {
7453
7496
  * @enum {string}
7454
7497
  */
7455
7498
  pr_status: "unopened" | "open" | "opened" | "closed" | "merged";
7499
+ /** @description Number of PRs the session has opened. */
7500
+ pr_count: number;
7456
7501
  /** @description Name of the owning project. */
7457
7502
  project_name: string | null;
7458
7503
  /** @description Repository name of the owning project. */
@@ -7546,55 +7591,9 @@ export interface components {
7546
7591
  ChatSessionSubagentsResponse: {
7547
7592
  data: components["schemas"]["ChatSessionSubagents"];
7548
7593
  };
7549
- ChatSessionTimelineEvent: {
7550
- /** @description Timeline event ID. */
7551
- id: number;
7552
- /** @description Owning chat session ID. */
7553
- chat_session_id: number;
7554
- /**
7555
- * @description Timeline event type.
7556
- * @enum {string}
7557
- */
7558
- event_type: "pr.opened" | "pr.merged" | "pr.closed" | "chat_session.closed" | "branch.created";
7559
- /** @description Related pull request number, if any. */
7560
- pr_number: number | null;
7561
- /** @description User who triggered the event. */
7562
- created_by: string | null;
7563
- /** @description Event timestamp (ISO). */
7564
- created_at: string;
7565
- /** @description Resolved Supabase details for the triggerer. */
7566
- created_by_user_detail?: {
7567
- /** @description Supabase user ID. */
7568
- id: string;
7569
- /** @description User email. */
7570
- email: string;
7571
- /** @description Display name. */
7572
- name: string;
7573
- /** @description Avatar URL. */
7574
- picture: string;
7575
- } | null;
7576
- };
7577
- ChatSessionTimelineResponse: {
7578
- /** @description Response payload. */
7579
- data: components["schemas"]["ChatSessionTimelineEvent"][];
7580
- };
7581
7594
  ChatSessionTranscriptResponse: {
7582
7595
  data: components["schemas"]["SessionTranscript"];
7583
7596
  };
7584
- ChatSessionUserDetail: {
7585
- /** @description Supabase user ID. */
7586
- id: string;
7587
- /** @description User email. */
7588
- email: string;
7589
- /** @description Display name. */
7590
- name: string;
7591
- /** @description Avatar URL. */
7592
- picture: string;
7593
- };
7594
- ChatSessionUsersResponse: {
7595
- /** @description Response payload. */
7596
- data: components["schemas"]["ChatSessionUserDetail"][];
7597
- };
7598
7597
  ChatSessionWithUser: {
7599
7598
  /** @description Chat session ID. */
7600
7599
  id: number;
@@ -7639,8 +7638,6 @@ export interface components {
7639
7638
  }[];
7640
7639
  /** @description Whether the agent is awaiting user input. */
7641
7640
  ask_user_for_input: boolean | null;
7642
- /** @description Langfuse trace ID. */
7643
- langfuse_trace_id: string | null;
7644
7641
  /** @description Whether the session is closed. */
7645
7642
  is_closed: boolean;
7646
7643
  /** @description For a manager closed by rollover, the manager session that took over. */
@@ -7755,9 +7752,9 @@ export interface components {
7755
7752
  team_id: string;
7756
7753
  };
7757
7754
  CreateAlarmRequest: {
7758
- /** @description The note to deliver back into this session when the alarm fires. Write it to your future self: what to resume and any context you'd otherwise lose. */
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. */
7759
7756
  message: string;
7760
- /** @description How far from now to fire, as a duration string with units m/h/d — e.g. "15m", "2h", "1d", or compound "1h30m". Min 5m, max 72h (3 days). */
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". */
7761
7758
  delay: string;
7762
7759
  };
7763
7760
  CreateApiKeyRequest: {
@@ -7869,6 +7866,12 @@ export interface components {
7869
7866
  * @enum {string}
7870
7867
  */
7871
7868
  reporter_type: "github_pr_comment";
7869
+ } | {
7870
+ /**
7871
+ * @description Tracks the test branch named after the head branch of the app pull request the run was triggered for (`trigger.event` `pull_request`), and keeps the `Empirical linked test changes` check on that pull request up to date: it passes when the test branch has nothing left to merge and fails while it has unmerged commits. The pull request's latest run decides whether it is tracked. Does nothing for runs not triggered by a pull request. Needs `build` with a repository the GitHub Reporter app is installed on.
7872
+ * @enum {string}
7873
+ */
7874
+ reporter_type: "github_linked_changes";
7872
7875
  } | {
7873
7876
  /**
7874
7877
  * @description Emails a report when the run ends to every user whose email domain is one of the organization's email domains.
@@ -8119,12 +8122,29 @@ export interface components {
8119
8122
  /** @description Channel names to subscribe to, e.g. `chat-sessions-project-<id>-<env>`, `test-run-<id>-<env>` or `user-<user uuid>-<env>`. */
8120
8123
  channels: string[];
8121
8124
  };
8122
- CreateSandboxSnapshotRequest: {
8123
- /**
8124
- * @description Base template to snapshot for the project.
8125
- * @enum {string}
8126
- */
8127
- base_template: "pi-sandbox";
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;
8128
8148
  };
8129
8149
  CreateSlackThreadEntityLinkRequest: {
8130
8150
  /**
@@ -8199,6 +8219,34 @@ export interface components {
8199
8219
  task: components["schemas"]["Task"];
8200
8220
  };
8201
8221
  };
8222
+ CreateTestReportUploadUrlsRequest: {
8223
+ /** @description Report run ID (the folder under the project). */
8224
+ run_id: string;
8225
+ files: {
8226
+ /** @description Path inside the run's report folder, e.g. `data/abc.png`. */
8227
+ path: string;
8228
+ /**
8229
+ * @description MIME type the upload sends as `Content-Type`.
8230
+ * @default application/octet-stream
8231
+ */
8232
+ content_type: string;
8233
+ /**
8234
+ * @description Storage class. When set, the upload must send the same `x-amz-storage-class` header.
8235
+ * @enum {string}
8236
+ */
8237
+ storage_class?: "STANDARD" | "STANDARD_IA";
8238
+ }[];
8239
+ };
8240
+ CreateTestReportUploadUrlsResponse: {
8241
+ /** @description Response payload. */
8242
+ data: {
8243
+ files: {
8244
+ path: string;
8245
+ /** @description Presigned PUT URL, valid for 1 hour. */
8246
+ upload_url: string;
8247
+ }[];
8248
+ };
8249
+ };
8202
8250
  CreateTestRunResponse: {
8203
8251
  data: {
8204
8252
  trigger: {
@@ -8600,6 +8648,8 @@ export interface components {
8600
8648
  DeleteMemoryRequest: {
8601
8649
  /** @description Why this change was made (max 500 characters). Shown in the session's memory change report. */
8602
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;
8603
8653
  };
8604
8654
  DeleteProjectResourceResponse: {
8605
8655
  /** @description Response payload. */
@@ -8977,6 +9027,12 @@ export interface components {
8977
9027
  * @enum {string}
8978
9028
  */
8979
9029
  reporter_type: "github_pr_comment";
9030
+ } | {
9031
+ /**
9032
+ * @description Tracks the test branch named after the head branch of the app pull request the run was triggered for (`trigger.event` `pull_request`), and keeps the `Empirical linked test changes` check on that pull request up to date: it passes when the test branch has nothing left to merge and fails while it has unmerged commits. The pull request's latest run decides whether it is tracked. Does nothing for runs not triggered by a pull request. Needs `build` with a repository the GitHub Reporter app is installed on.
9033
+ * @enum {string}
9034
+ */
9035
+ reporter_type: "github_linked_changes";
8980
9036
  } | {
8981
9037
  /**
8982
9038
  * @description Emails a report when the run ends to every user whose email domain is one of the organization's email domains.
@@ -9311,6 +9367,12 @@ export interface components {
9311
9367
  failing_line: string | null;
9312
9368
  /** @description ISO 8601 test completion time from the run ledger. */
9313
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;
9314
9376
  /** @description SHA of the last commit before the run started. */
9315
9377
  last_commit_before_run_started_at: string | null;
9316
9378
  /** @description Snoozes matching this case at read time. */
@@ -10568,6 +10630,48 @@ export interface components {
10568
10630
  */
10569
10631
  seen_at?: string;
10570
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
+ };
10571
10675
  MemberByTestRun: {
10572
10676
  /** @description Test case ID (normalized 41-character Playwright test id). */
10573
10677
  test_case_id: string;
@@ -10609,6 +10713,8 @@ export interface components {
10609
10713
  name: string | null;
10610
10714
  description: string | null;
10611
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;
10612
10718
  source: string | null;
10613
10719
  source_path: string | null;
10614
10720
  /** @description ID of the chat session the memory was created in, or null if not written from a sandbox session. */
@@ -10800,6 +10906,41 @@ export interface components {
10800
10906
  /** @description ISO 8601 timestamp. */
10801
10907
  created_at: string;
10802
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
+ };
10803
10944
  MemoryVersionListResponse: {
10804
10945
  /** @description Response payload. */
10805
10946
  data: {
@@ -11819,6 +11960,42 @@ export interface components {
11819
11960
  plan: components["schemas"]["Plan"];
11820
11961
  };
11821
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
+ };
11822
11999
  PlaywrightUtilsProxyError: {
11823
12000
  /** @description Error message — the provider API key is not configured, or the proxied request failed. */
11824
12001
  error: string;
@@ -12055,6 +12232,21 @@ export interface components {
12055
12232
  created: boolean;
12056
12233
  };
12057
12234
  };
12235
+ ProjectNpmSnapshotUrlsBody: {
12236
+ /** @description Hex SHA-256 of the repo's package-lock.json. */
12237
+ lockfile_sha256: string;
12238
+ /** @description `<platform>-abi<node ABI>` of the sandbox, e.g. `linux-abi127`. */
12239
+ runtime: string;
12240
+ };
12241
+ ProjectNpmSnapshotUrlsResponse: {
12242
+ /** @description Response payload. */
12243
+ data: {
12244
+ /** @description Presigned GETs to try in order. Per bucket, nearest to the sandboxes first: the tarball test runs share across projects, then this project's own. */
12245
+ restore_urls: string[];
12246
+ /** @description Presigned PUT for this project's tarball in the bucket nearest the sandboxes. */
12247
+ upload_url: string;
12248
+ };
12249
+ };
12058
12250
  ProjectOrgResponse: {
12059
12251
  /** @description Response payload. */
12060
12252
  data: {
@@ -12236,6 +12428,24 @@ export interface components {
12236
12428
  project: components["schemas"]["Project"];
12237
12429
  };
12238
12430
  };
12431
+ ProtectionRuleset: {
12432
+ id: number;
12433
+ name: string;
12434
+ /** @description Where the ruleset is defined: `Repository`, `Organization` or `Enterprise`. */
12435
+ source_type: string | null;
12436
+ /** @description The repository, organization or enterprise defining it. */
12437
+ source: string | null;
12438
+ html_url: string;
12439
+ /**
12440
+ * @description Whether the Empirical GitHub App is on the ruleset's bypass list, and in which mode. `unknown` when GitHub did not say.
12441
+ * @enum {string}
12442
+ */
12443
+ bypass: "always" | "pull_requests_only" | "never" | "exempt" | "unknown";
12444
+ /** @description Rules that hold back pull requests Empirical merges into the default branch, e.g. "Requires 1 approval": approvals, status checks, required workflows and scans, restricted updates, linear history, signed commits and commit patterns. */
12445
+ rules: string[];
12446
+ /** @description Rules that do not affect how Empirical merges, e.g. "Blocks force pushes". */
12447
+ other_rules: string[];
12448
+ };
12239
12449
  PutRunManifestRequest: {
12240
12450
  /** @description Structured scheduled tests. */
12241
12451
  tests: {
@@ -12276,28 +12486,6 @@ export interface components {
12276
12486
  /** @description Reason the realtime service is unavailable. */
12277
12487
  error: string;
12278
12488
  };
12279
- RebuildSandboxSnapshotsByTemplateRequest: {
12280
- /**
12281
- * @description Base template whose snapshots to rebuild.
12282
- * @enum {string}
12283
- */
12284
- base_template: "pi-sandbox";
12285
- };
12286
- RebuildSandboxSnapshotsRequest: {
12287
- /**
12288
- * @description Sandbox provider. Only `e2b` is supported.
12289
- * @default e2b
12290
- * @enum {string}
12291
- */
12292
- provider: "e2b" | "docker" | "vercel";
12293
- /**
12294
- * @description Base template whose snapshots to rebuild.
12295
- * @enum {string}
12296
- */
12297
- base_template: "pi-sandbox";
12298
- /** @description Only rebuild these projects. Projects without a snapshot for the template are skipped. */
12299
- project_ids?: number[];
12300
- };
12301
12489
  RecentBranch: {
12302
12490
  /** @description Branch name. */
12303
12491
  name: string;
@@ -12403,18 +12591,18 @@ export interface components {
12403
12591
  /** @description Stable check id. */
12404
12592
  id: string;
12405
12593
  /**
12406
- * @description `error`: Empirical breaks without it. `warning`: recommended. `info`: for awareness.
12594
+ * @description `error`: Empirical breaks without it. `warning`: recommended.
12407
12595
  * @enum {string}
12408
12596
  */
12409
- level: "error" | "warning" | "info";
12597
+ level: "error" | "warning";
12410
12598
  /**
12411
- * @description `unknown` when GitHub didn't let the Empirical app read what the check needs.
12599
+ * @description `unknown` when GitHub did not let the Empirical app read what the check needs.
12412
12600
  * @enum {string}
12413
12601
  */
12414
12602
  status: "pass" | "fail" | "unknown";
12415
12603
  /** @description What was found, e.g. "Squash merging is on". Worded the same way whether the check passes or fails. */
12416
12604
  title: string;
12417
- /** @description Why it matters, or what couldn't be read. */
12605
+ /** @description Why it matters, or what could not be read. */
12418
12606
  detail: string;
12419
12607
  /** @description Where to change it in GitHub, in plain language. */
12420
12608
  fix_hint: string | null;
@@ -12428,8 +12616,36 @@ export interface components {
12428
12616
  html_url: string;
12429
12617
  };
12430
12618
  checks: components["schemas"]["RepoSettingsCheck"][];
12431
- /** @description True when the repo is owned by empirical-run and its merge settings need fixing; `POST …/fix` then applies them. */
12432
- can_auto_fix: boolean;
12619
+ /** @description Null when the repository could not be read. */
12620
+ default_branch_protection: {
12621
+ branch: string;
12622
+ rulesets: {
12623
+ /** @enum {string} */
12624
+ kind: "ok";
12625
+ items: components["schemas"]["ProtectionRuleset"][];
12626
+ } | {
12627
+ /** @enum {string} */
12628
+ kind: "unavailable";
12629
+ } | {
12630
+ /** @enum {string} */
12631
+ kind: "error";
12632
+ message: string;
12633
+ };
12634
+ classic: {
12635
+ /** @enum {string} */
12636
+ kind: "ok";
12637
+ rules: string[];
12638
+ } | {
12639
+ /** @enum {string} */
12640
+ kind: "none";
12641
+ } | {
12642
+ /** @enum {string} */
12643
+ kind: "unavailable";
12644
+ } | {
12645
+ /** @enum {string} */
12646
+ kind: "unreadable";
12647
+ };
12648
+ } | null;
12433
12649
  };
12434
12650
  };
12435
12651
  RepoTransfer: {
@@ -12559,6 +12775,27 @@ export interface components {
12559
12775
  updated_at: string | null;
12560
12776
  };
12561
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
+ };
12562
12799
  ReporterSlackChannel: {
12563
12800
  /** @description Registered channel id, as used in `slack_channel_ids` of a reporter config. */
12564
12801
  id: number;
@@ -12606,6 +12843,12 @@ export interface components {
12606
12843
  * @enum {string}
12607
12844
  */
12608
12845
  reporter_type: "github_pr_comment";
12846
+ } | {
12847
+ /**
12848
+ * @description Tracks the test branch named after the head branch of the app pull request the run was triggered for (`trigger.event` `pull_request`), and keeps the `Empirical linked test changes` check on that pull request up to date: it passes when the test branch has nothing left to merge and fails while it has unmerged commits. The pull request's latest run decides whether it is tracked. Does nothing for runs not triggered by a pull request. Needs `build` with a repository the GitHub Reporter app is installed on.
12849
+ * @enum {string}
12850
+ */
12851
+ reporter_type: "github_linked_changes";
12609
12852
  } | {
12610
12853
  /**
12611
12854
  * @description Emails a report when the run ends to every user whose email domain is one of the organization's email domains.
@@ -12753,6 +12996,83 @@ export interface components {
12753
12996
  description?: string;
12754
12997
  }[];
12755
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
+ };
12756
13076
  RunManifestResponse: {
12757
13077
  /** @description Response payload. */
12758
13078
  data: {
@@ -12954,37 +13274,14 @@ export interface components {
12954
13274
  created_at: string;
12955
13275
  /** @description ISO 8601 last-update timestamp. */
12956
13276
  updated_at: string;
12957
- };
12958
- SandboxSnapshotListResponse: {
12959
- /** @description Response payload. */
12960
- data: {
12961
- /** @description Snapshots for the project, newest first. */
12962
- snapshots: components["schemas"]["SandboxSnapshot"][];
12963
- };
12964
- };
12965
- SandboxSnapshotRebuildResponse: {
12966
- /** @description Response payload. */
12967
- data: {
12968
- /** @description Whether rebuilds were enqueued. */
12969
- triggered: boolean;
12970
- /** @description Number of projects scheduled for rebuild. */
12971
- project_count: number;
12972
- };
12973
- };
13277
+ } | null;
12974
13278
  SandboxSnapshotSourcesUpsertResponse: {
12975
13279
  /** @description Response payload. */
12976
13280
  data: {
12977
13281
  /** @description Number of sources upserted. */
12978
13282
  source_count: number;
12979
13283
  /** @description The upserted snapshot source rows. */
12980
- sources: (components["schemas"]["SandboxSnapshot"] & unknown)[];
12981
- };
12982
- };
12983
- SandboxSnapshotTriggeredResponse: {
12984
- /** @description Response payload. */
12985
- data: {
12986
- /** @description Whether snapshot creation was enqueued. */
12987
- triggered: boolean;
13284
+ sources: components["schemas"]["SandboxSnapshot"][];
12988
13285
  };
12989
13286
  };
12990
13287
  ScheduleSnoozeExpiryRequest: {
@@ -13101,6 +13398,16 @@ export interface components {
13101
13398
  data: {
13102
13399
  text: string;
13103
13400
  };
13401
+ } | {
13402
+ id: string;
13403
+ /** @enum {string} */
13404
+ kind: "thought";
13405
+ timestamp: string;
13406
+ seqFrom?: number;
13407
+ seqTo?: number;
13408
+ data: {
13409
+ texts: string[];
13410
+ };
13104
13411
  } | {
13105
13412
  id: string;
13106
13413
  /** @enum {string} */
@@ -13130,6 +13437,24 @@ export interface components {
13130
13437
  toolCallId: string;
13131
13438
  name: string;
13132
13439
  argsSummary: string;
13440
+ label: string;
13441
+ durationMs: number | null;
13442
+ changedLines?: {
13443
+ added: number;
13444
+ removed: number;
13445
+ };
13446
+ commitHash?: string;
13447
+ background?: {
13448
+ jobId: string;
13449
+ end?: {
13450
+ jobId: string;
13451
+ exitCode: number | null;
13452
+ signal: string | null;
13453
+ timedOut: boolean;
13454
+ durationMs: number;
13455
+ lost?: boolean;
13456
+ };
13457
+ };
13133
13458
  failed: boolean;
13134
13459
  running: boolean;
13135
13460
  };
@@ -13234,7 +13559,7 @@ export interface components {
13234
13559
  /** @enum {string} */
13235
13560
  kind: "event_subscription";
13236
13561
  delivery: {
13237
- instruction: string;
13562
+ instruction?: string;
13238
13563
  event: {
13239
13564
  id: string;
13240
13565
  type: string;
@@ -13282,6 +13607,7 @@ export interface components {
13282
13607
  signal: string | null;
13283
13608
  timedOut: boolean;
13284
13609
  durationMs: number;
13610
+ lost?: boolean;
13285
13611
  };
13286
13612
  } | {
13287
13613
  id: string;
@@ -14085,8 +14411,6 @@ export interface components {
14085
14411
  impacted_tests: unknown[];
14086
14412
  /** @description Whether the agent is awaiting user input. */
14087
14413
  ask_user_for_input: boolean | null;
14088
- /** @description Langfuse trace ID for observability. */
14089
- langfuse_trace_id: string | null;
14090
14414
  /** @description Whether the session is closed. */
14091
14415
  is_closed: boolean;
14092
14416
  /** @description Feature flags active for this session. */
@@ -14115,8 +14439,6 @@ export interface components {
14115
14439
  impacted_tests: unknown[];
14116
14440
  /** @description Whether the agent is awaiting user input. */
14117
14441
  ask_user_for_input: boolean | null;
14118
- /** @description Langfuse trace ID for observability. */
14119
- langfuse_trace_id: string | null;
14120
14442
  /** @description Whether the session is closed. */
14121
14443
  is_closed: boolean;
14122
14444
  /** @description Feature flags active for this session. */
@@ -14542,6 +14864,12 @@ export interface components {
14542
14864
  failing_line: string | null;
14543
14865
  /** @description ISO 8601 test completion time from the run ledger. */
14544
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;
14545
14873
  /** @description SHA of the last commit before the run started. */
14546
14874
  last_commit_before_run_started_at: string | null;
14547
14875
  /** @description Snoozes matching this case at read time. */
@@ -14658,8 +14986,6 @@ export interface components {
14658
14986
  model: string | null;
14659
14987
  /** @description Whether the agent is awaiting user input. */
14660
14988
  ask_user_for_input: boolean | null;
14661
- /** @description Langfuse trace ID. */
14662
- langfuse_trace_id: string | null;
14663
14989
  /** @description Whether the session is closed. */
14664
14990
  is_closed: boolean;
14665
14991
  /** @description For a manager closed by rollover, the manager session that took over. */
@@ -14691,6 +15017,8 @@ export interface components {
14691
15017
  * @enum {string}
14692
15018
  */
14693
15019
  pr_status: "unopened" | "open" | "opened" | "closed" | "merged";
15020
+ /** @description Number of PRs the session has opened. */
15021
+ pr_count: number;
14694
15022
  /** @description Name of the owning project. */
14695
15023
  project_name: string | null;
14696
15024
  /** @description Repository name of the owning project. */
@@ -14704,10 +15032,10 @@ export interface components {
14704
15032
  /** @description Unique identifier. */
14705
15033
  id: number;
14706
15034
  /**
14707
- * @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.
14708
15036
  * @enum {string}
14709
15037
  */
14710
- state: "pending" | "queued" | "started" | "ended" | "error" | "cancelled" | "cancelling";
15038
+ state: "pending" | "queued" | "cancelling" | "cancelled" | "ended" | "started" | "finalizing" | "error" | "interrupted";
14711
15039
  /** @description Total number of test cases. */
14712
15040
  total_count: number;
14713
15041
  /** @description Number of passed tests. */
@@ -14867,10 +15195,10 @@ export interface components {
14867
15195
  /** @description Unique identifier. */
14868
15196
  id: number;
14869
15197
  /**
14870
- * @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.
14871
15199
  * @enum {string}
14872
15200
  */
14873
- state: "pending" | "queued" | "started" | "ended" | "error" | "cancelled" | "cancelling";
15201
+ state: "pending" | "queued" | "cancelling" | "cancelled" | "ended" | "started" | "finalizing" | "error" | "interrupted";
14874
15202
  /** @description Total number of test cases. */
14875
15203
  total_count: number;
14876
15204
  /** @description Number of passed tests. */
@@ -15184,7 +15512,7 @@ export interface components {
15184
15512
  * @description Current run state (e.g. queued, started, ended).
15185
15513
  * @enum {string|null}
15186
15514
  */
15187
- status: "pending" | "queued" | "cancelling" | "cancelled" | "ended" | "started" | "error" | "interrupted" | null;
15515
+ status: "pending" | "queued" | "cancelling" | "cancelled" | "ended" | "started" | "finalizing" | "error" | "interrupted" | null;
15188
15516
  /** @description Arbitrary run metadata key/value pairs. */
15189
15517
  metadata: {
15190
15518
  [key: string]: string;
@@ -15431,6 +15759,12 @@ export interface components {
15431
15759
  * @enum {string}
15432
15760
  */
15433
15761
  reporter_type: "github_pr_comment";
15762
+ } | {
15763
+ /**
15764
+ * @description Tracks the test branch named after the head branch of the app pull request the run was triggered for (`trigger.event` `pull_request`), and keeps the `Empirical linked test changes` check on that pull request up to date: it passes when the test branch has nothing left to merge and fails while it has unmerged commits. The pull request's latest run decides whether it is tracked. Does nothing for runs not triggered by a pull request. Needs `build` with a repository the GitHub Reporter app is installed on.
15765
+ * @enum {string}
15766
+ */
15767
+ reporter_type: "github_linked_changes";
15434
15768
  } | {
15435
15769
  /**
15436
15770
  * @description Emails a report when the run ends to every user whose email domain is one of the organization's email domains.
@@ -15693,6 +16027,12 @@ export interface components {
15693
16027
  * @enum {string}
15694
16028
  */
15695
16029
  reporter_type: "github_pr_comment";
16030
+ } | {
16031
+ /**
16032
+ * @description Tracks the test branch named after the head branch of the app pull request the run was triggered for (`trigger.event` `pull_request`), and keeps the `Empirical linked test changes` check on that pull request up to date: it passes when the test branch has nothing left to merge and fails while it has unmerged commits. The pull request's latest run decides whether it is tracked. Does nothing for runs not triggered by a pull request. Needs `build` with a repository the GitHub Reporter app is installed on.
16033
+ * @enum {string}
16034
+ */
16035
+ reporter_type: "github_linked_changes";
15696
16036
  } | {
15697
16037
  /**
15698
16038
  * @description Emails a report when the run ends to every user whose email domain is one of the organization's email domains.
@@ -15733,6 +16073,8 @@ export interface components {
15733
16073
  description?: string | null;
15734
16074
  /** @description Why this change was made (max 500 characters). Shown in the session's memory change report. */
15735
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;
15736
16078
  };
15737
16079
  UpdateOrderFormRequest: {
15738
16080
  org_id?: number;
@@ -15804,6 +16146,31 @@ export interface components {
15804
16146
  */
15805
16147
  status?: "uploaded";
15806
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
+ };
15807
16174
  UpdateShardStateResponse: {
15808
16175
  /** @description Response payload. */
15809
16176
  data: {
@@ -16214,7 +16581,11 @@ export interface operations {
16214
16581
  branch?: string;
16215
16582
  /** @description Restrict to runs created in the last N days. */
16216
16583
  interval_in_days?: number;
16217
- /** @description Filter by run state (e.g. `queued`, `ended`). */
16584
+ /** @description Restrict to runs created at or after this time. */
16585
+ created_after?: string;
16586
+ /** @description Restrict to runs created before this time. */
16587
+ created_before?: string;
16588
+ /** @description Filter by run state (e.g. `queued`, `ended`); comma-separated for several. */
16218
16589
  state?: string;
16219
16590
  /** @description Filter by overall run result. */
16220
16591
  result?: "passed" | "failed";
@@ -20983,461 +21354,6 @@ export interface operations {
20983
21354
  };
20984
21355
  };
20985
21356
  };
20986
- getStaticIps: {
20987
- parameters: {
20988
- query: {
20989
- /** @description Region to look up. One of: ap-south-1. */
20990
- region: string;
20991
- };
20992
- header?: never;
20993
- path?: never;
20994
- cookie?: never;
20995
- };
20996
- requestBody?: never;
20997
- responses: {
20998
- /** @description Static IPs for the region. */
20999
- 200: {
21000
- headers: {
21001
- [name: string]: unknown;
21002
- };
21003
- content: {
21004
- "application/json": components["schemas"]["StaticIpsResponse"];
21005
- };
21006
- };
21007
- /** @description Missing or unknown region. */
21008
- 400: {
21009
- headers: {
21010
- [name: string]: unknown;
21011
- };
21012
- content: {
21013
- "application/json": components["schemas"]["ErrorResponse"];
21014
- };
21015
- };
21016
- };
21017
- };
21018
- listTasks: {
21019
- parameters: {
21020
- query?: {
21021
- /** @description Page number (1-indexed). */
21022
- page?: number;
21023
- /** @description Items per page. */
21024
- per_page?: number;
21025
- /** @description URL-encoded JSON array of generic filter conditions; malformed input is ignored. */
21026
- filters?: string;
21027
- };
21028
- header?: never;
21029
- path?: never;
21030
- cookie?: never;
21031
- };
21032
- requestBody?: never;
21033
- responses: {
21034
- /** @description Paginated list of tasks. */
21035
- 200: {
21036
- headers: {
21037
- [name: string]: unknown;
21038
- };
21039
- content: {
21040
- "application/json": components["schemas"]["TaskListResponse"];
21041
- };
21042
- };
21043
- /** @description Invalid request or missing project scope. */
21044
- 400: {
21045
- headers: {
21046
- [name: string]: unknown;
21047
- };
21048
- content: {
21049
- "application/json": components["schemas"]["ErrorResponse"];
21050
- };
21051
- };
21052
- /** @description Project not found or inaccessible. */
21053
- 404: {
21054
- headers: {
21055
- [name: string]: unknown;
21056
- };
21057
- content: {
21058
- "application/json": components["schemas"]["ErrorResponse"];
21059
- };
21060
- };
21061
- };
21062
- };
21063
- createTask: {
21064
- parameters: {
21065
- query?: never;
21066
- header?: never;
21067
- path?: never;
21068
- cookie?: never;
21069
- };
21070
- requestBody?: {
21071
- content: {
21072
- "application/json": components["schemas"]["CreateTaskRequest"];
21073
- };
21074
- };
21075
- responses: {
21076
- /** @description The created task. */
21077
- 201: {
21078
- headers: {
21079
- [name: string]: unknown;
21080
- };
21081
- content: {
21082
- "application/json": components["schemas"]["CreateTaskResponse"];
21083
- };
21084
- };
21085
- /** @description Missing required fields, no person to own the task, or invalid input. */
21086
- 400: {
21087
- headers: {
21088
- [name: string]: unknown;
21089
- };
21090
- content: {
21091
- "application/json": components["schemas"]["CreateTaskError"];
21092
- };
21093
- };
21094
- /** @description Project not found or inaccessible. */
21095
- 404: {
21096
- headers: {
21097
- [name: string]: unknown;
21098
- };
21099
- content: {
21100
- "application/json": components["schemas"]["ErrorResponse"];
21101
- };
21102
- };
21103
- /** @description Failed to create task. */
21104
- 500: {
21105
- headers: {
21106
- [name: string]: unknown;
21107
- };
21108
- content: {
21109
- "application/json": components["schemas"]["ErrorResponse"];
21110
- };
21111
- };
21112
- };
21113
- };
21114
- getTask: {
21115
- parameters: {
21116
- query?: never;
21117
- header?: never;
21118
- path: {
21119
- /** @description Task ID. */
21120
- id: number;
21121
- };
21122
- cookie?: never;
21123
- };
21124
- requestBody?: never;
21125
- responses: {
21126
- /** @description The task. */
21127
- 200: {
21128
- headers: {
21129
- [name: string]: unknown;
21130
- };
21131
- content: {
21132
- "application/json": components["schemas"]["TaskResponse"];
21133
- };
21134
- };
21135
- /** @description Invalid task ID. */
21136
- 400: {
21137
- headers: {
21138
- [name: string]: unknown;
21139
- };
21140
- content: {
21141
- "application/json": components["schemas"]["ErrorResponse"];
21142
- };
21143
- };
21144
- /** @description Task not found. */
21145
- 404: {
21146
- headers: {
21147
- [name: string]: unknown;
21148
- };
21149
- content: {
21150
- "application/json": components["schemas"]["ErrorResponse"];
21151
- };
21152
- };
21153
- };
21154
- };
21155
- deleteTask: {
21156
- parameters: {
21157
- query?: never;
21158
- header?: never;
21159
- path: {
21160
- /** @description Task ID. */
21161
- id: number;
21162
- };
21163
- cookie?: never;
21164
- };
21165
- requestBody?: never;
21166
- responses: {
21167
- /** @description The deleted task ID. */
21168
- 200: {
21169
- headers: {
21170
- [name: string]: unknown;
21171
- };
21172
- content: {
21173
- "application/json": components["schemas"]["DeletedTaskResponse"];
21174
- };
21175
- };
21176
- /** @description Invalid task ID. */
21177
- 400: {
21178
- headers: {
21179
- [name: string]: unknown;
21180
- };
21181
- content: {
21182
- "application/json": components["schemas"]["ErrorResponse"];
21183
- };
21184
- };
21185
- /** @description Task not found or not deleted. */
21186
- 404: {
21187
- headers: {
21188
- [name: string]: unknown;
21189
- };
21190
- content: {
21191
- "application/json": components["schemas"]["ErrorResponse"];
21192
- };
21193
- };
21194
- };
21195
- };
21196
- updateTask: {
21197
- parameters: {
21198
- query?: never;
21199
- header?: never;
21200
- path: {
21201
- /** @description Task ID. */
21202
- id: number;
21203
- };
21204
- cookie?: never;
21205
- };
21206
- requestBody?: {
21207
- content: {
21208
- "application/json": components["schemas"]["UpdateTaskRequest"];
21209
- };
21210
- };
21211
- responses: {
21212
- /** @description The updated task. */
21213
- 200: {
21214
- headers: {
21215
- [name: string]: unknown;
21216
- };
21217
- content: {
21218
- "application/json": components["schemas"]["UpdatedTaskResponse"];
21219
- };
21220
- };
21221
- /** @description No fields to update or invalid input. */
21222
- 400: {
21223
- headers: {
21224
- [name: string]: unknown;
21225
- };
21226
- content: {
21227
- "application/json": components["schemas"]["ErrorResponse"];
21228
- };
21229
- };
21230
- /** @description Task not found or not updated. */
21231
- 404: {
21232
- headers: {
21233
- [name: string]: unknown;
21234
- };
21235
- content: {
21236
- "application/json": components["schemas"]["ErrorResponse"];
21237
- };
21238
- };
21239
- };
21240
- };
21241
- getOverlayDismissalSummary: {
21242
- parameters: {
21243
- query?: {
21244
- /** @description Page number (1-indexed). Default 1. */
21245
- page?: string;
21246
- /** @description Items per page (1-100). Default 50. */
21247
- per_page?: string;
21248
- /** @description Look-back window in days (1-90, default 7). Ignored when `start_date` and `end_date` are set. */
21249
- days?: string;
21250
- /** @description Start of a custom date range (ISO 8601). */
21251
- start_date?: string;
21252
- /** @description End of a custom date range (ISO 8601). */
21253
- end_date?: string;
21254
- /** @description Filter by environment name. */
21255
- environment?: string;
21256
- /** @description Filter by test run ID. */
21257
- test_run_id?: string;
21258
- /** @description Case-insensitive substring filter on test name. */
21259
- test_name?: string;
21260
- /** @description Filter by success: `true` or `false`. Other values ignored. */
21261
- success?: string;
21262
- /** @description Filter by cache hit: `true` or `false`. Other values ignored. */
21263
- cache_hit?: string;
21264
- };
21265
- header?: never;
21266
- path?: never;
21267
- cookie?: never;
21268
- };
21269
- requestBody?: never;
21270
- responses: {
21271
- /** @description Overlay-dismissal summary for the project. */
21272
- 200: {
21273
- headers: {
21274
- [name: string]: unknown;
21275
- };
21276
- content: {
21277
- "application/json": components["schemas"]["OverlayDismissalSummaryResponse"];
21278
- };
21279
- };
21280
- /** @description Failed to query telemetry. */
21281
- 500: {
21282
- headers: {
21283
- [name: string]: unknown;
21284
- };
21285
- content: {
21286
- "application/json": components["schemas"]["ErrorResponse"];
21287
- };
21288
- };
21289
- };
21290
- };
21291
- getOverlayDismissalEvents: {
21292
- parameters: {
21293
- query?: {
21294
- /** @description Page number (1-indexed). Default 1. */
21295
- page?: string;
21296
- /** @description Items per page (1-100). Default 50. */
21297
- per_page?: string;
21298
- /** @description Look-back window in days (1-90, default 7). Ignored when `start_date` and `end_date` are set. */
21299
- days?: string;
21300
- /** @description Start of a custom date range (ISO 8601). */
21301
- start_date?: string;
21302
- /** @description End of a custom date range (ISO 8601). */
21303
- end_date?: string;
21304
- /** @description Filter by environment name. */
21305
- environment?: string;
21306
- /** @description Filter by test run ID. */
21307
- test_run_id?: string;
21308
- /** @description Case-insensitive substring filter on test name. */
21309
- test_name?: string;
21310
- /** @description Filter by success: `true` or `false`. Other values ignored. */
21311
- success?: string;
21312
- /** @description Filter by cache hit: `true` or `false`. Other values ignored. */
21313
- cache_hit?: string;
21314
- };
21315
- header?: never;
21316
- path?: never;
21317
- cookie?: never;
21318
- };
21319
- requestBody?: never;
21320
- responses: {
21321
- /** @description Paginated overlay-dismissal events for the project. */
21322
- 200: {
21323
- headers: {
21324
- [name: string]: unknown;
21325
- };
21326
- content: {
21327
- "application/json": components["schemas"]["OverlayDismissalEventsResponse"];
21328
- };
21329
- };
21330
- /** @description Failed to query telemetry. */
21331
- 500: {
21332
- headers: {
21333
- [name: string]: unknown;
21334
- };
21335
- content: {
21336
- "application/json": components["schemas"]["ErrorResponse"];
21337
- };
21338
- };
21339
- };
21340
- };
21341
- listTestRunCases: {
21342
- parameters: {
21343
- query?: {
21344
- /** @description Filter to cases with this status. */
21345
- status?: "passed" | "failed" | "flaky" | "skipped";
21346
- /** @description Page number (1-indexed). Default 1. */
21347
- page?: number;
21348
- /** @description Items per page (capped at 200). Default 50. */
21349
- per_page?: number;
21350
- /** @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. */
21351
- order?: "scheduled" | "recent" | "duration" | "start_time";
21352
- /** @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. */
21353
- q?: string;
21354
- /** @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`. */
21355
- include_retrying?: "true" | "false";
21356
- };
21357
- header?: never;
21358
- path: {
21359
- /** @description Test run database ID. */
21360
- id: number;
21361
- };
21362
- cookie?: never;
21363
- };
21364
- requestBody?: never;
21365
- responses: {
21366
- /** @description Paginated list of test run cases. */
21367
- 200: {
21368
- headers: {
21369
- [name: string]: unknown;
21370
- };
21371
- content: {
21372
- "application/json": components["schemas"]["ListTestRunCasesResponse"];
21373
- };
21374
- };
21375
- /** @description Invalid request. */
21376
- 400: {
21377
- headers: {
21378
- [name: string]: unknown;
21379
- };
21380
- content: {
21381
- "application/json": components["schemas"]["ErrorResponse"];
21382
- };
21383
- };
21384
- /** @description Test run not found. */
21385
- 404: {
21386
- headers: {
21387
- [name: string]: unknown;
21388
- };
21389
- content: {
21390
- "application/json": components["schemas"]["ErrorResponse"];
21391
- };
21392
- };
21393
- };
21394
- };
21395
- getTestRunCase: {
21396
- parameters: {
21397
- query?: {
21398
- /** @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`. */
21399
- include_retrying?: "true" | "false";
21400
- };
21401
- header?: never;
21402
- path: {
21403
- /** @description Test run database ID. */
21404
- id: number;
21405
- /** @description Playwright test ID (`pw_test_id`) of the case. */
21406
- case_id: string;
21407
- };
21408
- cookie?: never;
21409
- };
21410
- requestBody?: never;
21411
- responses: {
21412
- /** @description The test run case. */
21413
- 200: {
21414
- headers: {
21415
- [name: string]: unknown;
21416
- };
21417
- content: {
21418
- "application/json": components["schemas"]["GetTestRunCaseResponse"];
21419
- };
21420
- };
21421
- /** @description Invalid request. */
21422
- 400: {
21423
- headers: {
21424
- [name: string]: unknown;
21425
- };
21426
- content: {
21427
- "application/json": components["schemas"]["ErrorResponse"];
21428
- };
21429
- };
21430
- /** @description Test run or test case not found. */
21431
- 404: {
21432
- headers: {
21433
- [name: string]: unknown;
21434
- };
21435
- content: {
21436
- "application/json": components["schemas"]["ErrorResponse"];
21437
- };
21438
- };
21439
- };
21440
- };
21441
21357
  listChatSessionAlarms: {
21442
21358
  parameters: {
21443
21359
  query?: never;
@@ -21467,11 +21383,15 @@ export interface operations {
21467
21383
  timing: {
21468
21384
  /** @enum {string} */
21469
21385
  type: "once";
21470
- /** Format: date-time */
21386
+ /**
21387
+ * Format: date-time
21388
+ * @description ISO 8601 UTC time at least 5m in the future.
21389
+ */
21471
21390
  run_at: string;
21472
21391
  } | {
21473
21392
  /** @enum {string} */
21474
21393
  type: "cron";
21394
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21475
21395
  cron: string;
21476
21396
  /** Format: date-time */
21477
21397
  ends_at?: string;
@@ -21508,20 +21428,25 @@ export interface operations {
21508
21428
  requestBody?: {
21509
21429
  content: {
21510
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. */
21511
21432
  message: string;
21512
21433
  timing: {
21513
21434
  /** @enum {string} */
21514
21435
  type: "delay";
21515
- /** @description Relative delay using m/h/d units, such as "15m", "2h", or "1d". Min 5m, max 72h. */
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". */
21516
21437
  delay: string;
21517
21438
  } | {
21518
21439
  /** @enum {string} */
21519
21440
  type: "once";
21520
- /** Format: date-time */
21441
+ /**
21442
+ * Format: date-time
21443
+ * @description ISO 8601 UTC time at least 5m in the future.
21444
+ */
21521
21445
  run_at: string;
21522
21446
  } | {
21523
21447
  /** @enum {string} */
21524
21448
  type: "cron";
21449
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21525
21450
  cron: string;
21526
21451
  /** Format: date-time */
21527
21452
  ends_at?: string;
@@ -21548,11 +21473,15 @@ export interface operations {
21548
21473
  timing: {
21549
21474
  /** @enum {string} */
21550
21475
  type: "once";
21551
- /** Format: date-time */
21476
+ /**
21477
+ * Format: date-time
21478
+ * @description ISO 8601 UTC time at least 5m in the future.
21479
+ */
21552
21480
  run_at: string;
21553
21481
  } | {
21554
21482
  /** @enum {string} */
21555
21483
  type: "cron";
21484
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21556
21485
  cron: string;
21557
21486
  /** Format: date-time */
21558
21487
  ends_at?: string;
@@ -21638,15 +21567,19 @@ export interface operations {
21638
21567
  requestBody?: {
21639
21568
  content: {
21640
21569
  "application/json": {
21641
- message?: string;
21642
- timing?: {
21570
+ /** @description New schedule. The message is fixed at creation; delete the alarm and create a new one to change it. */
21571
+ timing: {
21643
21572
  /** @enum {string} */
21644
21573
  type: "once";
21645
- /** Format: date-time */
21574
+ /**
21575
+ * Format: date-time
21576
+ * @description ISO 8601 UTC time at least 5m in the future.
21577
+ */
21646
21578
  run_at: string;
21647
21579
  } | {
21648
21580
  /** @enum {string} */
21649
21581
  type: "cron";
21582
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21650
21583
  cron: string;
21651
21584
  /** Format: date-time */
21652
21585
  ends_at?: string;
@@ -21673,11 +21606,15 @@ export interface operations {
21673
21606
  timing: {
21674
21607
  /** @enum {string} */
21675
21608
  type: "once";
21676
- /** Format: date-time */
21609
+ /**
21610
+ * Format: date-time
21611
+ * @description ISO 8601 UTC time at least 5m in the future.
21612
+ */
21677
21613
  run_at: string;
21678
21614
  } | {
21679
21615
  /** @enum {string} */
21680
21616
  type: "cron";
21617
+ /** @description Five-field UTC cron expression, e.g. "0 *\/4 * * *". Runs must be at least 5m apart. */
21681
21618
  cron: string;
21682
21619
  /** Format: date-time */
21683
21620
  ends_at?: string;
@@ -21785,7 +21722,6 @@ export interface operations {
21785
21722
  lte?: number;
21786
21723
  }) | null;
21787
21724
  };
21788
- message: string;
21789
21725
  /**
21790
21726
  * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21791
21727
  * @enum {string}
@@ -21837,8 +21773,6 @@ export interface operations {
21837
21773
  lte?: number;
21838
21774
  }) | null;
21839
21775
  };
21840
- /** @description Continuation instruction delivered to the session after the event matches. */
21841
- message: string;
21842
21776
  /**
21843
21777
  * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21844
21778
  * @enum {string}
@@ -21873,7 +21807,6 @@ export interface operations {
21873
21807
  lte?: number;
21874
21808
  }) | null;
21875
21809
  };
21876
- message: string;
21877
21810
  /**
21878
21811
  * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21879
21812
  * @enum {string}
@@ -21952,7 +21885,6 @@ export interface operations {
21952
21885
  lte?: number;
21953
21886
  }) | null;
21954
21887
  };
21955
- message: string;
21956
21888
  /**
21957
21889
  * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
21958
21890
  * @enum {string}
@@ -22032,8 +21964,6 @@ export interface operations {
22032
21964
  lte?: number;
22033
21965
  }) | null;
22034
21966
  };
22035
- /** @description Continuation instruction delivered to the session after the event matches. */
22036
- message?: string;
22037
21967
  /**
22038
21968
  * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
22039
21969
  * @enum {string}
@@ -22068,7 +21998,6 @@ export interface operations {
22068
21998
  lte?: number;
22069
21999
  }) | null;
22070
22000
  };
22071
- message: string;
22072
22001
  /**
22073
22002
  * @description Whether the trigger is consumed after one successful delivery or remains active. Recurring triggers require a wildcard entity match.
22074
22003
  * @enum {string}
@@ -22565,6 +22494,38 @@ export interface operations {
22565
22494
  };
22566
22495
  };
22567
22496
  };
22497
+ getStaticIps: {
22498
+ parameters: {
22499
+ query: {
22500
+ /** @description Region to look up. One of: ap-south-1. */
22501
+ region: string;
22502
+ };
22503
+ header?: never;
22504
+ path?: never;
22505
+ cookie?: never;
22506
+ };
22507
+ requestBody?: never;
22508
+ responses: {
22509
+ /** @description Static IPs for the region. */
22510
+ 200: {
22511
+ headers: {
22512
+ [name: string]: unknown;
22513
+ };
22514
+ content: {
22515
+ "application/json": components["schemas"]["StaticIpsResponse"];
22516
+ };
22517
+ };
22518
+ /** @description Missing or unknown region. */
22519
+ 400: {
22520
+ headers: {
22521
+ [name: string]: unknown;
22522
+ };
22523
+ content: {
22524
+ "application/json": components["schemas"]["ErrorResponse"];
22525
+ };
22526
+ };
22527
+ };
22528
+ };
22568
22529
  listPlaywrightVersions: {
22569
22530
  parameters: {
22570
22531
  query?: never;
@@ -22585,6 +22546,471 @@ export interface operations {
22585
22546
  };
22586
22547
  };
22587
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";
22557
+ };
22558
+ header?: never;
22559
+ path?: never;
22560
+ cookie?: never;
22561
+ };
22562
+ requestBody?: never;
22563
+ responses: {
22564
+ /** @description Paginated list of rules. */
22565
+ 200: {
22566
+ headers: {
22567
+ [name: string]: unknown;
22568
+ };
22569
+ content: {
22570
+ "application/json": components["schemas"]["RuleListResponse"];
22571
+ };
22572
+ };
22573
+ /** @description Invalid request. */
22574
+ 400: {
22575
+ headers: {
22576
+ [name: string]: unknown;
22577
+ };
22578
+ content: {
22579
+ "application/json": components["schemas"]["ErrorResponse"];
22580
+ };
22581
+ };
22582
+ };
22583
+ };
22584
+ createRule: {
22585
+ parameters: {
22586
+ query?: never;
22587
+ header?: never;
22588
+ path?: never;
22589
+ cookie?: never;
22590
+ };
22591
+ requestBody?: {
22592
+ content: {
22593
+ "application/json": components["schemas"]["CreateRuleRequest"];
22594
+ };
22595
+ };
22596
+ responses: {
22597
+ /** @description The created rule. */
22598
+ 200: {
22599
+ headers: {
22600
+ [name: string]: unknown;
22601
+ };
22602
+ content: {
22603
+ "application/json": components["schemas"]["RuleResponse"];
22604
+ };
22605
+ };
22606
+ /** @description Invalid request. */
22607
+ 400: {
22608
+ headers: {
22609
+ [name: string]: unknown;
22610
+ };
22611
+ content: {
22612
+ "application/json": components["schemas"]["ErrorResponse"];
22613
+ };
22614
+ };
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: {
22631
+ headers: {
22632
+ [name: string]: unknown;
22633
+ };
22634
+ content: {
22635
+ "application/json": components["schemas"]["RuleResponse"];
22636
+ };
22637
+ };
22638
+ /** @description Rule not found. */
22639
+ 404: {
22640
+ headers: {
22641
+ [name: string]: unknown;
22642
+ };
22643
+ content: {
22644
+ "application/json": components["schemas"]["ErrorResponse"];
22645
+ };
22646
+ };
22647
+ };
22648
+ };
22649
+ deleteRule: {
22650
+ parameters: {
22651
+ query?: never;
22652
+ header?: never;
22653
+ path: {
22654
+ /** @description Rule ID. */
22655
+ id: number;
22656
+ };
22657
+ cookie?: never;
22658
+ };
22659
+ requestBody?: never;
22660
+ responses: {
22661
+ /** @description The deleted rule. */
22662
+ 200: {
22663
+ headers: {
22664
+ [name: string]: unknown;
22665
+ };
22666
+ content: {
22667
+ "application/json": components["schemas"]["RuleResponse"];
22668
+ };
22669
+ };
22670
+ /** @description Rule not found. */
22671
+ 404: {
22672
+ headers: {
22673
+ [name: string]: unknown;
22674
+ };
22675
+ content: {
22676
+ "application/json": components["schemas"]["ErrorResponse"];
22677
+ };
22678
+ };
22679
+ };
22680
+ };
22681
+ updateRule: {
22682
+ parameters: {
22683
+ query?: never;
22684
+ header?: never;
22685
+ path: {
22686
+ /** @description Rule ID. */
22687
+ id: number;
22688
+ };
22689
+ cookie?: never;
22690
+ };
22691
+ requestBody?: {
22692
+ content: {
22693
+ "application/json": components["schemas"]["UpdateRuleRequest"];
22694
+ };
22695
+ };
22696
+ responses: {
22697
+ /** @description The updated rule. */
22698
+ 200: {
22699
+ headers: {
22700
+ [name: string]: unknown;
22701
+ };
22702
+ content: {
22703
+ "application/json": components["schemas"]["RuleResponse"];
22704
+ };
22705
+ };
22706
+ /** @description Invalid request. */
22707
+ 400: {
22708
+ headers: {
22709
+ [name: string]: unknown;
22710
+ };
22711
+ content: {
22712
+ "application/json": components["schemas"]["ErrorResponse"];
22713
+ };
22714
+ };
22715
+ /** @description Rule not found. */
22716
+ 404: {
22717
+ headers: {
22718
+ [name: string]: unknown;
22719
+ };
22720
+ content: {
22721
+ "application/json": components["schemas"]["ErrorResponse"];
22722
+ };
22723
+ };
22724
+ };
22725
+ };
22726
+ listRuleRevisions: {
22727
+ parameters: {
22728
+ query?: never;
22729
+ header?: never;
22730
+ path: {
22731
+ /** @description Rule ID. */
22732
+ id: number;
22733
+ };
22734
+ cookie?: never;
22735
+ };
22736
+ requestBody?: never;
22737
+ responses: {
22738
+ /** @description The rule's revisions. */
22739
+ 200: {
22740
+ headers: {
22741
+ [name: string]: unknown;
22742
+ };
22743
+ content: {
22744
+ "application/json": components["schemas"]["RuleRevisionListResponse"];
22745
+ };
22746
+ };
22747
+ /** @description Rule not found. */
22748
+ 404: {
22749
+ headers: {
22750
+ [name: string]: unknown;
22751
+ };
22752
+ content: {
22753
+ "application/json": components["schemas"]["ErrorResponse"];
22754
+ };
22755
+ };
22756
+ };
22757
+ };
22758
+ matchRules: {
22759
+ parameters: {
22760
+ query?: never;
22761
+ header?: never;
22762
+ path?: never;
22763
+ cookie?: never;
22764
+ };
22765
+ requestBody?: {
22766
+ content: {
22767
+ "application/json": components["schemas"]["MatchRulesRequest"];
22768
+ };
22769
+ };
22770
+ responses: {
22771
+ /** @description Rules that cover the case. */
22772
+ 200: {
22773
+ headers: {
22774
+ [name: string]: unknown;
22775
+ };
22776
+ content: {
22777
+ "application/json": components["schemas"]["MatchRulesResponse"];
22778
+ };
22779
+ };
22780
+ /** @description Test run or case not found. */
22781
+ 404: {
22782
+ headers: {
22783
+ [name: string]: unknown;
22784
+ };
22785
+ content: {
22786
+ "application/json": components["schemas"]["ErrorResponse"];
22787
+ };
22788
+ };
22789
+ };
22790
+ };
22791
+ listTasks: {
22792
+ parameters: {
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
+ };
22801
+ header?: never;
22802
+ path?: never;
22803
+ cookie?: never;
22804
+ };
22805
+ requestBody?: never;
22806
+ responses: {
22807
+ /** @description Paginated list of tasks. */
22808
+ 200: {
22809
+ headers: {
22810
+ [name: string]: unknown;
22811
+ };
22812
+ content: {
22813
+ "application/json": components["schemas"]["TaskListResponse"];
22814
+ };
22815
+ };
22816
+ /** @description Invalid request or missing project scope. */
22817
+ 400: {
22818
+ headers: {
22819
+ [name: string]: unknown;
22820
+ };
22821
+ content: {
22822
+ "application/json": components["schemas"]["ErrorResponse"];
22823
+ };
22824
+ };
22825
+ /** @description Project not found or inaccessible. */
22826
+ 404: {
22827
+ headers: {
22828
+ [name: string]: unknown;
22829
+ };
22830
+ content: {
22831
+ "application/json": components["schemas"]["ErrorResponse"];
22832
+ };
22833
+ };
22834
+ };
22835
+ };
22836
+ createTask: {
22837
+ parameters: {
22838
+ query?: never;
22839
+ header?: never;
22840
+ path?: never;
22841
+ cookie?: never;
22842
+ };
22843
+ requestBody?: {
22844
+ content: {
22845
+ "application/json": components["schemas"]["CreateTaskRequest"];
22846
+ };
22847
+ };
22848
+ responses: {
22849
+ /** @description The created task. */
22850
+ 201: {
22851
+ headers: {
22852
+ [name: string]: unknown;
22853
+ };
22854
+ content: {
22855
+ "application/json": components["schemas"]["CreateTaskResponse"];
22856
+ };
22857
+ };
22858
+ /** @description Missing required fields, no person to own the task, or invalid input. */
22859
+ 400: {
22860
+ headers: {
22861
+ [name: string]: unknown;
22862
+ };
22863
+ content: {
22864
+ "application/json": components["schemas"]["CreateTaskError"];
22865
+ };
22866
+ };
22867
+ /** @description Project not found or inaccessible. */
22868
+ 404: {
22869
+ headers: {
22870
+ [name: string]: unknown;
22871
+ };
22872
+ content: {
22873
+ "application/json": components["schemas"]["ErrorResponse"];
22874
+ };
22875
+ };
22876
+ /** @description Failed to create task. */
22877
+ 500: {
22878
+ headers: {
22879
+ [name: string]: unknown;
22880
+ };
22881
+ content: {
22882
+ "application/json": components["schemas"]["ErrorResponse"];
22883
+ };
22884
+ };
22885
+ };
22886
+ };
22887
+ getTask: {
22888
+ parameters: {
22889
+ query?: never;
22890
+ header?: never;
22891
+ path: {
22892
+ /** @description Task ID. */
22893
+ id: number;
22894
+ };
22895
+ cookie?: never;
22896
+ };
22897
+ requestBody?: never;
22898
+ responses: {
22899
+ /** @description The task. */
22900
+ 200: {
22901
+ headers: {
22902
+ [name: string]: unknown;
22903
+ };
22904
+ content: {
22905
+ "application/json": components["schemas"]["TaskResponse"];
22906
+ };
22907
+ };
22908
+ /** @description Invalid task ID. */
22909
+ 400: {
22910
+ headers: {
22911
+ [name: string]: unknown;
22912
+ };
22913
+ content: {
22914
+ "application/json": components["schemas"]["ErrorResponse"];
22915
+ };
22916
+ };
22917
+ /** @description Task not found. */
22918
+ 404: {
22919
+ headers: {
22920
+ [name: string]: unknown;
22921
+ };
22922
+ content: {
22923
+ "application/json": components["schemas"]["ErrorResponse"];
22924
+ };
22925
+ };
22926
+ };
22927
+ };
22928
+ deleteTask: {
22929
+ parameters: {
22930
+ query?: never;
22931
+ header?: never;
22932
+ path: {
22933
+ /** @description Task ID. */
22934
+ id: number;
22935
+ };
22936
+ cookie?: never;
22937
+ };
22938
+ requestBody?: never;
22939
+ responses: {
22940
+ /** @description The deleted task ID. */
22941
+ 200: {
22942
+ headers: {
22943
+ [name: string]: unknown;
22944
+ };
22945
+ content: {
22946
+ "application/json": components["schemas"]["DeletedTaskResponse"];
22947
+ };
22948
+ };
22949
+ /** @description Invalid task ID. */
22950
+ 400: {
22951
+ headers: {
22952
+ [name: string]: unknown;
22953
+ };
22954
+ content: {
22955
+ "application/json": components["schemas"]["ErrorResponse"];
22956
+ };
22957
+ };
22958
+ /** @description Task not found or not deleted. */
22959
+ 404: {
22960
+ headers: {
22961
+ [name: string]: unknown;
22962
+ };
22963
+ content: {
22964
+ "application/json": components["schemas"]["ErrorResponse"];
22965
+ };
22966
+ };
22967
+ };
22968
+ };
22969
+ updateTask: {
22970
+ parameters: {
22971
+ query?: never;
22972
+ header?: never;
22973
+ path: {
22974
+ /** @description Task ID. */
22975
+ id: number;
22976
+ };
22977
+ cookie?: never;
22978
+ };
22979
+ requestBody?: {
22980
+ content: {
22981
+ "application/json": components["schemas"]["UpdateTaskRequest"];
22982
+ };
22983
+ };
22984
+ responses: {
22985
+ /** @description The updated task. */
22986
+ 200: {
22987
+ headers: {
22988
+ [name: string]: unknown;
22989
+ };
22990
+ content: {
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"];
23010
+ };
23011
+ };
23012
+ };
23013
+ };
22588
23014
  compareTraceAgainstPass: {
22589
23015
  parameters: {
22590
23016
  query?: never;
@@ -22935,6 +23361,206 @@ export interface operations {
22935
23361
  };
22936
23362
  };
22937
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;
23443
+ responses: {
23444
+ /** @description Paginated overlay-dismissal events for the project. */
23445
+ 200: {
23446
+ headers: {
23447
+ [name: string]: unknown;
23448
+ };
23449
+ content: {
23450
+ "application/json": components["schemas"]["OverlayDismissalEventsResponse"];
23451
+ };
23452
+ };
23453
+ /** @description Failed to query telemetry. */
23454
+ 500: {
23455
+ headers: {
23456
+ [name: string]: unknown;
23457
+ };
23458
+ content: {
23459
+ "application/json": components["schemas"]["ErrorResponse"];
23460
+ };
23461
+ };
23462
+ };
23463
+ };
23464
+ listTestRunCases: {
23465
+ parameters: {
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";
23479
+ };
23480
+ header?: never;
23481
+ path: {
23482
+ /** @description Test run database ID. */
23483
+ id: number;
23484
+ };
23485
+ cookie?: never;
23486
+ };
23487
+ requestBody?: never;
23488
+ responses: {
23489
+ /** @description Paginated list of test run cases. */
23490
+ 200: {
23491
+ headers: {
23492
+ [name: string]: unknown;
23493
+ };
23494
+ content: {
23495
+ "application/json": components["schemas"]["ListTestRunCasesResponse"];
23496
+ };
23497
+ };
23498
+ /** @description Invalid request. */
23499
+ 400: {
23500
+ headers: {
23501
+ [name: string]: unknown;
23502
+ };
23503
+ content: {
23504
+ "application/json": components["schemas"]["ErrorResponse"];
23505
+ };
23506
+ };
23507
+ /** @description Test run not found. */
23508
+ 404: {
23509
+ headers: {
23510
+ [name: string]: unknown;
23511
+ };
23512
+ content: {
23513
+ "application/json": components["schemas"]["ErrorResponse"];
23514
+ };
23515
+ };
23516
+ };
23517
+ };
23518
+ getTestRunCase: {
23519
+ parameters: {
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
+ };
23524
+ header?: never;
23525
+ path: {
23526
+ /** @description Test run database ID. */
23527
+ id: number;
23528
+ /** @description Playwright test ID (`pw_test_id`) of the case. */
23529
+ case_id: string;
23530
+ };
23531
+ cookie?: never;
23532
+ };
23533
+ requestBody?: never;
23534
+ responses: {
23535
+ /** @description The test run case. */
23536
+ 200: {
23537
+ headers: {
23538
+ [name: string]: unknown;
23539
+ };
23540
+ content: {
23541
+ "application/json": components["schemas"]["GetTestRunCaseResponse"];
23542
+ };
23543
+ };
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. */
23554
+ 404: {
23555
+ headers: {
23556
+ [name: string]: unknown;
23557
+ };
23558
+ content: {
23559
+ "application/json": components["schemas"]["ErrorResponse"];
23560
+ };
23561
+ };
23562
+ };
23563
+ };
22938
23564
  listActivity: {
22939
23565
  parameters: {
22940
23566
  query?: {
@@ -23650,6 +24276,8 @@ export interface operations {
23650
24276
  exclude_project_ids?: string;
23651
24277
  /** @description Comma-separated creator user IDs to filter by. */
23652
24278
  user_ids?: string;
24279
+ /** @description Matches the session title, the creator's name or email, or the session ID. */
24280
+ search?: string;
23653
24281
  /** @description Only sessions updated within this many days. */
23654
24282
  updated_within_days?: number;
23655
24283
  /** @description URL-encoded JSON array of generic filter conditions. */
@@ -24335,7 +24963,7 @@ export interface operations {
24335
24963
  [key: string]: number;
24336
24964
  }) | null;
24337
24965
  };
24338
- message: string;
24966
+ message?: string;
24339
24967
  /** @enum {string} */
24340
24968
  cardinality: "one_shot" | "recurring";
24341
24969
  }[];
@@ -24444,7 +25072,7 @@ export interface operations {
24444
25072
  "application/json": components["schemas"]["ChatSessionForwardMessageResponse"];
24445
25073
  };
24446
25074
  };
24447
- /** @description Invalid request. */
25075
+ /** @description Invalid request, or the caller is the target session. */
24448
25076
  400: {
24449
25077
  headers: {
24450
25078
  [name: string]: unknown;
@@ -24906,38 +25534,6 @@ export interface operations {
24906
25534
  };
24907
25535
  };
24908
25536
  };
24909
- getChatSessionTimeline: {
24910
- parameters: {
24911
- query?: never;
24912
- header?: never;
24913
- path: {
24914
- /** @description Chat session ID. */
24915
- id: number;
24916
- };
24917
- cookie?: never;
24918
- };
24919
- requestBody?: never;
24920
- responses: {
24921
- /** @description The session timeline. */
24922
- 200: {
24923
- headers: {
24924
- [name: string]: unknown;
24925
- };
24926
- content: {
24927
- "application/json": components["schemas"]["ChatSessionTimelineResponse"];
24928
- };
24929
- };
24930
- /** @description Chat session not found. */
24931
- 404: {
24932
- headers: {
24933
- [name: string]: unknown;
24934
- };
24935
- content: {
24936
- "application/json": components["schemas"]["ErrorResponse"];
24937
- };
24938
- };
24939
- };
24940
- };
24941
25537
  getChatSessionTranscript: {
24942
25538
  parameters: {
24943
25539
  query?: never;
@@ -25066,51 +25662,6 @@ export interface operations {
25066
25662
  };
25067
25663
  };
25068
25664
  };
25069
- listChatSessionUsers: {
25070
- parameters: {
25071
- query?: {
25072
- /** @description Restrict to a single project (ignored for bound principals). */
25073
- project_id?: number;
25074
- /** @description Include closed sessions when `true`. */
25075
- show_closed?: boolean | null;
25076
- /** @description Filter sessions by preset (all, active, merged). */
25077
- preset?: "all" | "active" | "merged";
25078
- };
25079
- header?: never;
25080
- path?: never;
25081
- cookie?: never;
25082
- };
25083
- requestBody?: never;
25084
- responses: {
25085
- /** @description Distinct chat-session creators. */
25086
- 200: {
25087
- headers: {
25088
- [name: string]: unknown;
25089
- };
25090
- content: {
25091
- "application/json": components["schemas"]["ChatSessionUsersResponse"];
25092
- };
25093
- };
25094
- /** @description Invalid request. */
25095
- 400: {
25096
- headers: {
25097
- [name: string]: unknown;
25098
- };
25099
- content: {
25100
- "application/json": components["schemas"]["ErrorResponse"];
25101
- };
25102
- };
25103
- /** @description Project not found or not accessible. */
25104
- 404: {
25105
- headers: {
25106
- [name: string]: unknown;
25107
- };
25108
- content: {
25109
- "application/json": components["schemas"]["ErrorResponse"];
25110
- };
25111
- };
25112
- };
25113
- };
25114
25665
  listCreditGrants: {
25115
25666
  parameters: {
25116
25667
  query?: {
@@ -27132,7 +27683,7 @@ export interface operations {
27132
27683
  "application/json": components["schemas"]["SandboxAuthRefreshError"];
27133
27684
  };
27134
27685
  };
27135
- /** @description The session is revoked or expired. */
27686
+ /** @description The session is revoked, expired, or not tied to a chat session. */
27136
27687
  403: {
27137
27688
  headers: {
27138
27689
  [name: string]: unknown;
@@ -29207,6 +29758,15 @@ export interface operations {
29207
29758
  "application/json": components["schemas"]["ErrorResponse"];
29208
29759
  };
29209
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
+ };
29210
29770
  };
29211
29771
  };
29212
29772
  updateMemory: {
@@ -29243,6 +29803,15 @@ export interface operations {
29243
29803
  "application/json": components["schemas"]["ErrorResponse"];
29244
29804
  };
29245
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
+ };
29246
29815
  /** @description Refused by the memory write gate: classified as failure/incident state. */
29247
29816
  422: {
29248
29817
  headers: {
@@ -30712,6 +31281,122 @@ export interface operations {
30712
31281
  };
30713
31282
  };
30714
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
+ };
30715
31400
  listProjectAddons: {
30716
31401
  parameters: {
30717
31402
  query?: never;
@@ -31375,7 +32060,7 @@ export interface operations {
31375
32060
  checkProjectRepoSettings: {
31376
32061
  parameters: {
31377
32062
  query?: {
31378
- /** @description Check this GitHub owner's repo instead of the project's (e.g. a repo transfer destination). Requires `repo_name`; can't be `empirical-run`. */
32063
+ /** @description Check this GitHub owner's repo instead of the project's (e.g. a repo transfer destination). Requires `repo_name`; cannot be `empirical-run`. */
31379
32064
  repo_owner?: string;
31380
32065
  /** @description Repository name to check, with `repo_owner`. */
31381
32066
  repo_name?: string;
@@ -31427,65 +32112,6 @@ export interface operations {
31427
32112
  };
31428
32113
  };
31429
32114
  };
31430
- fixProjectRepoSettings: {
31431
- parameters: {
31432
- query?: never;
31433
- header?: never;
31434
- path: {
31435
- /** @description Project ID. */
31436
- id: number;
31437
- };
31438
- cookie?: never;
31439
- };
31440
- requestBody?: never;
31441
- responses: {
31442
- /** @description Re-checked results. */
31443
- 200: {
31444
- headers: {
31445
- [name: string]: unknown;
31446
- };
31447
- content: {
31448
- "application/json": components["schemas"]["RepoSettingsCheckResponse"];
31449
- };
31450
- };
31451
- /** @description Project has no GitHub repository. */
31452
- 400: {
31453
- headers: {
31454
- [name: string]: unknown;
31455
- };
31456
- content: {
31457
- "application/json": components["schemas"]["ErrorResponse"];
31458
- };
31459
- };
31460
- /** @description Repository isn't owned by empirical-run. */
31461
- 403: {
31462
- headers: {
31463
- [name: string]: unknown;
31464
- };
31465
- content: {
31466
- "application/json": components["schemas"]["ErrorResponse"];
31467
- };
31468
- };
31469
- /** @description Project not found. */
31470
- 404: {
31471
- headers: {
31472
- [name: string]: unknown;
31473
- };
31474
- content: {
31475
- "application/json": components["schemas"]["ErrorResponse"];
31476
- };
31477
- };
31478
- /** @description GitHub request failed. */
31479
- 502: {
31480
- headers: {
31481
- [name: string]: unknown;
31482
- };
31483
- content: {
31484
- "application/json": components["schemas"]["ErrorResponse"];
31485
- };
31486
- };
31487
- };
31488
- };
31489
32115
  triggerProjectTestCasesSync: {
31490
32116
  parameters: {
31491
32117
  query?: never;
@@ -32030,6 +32656,39 @@ export interface operations {
32030
32656
  };
32031
32657
  };
32032
32658
  };
32659
+ getProjectNpmSnapshotUrls: {
32660
+ parameters: {
32661
+ query?: never;
32662
+ header?: never;
32663
+ path?: never;
32664
+ cookie?: never;
32665
+ };
32666
+ requestBody?: {
32667
+ content: {
32668
+ "application/json": components["schemas"]["ProjectNpmSnapshotUrlsBody"];
32669
+ };
32670
+ };
32671
+ responses: {
32672
+ /** @description Presigned snapshot URLs. */
32673
+ 200: {
32674
+ headers: {
32675
+ [name: string]: unknown;
32676
+ };
32677
+ content: {
32678
+ "application/json": components["schemas"]["ProjectNpmSnapshotUrlsResponse"];
32679
+ };
32680
+ };
32681
+ /** @description The project has no npm snapshot storage. */
32682
+ 404: {
32683
+ headers: {
32684
+ [name: string]: unknown;
32685
+ };
32686
+ content: {
32687
+ "application/json": components["schemas"]["ErrorResponse"];
32688
+ };
32689
+ };
32690
+ };
32691
+ };
32033
32692
  getProjectStaticIpProxyToken: {
32034
32693
  parameters: {
32035
32694
  query?: never;
@@ -32777,202 +33436,6 @@ export interface operations {
32777
33436
  };
32778
33437
  };
32779
33438
  };
32780
- listSandboxSnapshots: {
32781
- parameters: {
32782
- query?: never;
32783
- header?: never;
32784
- path?: never;
32785
- cookie?: never;
32786
- };
32787
- requestBody?: never;
32788
- responses: {
32789
- /** @description The project's sandbox snapshots. */
32790
- 200: {
32791
- headers: {
32792
- [name: string]: unknown;
32793
- };
32794
- content: {
32795
- "application/json": components["schemas"]["SandboxSnapshotListResponse"];
32796
- };
32797
- };
32798
- /** @description Invalid project scope. */
32799
- 400: {
32800
- headers: {
32801
- [name: string]: unknown;
32802
- };
32803
- content: {
32804
- "application/json": components["schemas"]["ErrorResponse"];
32805
- };
32806
- };
32807
- /** @description Project not found. */
32808
- 404: {
32809
- headers: {
32810
- [name: string]: unknown;
32811
- };
32812
- content: {
32813
- "application/json": components["schemas"]["ErrorResponse"];
32814
- };
32815
- };
32816
- };
32817
- };
32818
- createSandboxSnapshot: {
32819
- parameters: {
32820
- query?: never;
32821
- header?: never;
32822
- path?: never;
32823
- cookie?: never;
32824
- };
32825
- requestBody?: {
32826
- content: {
32827
- "application/json": components["schemas"]["CreateSandboxSnapshotRequest"];
32828
- };
32829
- };
32830
- responses: {
32831
- /** @description Snapshot creation enqueued. */
32832
- 200: {
32833
- headers: {
32834
- [name: string]: unknown;
32835
- };
32836
- content: {
32837
- "application/json": components["schemas"]["SandboxSnapshotTriggeredResponse"];
32838
- };
32839
- };
32840
- /** @description Invalid request. */
32841
- 400: {
32842
- headers: {
32843
- [name: string]: unknown;
32844
- };
32845
- content: {
32846
- "application/json": components["schemas"]["ErrorResponse"];
32847
- };
32848
- };
32849
- /** @description Project not found. */
32850
- 404: {
32851
- headers: {
32852
- [name: string]: unknown;
32853
- };
32854
- content: {
32855
- "application/json": components["schemas"]["ErrorResponse"];
32856
- };
32857
- };
32858
- /** @description The jobs queue is not configured. */
32859
- 500: {
32860
- headers: {
32861
- [name: string]: unknown;
32862
- };
32863
- content: {
32864
- "application/json": components["schemas"]["ErrorResponse"];
32865
- };
32866
- };
32867
- };
32868
- };
32869
- listProjectSandboxSnapshots: {
32870
- parameters: {
32871
- query?: never;
32872
- header?: never;
32873
- path: {
32874
- /** @description Project ID (positive integer). */
32875
- project_id: string;
32876
- };
32877
- cookie?: never;
32878
- };
32879
- requestBody?: never;
32880
- responses: {
32881
- /** @description The project's sandbox snapshots. */
32882
- 200: {
32883
- headers: {
32884
- [name: string]: unknown;
32885
- };
32886
- content: {
32887
- "application/json": components["schemas"]["SandboxSnapshotListResponse"];
32888
- };
32889
- };
32890
- };
32891
- };
32892
- rebuildSandboxSnapshots: {
32893
- parameters: {
32894
- query?: never;
32895
- header?: never;
32896
- path?: never;
32897
- cookie?: never;
32898
- };
32899
- requestBody?: {
32900
- content: {
32901
- "application/json": components["schemas"]["RebuildSandboxSnapshotsRequest"];
32902
- };
32903
- };
32904
- responses: {
32905
- /** @description Rebuilds enqueued. */
32906
- 200: {
32907
- headers: {
32908
- [name: string]: unknown;
32909
- };
32910
- content: {
32911
- "application/json": components["schemas"]["SandboxSnapshotRebuildResponse"];
32912
- };
32913
- };
32914
- /** @description Unsupported provider or invalid request. */
32915
- 400: {
32916
- headers: {
32917
- [name: string]: unknown;
32918
- };
32919
- content: {
32920
- "application/json": components["schemas"]["ErrorResponse"];
32921
- };
32922
- };
32923
- /** @description The jobs queue is not configured. */
32924
- 500: {
32925
- headers: {
32926
- [name: string]: unknown;
32927
- };
32928
- content: {
32929
- "application/json": components["schemas"]["ErrorResponse"];
32930
- };
32931
- };
32932
- };
32933
- };
32934
- rebuildSandboxSnapshotsByTemplate: {
32935
- parameters: {
32936
- query?: never;
32937
- header?: never;
32938
- path?: never;
32939
- cookie?: never;
32940
- };
32941
- requestBody?: {
32942
- content: {
32943
- "application/json": components["schemas"]["RebuildSandboxSnapshotsByTemplateRequest"];
32944
- };
32945
- };
32946
- responses: {
32947
- /** @description Rebuilds enqueued. */
32948
- 200: {
32949
- headers: {
32950
- [name: string]: unknown;
32951
- };
32952
- content: {
32953
- "application/json": components["schemas"]["SandboxSnapshotRebuildResponse"];
32954
- };
32955
- };
32956
- /** @description Invalid request. */
32957
- 400: {
32958
- headers: {
32959
- [name: string]: unknown;
32960
- };
32961
- content: {
32962
- "application/json": components["schemas"]["ErrorResponse"];
32963
- };
32964
- };
32965
- /** @description The jobs queue is not configured. */
32966
- 500: {
32967
- headers: {
32968
- [name: string]: unknown;
32969
- };
32970
- content: {
32971
- "application/json": components["schemas"]["ErrorResponse"];
32972
- };
32973
- };
32974
- };
32975
- };
32976
33439
  upsertSandboxSnapshotSources: {
32977
33440
  parameters: {
32978
33441
  query?: never;
@@ -33238,6 +33701,39 @@ export interface operations {
33238
33701
  };
33239
33702
  };
33240
33703
  };
33704
+ createTestReportUploadUrls: {
33705
+ parameters: {
33706
+ query?: never;
33707
+ header?: never;
33708
+ path?: never;
33709
+ cookie?: never;
33710
+ };
33711
+ requestBody?: {
33712
+ content: {
33713
+ "application/json": components["schemas"]["CreateTestReportUploadUrlsRequest"];
33714
+ };
33715
+ };
33716
+ responses: {
33717
+ /** @description Upload URLs, in request order. */
33718
+ 200: {
33719
+ headers: {
33720
+ [name: string]: unknown;
33721
+ };
33722
+ content: {
33723
+ "application/json": components["schemas"]["CreateTestReportUploadUrlsResponse"];
33724
+ };
33725
+ };
33726
+ /** @description Invalid request. */
33727
+ 400: {
33728
+ headers: {
33729
+ [name: string]: unknown;
33730
+ };
33731
+ content: {
33732
+ "application/json": components["schemas"]["ErrorResponse"];
33733
+ };
33734
+ };
33735
+ };
33736
+ };
33241
33737
  ingestTestCaseRunEndEvent: {
33242
33738
  parameters: {
33243
33739
  query?: never;