@empiricalrun/playwright-utils 0.61.0 → 0.61.2

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.
@@ -962,6 +962,26 @@ export interface paths {
962
962
  patch?: never;
963
963
  trace?: never;
964
964
  };
965
+ "/api/slack/admin/scope-refresh": {
966
+ parameters: {
967
+ query?: never;
968
+ header?: never;
969
+ path?: never;
970
+ cookie?: never;
971
+ };
972
+ get?: never;
973
+ put?: never;
974
+ /**
975
+ * 🛡️ Complete a Slack scope refresh
976
+ * @description Exchanges the OAuth code from re-authorizing the Slack app on Empirical's own workspace, which applies newly requested scopes. The token is not stored. Super-admin only.
977
+ */
978
+ post: operations["refreshSlackAppScopes"];
979
+ delete?: never;
980
+ options?: never;
981
+ head?: never;
982
+ patch?: never;
983
+ trace?: never;
984
+ };
965
985
  "/api/slack/auth-test": {
966
986
  parameters: {
967
987
  query?: never;
@@ -997,7 +1017,7 @@ export interface paths {
997
1017
  put?: never;
998
1018
  /**
999
1019
  * 🛡️ Create or update a Slack install
1000
- * @description Creates a Slack app install for the org and team, or updates the existing one.
1020
+ * @description Creates a Slack app install for the org and team, or updates the existing one. A signed-in user sends the OAuth code and api-worker exchanges it; installs into Empirical's own workspace are not stored.
1001
1021
  */
1002
1022
  post: operations["upsertSlackInstallation"];
1003
1023
  delete?: never;
@@ -1973,8 +1993,8 @@ export interface paths {
1973
1993
  cookie?: never;
1974
1994
  };
1975
1995
  /**
1976
- * 🛡️ Get the org's usage and cost for a month
1977
- * @description Org-wide usage across all of the scoped project's org projects, against the plan in effect: per-meter usage, overage so far, a month-end projection, and the usage limit.
1996
+ * 🛡️ Get the org's usage and cost for a usage period
1997
+ * @description Org-wide usage across all of the scoped project's org projects, against the plan in effect: per-meter usage, overage so far, a period-end projection, and the usage limit. The period is a UTC calendar month, or the billing cycle for an org on a live Dodo subscription.
1978
1998
  */
1979
1999
  get: operations["getBillingMonthSummary"];
1980
2000
  put?: never;
@@ -1985,6 +2005,126 @@ export interface paths {
1985
2005
  patch?: never;
1986
2006
  trace?: never;
1987
2007
  };
2008
+ "/api/billing/periods": {
2009
+ parameters: {
2010
+ query?: never;
2011
+ header?: never;
2012
+ path?: never;
2013
+ cookie?: never;
2014
+ };
2015
+ /**
2016
+ * 🛡️ List the org's usage periods
2017
+ * @description The org's usage periods up to the current one, latest first: billing cycles back to the subscription start for an org on a live Dodo subscription, calendar months otherwise and before that.
2018
+ */
2019
+ get: operations["listBillingPeriods"];
2020
+ put?: never;
2021
+ post?: never;
2022
+ delete?: never;
2023
+ options?: never;
2024
+ head?: never;
2025
+ patch?: never;
2026
+ trace?: never;
2027
+ };
2028
+ "/api/billing/subscription/{subscription_id}/reconcile": {
2029
+ parameters: {
2030
+ query?: never;
2031
+ header?: never;
2032
+ path?: never;
2033
+ cookie?: never;
2034
+ };
2035
+ /**
2036
+ * 🛡️ 🧪 Compare a subscription's usage with Dodo's events
2037
+ * @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.
2038
+ */
2039
+ get: operations["reconcileSubscriptionUsage"];
2040
+ put?: never;
2041
+ post?: never;
2042
+ delete?: never;
2043
+ options?: never;
2044
+ head?: never;
2045
+ patch?: never;
2046
+ trace?: never;
2047
+ };
2048
+ "/api/billing/subscription/checkout": {
2049
+ parameters: {
2050
+ query?: never;
2051
+ header?: never;
2052
+ path?: never;
2053
+ cookie?: never;
2054
+ };
2055
+ get?: never;
2056
+ put?: never;
2057
+ /**
2058
+ * 🛡️ 🧪 Start a Dodo checkout for the org's plan
2059
+ * @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.
2060
+ */
2061
+ post: operations["createSubscriptionCheckout"];
2062
+ delete?: never;
2063
+ options?: never;
2064
+ head?: never;
2065
+ patch?: never;
2066
+ trace?: never;
2067
+ };
2068
+ "/api/billing/subscription/end": {
2069
+ parameters: {
2070
+ query?: never;
2071
+ header?: never;
2072
+ path?: never;
2073
+ cookie?: never;
2074
+ };
2075
+ get?: never;
2076
+ put?: never;
2077
+ /**
2078
+ * 🛡️ 🧪 End the org's plan now
2079
+ * @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.
2080
+ */
2081
+ post: operations["endSubscription"];
2082
+ delete?: never;
2083
+ options?: never;
2084
+ head?: never;
2085
+ patch?: never;
2086
+ trace?: never;
2087
+ };
2088
+ "/api/billing/subscription/offer": {
2089
+ parameters: {
2090
+ query?: never;
2091
+ header?: never;
2092
+ path?: never;
2093
+ cookie?: never;
2094
+ };
2095
+ /**
2096
+ * 🛡️ 🧪 Get the plan the org can subscribe to
2097
+ * @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.
2098
+ */
2099
+ get: operations["getSubscriptionOffer"];
2100
+ put?: never;
2101
+ post?: never;
2102
+ delete?: never;
2103
+ options?: never;
2104
+ head?: never;
2105
+ patch?: never;
2106
+ trace?: never;
2107
+ };
2108
+ "/api/billing/subscription/portal": {
2109
+ parameters: {
2110
+ query?: never;
2111
+ header?: never;
2112
+ path?: never;
2113
+ cookie?: never;
2114
+ };
2115
+ get?: never;
2116
+ put?: never;
2117
+ /**
2118
+ * 🛡️ 🧪 Open the org's Dodo billing portal
2119
+ * @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.
2120
+ */
2121
+ post: operations["createSubscriptionPortalSession"];
2122
+ delete?: never;
2123
+ options?: never;
2124
+ head?: never;
2125
+ patch?: never;
2126
+ trace?: never;
2127
+ };
1988
2128
  "/api/billing/usage-limit": {
1989
2129
  parameters: {
1990
2130
  query?: never;
@@ -2538,7 +2678,7 @@ export interface paths {
2538
2678
  put?: never;
2539
2679
  /**
2540
2680
  * Dodo Payments webhook
2541
- * @description Receives Dodo Payments events directly from Dodo (verified by the Standard Webhooks signature). payment.succeeded events carrying an invoice_id in metadata mirror the payment onto the invoice; everything else is acked and ignored.
2681
+ * @description Receives signature-verified Dodo events. subscription.* events re-fetch the subscription from Dodo and mirror it, with the org's plan assignment. Other events are acknowledged and ignored.
2542
2682
  */
2543
2683
  post: operations["dodoPaymentsWebhook"];
2544
2684
  delete?: never;
@@ -2842,7 +2982,7 @@ export interface paths {
2842
2982
  put?: never;
2843
2983
  /**
2844
2984
  * ⚙️ Upsert a main App installation
2845
- * @description Records or updates a main App installation for an org.
2985
+ * @description Records or updates a main App installation for an org the caller can access.
2846
2986
  */
2847
2987
  post: operations["upsertMainInstallation"];
2848
2988
  delete?: never;
@@ -3026,7 +3166,7 @@ export interface paths {
3026
3166
  put?: never;
3027
3167
  /**
3028
3168
  * ⚙️ Create a reporter installation
3029
- * @description Records a reporter App installation for an org.
3169
+ * @description Records a reporter App installation for an org the caller can access.
3030
3170
  */
3031
3171
  post: operations["createReporterInstallation"];
3032
3172
  delete?: never;
@@ -3374,7 +3514,7 @@ export interface paths {
3374
3514
  put?: never;
3375
3515
  /**
3376
3516
  * 🛡️ Create an invoice
3377
- * @description Creates a new invoice for an existing organisation.
3517
+ * @description Creates a new invoice for an existing organisation. Refused for an org with a live Dodo subscription, which Dodo bills instead.
3378
3518
  */
3379
3519
  post: operations["createInvoice"];
3380
3520
  delete?: never;
@@ -3402,7 +3542,7 @@ export interface paths {
3402
3542
  head?: never;
3403
3543
  /**
3404
3544
  * 🛡️ Update an invoice
3405
- * @description Updates fields on an existing invoice.
3545
+ * @description Updates fields on an existing invoice. Moving it to an org with a live Dodo subscription is refused.
3406
3546
  */
3407
3547
  patch: operations["updateInvoice"];
3408
3548
  trace?: never;
@@ -3542,7 +3682,7 @@ export interface paths {
3542
3682
  put?: never;
3543
3683
  /**
3544
3684
  * 🛡️ Send an invoice
3545
- * @description Emails the invoice PDF to the organisation's billing contacts and marks it as sent (unless `is_test_email` is set). On a real send, an unpaid INR invoice without a payment link gets a Razorpay-hosted payment link, stored on the invoice and included in the email.
3685
+ * @description Emails the invoice PDF to the organisation's billing contacts and marks it as sent (unless `is_test_email` is set). On a real send, an unpaid INR invoice without a payment link gets a Razorpay-hosted payment link, stored on the invoice and included in the email. Refused for an org with a live Dodo subscription, which Dodo bills instead.
3546
3686
  */
3547
3687
  post: operations["sendInvoice"];
3548
3688
  delete?: never;
@@ -3571,26 +3711,6 @@ export interface paths {
3571
3711
  patch?: never;
3572
3712
  trace?: never;
3573
3713
  };
3574
- "/api/invoices/org/{id}/checkout-session": {
3575
- parameters: {
3576
- query?: never;
3577
- header?: never;
3578
- path?: never;
3579
- cookie?: never;
3580
- };
3581
- get?: never;
3582
- put?: never;
3583
- /**
3584
- * 🛡️ Create a checkout session to pay an invoice
3585
- * @description Creates a single-use Dodo Payments checkout session for the outstanding amount of one of the scoped project's org's sent invoices. Sessions are not stored; a new one is created per attempt. Payment confirmation arrives via the Dodo webhook, not this endpoint.
3586
- */
3587
- post: operations["createInvoiceCheckoutSession"];
3588
- delete?: never;
3589
- options?: never;
3590
- head?: never;
3591
- patch?: never;
3592
- trace?: never;
3593
- };
3594
3714
  "/api/invoices/org/{id}/pdf/download": {
3595
3715
  parameters: {
3596
3716
  query?: never;
@@ -3651,7 +3771,7 @@ export interface paths {
3651
3771
  patch?: never;
3652
3772
  trace?: never;
3653
3773
  };
3654
- "/api/invoices/org/{id}/tax-invoice/download": {
3774
+ "/api/invoices/reminders/upcoming": {
3655
3775
  parameters: {
3656
3776
  query?: never;
3657
3777
  header?: never;
@@ -3659,10 +3779,10 @@ export interface paths {
3659
3779
  cookie?: never;
3660
3780
  };
3661
3781
  /**
3662
- * 🛡️ Download the tax invoice for a paid invoice
3663
- * @description Streams the payment processor's (Dodo, the merchant of record) tax invoice PDF for the invoice's most recent settling payment.
3782
+ * 🛡️ List upcoming invoice reminders
3783
+ * @description Returns read-only invoice reminder candidates for the next window. This endpoint does not send emails or stamp reminder timestamps.
3664
3784
  */
3665
- get: operations["downloadOrgInvoiceTaxInvoice"];
3785
+ get: operations["listUpcomingInvoiceReminders"];
3666
3786
  put?: never;
3667
3787
  post?: never;
3668
3788
  delete?: never;
@@ -3671,20 +3791,20 @@ export interface paths {
3671
3791
  patch?: never;
3672
3792
  trace?: never;
3673
3793
  };
3674
- "/api/invoices/reminders/upcoming": {
3794
+ "/api/jira/events": {
3675
3795
  parameters: {
3676
3796
  query?: never;
3677
3797
  header?: never;
3678
3798
  path?: never;
3679
3799
  cookie?: never;
3680
3800
  };
3801
+ get?: never;
3802
+ put?: never;
3681
3803
  /**
3682
- * 🛡️ List upcoming invoice reminders
3683
- * @description Returns read-only invoice reminder candidates for the next window. This endpoint does not send emails or stamp reminder timestamps.
3804
+ * Receive a Jira webhook
3805
+ * @description Receives a Jira webhook delivery, resolves the install and project, and ingests issues carrying the `empirical` label as Empirical requests.
3684
3806
  */
3685
- get: operations["listUpcomingInvoiceReminders"];
3686
- put?: never;
3687
- post?: never;
3807
+ post: operations["receiveJiraWebhook"];
3688
3808
  delete?: never;
3689
3809
  options?: never;
3690
3810
  head?: never;
@@ -3706,7 +3826,7 @@ export interface paths {
3706
3826
  put?: never;
3707
3827
  /**
3708
3828
  * ⚙️ Create or reauthorize a Jira installation
3709
- * @description Stores a Jira app installation, or reauthorizes the existing site while preserving mappings, and optionally registers its webhook.
3829
+ * @description Stores a Jira app installation, or reauthorizes the existing site while preserving mappings, and optionally registers its webhook. A signed-in user sends the OAuth code and api-worker exchanges it.
3710
3830
  */
3711
3831
  post: operations["createJiraInstallation"];
3712
3832
  delete?: never;
@@ -3815,6 +3935,26 @@ export interface paths {
3815
3935
  patch: operations["updateJiraWebhookExpiresAt"];
3816
3936
  trace?: never;
3817
3937
  };
3938
+ "/api/linear/events": {
3939
+ parameters: {
3940
+ query?: never;
3941
+ header?: never;
3942
+ path?: never;
3943
+ cookie?: never;
3944
+ };
3945
+ get?: never;
3946
+ put?: never;
3947
+ /**
3948
+ * Receive a Linear webhook
3949
+ * @description Receives a Linear webhook delivery, verified by its `linear-signature` header, and ingests labelled issues into the resolved project as Empirical requests.
3950
+ */
3951
+ post: operations["receiveLinearWebhook"];
3952
+ delete?: never;
3953
+ options?: never;
3954
+ head?: never;
3955
+ patch?: never;
3956
+ trace?: never;
3957
+ };
3818
3958
  "/api/linear/installations": {
3819
3959
  parameters: {
3820
3960
  query?: never;
@@ -3830,7 +3970,7 @@ export interface paths {
3830
3970
  put?: never;
3831
3971
  /**
3832
3972
  * ⚙️ Create a Linear installation
3833
- * @description Creates or reauthorizes a Linear installation and stores its OAuth tokens.
3973
+ * @description Creates or reauthorizes a Linear installation and stores its OAuth tokens. A signed-in user sends the OAuth code and api-worker exchanges it.
3834
3974
  */
3835
3975
  post: operations["createLinearInstallation"];
3836
3976
  delete?: never;
@@ -4051,6 +4191,26 @@ export interface paths {
4051
4191
  patch?: never;
4052
4192
  trace?: never;
4053
4193
  };
4194
+ "/api/oauth/authorize-url": {
4195
+ parameters: {
4196
+ query?: never;
4197
+ header?: never;
4198
+ path?: never;
4199
+ cookie?: never;
4200
+ };
4201
+ /**
4202
+ * ⚙️ Get an OAuth authorize URL
4203
+ * @description Builds the provider authorize URL (client ID and scopes) for connecting Slack, Linear, Jira or the GitHub reporter app. The caller keeps the state and redirects to the URL.
4204
+ */
4205
+ get: operations["getOAuthAuthorizeUrl"];
4206
+ put?: never;
4207
+ post?: never;
4208
+ delete?: never;
4209
+ options?: never;
4210
+ head?: never;
4211
+ patch?: never;
4212
+ trace?: never;
4213
+ };
4054
4214
  "/api/onboarding/complete": {
4055
4215
  parameters: {
4056
4216
  query?: never;
@@ -4334,7 +4494,7 @@ export interface paths {
4334
4494
  put?: never;
4335
4495
  /**
4336
4496
  * ⚙️ Resolve org membership for a signed-in user
4337
- * @description Grants super-admin to staff emails; for users with no org yet, accepts pending invites for the email and matches org email domains. Returns the user's memberships and super-admin flag. System-to-system callers only.
4497
+ * @description Grants super-admin to staff emails; for users with no org yet, accepts pending invites for the email and matches org email domains. Returns the user's memberships and super-admin flag. A signed-in user resolves their own membership and needs a confirmed email; system callers name the user in the body.
4338
4498
  */
4339
4499
  post: operations["resolveMembership"];
4340
4500
  delete?: never;
@@ -4400,7 +4560,7 @@ export interface paths {
4400
4560
  };
4401
4561
  /**
4402
4562
  * 🛡️ Get the org's plan
4403
- * @description Returns whether the scoped project's org is on a plan (now, or during `month`), and the plan's terms when it is a shared plan.
4563
+ * @description Returns whether the scoped project's org is on a plan (now, or during `month` or `period`), and the plan's terms when it is a shared plan.
4404
4564
  */
4405
4565
  get: operations["getOrgPlan"];
4406
4566
  put?: never;
@@ -5155,31 +5315,27 @@ export interface paths {
5155
5315
  patch?: never;
5156
5316
  trace?: never;
5157
5317
  };
5158
- "/api/runner-backends": {
5318
+ "/api/runner-backends/claim": {
5159
5319
  parameters: {
5160
5320
  query?: never;
5161
5321
  header?: never;
5162
5322
  path?: never;
5163
5323
  cookie?: never;
5164
5324
  };
5165
- /**
5166
- * 🛡️ 🧪 List runner backends
5167
- * @description Lists customer-hosted runner backends, optionally for one org.
5168
- */
5169
- get: operations["listRunnerBackends"];
5325
+ get?: never;
5170
5326
  put?: never;
5171
5327
  /**
5172
- * 🛡️ 🧪 Register a runner backend
5173
- * @description Registers an installation as `pending` and returns the external ID its role must require. Run `verify` before linking projects.
5328
+ * 🧪 Call home from an installation's stack
5329
+ * @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.
5174
5330
  */
5175
- post: operations["createRunnerBackend"];
5331
+ post: operations["claimRunnerBackend"];
5176
5332
  delete?: never;
5177
5333
  options?: never;
5178
5334
  head?: never;
5179
5335
  patch?: never;
5180
5336
  trace?: never;
5181
5337
  };
5182
- "/api/runner-backends/{id}": {
5338
+ "/api/runner-backends/project": {
5183
5339
  parameters: {
5184
5340
  query?: never;
5185
5341
  header?: never;
@@ -5187,19 +5343,63 @@ export interface paths {
5187
5343
  cookie?: never;
5188
5344
  };
5189
5345
  /**
5190
- * 🛡️ 🧪 Get a runner backend
5191
- * @description Returns one runner backend.
5346
+ * 🧪 Get the scoped project's runner backend
5347
+ * @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.
5192
5348
  */
5193
- get: operations["getRunnerBackend"];
5349
+ get: operations["getProjectRunnerBackend"];
5350
+ put?: never;
5351
+ post?: never;
5352
+ delete?: never;
5353
+ options?: never;
5354
+ head?: never;
5355
+ patch?: never;
5356
+ trace?: never;
5357
+ };
5358
+ "/api/runner-backends/project/{id}": {
5359
+ parameters: {
5360
+ query?: never;
5361
+ header?: never;
5362
+ path?: never;
5363
+ cookie?: never;
5364
+ };
5365
+ get?: never;
5194
5366
  put?: never;
5195
5367
  post?: never;
5368
+ /**
5369
+ * 🧪 Remove a private runner
5370
+ * @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.
5371
+ */
5372
+ delete: operations["removeProjectRunnerBackend"];
5373
+ options?: never;
5374
+ head?: never;
5375
+ /**
5376
+ * 🧪 Rename a private runner
5377
+ * @description Renames a runner backend of the scoped project's organisation.
5378
+ */
5379
+ patch: operations["renameProjectRunnerBackend"];
5380
+ trace?: never;
5381
+ };
5382
+ "/api/runner-backends/project/{id}/disconnect": {
5383
+ parameters: {
5384
+ query?: never;
5385
+ header?: never;
5386
+ path?: never;
5387
+ cookie?: never;
5388
+ };
5389
+ get?: never;
5390
+ put?: never;
5391
+ /**
5392
+ * 🧪 Disconnect a private runner
5393
+ * @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.
5394
+ */
5395
+ post: operations["disconnectProjectRunnerBackend"];
5196
5396
  delete?: never;
5197
5397
  options?: never;
5198
5398
  head?: never;
5199
5399
  patch?: never;
5200
5400
  trace?: never;
5201
5401
  };
5202
- "/api/runner-backends/{id}/disable": {
5402
+ "/api/runner-backends/project/{id}/enable": {
5203
5403
  parameters: {
5204
5404
  query?: never;
5205
5405
  header?: never;
@@ -5209,17 +5409,17 @@ export interface paths {
5209
5409
  get?: never;
5210
5410
  put?: never;
5211
5411
  /**
5212
- * 🛡️ 🧪 Disable a runner backend
5213
- * @description Stops new dispatches to the backend immediately: runs of linked projects fail with `dispatch_failed` until it is verified again or the projects are unlinked.
5412
+ * 🧪 Re-enable a disconnected private runner
5413
+ * @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.
5214
5414
  */
5215
- post: operations["disableRunnerBackend"];
5415
+ post: operations["enableProjectRunnerBackend"];
5216
5416
  delete?: never;
5217
5417
  options?: never;
5218
5418
  head?: never;
5219
5419
  patch?: never;
5220
5420
  trace?: never;
5221
5421
  };
5222
- "/api/runner-backends/{id}/verify": {
5422
+ "/api/runner-backends/project/{id}/registration": {
5223
5423
  parameters: {
5224
5424
  query?: never;
5225
5425
  header?: never;
@@ -5229,17 +5429,17 @@ export interface paths {
5229
5429
  get?: never;
5230
5430
  put?: never;
5231
5431
  /**
5232
- * 🛡️ 🧪 Verify a runner backend
5233
- * @description Assumes the backend's role and makes one read-only call to each queue, the cluster and the log group. On success the backend becomes `active`; on failure its status is unchanged. A disabled backend is re-enabled only by a passing verify.
5432
+ * 🧪 Create a new setup link
5433
+ * @description Mints a new quick-create link for a pending runner backend of the scoped project's organisation, replacing any earlier unused link.
5234
5434
  */
5235
- post: operations["verifyRunnerBackend"];
5435
+ post: operations["createProjectRunnerBackendRegistration"];
5236
5436
  delete?: never;
5237
5437
  options?: never;
5238
5438
  head?: never;
5239
5439
  patch?: never;
5240
5440
  trace?: never;
5241
5441
  };
5242
- "/api/runner-backends/project": {
5442
+ "/api/runner-backends/project/available": {
5243
5443
  parameters: {
5244
5444
  query?: never;
5245
5445
  header?: never;
@@ -5247,10 +5447,10 @@ export interface paths {
5247
5447
  cookie?: never;
5248
5448
  };
5249
5449
  /**
5250
- * ⚙️ 🧪 Get the scoped project's runner backend
5251
- * @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.
5450
+ * 🧪 List the organisation's runner backends
5451
+ * @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.
5252
5452
  */
5253
- get: operations["getProjectRunnerBackend"];
5453
+ get: operations["listProjectOrgRunnerBackends"];
5254
5454
  put?: never;
5255
5455
  post?: never;
5256
5456
  delete?: never;
@@ -5259,7 +5459,27 @@ export interface paths {
5259
5459
  patch?: never;
5260
5460
  trace?: never;
5261
5461
  };
5262
- "/api/runner-backends/project/verify": {
5462
+ "/api/runner-backends/project/runner-backend": {
5463
+ parameters: {
5464
+ query?: never;
5465
+ header?: never;
5466
+ path?: never;
5467
+ cookie?: never;
5468
+ };
5469
+ get?: never;
5470
+ /**
5471
+ * 🧪 Choose where the project's runs execute
5472
+ * @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.
5473
+ */
5474
+ put: operations["setScopedProjectRunnerBackend"];
5475
+ post?: never;
5476
+ delete?: never;
5477
+ options?: never;
5478
+ head?: never;
5479
+ patch?: never;
5480
+ trace?: never;
5481
+ };
5482
+ "/api/runner-backends/project/setup": {
5263
5483
  parameters: {
5264
5484
  query?: never;
5265
5485
  header?: never;
@@ -5269,17 +5489,17 @@ export interface paths {
5269
5489
  get?: never;
5270
5490
  put?: never;
5271
5491
  /**
5272
- * ⚙️ 🧪 Re-check the scoped project's runner backend
5273
- * @description Runs the same read-only checks as `verify` against the backend the scoped project is linked to and records the result, so a customer can confirm a fix to their role or stack. It never changes the backend's status: a disabled backend is re-enabled only by Empirical.
5492
+ * 🧪 Start setting up a private runner
5493
+ * @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.
5274
5494
  */
5275
- post: operations["verifyProjectRunnerBackend"];
5495
+ post: operations["setupProjectRunnerBackend"];
5276
5496
  delete?: never;
5277
5497
  options?: never;
5278
5498
  head?: never;
5279
5499
  patch?: never;
5280
5500
  trace?: never;
5281
5501
  };
5282
- "/api/runner-backends/projects/{project_id}": {
5502
+ "/api/runner-backends/project/verify": {
5283
5503
  parameters: {
5284
5504
  query?: never;
5285
5505
  header?: never;
@@ -5287,12 +5507,12 @@ export interface paths {
5287
5507
  cookie?: never;
5288
5508
  };
5289
5509
  get?: never;
5510
+ put?: never;
5290
5511
  /**
5291
- * 🛡️ 🧪 Set a project's runner backend
5292
- * @description Links a project to an active backend of its organisation, or back to Empirical-hosted with null. Applies to runs created afterwards; runs already created keep their backend.
5512
+ * 🧪 Re-check the scoped project's runner backend
5513
+ * @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.
5293
5514
  */
5294
- put: operations["setProjectRunnerBackend"];
5295
- post?: never;
5515
+ post: operations["verifyProjectRunnerBackend"];
5296
5516
  delete?: never;
5297
5517
  options?: never;
5298
5518
  head?: never;
@@ -5596,7 +5816,7 @@ export interface paths {
5596
5816
  put?: never;
5597
5817
  /**
5598
5818
  * ⚙️ Upsert a GitHub link
5599
- * @description Creates or updates the GitHub account link for the given user. Super-admin only.
5819
+ * @description Creates or updates a GitHub account link. A signed-in user links their own account to the GitHub user who authorized `code`; system callers pass the user and profile directly.
5600
5820
  */
5601
5821
  post: operations["upsertGithubLink"];
5602
5822
  /**
@@ -5879,15 +6099,13 @@ export interface components {
5879
6099
  paid_at: string | null;
5880
6100
  /** @description Whether the invoice PDF is available. */
5881
6101
  has_pdf: boolean;
5882
- /** @description Whether a payment-processor tax invoice is available for download. */
5883
- has_tax_invoice: boolean;
5884
6102
  /** @description Whether this invoice can be paid online (unpaid and in a supported currency). */
5885
6103
  payable: boolean;
5886
6104
  /**
5887
- * @description Which provider pays this invoice's currency (USD via Dodo checkout sessions, INR via Razorpay Standard Checkout), or null if none does. Drives the Pay button's checkout flow.
6105
+ * @description Which provider pays this invoice's currency (INR via Razorpay Standard Checkout), or null if none does. Drives the Pay button's checkout flow.
5888
6106
  * @enum {string|null}
5889
6107
  */
5890
- payment_provider: "dodo" | "razorpay" | null;
6108
+ payment_provider: "razorpay" | null;
5891
6109
  /** @description Whether an unpaid invoice is past its due date plus the reminder grace period. Always false for paid invoices. */
5892
6110
  past_reminder_date: boolean;
5893
6111
  };
@@ -5900,22 +6118,6 @@ export interface components {
5900
6118
  message: string;
5901
6119
  };
5902
6120
  };
5903
- InvoiceCheckoutSessionResponse: {
5904
- /** @description Response payload. */
5905
- data: {
5906
- /** @description Single-use hosted checkout URL (expires in 24h). */
5907
- checkout_url: string;
5908
- /** @description Dodo checkout session ID. */
5909
- session_id: string;
5910
- };
5911
- };
5912
- CreateInvoiceCheckoutSessionRequest: {
5913
- /**
5914
- * Format: uri
5915
- * @description Dashboard URL Dodo redirects to after payment (gets payment_id and status query params appended).
5916
- */
5917
- return_url: string;
5918
- };
5919
6121
  InvoiceRazorpayOrderResponse: {
5920
6122
  /** @description Response payload. */
5921
6123
  data: {
@@ -6368,6 +6570,16 @@ export interface components {
6368
6570
  overage_price_cents: number | null;
6369
6571
  }[];
6370
6572
  } | null;
6573
+ /** @description The org's live Dodo subscription now, or null when it's billed by invoice or has none. */
6574
+ subscription: {
6575
+ /**
6576
+ * @description `past_due` / `on_hold`: the last renewal payment failed and is being retried. A paused subscription, or one whose plan was ended (End plan) whatever its Dodo status, holds no plan, so `subscription` is null.
6577
+ * @enum {string}
6578
+ */
6579
+ status: "active" | "past_due" | "on_hold";
6580
+ /** @description When the subscription next renews (ISO 8601). */
6581
+ next_billing_date: string;
6582
+ } | null;
6371
6583
  };
6372
6584
  };
6373
6585
  PlanAssignmentListResponse: {
@@ -6472,6 +6684,8 @@ export interface components {
6472
6684
  base_price_cents: number;
6473
6685
  /** @description `active` or `retired`. Retired plans keep existing assignments. */
6474
6686
  status: string;
6687
+ /** @description Dodo product that bills this plan by subscription; null when it isn't sold through Dodo. */
6688
+ dodo_product_id: string | null;
6475
6689
  /** @description ISO-8601 creation timestamp. */
6476
6690
  created_at: string;
6477
6691
  /** @description Metered allowances and overage rates. */
@@ -6509,6 +6723,8 @@ export interface components {
6509
6723
  currency?: "usd" | "inr" | "aed";
6510
6724
  /** @description Monthly base price in cents of `currency`. */
6511
6725
  base_price_cents: number;
6726
+ /** @description Dodo product that bills this plan by subscription, in this environment's Dodo mode. New Dodo checkouts use the newest active plan that has one. */
6727
+ dodo_product_id?: string;
6512
6728
  /**
6513
6729
  * @description Metered allowances, in display order.
6514
6730
  * @default []
@@ -6535,11 +6751,19 @@ export interface components {
6535
6751
  BillingMonthSummaryResponse: {
6536
6752
  /** @description Response payload. */
6537
6753
  data: {
6538
- /** @description Usage month, YYYY-MM (UTC). */
6754
+ /** @description Usage month, YYYY-MM (UTC). For a billing cycle, the month it starts in. */
6539
6755
  month: string;
6756
+ /** @description The period's key (YYYY-MM-DD), to pass as `period`: the 1st for a calendar month, the scheduled start date for a billing cycle. */
6757
+ period_key: string;
6758
+ /**
6759
+ * @description `month`: a UTC calendar month. `cycle`: a Dodo billing cycle [previous_billing_date, next_billing_date).
6760
+ * @enum {string}
6761
+ */
6762
+ period_kind: "month" | "cycle";
6540
6763
  period_start: string;
6541
6764
  /** @description Exclusive (ISO 8601). */
6542
6765
  period_end: string;
6766
+ /** @description Whether this is the current period (month or cycle). */
6543
6767
  is_current_month: boolean;
6544
6768
  /** @description The shared plan in effect; null for no plan or a custom contract. */
6545
6769
  plan: {
@@ -6557,7 +6781,7 @@ export interface components {
6557
6781
  }[];
6558
6782
  overage_cents: number;
6559
6783
  projected_overage_cents: number | null;
6560
- /** @description Overage of the previous usage month, as a guide when picking a limit. Current month only. */
6784
+ /** @description Overage of the previous usage period, as a guide when picking a limit. Current period only. */
6561
6785
  last_month_overage_cents: number | null;
6562
6786
  usage_limit: components["schemas"]["UsageLimit"];
6563
6787
  };
@@ -6567,7 +6791,7 @@ export interface components {
6567
6791
  meter: "ai_credits" | "test_minutes";
6568
6792
  included_qty: number | null;
6569
6793
  overage_price_cents: number | null;
6570
- /** @description Units used so far this month. */
6794
+ /** @description Units used so far this period. */
6571
6795
  used: number;
6572
6796
  /** @description Projected units at month end (trailing 7-day pace); null when too early to project. */
6573
6797
  projected: number | null;
@@ -6577,14 +6801,14 @@ export interface components {
6577
6801
  UsageLimit: {
6578
6802
  /** @description Whether the org's plan supports a usage limit (catalog plans with overage pricing). */
6579
6803
  available: boolean;
6580
- /** @description Most overage allowed per usage month, in cents of the plan currency. Null means no limit. */
6804
+ /** @description Most overage allowed per usage period (calendar month, or Dodo billing cycle), in cents of the plan currency. Null means no limit. */
6581
6805
  cap_cents: number | null;
6582
6806
  /**
6583
- * @description `warning` at 80% of the limit (or, for a $0 limit, 80% of any allowance); `reached` when new work is paused.
6807
+ * @description `warning` once the bill (plan + overage) reaches 80% of plan + cap, skipped when that is at or below the plan price (including a $0 limit); `reached` when new work is paused.
6584
6808
  * @enum {string}
6585
6809
  */
6586
6810
  status: "none" | "ok" | "warning" | "reached";
6587
- /** @description When the limit was reached this month (ISO 8601). */
6811
+ /** @description When the limit was reached this period (ISO 8601). */
6588
6812
  reached_at: string | null;
6589
6813
  updated_at: string | null;
6590
6814
  /** @description Who made a change. */
@@ -6596,19 +6820,37 @@ export interface components {
6596
6820
  name: string | null;
6597
6821
  } | null;
6598
6822
  };
6599
- UsageLimitResponse: {
6823
+ BillingPeriodsResponse: {
6600
6824
  /** @description Response payload. */
6601
- data: {
6602
- /** @description Whether the org's plan supports a usage limit (catalog plans with overage pricing). */
6603
- available: boolean;
6604
- /** @description Most overage allowed per usage month, in cents of the plan currency. Null means no limit. */
6825
+ data: components["schemas"]["BillingPeriod"][];
6826
+ };
6827
+ BillingPeriod: {
6828
+ /** @description Pass as `period` to the month summary (YYYY-MM-DD). */
6829
+ key: string;
6830
+ /**
6831
+ * @description `month`: a UTC calendar month. `cycle`: a Dodo billing cycle [previous_billing_date, next_billing_date).
6832
+ * @enum {string}
6833
+ */
6834
+ kind: "month" | "cycle";
6835
+ /** @description Inclusive (ISO 8601). */
6836
+ start: string;
6837
+ /** @description Exclusive (ISO 8601). */
6838
+ end: string;
6839
+ is_current: boolean;
6840
+ };
6841
+ UsageLimitResponse: {
6842
+ /** @description Response payload. */
6843
+ data: {
6844
+ /** @description Whether the org's plan supports a usage limit (catalog plans with overage pricing). */
6845
+ available: boolean;
6846
+ /** @description Most overage allowed per usage period (calendar month, or Dodo billing cycle), in cents of the plan currency. Null means no limit. */
6605
6847
  cap_cents: number | null;
6606
6848
  /**
6607
- * @description `warning` at 80% of the limit (or, for a $0 limit, 80% of any allowance); `reached` when new work is paused.
6849
+ * @description `warning` once the bill (plan + overage) reaches 80% of plan + cap, skipped when that is at or below the plan price (including a $0 limit); `reached` when new work is paused.
6608
6850
  * @enum {string}
6609
6851
  */
6610
6852
  status: "none" | "ok" | "warning" | "reached";
6611
- /** @description When the limit was reached this month (ISO 8601). */
6853
+ /** @description When the limit was reached this period (ISO 8601). */
6612
6854
  reached_at: string | null;
6613
6855
  updated_at: string | null;
6614
6856
  /** @description Who made a change. */
@@ -6642,10 +6884,219 @@ export interface components {
6642
6884
  metadata?: unknown;
6643
6885
  created_at: string;
6644
6886
  };
6645
- RunnerBackendListResponse: {
6887
+ SubscriptionCheckoutResponse: {
6888
+ /** @description Response payload. */
6889
+ data: {
6890
+ /** @description Dodo hosted checkout to open. It returns to the billing page. */
6891
+ checkout_url: string;
6892
+ };
6893
+ };
6894
+ SubscriptionOfferResponse: {
6895
+ /** @description Response payload. */
6896
+ data: {
6897
+ /** @description Whether the org can subscribe through Dodo now. */
6898
+ available: boolean;
6899
+ /**
6900
+ * @description Why not, when `available` is false.
6901
+ * @enum {string|null}
6902
+ */
6903
+ reason: "not_configured" | "no_org" | "inr" | "has_plan" | "no_plan" | null;
6904
+ /** @description The plan checkout would subscribe to, when available. */
6905
+ plan: {
6906
+ /** @description Plan name, e.g. `Managed`. */
6907
+ name: string;
6908
+ /** @description Currency of the prices below, e.g. `usd`. */
6909
+ currency: string;
6910
+ /** @description Monthly base price in cents of `currency`. */
6911
+ base_price_cents: number;
6912
+ /** @description Metered allowances and overage rates. */
6913
+ meters: {
6914
+ /** @description Meter key, e.g. `ai_credits` or `test_minutes`. */
6915
+ meter: string;
6916
+ /** @description Units included each month. */
6917
+ included_qty: number | null;
6918
+ /** @description Price per unit above the allowance, in cents of `currency`; may be fractional. */
6919
+ overage_price_cents: number | null;
6920
+ }[];
6921
+ } | null;
6922
+ };
6923
+ };
6924
+ SubscriptionPortalResponse: {
6925
+ /** @description Response payload. */
6926
+ data: {
6927
+ /** @description Short-lived Dodo customer portal session: update the card, download invoices. */
6928
+ portal_url: string;
6929
+ };
6930
+ };
6931
+ SubscriptionEndResponse: {
6932
+ /** @description Response payload. */
6933
+ data: {
6934
+ /**
6935
+ * @description What the subscription became in Dodo: `cancelled` when there was no usage beyond the plan's allowance; `paused` when there was, which Dodo charges on pausing (the subscription is cancelled once that charge succeeds). Either way the plan has ended.
6936
+ * @enum {string}
6937
+ */
6938
+ status: "cancelled" | "paused";
6939
+ /** @description Whether Dodo charges a final payment for this cycle's usage beyond the allowance. */
6940
+ final_charge: boolean;
6941
+ };
6942
+ };
6943
+ SubscriptionUsageReconcileResponse: {
6944
+ /** @description Response payload. */
6945
+ data: {
6946
+ subscription_id: string;
6947
+ cycle_start: string;
6948
+ cycle_end: string;
6949
+ meters: {
6950
+ ai_credits: {
6951
+ /** @description Our usage in the cycle. */
6952
+ ours: number;
6953
+ /** @description What Dodo's events in the cycle add up to. */
6954
+ dodo: number;
6955
+ our_events: number;
6956
+ dodo_events: number;
6957
+ };
6958
+ test_minutes: {
6959
+ /** @description Our usage in the cycle. */
6960
+ ours: number;
6961
+ /** @description What Dodo's events in the cycle add up to. */
6962
+ dodo: number;
6963
+ our_events: number;
6964
+ dodo_events: number;
6965
+ };
6966
+ };
6967
+ /** @description Event ids of our usage rows that Dodo has no event for. */
6968
+ missing: string[];
6969
+ /** @description Dodo event ids in the cycle with no usage row of ours. */
6970
+ extra: string[];
6971
+ /** @description Events whose quantity differs from our usage row's (Dodo keeps the first quantity sent). */
6972
+ changed: {
6973
+ event_id: string;
6974
+ ours: number;
6975
+ dodo: number;
6976
+ }[];
6977
+ };
6978
+ };
6979
+ ClaimRunnerBackendResponse: {
6980
+ /** @description Response payload. */
6981
+ data: {
6982
+ /** @description The registered backend, or null when nothing matched. */
6983
+ runner_backend_id: number | null;
6984
+ /** @enum {string|null} */
6985
+ status: "pending" | "active" | "disabled" | null;
6986
+ /** @description What the call did. */
6987
+ message: string;
6988
+ };
6989
+ };
6990
+ ClaimRunnerBackendBody: {
6991
+ /** @description The token from the installation's registration link. */
6992
+ registration_token: string;
6993
+ /**
6994
+ * @description The CloudFormation event the stack is handling.
6995
+ * @enum {string}
6996
+ */
6997
+ request_type: "Create" | "Update" | "Delete";
6998
+ /** @description ARN of the calling stack. */
6999
+ stack_id: string;
7000
+ /** @description The stack's control-plane role. */
7001
+ role_arn: string;
7002
+ /** @description The stack's ECS cluster. */
7003
+ cluster_name: string;
7004
+ /** @description The stack's worker log group. */
7005
+ log_group_name: string;
7006
+ /** @description The stack's job queue prefix. */
7007
+ queue_prefix: string;
7008
+ /** @description Template release. */
7009
+ stack_version: string;
7010
+ /**
7011
+ * Format: date-time
7012
+ * @description When the template release was published.
7013
+ */
7014
+ stack_released_at?: string;
7015
+ /** @description Worker image. */
7016
+ worker_version: string;
7017
+ /** @description Job protocol version. */
7018
+ protocol_version: string;
7019
+ /** @description Optional features the template supports. */
7020
+ capabilities: string[];
7021
+ };
7022
+ ProjectRunnerBackendDetailResponse: {
7023
+ /** @description Response payload. */
7024
+ data: {
7025
+ /** @description The backend the project's new runs are placed on, or null for Empirical-hosted. */
7026
+ runner_backend: {
7027
+ /** @description Runner backend ID. */
7028
+ id: number;
7029
+ /** @description Organisation that owns the installation. */
7030
+ org_id: number;
7031
+ /** @description Human-readable name. */
7032
+ name: string;
7033
+ /** @description AWS account the installation runs in. */
7034
+ aws_account_id: string;
7035
+ /** @description AWS region of the installation. */
7036
+ region: string;
7037
+ /** @description Role api-worker assumes to drive the plane. */
7038
+ role_arn: string;
7039
+ /** @description ECS cluster name. */
7040
+ cluster_name: string;
7041
+ /** @description CloudWatch log group of the worker. */
7042
+ log_group_name: string;
7043
+ /** @description Worker container name. */
7044
+ container_name: string;
7045
+ /** @description Job queue URLs are `${queue_prefix}-${machineSize}`. */
7046
+ queue_prefix: string;
7047
+ /**
7048
+ * @description `pending` until verified; only `active` backends receive runs.
7049
+ * @enum {string}
7050
+ */
7051
+ status: "pending" | "active" | "disabled";
7052
+ /** @description ISO-8601 time of the last successful verify. */
7053
+ last_verified_at: string | null;
7054
+ /** @description ISO-8601 time of the last verify, manual or scheduled, whatever its outcome. */
7055
+ last_checked_at: string | null;
7056
+ /** @description Outcome of the last verify; null if never run. */
7057
+ last_check_ok: boolean | null;
7058
+ /** @description Every check from the last verify. */
7059
+ last_check_results: components["schemas"]["RunnerBackendCheck"][] | null;
7060
+ /** @description ISO-8601 start of the current run of failed checks; null while passing. A failing check does not change `status`. */
7061
+ check_failing_since: string | null;
7062
+ /** @description Release of the CloudFormation template the installation runs, as its stack last reported. */
7063
+ stack_version: string | null;
7064
+ /** @description ISO-8601 time that release was published, if known. */
7065
+ stack_released_at: string | null;
7066
+ /** @description Worker image the installation runs. */
7067
+ worker_version: string | null;
7068
+ /** @description Job protocol version the installation speaks. */
7069
+ protocol_version: string | null;
7070
+ /** @description Optional features the installation supports. */
7071
+ capabilities: string[];
7072
+ /** @description ARN of the CloudFormation stack that registered the installation. */
7073
+ stack_id: string | null;
7074
+ /** @description ISO-8601 time the installation's stack first called home; null until then. */
7075
+ registration_claimed_at: string | null;
7076
+ /** @description ISO-8601 expiry of the current registration link, if one was minted. Ignored once claimed. */
7077
+ registration_token_expires_at: string | null;
7078
+ /** @description ISO-8601 creation time. */
7079
+ created_at: string;
7080
+ /** @description ISO-8601 last-update time. */
7081
+ updated_at: string;
7082
+ } | null;
7083
+ };
7084
+ };
7085
+ RunnerBackendCheck: {
7086
+ /** @description `assume_role`, `job_queue`, `scaler_trigger_queue`, `ecs_cluster`, `ecs_tasks` or `worker_logs`. */
7087
+ name: string;
7088
+ /** @description Whether the check passed. */
7089
+ ok: boolean;
7090
+ /** @description The resource checked, or the AWS error. */
7091
+ detail: string;
7092
+ };
7093
+ RunnerBackendVerifyResponse: {
6646
7094
  /** @description Response payload. */
6647
7095
  data: {
6648
- runner_backends: components["schemas"]["RunnerBackend"][];
7096
+ /** @description True when every check passed. */
7097
+ verified: boolean;
7098
+ checks: components["schemas"]["RunnerBackendCheck"][];
7099
+ runner_backend: components["schemas"]["RunnerBackend"];
6649
7100
  };
6650
7101
  };
6651
7102
  RunnerBackend: {
@@ -6661,8 +7112,6 @@ export interface components {
6661
7112
  region: string;
6662
7113
  /** @description Role api-worker assumes to drive the plane. */
6663
7114
  role_arn: string;
6664
- /** @description External ID the role's trust policy must require. Give it only to this installation's owner. */
6665
- external_id: string;
6666
7115
  /** @description ECS cluster name. */
6667
7116
  cluster_name: string;
6668
7117
  /** @description CloudWatch log group of the worker. */
@@ -6686,63 +7135,31 @@ export interface components {
6686
7135
  last_check_results: components["schemas"]["RunnerBackendCheck"][] | null;
6687
7136
  /** @description ISO-8601 start of the current run of failed checks; null while passing. A failing check does not change `status`. */
6688
7137
  check_failing_since: string | null;
7138
+ /** @description Release of the CloudFormation template the installation runs, as its stack last reported. */
7139
+ stack_version: string | null;
7140
+ /** @description ISO-8601 time that release was published, if known. */
7141
+ stack_released_at: string | null;
7142
+ /** @description Worker image the installation runs. */
7143
+ worker_version: string | null;
7144
+ /** @description Job protocol version the installation speaks. */
7145
+ protocol_version: string | null;
7146
+ /** @description Optional features the installation supports. */
7147
+ capabilities: string[];
7148
+ /** @description ARN of the CloudFormation stack that registered the installation. */
7149
+ stack_id: string | null;
7150
+ /** @description ISO-8601 time the installation's stack first called home; null until then. */
7151
+ registration_claimed_at: string | null;
7152
+ /** @description ISO-8601 expiry of the current registration link, if one was minted. Ignored once claimed. */
7153
+ registration_token_expires_at: string | null;
6689
7154
  /** @description ISO-8601 creation time. */
6690
7155
  created_at: string;
6691
7156
  /** @description ISO-8601 last-update time. */
6692
7157
  updated_at: string;
6693
7158
  };
6694
- RunnerBackendCheck: {
6695
- /** @description `assume_role`, `job_queue`, `scaler_trigger_queue`, `ecs_cluster`, `ecs_tasks` or `worker_logs`. */
6696
- name: string;
6697
- /** @description Whether the check passed. */
6698
- ok: boolean;
6699
- /** @description The resource checked, or the AWS error. */
6700
- detail: string;
6701
- };
6702
- RunnerBackendResponse: {
6703
- /** @description Response payload. */
6704
- data: {
6705
- runner_backend: components["schemas"]["RunnerBackend"];
6706
- };
6707
- };
6708
- CreateRunnerBackendBody: {
6709
- /** @description Owning organisation. */
6710
- org_id: number;
6711
- /** @description Human-readable name. */
6712
- name: string;
6713
- /** @description 12-digit AWS account ID. */
6714
- aws_account_id: string;
6715
- /** @description AWS region, e.g. `us-east-1`. */
6716
- region: string;
6717
- /** @description ARN of a role named `empirical-private-runner-*` in `aws_account_id`. */
6718
- role_arn: string;
6719
- /** @description ECS cluster name. */
6720
- cluster_name: string;
6721
- /** @description CloudWatch log group of the worker. */
6722
- log_group_name: string;
6723
- /** @description `https://sqs.<region>.amazonaws.com/<account>/<name>`; queues are `${queue_prefix}-${machineSize}`. */
6724
- queue_prefix: string;
6725
- /** @description Worker container name. Defaults to `test-run-worker`. */
6726
- container_name?: string;
6727
- /** @description Only for installations whose role already requires a fixed ID (Empirical's own dogfood). Generated otherwise. */
6728
- external_id?: string;
6729
- };
6730
- ProjectRunnerBackendResponse: {
6731
- /** @description Response payload. */
6732
- data: {
6733
- project_id: number;
6734
- runner_backend_id: number | null;
6735
- };
6736
- };
6737
- SetProjectRunnerBackendBody: {
6738
- /** @description An active backend of the project's organisation, or null for Empirical-hosted. */
6739
- runner_backend_id: number | null;
6740
- };
6741
- ProjectRunnerBackendDetailResponse: {
7159
+ OrgRunnerBackendListResponse: {
6742
7160
  /** @description Response payload. */
6743
7161
  data: {
6744
- /** @description The backend the project's new runs are placed on, or null for Empirical-hosted. */
6745
- runner_backend: {
7162
+ runner_backends: {
6746
7163
  /** @description Runner backend ID. */
6747
7164
  id: number;
6748
7165
  /** @description Organisation that owns the installation. */
@@ -6755,8 +7172,6 @@ export interface components {
6755
7172
  region: string;
6756
7173
  /** @description Role api-worker assumes to drive the plane. */
6757
7174
  role_arn: string;
6758
- /** @description External ID the role's trust policy must require. Give it only to this installation's owner. */
6759
- external_id: string;
6760
7175
  /** @description ECS cluster name. */
6761
7176
  cluster_name: string;
6762
7177
  /** @description CloudWatch log group of the worker. */
@@ -6780,22 +7195,111 @@ export interface components {
6780
7195
  last_check_results: components["schemas"]["RunnerBackendCheck"][] | null;
6781
7196
  /** @description ISO-8601 start of the current run of failed checks; null while passing. A failing check does not change `status`. */
6782
7197
  check_failing_since: string | null;
7198
+ /** @description Release of the CloudFormation template the installation runs, as its stack last reported. */
7199
+ stack_version: string | null;
7200
+ /** @description ISO-8601 time that release was published, if known. */
7201
+ stack_released_at: string | null;
7202
+ /** @description Worker image the installation runs. */
7203
+ worker_version: string | null;
7204
+ /** @description Job protocol version the installation speaks. */
7205
+ protocol_version: string | null;
7206
+ /** @description Optional features the installation supports. */
7207
+ capabilities: string[];
7208
+ /** @description ARN of the CloudFormation stack that registered the installation. */
7209
+ stack_id: string | null;
7210
+ /** @description ISO-8601 time the installation's stack first called home; null until then. */
7211
+ registration_claimed_at: string | null;
7212
+ /** @description ISO-8601 expiry of the current registration link, if one was minted. Ignored once claimed. */
7213
+ registration_token_expires_at: string | null;
6783
7214
  /** @description ISO-8601 creation time. */
6784
7215
  created_at: string;
6785
7216
  /** @description ISO-8601 last-update time. */
6786
7217
  updated_at: string;
6787
- } | null;
7218
+ /** @description Projects whose new runs use this runner. */
7219
+ projects: {
7220
+ id: number;
7221
+ name: string;
7222
+ slug: string;
7223
+ }[];
7224
+ }[];
6788
7225
  };
6789
7226
  };
6790
- RunnerBackendVerifyResponse: {
7227
+ SetupRunnerBackendResponse: {
7228
+ /** @description Response payload. */
7229
+ data: {
7230
+ runner_backend: components["schemas"]["RunnerBackend"];
7231
+ /** @description Response payload. */
7232
+ registration: {
7233
+ /** @description Credential the installation's stack calls home with. Shown once; Empirical keeps only its hash. */
7234
+ registration_token: string;
7235
+ /** @description ISO-8601 time the link stops working if unused. */
7236
+ expires_at: string;
7237
+ /** @description Release of the template the link installs. */
7238
+ stack_version: string;
7239
+ /** @description The template the link installs. */
7240
+ template_url: string;
7241
+ /** @description AWS console link that opens CloudFormation with the template and Empirical's parameters filled in. */
7242
+ quick_create_url: string;
7243
+ };
7244
+ };
7245
+ };
7246
+ SetupRunnerBackendBody: {
7247
+ /** @description 12-digit AWS account to install the runner in. */
7248
+ aws_account_id: string;
7249
+ /** @description AWS region with a published template, e.g. `us-east-1`. */
7250
+ region: string;
7251
+ };
7252
+ ProjectRunnerBackendResponse: {
7253
+ /** @description Response payload. */
7254
+ data: {
7255
+ project_id: number;
7256
+ runner_backend_id: number | null;
7257
+ };
7258
+ };
7259
+ SetProjectRunnerBackendBody: {
7260
+ /** @description An active backend of the project's organisation, or null for Empirical-hosted. */
7261
+ runner_backend_id: number | null;
7262
+ };
7263
+ RunnerBackendRegistrationResponse: {
7264
+ /** @description Response payload. */
7265
+ data: {
7266
+ /** @description Credential the installation's stack calls home with. Shown once; Empirical keeps only its hash. */
7267
+ registration_token: string;
7268
+ /** @description ISO-8601 time the link stops working if unused. */
7269
+ expires_at: string;
7270
+ /** @description Release of the template the link installs. */
7271
+ stack_version: string;
7272
+ /** @description The template the link installs. */
7273
+ template_url: string;
7274
+ /** @description AWS console link that opens CloudFormation with the template and Empirical's parameters filled in. */
7275
+ quick_create_url: string;
7276
+ };
7277
+ };
7278
+ DisconnectRunnerBackendResponse: {
7279
+ /** @description Response payload. */
7280
+ data: {
7281
+ runner_backend: components["schemas"]["RunnerBackend"];
7282
+ /** @description Projects moved back to Empirical-hosted runs. */
7283
+ unlinked_project_ids: number[];
7284
+ };
7285
+ };
7286
+ RemoveRunnerBackendResponse: {
7287
+ /** @description Response payload. */
7288
+ data: {
7289
+ /** @enum {boolean} */
7290
+ removed: true;
7291
+ };
7292
+ };
7293
+ RunnerBackendResponse: {
6791
7294
  /** @description Response payload. */
6792
7295
  data: {
6793
- /** @description True when every check passed. */
6794
- verified: boolean;
6795
- checks: components["schemas"]["RunnerBackendCheck"][];
6796
7296
  runner_backend: components["schemas"]["RunnerBackend"];
6797
7297
  };
6798
7298
  };
7299
+ RenameRunnerBackendBody: {
7300
+ /** @description Name shown for the runner in Empirical. */
7301
+ name: string;
7302
+ };
6799
7303
  CreateSystemMessageResponse: {
6800
7304
  data: {
6801
7305
  system_message: components["schemas"]["SystemMessage"];
@@ -7504,7 +8008,25 @@ export interface components {
7504
8008
  /** @description Opaque agent chat state. */
7505
8009
  chat_state?: unknown;
7506
8010
  /** @description Tests impacted by this session. */
7507
- impacted_tests?: unknown;
8011
+ impacted_tests: {
8012
+ test_case: {
8013
+ name: string;
8014
+ suites: string[];
8015
+ file_path: string;
8016
+ start_line: number;
8017
+ end_line: number;
8018
+ };
8019
+ /** @enum {string} */
8020
+ type: "added" | "removed" | "modified";
8021
+ modified_by: {
8022
+ file_path: string;
8023
+ line: {
8024
+ number: number;
8025
+ /** @enum {string} */
8026
+ type: "added" | "removed" | "modified";
8027
+ };
8028
+ }[] | null;
8029
+ }[];
7508
8030
  /** @description Whether the agent is awaiting user input. */
7509
8031
  ask_user_for_input: boolean | null;
7510
8032
  /** @description Langfuse trace ID. */
@@ -7897,11 +8419,11 @@ export interface components {
7897
8419
  ResolveMembershipRequest: {
7898
8420
  /**
7899
8421
  * Format: email
7900
- * @description Verified email of the user.
8422
+ * @description Verified email of the user. Required for system callers; ignored for a signed-in user, whose confirmed email is read server-side.
7901
8423
  */
7902
- email: string;
7903
- /** @description Supabase user id to grant membership to. */
7904
- user_id: string;
8424
+ email?: string;
8425
+ /** @description Supabase user id to grant membership to. Required for system callers; ignored for a signed-in user, who resolves their own. */
8426
+ user_id?: string;
7905
8427
  };
7906
8428
  OrgUpdateResponse: {
7907
8429
  /** @description Response payload. */
@@ -9175,10 +9697,10 @@ export interface components {
9175
9697
  /** @description ISO 8601 creation timestamp. */
9176
9698
  created_at: string | null;
9177
9699
  };
9178
- SlackAppInstallMutationResponse: {
9700
+ SlackAppInstallUpsertResponse: {
9179
9701
  /** @description Whether the write succeeded. */
9180
9702
  success: boolean;
9181
- /** @description The Slack app install. */
9703
+ /** @description The Slack app install; null when the install was into Empirical's own workspace, which is not stored per org. */
9182
9704
  data: {
9183
9705
  /** @description Slack app install ID. */
9184
9706
  id: number;
@@ -9205,7 +9727,15 @@ export interface components {
9205
9727
  team_url: string | null;
9206
9728
  /** @description ISO 8601 creation timestamp. */
9207
9729
  created_at: string | null;
9208
- };
9730
+ } | null;
9731
+ /** @description True when nothing was stored (Empirical's workspace). */
9732
+ skipped?: boolean;
9733
+ };
9734
+ SlackScopeRefreshResponse: {
9735
+ /** @description Whether the refresh succeeded. */
9736
+ success: boolean;
9737
+ /** @description Granted OAuth scopes (CSV). */
9738
+ scope: string;
9209
9739
  };
9210
9740
  SlackAppInstallResponse: {
9211
9741
  /** @description Response payload. */
@@ -9411,22 +9941,54 @@ export interface components {
9411
9941
  /** @description Pull request number in the authenticated project's repository. */
9412
9942
  pr_number: number;
9413
9943
  };
9414
- ChatSessionUsersResponse: {
9415
- /** @description Response payload. */
9416
- data: components["schemas"]["ChatSessionUserDetail"][];
9417
- };
9418
- ChatSessionUserDetail: {
9419
- /** @description Supabase user ID. */
9420
- id: string;
9421
- /** @description User email. */
9422
- email: string;
9423
- /** @description Display name. */
9424
- name: string;
9425
- /** @description Avatar URL. */
9426
- picture: string;
9427
- };
9428
- ChatSessionCombinedAnalyticsResponse: {
9429
- /** @description Response payload. */
9944
+ SlackAppInstallMutationResponse: {
9945
+ /** @description Whether the write succeeded. */
9946
+ success: boolean;
9947
+ /** @description The Slack app install. */
9948
+ data: {
9949
+ /** @description Slack app install ID. */
9950
+ id: number;
9951
+ /** @description Organisation ID. */
9952
+ org_id: number;
9953
+ /** @description Slack app ID. */
9954
+ slack_app_id: string;
9955
+ /** @description Authorizing Slack user ID. */
9956
+ authed_user_id: string;
9957
+ /** @description OAuth scopes (CSV). */
9958
+ scope: string;
9959
+ /** @description OAuth token type. */
9960
+ token_type: string;
9961
+ /** @description Bot user ID. */
9962
+ bot_user_id: string;
9963
+ /** @description Slack workspace (team) ID. */
9964
+ team_id: string;
9965
+ /** @description Slack workspace name. */
9966
+ team_name: string;
9967
+ /**
9968
+ * Format: uri
9969
+ * @description Slack workspace URL learned from auth.test.
9970
+ */
9971
+ team_url: string | null;
9972
+ /** @description ISO 8601 creation timestamp. */
9973
+ created_at: string | null;
9974
+ };
9975
+ };
9976
+ ChatSessionUsersResponse: {
9977
+ /** @description Response payload. */
9978
+ data: components["schemas"]["ChatSessionUserDetail"][];
9979
+ };
9980
+ ChatSessionUserDetail: {
9981
+ /** @description Supabase user ID. */
9982
+ id: string;
9983
+ /** @description User email. */
9984
+ email: string;
9985
+ /** @description Display name. */
9986
+ name: string;
9987
+ /** @description Avatar URL. */
9988
+ picture: string;
9989
+ };
9990
+ ChatSessionCombinedAnalyticsResponse: {
9991
+ /** @description Response payload. */
9430
9992
  data: {
9431
9993
  my: components["schemas"]["ChatSessionChartData"];
9432
9994
  overall: components["schemas"]["ChatSessionChartData"];
@@ -9523,8 +10085,11 @@ export interface components {
9523
10085
  } | null;
9524
10086
  /** @description Number of the session's most recently updated PR, if any. */
9525
10087
  pr_number: number | null;
9526
- /** @description Status of the session's most recently updated PR ('unopened' when it has none). */
9527
- pr_status: string;
10088
+ /**
10089
+ * @description Status of the session's most recently updated PR ('unopened' when it has none).
10090
+ * @enum {string}
10091
+ */
10092
+ pr_status: "unopened" | "open" | "opened" | "closed" | "merged";
9528
10093
  /** @description Name of the owning project. */
9529
10094
  project_name: string | null;
9530
10095
  /** @description Repository name of the owning project. */
@@ -9579,7 +10144,25 @@ export interface components {
9579
10144
  /** @description Opaque agent chat state. */
9580
10145
  chat_state?: unknown;
9581
10146
  /** @description Tests impacted by this session. */
9582
- impacted_tests?: unknown;
10147
+ impacted_tests: {
10148
+ test_case: {
10149
+ name: string;
10150
+ suites: string[];
10151
+ file_path: string;
10152
+ start_line: number;
10153
+ end_line: number;
10154
+ };
10155
+ /** @enum {string} */
10156
+ type: "added" | "removed" | "modified";
10157
+ modified_by: {
10158
+ file_path: string;
10159
+ line: {
10160
+ number: number;
10161
+ /** @enum {string} */
10162
+ type: "added" | "removed" | "modified";
10163
+ };
10164
+ }[] | null;
10165
+ }[];
9583
10166
  /** @description Whether the agent is awaiting user input. */
9584
10167
  ask_user_for_input: boolean | null;
9585
10168
  /** @description Langfuse trace ID. */
@@ -9973,14 +10556,83 @@ export interface components {
9973
10556
  /** @description Response payload. */
9974
10557
  data: {
9975
10558
  /** @description Reporter App installation rows. */
9976
- gh_app_installs: unknown[];
10559
+ gh_app_installs: components["schemas"]["GhReporterAppInstall"][];
10560
+ };
10561
+ };
10562
+ GhReporterAppInstall: {
10563
+ id: number;
10564
+ org_id: number | null;
10565
+ app_installation_id: string | null;
10566
+ gh_organization: string | null;
10567
+ gh_repos: {
10568
+ id: number;
10569
+ node_id: string;
10570
+ name: string;
10571
+ full_name: string;
10572
+ private: boolean;
10573
+ }[] | null;
10574
+ /** @enum {string|null} */
10575
+ installation_status: "requested" | "installed" | null;
10576
+ permissions: {
10577
+ /** @enum {string} */
10578
+ metadata: "read";
10579
+ /** @enum {string} */
10580
+ checks?: "write" | "read";
10581
+ /** @enum {string} */
10582
+ pull_requests?: "write" | "read";
10583
+ /** @enum {string} */
10584
+ contents?: "write" | "read";
10585
+ /** @enum {string} */
10586
+ issues?: "write" | "read";
10587
+ /** @enum {string} */
10588
+ merge_queues?: "write" | "read";
10589
+ /** @enum {string} */
10590
+ repository_custom_properties?: "write" | "read";
10591
+ } & {
10592
+ [key: string]: unknown;
9977
10593
  };
10594
+ created_at: string | null;
10595
+ updated_at: string | null;
9978
10596
  };
9979
10597
  GhReporterInstallResponse: {
9980
10598
  /** @description Response payload. */
9981
10599
  data: {
9982
- /** @description The reporter App installation row. */
9983
- installation?: unknown;
10600
+ /** @description The reporter App installation row, or null if the write matched nothing. */
10601
+ installation: {
10602
+ id: number;
10603
+ org_id: number | null;
10604
+ app_installation_id: string | null;
10605
+ gh_organization: string | null;
10606
+ gh_repos: {
10607
+ id: number;
10608
+ node_id: string;
10609
+ name: string;
10610
+ full_name: string;
10611
+ private: boolean;
10612
+ }[] | null;
10613
+ /** @enum {string|null} */
10614
+ installation_status: "requested" | "installed" | null;
10615
+ permissions: {
10616
+ /** @enum {string} */
10617
+ metadata: "read";
10618
+ /** @enum {string} */
10619
+ checks?: "write" | "read";
10620
+ /** @enum {string} */
10621
+ pull_requests?: "write" | "read";
10622
+ /** @enum {string} */
10623
+ contents?: "write" | "read";
10624
+ /** @enum {string} */
10625
+ issues?: "write" | "read";
10626
+ /** @enum {string} */
10627
+ merge_queues?: "write" | "read";
10628
+ /** @enum {string} */
10629
+ repository_custom_properties?: "write" | "read";
10630
+ } & {
10631
+ [key: string]: unknown;
10632
+ };
10633
+ created_at: string | null;
10634
+ updated_at: string | null;
10635
+ } | null;
9984
10636
  };
9985
10637
  };
9986
10638
  GhReporterDeliveriesResponse: {
@@ -10085,9 +10737,24 @@ export interface components {
10085
10737
  /** @description Response payload. */
10086
10738
  data: {
10087
10739
  /** @description Main App installation rows. */
10088
- gh_app_installs: unknown[];
10740
+ gh_app_installs: components["schemas"]["GhMainAppInstall"][];
10089
10741
  };
10090
10742
  };
10743
+ GhMainAppInstall: {
10744
+ id: number;
10745
+ org_id: number;
10746
+ app_installation_id: string;
10747
+ gh_organization: string | null;
10748
+ gh_repos: {
10749
+ id: number;
10750
+ node_id: string;
10751
+ name: string;
10752
+ full_name: string;
10753
+ private: boolean;
10754
+ }[] | null;
10755
+ created_at: string | null;
10756
+ updated_at: string | null;
10757
+ };
10091
10758
  GhMainMetadataResponse: {
10092
10759
  /** @description Response payload. */
10093
10760
  data: {
@@ -10108,8 +10775,22 @@ export interface components {
10108
10775
  GhMainInstallResponse: {
10109
10776
  /** @description Response payload. */
10110
10777
  data: {
10111
- /** @description The main App installation row. */
10112
- installation?: unknown;
10778
+ /** @description The main App installation row, or null if the write matched nothing. */
10779
+ installation: {
10780
+ id: number;
10781
+ org_id: number;
10782
+ app_installation_id: string;
10783
+ gh_organization: string | null;
10784
+ gh_repos: {
10785
+ id: number;
10786
+ node_id: string;
10787
+ name: string;
10788
+ full_name: string;
10789
+ private: boolean;
10790
+ }[] | null;
10791
+ created_at: string | null;
10792
+ updated_at: string | null;
10793
+ } | null;
10113
10794
  };
10114
10795
  };
10115
10796
  GithubProxyError: {
@@ -10168,22 +10849,29 @@ export interface components {
10168
10849
  CreateJiraInstallationRequest: {
10169
10850
  /** @description Organisation the installation belongs to. */
10170
10851
  org_id: number;
10171
- /** @description Atlassian cloud ID of the Jira site. */
10172
- jira_cloud_id: string;
10852
+ /** @description OAuth code from Atlassian's redirect. Required for a signed-in user. */
10853
+ code?: string;
10173
10854
  /**
10174
10855
  * Format: uri
10175
- * @description Base URL of the Jira site.
10856
+ * @description Redirect URI the authorize request used; Atlassian requires it to match. Required with `code`.
10176
10857
  */
10177
- jira_site_url: string;
10178
- /** @description OAuth access token. */
10179
- jira_access_token: string;
10180
- /** @description OAuth refresh token. */
10181
- jira_refresh_token: string;
10858
+ redirect_uri?: string;
10859
+ /** @description Atlassian cloud ID. System callers only. */
10860
+ jira_cloud_id?: string;
10861
+ /**
10862
+ * Format: uri
10863
+ * @description Base URL of the Jira site. System callers only.
10864
+ */
10865
+ jira_site_url?: string;
10866
+ /** @description OAuth access token. System callers only. */
10867
+ jira_access_token?: string;
10868
+ /** @description OAuth refresh token. System callers only. */
10869
+ jira_refresh_token?: string;
10182
10870
  /**
10183
10871
  * Format: date-time
10184
- * @description Expiry timestamp of the access token.
10872
+ * @description Expiry of the access token. System callers only.
10185
10873
  */
10186
- jira_access_token_expires_at: string | null;
10874
+ jira_access_token_expires_at?: string | null;
10187
10875
  /** @description When true, register the Jira webhook after install. */
10188
10876
  register_webhook?: boolean;
10189
10877
  };
@@ -10257,6 +10945,9 @@ export interface components {
10257
10945
  /** @description Webhook expiry (ISO 8601), or null. */
10258
10946
  webhookExpiresAt: string | null;
10259
10947
  };
10948
+ RequestIngestionProviderPayload: {
10949
+ [key: string]: unknown;
10950
+ };
10260
10951
  LinearInstallListResponse: {
10261
10952
  /** @description Installations for the organization. */
10262
10953
  data: components["schemas"]["LinearAppInstall"][];
@@ -12464,6 +13155,13 @@ export interface components {
12464
13155
  id: number;
12465
13156
  title: string | null;
12466
13157
  } | null;
13158
+ /** @description The customer-hosted runner (Private Runner) the run was dispatched to. Null for runs on Empirical's hosted runners. */
13159
+ runner_backend: {
13160
+ id: number;
13161
+ name: string;
13162
+ aws_account_id: string;
13163
+ region: string;
13164
+ } | null;
12467
13165
  /** @description For a pending run held back by its concurrency group (on_conflict=wait), the in-progress run it is waiting on. Null when the run is not pending or nothing blocks it. */
12468
13166
  waiting_on_test_run_id: number | null;
12469
13167
  /** @description First page of ledger-sourced cases, ordered failed → flaky → others so the default 'failed' filter and the failure-first list render correctly on first paint. Shipped inline so the list renders without waiting on a fetch. The client refetches the full set. */
@@ -13104,7 +13802,7 @@ export interface components {
13104
13802
  };
13105
13803
  };
13106
13804
  DodoWebhookAckResponse: {
13107
- /** @description Ack. */
13805
+ /** @description Acknowledgement. */
13108
13806
  message: string;
13109
13807
  };
13110
13808
  RazorpayWebhookAckResponse: {
@@ -13532,7 +14230,7 @@ export interface operations {
13532
14230
  "application/json": components["schemas"]["ErrorResponse"];
13533
14231
  };
13534
14232
  };
13535
- /** @description The organisation has an overdue invoice. */
14233
+ /** @description Billing blocked: an overdue invoice, a failed renewal, no active plan, or the spend limit reached. */
13536
14234
  402: {
13537
14235
  headers: {
13538
14236
  [name: string]: unknown;
@@ -13780,7 +14478,7 @@ export interface operations {
13780
14478
  "application/json": components["schemas"]["ErrorResponse"];
13781
14479
  };
13782
14480
  };
13783
- /** @description The organisation has an overdue invoice. */
14481
+ /** @description Billing blocked: an overdue invoice, a failed renewal, no active plan, or the spend limit reached. */
13784
14482
  402: {
13785
14483
  headers: {
13786
14484
  [name: string]: unknown;
@@ -15862,6 +16560,56 @@ export interface operations {
15862
16560
  };
15863
16561
  };
15864
16562
  };
16563
+ refreshSlackAppScopes: {
16564
+ parameters: {
16565
+ query?: never;
16566
+ header?: never;
16567
+ path?: never;
16568
+ cookie?: never;
16569
+ };
16570
+ requestBody?: {
16571
+ content: {
16572
+ "application/json": {
16573
+ /** @description OAuth code from Slack's redirect. */
16574
+ code: string;
16575
+ /**
16576
+ * Format: uri
16577
+ * @description Redirect URI the authorize request used.
16578
+ */
16579
+ redirect_uri: string;
16580
+ };
16581
+ };
16582
+ };
16583
+ responses: {
16584
+ /** @description The scopes were refreshed. */
16585
+ 200: {
16586
+ headers: {
16587
+ [name: string]: unknown;
16588
+ };
16589
+ content: {
16590
+ "application/json": components["schemas"]["SlackScopeRefreshResponse"];
16591
+ };
16592
+ };
16593
+ /** @description The code was for another workspace. */
16594
+ 400: {
16595
+ headers: {
16596
+ [name: string]: unknown;
16597
+ };
16598
+ content: {
16599
+ "application/json": components["schemas"]["ErrorResponse"];
16600
+ };
16601
+ };
16602
+ /** @description Slack rejected the OAuth code. */
16603
+ 401: {
16604
+ headers: {
16605
+ [name: string]: unknown;
16606
+ };
16607
+ content: {
16608
+ "application/json": components["schemas"]["ErrorResponse"];
16609
+ };
16610
+ };
16611
+ };
16612
+ };
15865
16613
  slackAuthTest: {
15866
16614
  parameters: {
15867
16615
  query?: never;
@@ -15959,22 +16707,29 @@ export interface operations {
15959
16707
  "application/json": {
15960
16708
  /** @description Organisation ID. */
15961
16709
  org_id: number;
15962
- /** @description Slack app ID. */
15963
- slack_app_id: string;
15964
- /** @description Authorizing Slack user ID. */
15965
- authed_user_id: string;
15966
- /** @description OAuth scopes (CSV). */
15967
- scope: string;
15968
- /** @description OAuth token type. */
15969
- token_type: string;
15970
- /** @description OAuth access token. */
15971
- access_token: string;
15972
- /** @description Bot user ID. */
15973
- bot_user_id: string;
15974
- /** @description Slack workspace (team) ID. */
15975
- team_id: string;
15976
- /** @description Slack workspace name. */
15977
- team_name: string;
16710
+ /** @description OAuth code from Slack's redirect. Required for a signed-in user. */
16711
+ code?: string;
16712
+ /**
16713
+ * Format: uri
16714
+ * @description Redirect URI the authorize request used; Slack requires it to match. Required with `code`.
16715
+ */
16716
+ redirect_uri?: string;
16717
+ /** @description Slack app ID. System callers only. */
16718
+ slack_app_id?: string;
16719
+ /** @description Authorizing Slack user ID. System callers only. */
16720
+ authed_user_id?: string;
16721
+ /** @description OAuth scopes (CSV). System callers only. */
16722
+ scope?: string;
16723
+ /** @description OAuth token type. System callers only. */
16724
+ token_type?: string;
16725
+ /** @description OAuth access token. System callers only. */
16726
+ access_token?: string;
16727
+ /** @description Bot user ID. System callers only. */
16728
+ bot_user_id?: string;
16729
+ /** @description Slack workspace (team) ID. System callers only. */
16730
+ team_id?: string;
16731
+ /** @description Slack workspace name. System callers only. */
16732
+ team_name?: string;
15978
16733
  };
15979
16734
  };
15980
16735
  };
@@ -15985,7 +16740,7 @@ export interface operations {
15985
16740
  [name: string]: unknown;
15986
16741
  };
15987
16742
  content: {
15988
- "application/json": components["schemas"]["SlackAppInstallMutationResponse"];
16743
+ "application/json": components["schemas"]["SlackAppInstallUpsertResponse"];
15989
16744
  };
15990
16745
  };
15991
16746
  /** @description Invalid request. */
@@ -15997,6 +16752,15 @@ export interface operations {
15997
16752
  "application/json": components["schemas"]["ErrorResponse"];
15998
16753
  };
15999
16754
  };
16755
+ /** @description Slack rejected the OAuth code. */
16756
+ 401: {
16757
+ headers: {
16758
+ [name: string]: unknown;
16759
+ };
16760
+ content: {
16761
+ "application/json": components["schemas"]["ErrorResponse"];
16762
+ };
16763
+ };
16000
16764
  /** @description Forbidden. */
16001
16765
  403: {
16002
16766
  headers: {
@@ -19173,8 +19937,10 @@ export interface operations {
19173
19937
  getBillingMonthSummary: {
19174
19938
  parameters: {
19175
19939
  query?: {
19176
- /** @description Usage month (YYYY-MM, UTC). Defaults to the current month. */
19940
+ /** @description A UTC calendar month (YYYY-MM), for any org. Defaults to the current period. */
19177
19941
  month?: string;
19942
+ /** @description A usage period by key (YYYY-MM-DD, from `/api/billing/periods`): a calendar month, or a billing cycle for an org on a live Dodo subscription. Defaults to the current period. */
19943
+ period?: string;
19178
19944
  };
19179
19945
  header?: never;
19180
19946
  path?: never;
@@ -19191,7 +19957,7 @@ export interface operations {
19191
19957
  "application/json": components["schemas"]["BillingMonthSummaryResponse"];
19192
19958
  };
19193
19959
  };
19194
- /** @description Invalid month, or missing project scope. */
19960
+ /** @description Invalid month or period, or missing project scope. */
19195
19961
  400: {
19196
19962
  headers: {
19197
19963
  [name: string]: unknown;
@@ -19211,32 +19977,28 @@ export interface operations {
19211
19977
  };
19212
19978
  };
19213
19979
  };
19214
- setUsageLimit: {
19980
+ listBillingPeriods: {
19215
19981
  parameters: {
19216
- query?: never;
19982
+ query?: {
19983
+ /** @description How many periods. Defaults to 2. */
19984
+ count?: number;
19985
+ };
19217
19986
  header?: never;
19218
19987
  path?: never;
19219
19988
  cookie?: never;
19220
19989
  };
19221
- requestBody?: {
19222
- content: {
19223
- "application/json": {
19224
- /** @description Whole dollars, in cents; null removes it. */
19225
- cap_cents: number | null;
19226
- };
19227
- };
19228
- };
19990
+ requestBody?: never;
19229
19991
  responses: {
19230
- /** @description The updated usage limit. */
19992
+ /** @description Usage periods, latest first. */
19231
19993
  200: {
19232
19994
  headers: {
19233
19995
  [name: string]: unknown;
19234
19996
  };
19235
19997
  content: {
19236
- "application/json": components["schemas"]["UsageLimitResponse"];
19998
+ "application/json": components["schemas"]["BillingPeriodsResponse"];
19237
19999
  };
19238
20000
  };
19239
- /** @description Invalid body, or the plan doesn't support a limit. */
20001
+ /** @description Invalid query, or missing project scope. */
19240
20002
  400: {
19241
20003
  headers: {
19242
20004
  [name: string]: unknown;
@@ -19256,29 +20018,31 @@ export interface operations {
19256
20018
  };
19257
20019
  };
19258
20020
  };
19259
- listUsageLimitEvents: {
20021
+ reconcileSubscriptionUsage: {
19260
20022
  parameters: {
19261
20023
  query?: {
19262
- per_page?: number;
19263
- /** @description Return events older than this id (pagination cursor). */
19264
- before_id?: number;
20024
+ cycle_end?: string;
20025
+ cycle_start?: string;
19265
20026
  };
19266
20027
  header?: never;
19267
- path?: never;
20028
+ path: {
20029
+ /** @description Dodo subscription id. */
20030
+ subscription_id: string;
20031
+ };
19268
20032
  cookie?: never;
19269
20033
  };
19270
20034
  requestBody?: never;
19271
20035
  responses: {
19272
- /** @description Usage limit events. */
20036
+ /** @description The reconciliation. */
19273
20037
  200: {
19274
20038
  headers: {
19275
20039
  [name: string]: unknown;
19276
20040
  };
19277
20041
  content: {
19278
- "application/json": components["schemas"]["UsageLimitEventsResponse"];
20042
+ "application/json": components["schemas"]["SubscriptionUsageReconcileResponse"];
19279
20043
  };
19280
20044
  };
19281
- /** @description Invalid query, or missing project scope. */
20045
+ /** @description Payments are not configured, or an empty cycle. */
19282
20046
  400: {
19283
20047
  headers: {
19284
20048
  [name: string]: unknown;
@@ -19287,7 +20051,7 @@ export interface operations {
19287
20051
  "application/json": components["schemas"]["ErrorResponse"];
19288
20052
  };
19289
20053
  };
19290
- /** @description The project has no org. */
20054
+ /** @description No such subscription. */
19291
20055
  404: {
19292
20056
  headers: {
19293
20057
  [name: string]: unknown;
@@ -19298,48 +20062,25 @@ export interface operations {
19298
20062
  };
19299
20063
  };
19300
20064
  };
19301
- listChatSessions: {
20065
+ createSubscriptionCheckout: {
19302
20066
  parameters: {
19303
- query?: {
19304
- /** @description Restrict to a single project (ignored for bound principals). */
19305
- project_id?: number;
19306
- /** @description Include closed sessions when `true`. */
19307
- show_closed?: boolean | null;
19308
- /** @description Filter sessions by preset (all, active, merged). */
19309
- preset?: "all" | "active" | "merged";
19310
- /** @description Page number (1-indexed). Default 1. */
19311
- page?: number;
19312
- /** @description Items per page. Default 10. */
19313
- per_page?: number;
19314
- /** @description Optional Manager sidebar category: executor sessions, or all non-manager/non-executor user-facing sessions. */
19315
- category?: "executor" | "user";
19316
- /** @description Comma-separated project IDs to include. */
19317
- project_ids?: string;
19318
- /** @description Comma-separated project IDs to exclude. */
19319
- exclude_project_ids?: string;
19320
- /** @description Comma-separated creator user IDs to filter by. */
19321
- user_ids?: string;
19322
- /** @description Only sessions updated within this many days. */
19323
- updated_within_days?: number;
19324
- /** @description URL-encoded JSON array of generic filter conditions. */
19325
- filters?: string;
19326
- };
20067
+ query?: never;
19327
20068
  header?: never;
19328
20069
  path?: never;
19329
20070
  cookie?: never;
19330
20071
  };
19331
20072
  requestBody?: never;
19332
20073
  responses: {
19333
- /** @description Page of chat sessions. */
20074
+ /** @description The checkout. */
19334
20075
  200: {
19335
20076
  headers: {
19336
20077
  [name: string]: unknown;
19337
20078
  };
19338
20079
  content: {
19339
- "application/json": components["schemas"]["ChatSessionListResponse"];
20080
+ "application/json": components["schemas"]["SubscriptionCheckoutResponse"];
19340
20081
  };
19341
20082
  };
19342
- /** @description Invalid request. */
20083
+ /** @description Payments not configured, INR org, no plan for sale, or no email for the Dodo customer. */
19343
20084
  400: {
19344
20085
  headers: {
19345
20086
  [name: string]: unknown;
@@ -19348,7 +20089,7 @@ export interface operations {
19348
20089
  "application/json": components["schemas"]["ErrorResponse"];
19349
20090
  };
19350
20091
  };
19351
- /** @description Project not found or not accessible. */
20092
+ /** @description The project has no org. */
19352
20093
  404: {
19353
20094
  headers: {
19354
20095
  [name: string]: unknown;
@@ -19357,8 +20098,270 @@ export interface operations {
19357
20098
  "application/json": components["schemas"]["ErrorResponse"];
19358
20099
  };
19359
20100
  };
19360
- };
19361
- };
20101
+ /** @description The org already has a plan or a live subscription. */
20102
+ 409: {
20103
+ headers: {
20104
+ [name: string]: unknown;
20105
+ };
20106
+ content: {
20107
+ "application/json": components["schemas"]["ErrorResponse"];
20108
+ };
20109
+ };
20110
+ };
20111
+ };
20112
+ endSubscription: {
20113
+ parameters: {
20114
+ query?: never;
20115
+ header?: never;
20116
+ path?: never;
20117
+ cookie?: never;
20118
+ };
20119
+ requestBody?: never;
20120
+ responses: {
20121
+ /** @description The plan has ended. */
20122
+ 200: {
20123
+ headers: {
20124
+ [name: string]: unknown;
20125
+ };
20126
+ content: {
20127
+ "application/json": components["schemas"]["SubscriptionEndResponse"];
20128
+ };
20129
+ };
20130
+ /** @description Payments are not configured. */
20131
+ 400: {
20132
+ headers: {
20133
+ [name: string]: unknown;
20134
+ };
20135
+ content: {
20136
+ "application/json": components["schemas"]["ErrorResponse"];
20137
+ };
20138
+ };
20139
+ /** @description The org has no active subscription. */
20140
+ 404: {
20141
+ headers: {
20142
+ [name: string]: unknown;
20143
+ };
20144
+ content: {
20145
+ "application/json": components["schemas"]["ErrorResponse"];
20146
+ };
20147
+ };
20148
+ /** @description The subscription is on hold (pay first), is already being ended, or can't be ended in Dodo right now. */
20149
+ 409: {
20150
+ headers: {
20151
+ [name: string]: unknown;
20152
+ };
20153
+ content: {
20154
+ "application/json": components["schemas"]["ErrorResponse"];
20155
+ };
20156
+ };
20157
+ };
20158
+ };
20159
+ getSubscriptionOffer: {
20160
+ parameters: {
20161
+ query?: never;
20162
+ header?: never;
20163
+ path?: never;
20164
+ cookie?: never;
20165
+ };
20166
+ requestBody?: never;
20167
+ responses: {
20168
+ /** @description The offer. */
20169
+ 200: {
20170
+ headers: {
20171
+ [name: string]: unknown;
20172
+ };
20173
+ content: {
20174
+ "application/json": components["schemas"]["SubscriptionOfferResponse"];
20175
+ };
20176
+ };
20177
+ };
20178
+ };
20179
+ createSubscriptionPortalSession: {
20180
+ parameters: {
20181
+ query?: never;
20182
+ header?: never;
20183
+ path?: never;
20184
+ cookie?: never;
20185
+ };
20186
+ requestBody?: never;
20187
+ responses: {
20188
+ /** @description The portal session. */
20189
+ 200: {
20190
+ headers: {
20191
+ [name: string]: unknown;
20192
+ };
20193
+ content: {
20194
+ "application/json": components["schemas"]["SubscriptionPortalResponse"];
20195
+ };
20196
+ };
20197
+ /** @description Payments are not configured. */
20198
+ 400: {
20199
+ headers: {
20200
+ [name: string]: unknown;
20201
+ };
20202
+ content: {
20203
+ "application/json": components["schemas"]["ErrorResponse"];
20204
+ };
20205
+ };
20206
+ /** @description The org has no Dodo customer. */
20207
+ 404: {
20208
+ headers: {
20209
+ [name: string]: unknown;
20210
+ };
20211
+ content: {
20212
+ "application/json": components["schemas"]["ErrorResponse"];
20213
+ };
20214
+ };
20215
+ };
20216
+ };
20217
+ setUsageLimit: {
20218
+ parameters: {
20219
+ query?: never;
20220
+ header?: never;
20221
+ path?: never;
20222
+ cookie?: never;
20223
+ };
20224
+ requestBody?: {
20225
+ content: {
20226
+ "application/json": {
20227
+ /** @description Whole dollars, in cents; null removes it. */
20228
+ cap_cents: number | null;
20229
+ };
20230
+ };
20231
+ };
20232
+ responses: {
20233
+ /** @description The updated usage limit. */
20234
+ 200: {
20235
+ headers: {
20236
+ [name: string]: unknown;
20237
+ };
20238
+ content: {
20239
+ "application/json": components["schemas"]["UsageLimitResponse"];
20240
+ };
20241
+ };
20242
+ /** @description Invalid body, or the plan doesn't support a limit. */
20243
+ 400: {
20244
+ headers: {
20245
+ [name: string]: unknown;
20246
+ };
20247
+ content: {
20248
+ "application/json": components["schemas"]["ErrorResponse"];
20249
+ };
20250
+ };
20251
+ /** @description The project has no org. */
20252
+ 404: {
20253
+ headers: {
20254
+ [name: string]: unknown;
20255
+ };
20256
+ content: {
20257
+ "application/json": components["schemas"]["ErrorResponse"];
20258
+ };
20259
+ };
20260
+ };
20261
+ };
20262
+ listUsageLimitEvents: {
20263
+ parameters: {
20264
+ query?: {
20265
+ per_page?: number;
20266
+ /** @description Return events older than this id (pagination cursor). */
20267
+ before_id?: number;
20268
+ };
20269
+ header?: never;
20270
+ path?: never;
20271
+ cookie?: never;
20272
+ };
20273
+ requestBody?: never;
20274
+ responses: {
20275
+ /** @description Usage limit events. */
20276
+ 200: {
20277
+ headers: {
20278
+ [name: string]: unknown;
20279
+ };
20280
+ content: {
20281
+ "application/json": components["schemas"]["UsageLimitEventsResponse"];
20282
+ };
20283
+ };
20284
+ /** @description Invalid query, or missing project scope. */
20285
+ 400: {
20286
+ headers: {
20287
+ [name: string]: unknown;
20288
+ };
20289
+ content: {
20290
+ "application/json": components["schemas"]["ErrorResponse"];
20291
+ };
20292
+ };
20293
+ /** @description The project has no org. */
20294
+ 404: {
20295
+ headers: {
20296
+ [name: string]: unknown;
20297
+ };
20298
+ content: {
20299
+ "application/json": components["schemas"]["ErrorResponse"];
20300
+ };
20301
+ };
20302
+ };
20303
+ };
20304
+ listChatSessions: {
20305
+ parameters: {
20306
+ query?: {
20307
+ /** @description Restrict to a single project (ignored for bound principals). */
20308
+ project_id?: number;
20309
+ /** @description Include closed sessions when `true`. */
20310
+ show_closed?: boolean | null;
20311
+ /** @description Filter sessions by preset (all, active, merged). */
20312
+ preset?: "all" | "active" | "merged";
20313
+ /** @description Page number (1-indexed). Default 1. */
20314
+ page?: number;
20315
+ /** @description Items per page. Default 10. */
20316
+ per_page?: number;
20317
+ /** @description Optional Manager sidebar category: executor sessions, or all non-manager/non-executor user-facing sessions. */
20318
+ category?: "executor" | "user";
20319
+ /** @description Comma-separated project IDs to include. */
20320
+ project_ids?: string;
20321
+ /** @description Comma-separated project IDs to exclude. */
20322
+ exclude_project_ids?: string;
20323
+ /** @description Comma-separated creator user IDs to filter by. */
20324
+ user_ids?: string;
20325
+ /** @description Only sessions updated within this many days. */
20326
+ updated_within_days?: number;
20327
+ /** @description URL-encoded JSON array of generic filter conditions. */
20328
+ filters?: string;
20329
+ };
20330
+ header?: never;
20331
+ path?: never;
20332
+ cookie?: never;
20333
+ };
20334
+ requestBody?: never;
20335
+ responses: {
20336
+ /** @description Page of chat sessions. */
20337
+ 200: {
20338
+ headers: {
20339
+ [name: string]: unknown;
20340
+ };
20341
+ content: {
20342
+ "application/json": components["schemas"]["ChatSessionListResponse"];
20343
+ };
20344
+ };
20345
+ /** @description Invalid request. */
20346
+ 400: {
20347
+ headers: {
20348
+ [name: string]: unknown;
20349
+ };
20350
+ content: {
20351
+ "application/json": components["schemas"]["ErrorResponse"];
20352
+ };
20353
+ };
20354
+ /** @description Project not found or not accessible. */
20355
+ 404: {
20356
+ headers: {
20357
+ [name: string]: unknown;
20358
+ };
20359
+ content: {
20360
+ "application/json": components["schemas"]["ErrorResponse"];
20361
+ };
20362
+ };
20363
+ };
20364
+ };
19362
20365
  createChatSession: {
19363
20366
  parameters: {
19364
20367
  query?: never;
@@ -20599,20 +21602,12 @@ export interface operations {
20599
21602
  requestBody?: {
20600
21603
  content: {
20601
21604
  "application/json": {
20602
- /** @description Event type, e.g. "payment.succeeded". */
21605
+ /** @description Event type, e.g. "subscription.active". */
20603
21606
  type: string;
20604
21607
  /** @description Event payload. */
20605
21608
  data: {
20606
- /** @description Dodo payment ID. */
20607
- payment_id?: string;
20608
- /** @description Charged amount in minor units, tax included. */
20609
- total_amount?: number;
20610
- /** @description Tax portion of total_amount in minor units. */
20611
- tax?: number;
20612
- /** @description Metadata set at checkout session creation. */
20613
- metadata?: {
20614
- [key: string]: string;
20615
- };
21609
+ /** @description Dodo subscription ID. */
21610
+ subscription_id?: string;
20616
21611
  };
20617
21612
  };
20618
21613
  };
@@ -20636,12 +21631,21 @@ export interface operations {
20636
21631
  "application/json": components["schemas"]["ErrorResponse"];
20637
21632
  };
20638
21633
  };
20639
- };
20640
- };
20641
- listEnvironmentVariables: {
20642
- parameters: {
20643
- query?: never;
20644
- header?: never;
21634
+ /** @description Dodo API credentials are not configured. */
21635
+ 500: {
21636
+ headers: {
21637
+ [name: string]: unknown;
21638
+ };
21639
+ content: {
21640
+ "application/json": components["schemas"]["ErrorResponse"];
21641
+ };
21642
+ };
21643
+ };
21644
+ };
21645
+ listEnvironmentVariables: {
21646
+ parameters: {
21647
+ query?: never;
21648
+ header?: never;
20645
21649
  path?: never;
20646
21650
  cookie?: never;
20647
21651
  };
@@ -21507,6 +22511,15 @@ export interface operations {
21507
22511
  "application/json": components["schemas"]["ErrorResponse"];
21508
22512
  };
21509
22513
  };
22514
+ /** @description Caller cannot access the organisation. */
22515
+ 403: {
22516
+ headers: {
22517
+ [name: string]: unknown;
22518
+ };
22519
+ content: {
22520
+ "application/json": components["schemas"]["ErrorResponse"];
22521
+ };
22522
+ };
21510
22523
  };
21511
22524
  };
21512
22525
  getMainInstallationMetadata: {
@@ -21928,6 +22941,15 @@ export interface operations {
21928
22941
  "application/json": components["schemas"]["ErrorResponse"];
21929
22942
  };
21930
22943
  };
22944
+ /** @description Caller cannot access the organisation. */
22945
+ 403: {
22946
+ headers: {
22947
+ [name: string]: unknown;
22948
+ };
22949
+ content: {
22950
+ "application/json": components["schemas"]["ErrorResponse"];
22951
+ };
22952
+ };
21931
22953
  };
21932
22954
  };
21933
22955
  getReporterInstallationMetadata: {
@@ -22706,6 +23728,15 @@ export interface operations {
22706
23728
  "application/json": components["schemas"]["ErrorResponse"] | components["schemas"]["InvoiceSimpleError"];
22707
23729
  };
22708
23730
  };
23731
+ /** @description The organisation is billed by Dodo. */
23732
+ 409: {
23733
+ headers: {
23734
+ [name: string]: unknown;
23735
+ };
23736
+ content: {
23737
+ "application/json": components["schemas"]["ErrorResponse"];
23738
+ };
23739
+ };
22709
23740
  };
22710
23741
  };
22711
23742
  getInvoice: {
@@ -22824,6 +23855,15 @@ export interface operations {
22824
23855
  "application/json": components["schemas"]["ErrorResponse"];
22825
23856
  };
22826
23857
  };
23858
+ /** @description The target organisation is billed by Dodo. */
23859
+ 409: {
23860
+ headers: {
23861
+ [name: string]: unknown;
23862
+ };
23863
+ content: {
23864
+ "application/json": components["schemas"]["ErrorResponse"];
23865
+ };
23866
+ };
22827
23867
  };
22828
23868
  };
22829
23869
  listInvoiceBillingLines: {
@@ -23217,28 +24257,8 @@ export interface operations {
23217
24257
  "application/json": components["schemas"]["ErrorResponse"];
23218
24258
  };
23219
24259
  };
23220
- };
23221
- };
23222
- listOrgInvoices: {
23223
- parameters: {
23224
- query?: never;
23225
- header?: never;
23226
- path?: never;
23227
- cookie?: never;
23228
- };
23229
- requestBody?: never;
23230
- responses: {
23231
- /** @description The org's invoices. */
23232
- 200: {
23233
- headers: {
23234
- [name: string]: unknown;
23235
- };
23236
- content: {
23237
- "application/json": components["schemas"]["OrgInvoiceListResponse"];
23238
- };
23239
- };
23240
- /** @description Invalid request or missing project scope. */
23241
- 400: {
24260
+ /** @description The organisation is billed by Dodo. */
24261
+ 409: {
23242
24262
  headers: {
23243
24263
  [name: string]: unknown;
23244
24264
  };
@@ -23248,32 +24268,25 @@ export interface operations {
23248
24268
  };
23249
24269
  };
23250
24270
  };
23251
- createInvoiceCheckoutSession: {
24271
+ listOrgInvoices: {
23252
24272
  parameters: {
23253
24273
  query?: never;
23254
24274
  header?: never;
23255
- path: {
23256
- /** @description Invoice ID. */
23257
- id: string;
23258
- };
24275
+ path?: never;
23259
24276
  cookie?: never;
23260
24277
  };
23261
- requestBody?: {
23262
- content: {
23263
- "application/json": components["schemas"]["CreateInvoiceCheckoutSessionRequest"];
23264
- };
23265
- };
24278
+ requestBody?: never;
23266
24279
  responses: {
23267
- /** @description The checkout session. */
24280
+ /** @description The org's invoices. */
23268
24281
  200: {
23269
24282
  headers: {
23270
24283
  [name: string]: unknown;
23271
24284
  };
23272
24285
  content: {
23273
- "application/json": components["schemas"]["InvoiceCheckoutSessionResponse"];
24286
+ "application/json": components["schemas"]["OrgInvoiceListResponse"];
23274
24287
  };
23275
24288
  };
23276
- /** @description Invalid request, unsupported currency, or Dodo not configured. */
24289
+ /** @description Invalid request or missing project scope. */
23277
24290
  400: {
23278
24291
  headers: {
23279
24292
  [name: string]: unknown;
@@ -23282,24 +24295,6 @@ export interface operations {
23282
24295
  "application/json": components["schemas"]["ErrorResponse"];
23283
24296
  };
23284
24297
  };
23285
- /** @description Invoice not found. */
23286
- 404: {
23287
- headers: {
23288
- [name: string]: unknown;
23289
- };
23290
- content: {
23291
- "application/json": components["schemas"]["ErrorResponse"];
23292
- };
23293
- };
23294
- /** @description Invoice has no outstanding amount. */
23295
- 409: {
23296
- headers: {
23297
- [name: string]: unknown;
23298
- };
23299
- content: {
23300
- "application/json": components["schemas"]["ErrorResponse"];
23301
- };
23302
- };
23303
24298
  };
23304
24299
  };
23305
24300
  downloadOrgInvoicePdf: {
@@ -23447,38 +24442,57 @@ export interface operations {
23447
24442
  };
23448
24443
  };
23449
24444
  };
23450
- downloadOrgInvoiceTaxInvoice: {
24445
+ listUpcomingInvoiceReminders: {
23451
24446
  parameters: {
23452
- query?: never;
23453
- header?: never;
23454
- path: {
23455
- /** @description Invoice ID. */
23456
- id: string;
24447
+ query?: {
24448
+ /** @description Number of upcoming days to preview. Default 7. */
24449
+ window_days?: string;
24450
+ /** @description Page number (1-indexed). Default 1. */
24451
+ page?: string;
24452
+ /** @description Items per page. Default 50. */
24453
+ per_page?: string;
23457
24454
  };
24455
+ header?: never;
24456
+ path?: never;
23458
24457
  cookie?: never;
23459
24458
  };
23460
24459
  requestBody?: never;
23461
24460
  responses: {
23462
- /** @description The tax invoice PDF. */
24461
+ /** @description Paginated upcoming invoice reminders. */
23463
24462
  200: {
23464
24463
  headers: {
23465
24464
  [name: string]: unknown;
23466
24465
  };
23467
24466
  content: {
23468
- "application/pdf": string;
24467
+ "application/json": components["schemas"]["UpcomingInvoiceRemindersResponse"];
23469
24468
  };
23470
24469
  };
23471
- /** @description Invalid invoice id or payments not configured. */
23472
- 400: {
24470
+ };
24471
+ };
24472
+ receiveJiraWebhook: {
24473
+ parameters: {
24474
+ query?: never;
24475
+ header?: never;
24476
+ path?: never;
24477
+ cookie?: never;
24478
+ };
24479
+ requestBody?: {
24480
+ content: {
24481
+ "application/json": components["schemas"]["RequestIngestionProviderPayload"];
24482
+ };
24483
+ };
24484
+ responses: {
24485
+ /** @description Webhook processed. */
24486
+ 200: {
23473
24487
  headers: {
23474
24488
  [name: string]: unknown;
23475
24489
  };
23476
24490
  content: {
23477
- "application/json": components["schemas"]["ErrorResponse"];
24491
+ "application/json": components["schemas"]["JiraWebhookResponse"];
23478
24492
  };
23479
24493
  };
23480
- /** @description Invoice or its tax invoice not found. */
23481
- 404: {
24494
+ /** @description Invalid webhook payload. */
24495
+ 400: {
23482
24496
  headers: {
23483
24497
  [name: string]: unknown;
23484
24498
  };
@@ -23486,31 +24500,13 @@ export interface operations {
23486
24500
  "application/json": components["schemas"]["ErrorResponse"];
23487
24501
  };
23488
24502
  };
23489
- };
23490
- };
23491
- listUpcomingInvoiceReminders: {
23492
- parameters: {
23493
- query?: {
23494
- /** @description Number of upcoming days to preview. Default 7. */
23495
- window_days?: string;
23496
- /** @description Page number (1-indexed). Default 1. */
23497
- page?: string;
23498
- /** @description Items per page. Default 50. */
23499
- per_page?: string;
23500
- };
23501
- header?: never;
23502
- path?: never;
23503
- cookie?: never;
23504
- };
23505
- requestBody?: never;
23506
- responses: {
23507
- /** @description Paginated upcoming invoice reminders. */
23508
- 200: {
24503
+ /** @description No matching install or project. */
24504
+ 404: {
23509
24505
  headers: {
23510
24506
  [name: string]: unknown;
23511
24507
  };
23512
24508
  content: {
23513
- "application/json": components["schemas"]["UpcomingInvoiceRemindersResponse"];
24509
+ "application/json": components["schemas"]["ErrorResponse"];
23514
24510
  };
23515
24511
  };
23516
24512
  };
@@ -23587,6 +24583,15 @@ export interface operations {
23587
24583
  "application/json": components["schemas"]["ErrorResponse"];
23588
24584
  };
23589
24585
  };
24586
+ /** @description Atlassian rejected the OAuth code. */
24587
+ 401: {
24588
+ headers: {
24589
+ [name: string]: unknown;
24590
+ };
24591
+ content: {
24592
+ "application/json": components["schemas"]["ErrorResponse"];
24593
+ };
24594
+ };
23590
24595
  /** @description Caller cannot access the organisation. */
23591
24596
  403: {
23592
24597
  headers: {
@@ -23820,6 +24825,57 @@ export interface operations {
23820
24825
  };
23821
24826
  };
23822
24827
  };
24828
+ receiveLinearWebhook: {
24829
+ parameters: {
24830
+ query?: never;
24831
+ header?: never;
24832
+ path?: never;
24833
+ cookie?: never;
24834
+ };
24835
+ requestBody?: {
24836
+ content: {
24837
+ "application/json": components["schemas"]["RequestIngestionProviderPayload"];
24838
+ };
24839
+ };
24840
+ responses: {
24841
+ /** @description Webhook accepted. */
24842
+ 200: {
24843
+ headers: {
24844
+ [name: string]: unknown;
24845
+ };
24846
+ content: {
24847
+ "application/json": components["schemas"]["LinearWebhookResponse"];
24848
+ };
24849
+ };
24850
+ /** @description Invalid webhook payload. */
24851
+ 400: {
24852
+ headers: {
24853
+ [name: string]: unknown;
24854
+ };
24855
+ content: {
24856
+ "application/json": components["schemas"]["ErrorResponse"];
24857
+ };
24858
+ };
24859
+ /** @description Invalid signature. */
24860
+ 401: {
24861
+ headers: {
24862
+ [name: string]: unknown;
24863
+ };
24864
+ content: {
24865
+ "application/json": components["schemas"]["ErrorResponse"];
24866
+ };
24867
+ };
24868
+ /** @description No matching install or project. */
24869
+ 404: {
24870
+ headers: {
24871
+ [name: string]: unknown;
24872
+ };
24873
+ content: {
24874
+ "application/json": components["schemas"]["ErrorResponse"];
24875
+ };
24876
+ };
24877
+ };
24878
+ };
23823
24879
  listLinearInstallations: {
23824
24880
  parameters: {
23825
24881
  query: {
@@ -23873,20 +24929,27 @@ export interface operations {
23873
24929
  "application/json": {
23874
24930
  /** @description Organization the installation belongs to. */
23875
24931
  org_id: number;
23876
- /** @description Linear app user (actor) id. */
23877
- linear_app_user_id: string;
23878
- /** @description Linear organization id. */
23879
- linear_organization_id: string;
23880
- /** @description OAuth access token for the Linear API. */
23881
- linear_access_token: string;
23882
- /** @description OAuth refresh token for the Linear API. */
24932
+ /** @description OAuth code from Linear's redirect. Required for a signed-in user. */
24933
+ code?: string;
24934
+ /**
24935
+ * Format: uri
24936
+ * @description Redirect URI the authorize request used; Linear requires it to match. Required with `code`.
24937
+ */
24938
+ redirect_uri?: string;
24939
+ /** @description Linear app user (actor) id. System callers only. */
24940
+ linear_app_user_id?: string;
24941
+ /** @description Linear organization id. System callers only. */
24942
+ linear_organization_id?: string;
24943
+ /** @description OAuth access token. System callers only. */
24944
+ linear_access_token?: string;
24945
+ /** @description OAuth refresh token. System callers only. */
23883
24946
  linear_refresh_token?: string;
23884
24947
  /**
23885
24948
  * Format: date-time
23886
- * @description Expiry of the access token.
24949
+ * @description Expiry of the access token. System callers only.
23887
24950
  */
23888
- linear_access_token_expires_at: string | null;
23889
- /** @description Cached Linear organization/team metadata. */
24951
+ linear_access_token_expires_at?: string | null;
24952
+ /** @description Cached Linear organization/team metadata. System callers only; built from Linear for users. */
23890
24953
  metadata?: {
23891
24954
  organization: {
23892
24955
  name: string;
@@ -23924,6 +24987,15 @@ export interface operations {
23924
24987
  "application/json": components["schemas"]["ErrorResponse"];
23925
24988
  };
23926
24989
  };
24990
+ /** @description Linear rejected the OAuth code. */
24991
+ 401: {
24992
+ headers: {
24993
+ [name: string]: unknown;
24994
+ };
24995
+ content: {
24996
+ "application/json": components["schemas"]["ErrorResponse"];
24997
+ };
24998
+ };
23927
24999
  /** @description Forbidden. */
23928
25000
  403: {
23929
25001
  headers: {
@@ -24495,26 +25567,36 @@ export interface operations {
24495
25567
  };
24496
25568
  };
24497
25569
  };
24498
- completeOnboarding: {
25570
+ getOAuthAuthorizeUrl: {
24499
25571
  parameters: {
24500
- query?: never;
25572
+ query: {
25573
+ /** @description OAuth provider. */
25574
+ provider: "slack" | "linear" | "jira" | "github";
25575
+ /** @description The dashboard callback the provider returns to. */
25576
+ redirect_uri: string;
25577
+ /** @description CSRF state, echoed back to the callback. */
25578
+ state: string;
25579
+ /** @description Slack only: pins the install to a workspace, so re-auth updates it instead of showing a picker. */
25580
+ team?: string;
25581
+ };
24501
25582
  header?: never;
24502
25583
  path?: never;
24503
25584
  cookie?: never;
24504
25585
  };
24505
- requestBody?: {
24506
- content: {
24507
- "application/json": components["schemas"]["OnboardingCompleteRequest"];
24508
- };
24509
- };
25586
+ requestBody?: never;
24510
25587
  responses: {
24511
- /** @description Created org and project. */
25588
+ /** @description The authorize URL. */
24512
25589
  200: {
24513
25590
  headers: {
24514
25591
  [name: string]: unknown;
24515
25592
  };
24516
25593
  content: {
24517
- "application/json": components["schemas"]["OnboardingCompleteResponse"];
25594
+ "application/json": {
25595
+ data: {
25596
+ /** @description The provider's authorize URL. */
25597
+ url: string;
25598
+ };
25599
+ };
24518
25600
  };
24519
25601
  };
24520
25602
  /** @description Invalid request. */
@@ -24526,8 +25608,8 @@ export interface operations {
24526
25608
  "application/json": components["schemas"]["ErrorResponse"];
24527
25609
  };
24528
25610
  };
24529
- /** @description Caller is not a member of the given organisation. */
24530
- 403: {
25611
+ /** @description The provider's client ID is not configured. */
25612
+ 500: {
24531
25613
  headers: {
24532
25614
  [name: string]: unknown;
24533
25615
  };
@@ -24537,15 +25619,57 @@ export interface operations {
24537
25619
  };
24538
25620
  };
24539
25621
  };
24540
- getOnboardingContext: {
25622
+ completeOnboarding: {
24541
25623
  parameters: {
24542
25624
  query?: never;
24543
25625
  header?: never;
24544
25626
  path?: never;
24545
25627
  cookie?: never;
24546
25628
  };
24547
- requestBody?: never;
24548
- responses: {
25629
+ requestBody?: {
25630
+ content: {
25631
+ "application/json": components["schemas"]["OnboardingCompleteRequest"];
25632
+ };
25633
+ };
25634
+ responses: {
25635
+ /** @description Created org and project. */
25636
+ 200: {
25637
+ headers: {
25638
+ [name: string]: unknown;
25639
+ };
25640
+ content: {
25641
+ "application/json": components["schemas"]["OnboardingCompleteResponse"];
25642
+ };
25643
+ };
25644
+ /** @description Invalid request. */
25645
+ 400: {
25646
+ headers: {
25647
+ [name: string]: unknown;
25648
+ };
25649
+ content: {
25650
+ "application/json": components["schemas"]["ErrorResponse"];
25651
+ };
25652
+ };
25653
+ /** @description Caller is not a member of the given organisation. */
25654
+ 403: {
25655
+ headers: {
25656
+ [name: string]: unknown;
25657
+ };
25658
+ content: {
25659
+ "application/json": components["schemas"]["ErrorResponse"];
25660
+ };
25661
+ };
25662
+ };
25663
+ };
25664
+ getOnboardingContext: {
25665
+ parameters: {
25666
+ query?: never;
25667
+ header?: never;
25668
+ path?: never;
25669
+ cookie?: never;
25670
+ };
25671
+ requestBody?: never;
25672
+ responses: {
24549
25673
  /** @description Onboarding context. */
24550
25674
  200: {
24551
25675
  headers: {
@@ -25159,6 +26283,15 @@ export interface operations {
25159
26283
  "application/json": components["schemas"]["ErrorResponse"];
25160
26284
  };
25161
26285
  };
26286
+ /** @description The user's email is not confirmed. */
26287
+ 403: {
26288
+ headers: {
26289
+ [name: string]: unknown;
26290
+ };
26291
+ content: {
26292
+ "application/json": components["schemas"]["ErrorResponse"];
26293
+ };
26294
+ };
25162
26295
  };
25163
26296
  };
25164
26297
  listPlanAssignments: {
@@ -25323,6 +26456,8 @@ export interface operations {
25323
26456
  query?: {
25324
26457
  /** @description Usage month (YYYY-MM, UTC). Returns the plan in effect at the end of that month, or now for the current month. Defaults to now. */
25325
26458
  month?: string;
26459
+ /** @description Usage period key (YYYY-MM-DD, from `/api/billing/periods`). Returns the plan in effect at the end of that period, or now for the current period. */
26460
+ period?: string;
25326
26461
  };
25327
26462
  header?: never;
25328
26463
  path?: never;
@@ -25339,7 +26474,7 @@ export interface operations {
25339
26474
  "application/json": components["schemas"]["OrgPlanResponse"];
25340
26475
  };
25341
26476
  };
25342
- /** @description Invalid month, or missing project scope. */
26477
+ /** @description Invalid month or period, or missing project scope. */
25343
26478
  400: {
25344
26479
  headers: {
25345
26480
  [name: string]: unknown;
@@ -25404,7 +26539,7 @@ export interface operations {
25404
26539
  "application/json": components["schemas"]["ErrorResponse"];
25405
26540
  };
25406
26541
  };
25407
- /** @description A plan with this key already exists. */
26542
+ /** @description A plan with this key or Dodo product already exists. */
25408
26543
  409: {
25409
26544
  headers: {
25410
26545
  [name: string]: unknown;
@@ -27401,52 +28536,112 @@ export interface operations {
27401
28536
  };
27402
28537
  };
27403
28538
  };
27404
- listRunnerBackends: {
28539
+ claimRunnerBackend: {
27405
28540
  parameters: {
27406
- query?: {
27407
- /** @description Only this organisation's backends. */
27408
- org_id?: number | null;
27409
- };
28541
+ query?: never;
27410
28542
  header?: never;
27411
28543
  path?: never;
27412
28544
  cookie?: never;
27413
28545
  };
27414
- requestBody?: never;
28546
+ requestBody?: {
28547
+ content: {
28548
+ "application/json": components["schemas"]["ClaimRunnerBackendBody"];
28549
+ };
28550
+ };
27415
28551
  responses: {
27416
- /** @description The runner backends. */
28552
+ /** @description The backend after the call. */
27417
28553
  200: {
27418
28554
  headers: {
27419
28555
  [name: string]: unknown;
27420
28556
  };
27421
28557
  content: {
27422
- "application/json": components["schemas"]["RunnerBackendListResponse"];
28558
+ "application/json": components["schemas"]["ClaimRunnerBackendResponse"];
28559
+ };
28560
+ };
28561
+ /** @description The stack's resources are not where Empirical expects. */
28562
+ 400: {
28563
+ headers: {
28564
+ [name: string]: unknown;
28565
+ };
28566
+ content: {
28567
+ "application/json": components["schemas"]["ErrorResponse"];
28568
+ };
28569
+ };
28570
+ /** @description The stack is in a different account or region than the registration. */
28571
+ 403: {
28572
+ headers: {
28573
+ [name: string]: unknown;
28574
+ };
28575
+ content: {
28576
+ "application/json": components["schemas"]["ErrorResponse"];
28577
+ };
28578
+ };
28579
+ /** @description Unknown registration token. */
28580
+ 404: {
28581
+ headers: {
28582
+ [name: string]: unknown;
28583
+ };
28584
+ content: {
28585
+ "application/json": components["schemas"]["ErrorResponse"];
28586
+ };
28587
+ };
28588
+ /** @description The registration was claimed by another stack. */
28589
+ 409: {
28590
+ headers: {
28591
+ [name: string]: unknown;
28592
+ };
28593
+ content: {
28594
+ "application/json": components["schemas"]["ErrorResponse"];
28595
+ };
28596
+ };
28597
+ /** @description The registration link expired. */
28598
+ 410: {
28599
+ headers: {
28600
+ [name: string]: unknown;
28601
+ };
28602
+ content: {
28603
+ "application/json": components["schemas"]["ErrorResponse"];
28604
+ };
28605
+ };
28606
+ /** @description Empirical assumed the role but a check failed. */
28607
+ 422: {
28608
+ headers: {
28609
+ [name: string]: unknown;
28610
+ };
28611
+ content: {
28612
+ "application/json": components["schemas"]["ErrorResponse"];
28613
+ };
28614
+ };
28615
+ /** @description Empirical cannot assume the role yet; retry. */
28616
+ 503: {
28617
+ headers: {
28618
+ [name: string]: unknown;
28619
+ };
28620
+ content: {
28621
+ "application/json": components["schemas"]["ErrorResponse"];
27423
28622
  };
27424
28623
  };
27425
28624
  };
27426
28625
  };
27427
- createRunnerBackend: {
28626
+ getProjectRunnerBackend: {
27428
28627
  parameters: {
27429
28628
  query?: never;
27430
28629
  header?: never;
27431
28630
  path?: never;
27432
28631
  cookie?: never;
27433
28632
  };
27434
- requestBody?: {
27435
- content: {
27436
- "application/json": components["schemas"]["CreateRunnerBackendBody"];
27437
- };
27438
- };
28633
+ requestBody?: never;
27439
28634
  responses: {
27440
- /** @description The registered backend. */
28635
+ /** @description The project's runner backend, or null. */
27441
28636
  200: {
27442
28637
  headers: {
27443
28638
  [name: string]: unknown;
27444
28639
  };
27445
28640
  content: {
27446
- "application/json": components["schemas"]["RunnerBackendResponse"];
28641
+ "application/json": components["schemas"]["ProjectRunnerBackendDetailResponse"];
27447
28642
  };
27448
28643
  };
27449
- /** @description Invalid registration. */
28644
+ /** @description Missing or invalid project scope. */
27450
28645
  400: {
27451
28646
  headers: {
27452
28647
  [name: string]: unknown;
@@ -27455,21 +28650,75 @@ export interface operations {
27455
28650
  "application/json": components["schemas"]["ErrorResponse"];
27456
28651
  };
27457
28652
  };
28653
+ /** @description Project not found or not accessible. */
28654
+ 404: {
28655
+ headers: {
28656
+ [name: string]: unknown;
28657
+ };
28658
+ content: {
28659
+ "application/json": components["schemas"]["ErrorResponse"];
28660
+ };
28661
+ };
27458
28662
  };
27459
28663
  };
27460
- getRunnerBackend: {
28664
+ removeProjectRunnerBackend: {
27461
28665
  parameters: {
27462
28666
  query?: never;
27463
28667
  header?: never;
27464
28668
  path: {
27465
- /** @description Runner backend ID. */
28669
+ /** @description A runner backend of the project's organisation. */
27466
28670
  id: number | null;
27467
28671
  };
27468
28672
  cookie?: never;
27469
28673
  };
27470
28674
  requestBody?: never;
27471
28675
  responses: {
27472
- /** @description The runner backend. */
28676
+ /** @description The runner was removed. */
28677
+ 200: {
28678
+ headers: {
28679
+ [name: string]: unknown;
28680
+ };
28681
+ content: {
28682
+ "application/json": components["schemas"]["RemoveRunnerBackendResponse"];
28683
+ };
28684
+ };
28685
+ /** @description Runner backend not found in this organisation. */
28686
+ 404: {
28687
+ headers: {
28688
+ [name: string]: unknown;
28689
+ };
28690
+ content: {
28691
+ "application/json": components["schemas"]["ErrorResponse"];
28692
+ };
28693
+ };
28694
+ /** @description The runner is active or still used by a project. */
28695
+ 409: {
28696
+ headers: {
28697
+ [name: string]: unknown;
28698
+ };
28699
+ content: {
28700
+ "application/json": components["schemas"]["ErrorResponse"];
28701
+ };
28702
+ };
28703
+ };
28704
+ };
28705
+ renameProjectRunnerBackend: {
28706
+ parameters: {
28707
+ query?: never;
28708
+ header?: never;
28709
+ path: {
28710
+ /** @description A runner backend of the project's organisation. */
28711
+ id: number | null;
28712
+ };
28713
+ cookie?: never;
28714
+ };
28715
+ requestBody?: {
28716
+ content: {
28717
+ "application/json": components["schemas"]["RenameRunnerBackendBody"];
28718
+ };
28719
+ };
28720
+ responses: {
28721
+ /** @description The renamed runner. */
27473
28722
  200: {
27474
28723
  headers: {
27475
28724
  [name: string]: unknown;
@@ -27478,7 +28727,7 @@ export interface operations {
27478
28727
  "application/json": components["schemas"]["RunnerBackendResponse"];
27479
28728
  };
27480
28729
  };
27481
- /** @description Runner backend not found. */
28730
+ /** @description Runner backend not found in this organisation. */
27482
28731
  404: {
27483
28732
  headers: {
27484
28733
  [name: string]: unknown;
@@ -27489,12 +28738,12 @@ export interface operations {
27489
28738
  };
27490
28739
  };
27491
28740
  };
27492
- disableRunnerBackend: {
28741
+ disconnectProjectRunnerBackend: {
27493
28742
  parameters: {
27494
28743
  query?: never;
27495
28744
  header?: never;
27496
28745
  path: {
27497
- /** @description Runner backend ID. */
28746
+ /** @description A runner backend of the project's organisation. */
27498
28747
  id: number | null;
27499
28748
  };
27500
28749
  cookie?: never;
@@ -27507,10 +28756,10 @@ export interface operations {
27507
28756
  [name: string]: unknown;
27508
28757
  };
27509
28758
  content: {
27510
- "application/json": components["schemas"]["RunnerBackendResponse"];
28759
+ "application/json": components["schemas"]["DisconnectRunnerBackendResponse"];
27511
28760
  };
27512
28761
  };
27513
- /** @description Runner backend not found. */
28762
+ /** @description Runner backend not found in this organisation. */
27514
28763
  404: {
27515
28764
  headers: {
27516
28765
  [name: string]: unknown;
@@ -27521,12 +28770,12 @@ export interface operations {
27521
28770
  };
27522
28771
  };
27523
28772
  };
27524
- verifyRunnerBackend: {
28773
+ enableProjectRunnerBackend: {
27525
28774
  parameters: {
27526
28775
  query?: never;
27527
28776
  header?: never;
27528
28777
  path: {
27529
- /** @description Runner backend ID. */
28778
+ /** @description A runner backend of the project's organisation. */
27530
28779
  id: number | null;
27531
28780
  };
27532
28781
  cookie?: never;
@@ -27542,7 +28791,7 @@ export interface operations {
27542
28791
  "application/json": components["schemas"]["RunnerBackendVerifyResponse"];
27543
28792
  };
27544
28793
  };
27545
- /** @description Runner backend not found. */
28794
+ /** @description Runner backend not found in this organisation. */
27546
28795
  404: {
27547
28796
  headers: {
27548
28797
  [name: string]: unknown;
@@ -27551,27 +28800,39 @@ export interface operations {
27551
28800
  "application/json": components["schemas"]["ErrorResponse"];
27552
28801
  };
27553
28802
  };
28803
+ /** @description The backend is not disabled, or its stack was deleted. */
28804
+ 409: {
28805
+ headers: {
28806
+ [name: string]: unknown;
28807
+ };
28808
+ content: {
28809
+ "application/json": components["schemas"]["ErrorResponse"];
28810
+ };
28811
+ };
27554
28812
  };
27555
28813
  };
27556
- getProjectRunnerBackend: {
28814
+ createProjectRunnerBackendRegistration: {
27557
28815
  parameters: {
27558
28816
  query?: never;
27559
28817
  header?: never;
27560
- path?: never;
28818
+ path: {
28819
+ /** @description A runner backend of the project's organisation. */
28820
+ id: number | null;
28821
+ };
27561
28822
  cookie?: never;
27562
28823
  };
27563
28824
  requestBody?: never;
27564
28825
  responses: {
27565
- /** @description The project's runner backend, or null. */
28826
+ /** @description The registration link. */
27566
28827
  200: {
27567
28828
  headers: {
27568
28829
  [name: string]: unknown;
27569
28830
  };
27570
28831
  content: {
27571
- "application/json": components["schemas"]["ProjectRunnerBackendDetailResponse"];
28832
+ "application/json": components["schemas"]["RunnerBackendRegistrationResponse"];
27572
28833
  };
27573
28834
  };
27574
- /** @description Missing or invalid project scope. */
28835
+ /** @description The backend's region has no published template. */
27575
28836
  400: {
27576
28837
  headers: {
27577
28838
  [name: string]: unknown;
@@ -27580,7 +28841,7 @@ export interface operations {
27580
28841
  "application/json": components["schemas"]["ErrorResponse"];
27581
28842
  };
27582
28843
  };
27583
- /** @description Project not found or not accessible. */
28844
+ /** @description Runner backend not found in this organisation. */
27584
28845
  404: {
27585
28846
  headers: {
27586
28847
  [name: string]: unknown;
@@ -27589,9 +28850,27 @@ export interface operations {
27589
28850
  "application/json": components["schemas"]["ErrorResponse"];
27590
28851
  };
27591
28852
  };
28853
+ /** @description The backend is no longer pending. */
28854
+ 409: {
28855
+ headers: {
28856
+ [name: string]: unknown;
28857
+ };
28858
+ content: {
28859
+ "application/json": components["schemas"]["ErrorResponse"];
28860
+ };
28861
+ };
28862
+ /** @description The published template could not be read. */
28863
+ 502: {
28864
+ headers: {
28865
+ [name: string]: unknown;
28866
+ };
28867
+ content: {
28868
+ "application/json": components["schemas"]["ErrorResponse"];
28869
+ };
28870
+ };
27592
28871
  };
27593
28872
  };
27594
- verifyProjectRunnerBackend: {
28873
+ listProjectOrgRunnerBackends: {
27595
28874
  parameters: {
27596
28875
  query?: never;
27597
28876
  header?: never;
@@ -27600,13 +28879,13 @@ export interface operations {
27600
28879
  };
27601
28880
  requestBody?: never;
27602
28881
  responses: {
27603
- /** @description Every check, and the backend after them. */
28882
+ /** @description The runner backends. */
27604
28883
  200: {
27605
28884
  headers: {
27606
28885
  [name: string]: unknown;
27607
28886
  };
27608
28887
  content: {
27609
- "application/json": components["schemas"]["RunnerBackendVerifyResponse"];
28888
+ "application/json": components["schemas"]["OrgRunnerBackendListResponse"];
27610
28889
  };
27611
28890
  };
27612
28891
  /** @description Missing or invalid project scope. */
@@ -27618,8 +28897,32 @@ export interface operations {
27618
28897
  "application/json": components["schemas"]["ErrorResponse"];
27619
28898
  };
27620
28899
  };
27621
- /** @description Project not found, or it runs on Empirical-hosted. */
27622
- 404: {
28900
+ };
28901
+ };
28902
+ setScopedProjectRunnerBackend: {
28903
+ parameters: {
28904
+ query?: never;
28905
+ header?: never;
28906
+ path?: never;
28907
+ cookie?: never;
28908
+ };
28909
+ requestBody?: {
28910
+ content: {
28911
+ "application/json": components["schemas"]["SetProjectRunnerBackendBody"];
28912
+ };
28913
+ };
28914
+ responses: {
28915
+ /** @description The project's backend. */
28916
+ 200: {
28917
+ headers: {
28918
+ [name: string]: unknown;
28919
+ };
28920
+ content: {
28921
+ "application/json": components["schemas"]["ProjectRunnerBackendResponse"];
28922
+ };
28923
+ };
28924
+ /** @description The backend is not active. */
28925
+ 400: {
27623
28926
  headers: {
27624
28927
  [name: string]: unknown;
27625
28928
  };
@@ -27627,8 +28930,8 @@ export interface operations {
27627
28930
  "application/json": components["schemas"]["ErrorResponse"];
27628
28931
  };
27629
28932
  };
27630
- /** @description The runner backend is disabled. */
27631
- 409: {
28933
+ /** @description Runner backend not found in this organisation. */
28934
+ 404: {
27632
28935
  headers: {
27633
28936
  [name: string]: unknown;
27634
28937
  };
@@ -27638,32 +28941,29 @@ export interface operations {
27638
28941
  };
27639
28942
  };
27640
28943
  };
27641
- setProjectRunnerBackend: {
28944
+ setupProjectRunnerBackend: {
27642
28945
  parameters: {
27643
28946
  query?: never;
27644
28947
  header?: never;
27645
- path: {
27646
- /** @description Project ID. */
27647
- project_id: number | null;
27648
- };
28948
+ path?: never;
27649
28949
  cookie?: never;
27650
28950
  };
27651
28951
  requestBody?: {
27652
28952
  content: {
27653
- "application/json": components["schemas"]["SetProjectRunnerBackendBody"];
28953
+ "application/json": components["schemas"]["SetupRunnerBackendBody"];
27654
28954
  };
27655
28955
  };
27656
28956
  responses: {
27657
- /** @description The project's backend. */
28957
+ /** @description The backend and its link. */
27658
28958
  200: {
27659
28959
  headers: {
27660
28960
  [name: string]: unknown;
27661
28961
  };
27662
28962
  content: {
27663
- "application/json": components["schemas"]["ProjectRunnerBackendResponse"];
28963
+ "application/json": components["schemas"]["SetupRunnerBackendResponse"];
27664
28964
  };
27665
28965
  };
27666
- /** @description The backend belongs to another org or is not active. */
28966
+ /** @description The region has no published template. */
27667
28967
  400: {
27668
28968
  headers: {
27669
28969
  [name: string]: unknown;
@@ -27672,7 +28972,54 @@ export interface operations {
27672
28972
  "application/json": components["schemas"]["ErrorResponse"];
27673
28973
  };
27674
28974
  };
27675
- /** @description Project or runner backend not found. */
28975
+ /** @description A runner is already connected in that account and region, or a disconnected one's stack still exists. */
28976
+ 409: {
28977
+ headers: {
28978
+ [name: string]: unknown;
28979
+ };
28980
+ content: {
28981
+ "application/json": components["schemas"]["ErrorResponse"];
28982
+ };
28983
+ };
28984
+ /** @description The published template could not be read. */
28985
+ 502: {
28986
+ headers: {
28987
+ [name: string]: unknown;
28988
+ };
28989
+ content: {
28990
+ "application/json": components["schemas"]["ErrorResponse"];
28991
+ };
28992
+ };
28993
+ };
28994
+ };
28995
+ verifyProjectRunnerBackend: {
28996
+ parameters: {
28997
+ query?: never;
28998
+ header?: never;
28999
+ path?: never;
29000
+ cookie?: never;
29001
+ };
29002
+ requestBody?: never;
29003
+ responses: {
29004
+ /** @description Every check, and the backend after them. */
29005
+ 200: {
29006
+ headers: {
29007
+ [name: string]: unknown;
29008
+ };
29009
+ content: {
29010
+ "application/json": components["schemas"]["RunnerBackendVerifyResponse"];
29011
+ };
29012
+ };
29013
+ /** @description Missing or invalid project scope. */
29014
+ 400: {
29015
+ headers: {
29016
+ [name: string]: unknown;
29017
+ };
29018
+ content: {
29019
+ "application/json": components["schemas"]["ErrorResponse"];
29020
+ };
29021
+ };
29022
+ /** @description Project not found, or it runs on Empirical-hosted. */
27676
29023
  404: {
27677
29024
  headers: {
27678
29025
  [name: string]: unknown;
@@ -27681,6 +29028,15 @@ export interface operations {
27681
29028
  "application/json": components["schemas"]["ErrorResponse"];
27682
29029
  };
27683
29030
  };
29031
+ /** @description The runner backend is disabled. */
29032
+ 409: {
29033
+ headers: {
29034
+ [name: string]: unknown;
29035
+ };
29036
+ content: {
29037
+ "application/json": components["schemas"]["ErrorResponse"];
29038
+ };
29039
+ };
27684
29040
  };
27685
29041
  };
27686
29042
  listSandboxSnapshots: {
@@ -28406,12 +29762,14 @@ export interface operations {
28406
29762
  requestBody?: {
28407
29763
  content: {
28408
29764
  "application/json": {
28409
- /** @description User ID to link the GitHub account to. */
28410
- user_id: string;
28411
- /** @description GitHub numeric user ID. */
28412
- github_user_id: string;
28413
- /** @description GitHub login/username. */
28414
- github_username: string;
29765
+ /** @description OAuth code from GitHub's redirect to the reporter app callback. Required for a signed-in user, whose account is linked to the GitHub user who authorized it. */
29766
+ code?: string;
29767
+ /** @description User ID to link the GitHub account to. System callers only. */
29768
+ user_id?: string;
29769
+ /** @description GitHub numeric user ID. System callers only. */
29770
+ github_user_id?: string;
29771
+ /** @description GitHub login/username. System callers only. */
29772
+ github_username?: string;
28415
29773
  /** @description GitHub display name. */
28416
29774
  github_display_name?: string | null;
28417
29775
  /** @description GitHub avatar URL. */
@@ -28440,6 +29798,15 @@ export interface operations {
28440
29798
  "application/json": components["schemas"]["ErrorResponse"];
28441
29799
  };
28442
29800
  };
29801
+ /** @description GitHub rejected the OAuth code. */
29802
+ 401: {
29803
+ headers: {
29804
+ [name: string]: unknown;
29805
+ };
29806
+ content: {
29807
+ "application/json": components["schemas"]["ErrorResponse"];
29808
+ };
29809
+ };
28443
29810
  };
28444
29811
  };
28445
29812
  deleteMyGithubLink: {