@vibexp/api-client 0.96.0 → 0.98.0

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.
package/dist/schema.d.ts CHANGED
@@ -189,6 +189,60 @@ export interface paths {
189
189
  patch?: never;
190
190
  trace?: never;
191
191
  };
192
+ "/api/v1/setup/status": {
193
+ parameters: {
194
+ query?: never;
195
+ header?: never;
196
+ path?: never;
197
+ cookie?: never;
198
+ };
199
+ /**
200
+ * Report whether the instance needs authentication setup
201
+ * @description Returns whether this instance is in authentication setup mode, so the web
202
+ * app can route to the setup page instead of a login screen that has no
203
+ * provider to offer. Public, and deliberately a single boolean: it reveals
204
+ * nothing else about the instance's configuration.
205
+ */
206
+ get: operations["getSetupStatus"];
207
+ put?: never;
208
+ post?: never;
209
+ delete?: never;
210
+ options?: never;
211
+ head?: never;
212
+ patch?: never;
213
+ trace?: never;
214
+ };
215
+ "/api/v1/setup/session": {
216
+ parameters: {
217
+ query?: never;
218
+ header?: never;
219
+ path?: never;
220
+ cookie?: never;
221
+ };
222
+ get?: never;
223
+ put?: never;
224
+ /**
225
+ * Exchange the setup token for a setup session
226
+ * @description Exchanges the one-time setup token (from the `SETUP URL` the server logs
227
+ * at boot while no sign-in provider is enabled) for a short-lived setup
228
+ * session, delivered as the `vibexp_setup` cookie.
229
+ *
230
+ * The setup session is **userless**: it is not a user session and signs
231
+ * nobody in. It authorizes only the instance authentication settings; every
232
+ * other endpoint treats the caller as anonymous. It ends after one hour,
233
+ * or as soon as a root instance admin signs in through a provider.
234
+ *
235
+ * Every rejected token — unknown, expired or already consumed — returns the
236
+ * same 401. Outside setup mode the endpoint returns 404. Rate-limited per
237
+ * client IP.
238
+ */
239
+ post: operations["createSetupSession"];
240
+ delete?: never;
241
+ options?: never;
242
+ head?: never;
243
+ patch?: never;
244
+ trace?: never;
245
+ };
192
246
  "/api/v1/api-keys": {
193
247
  parameters: {
194
248
  query?: never;
@@ -3751,6 +3805,246 @@ export interface paths {
3751
3805
  patch?: never;
3752
3806
  trace?: never;
3753
3807
  };
3808
+ "/api/v1/admin/settings/auth/providers": {
3809
+ parameters: {
3810
+ query?: never;
3811
+ header?: never;
3812
+ path?: never;
3813
+ cookie?: never;
3814
+ };
3815
+ /**
3816
+ * List the sign-in identity providers
3817
+ * @description Returns every stored sign-in identity provider in sign-in page order, each
3818
+ * with its health on the replica serving the request, whether a client secret
3819
+ * is stored (`has_client_secret`; the secret itself is never returned) and the
3820
+ * derived `redirect_uri` to register with the identity provider, together with
3821
+ * the authentication settings `version`. Reading the list resolves the enabled
3822
+ * providers first, so `health` reflects their current configuration.
3823
+ * Instance admin or a first-run setup session; every other request receives 404.
3824
+ */
3825
+ get: operations["listAdminAuthProviders"];
3826
+ put?: never;
3827
+ /**
3828
+ * Create a sign-in identity provider
3829
+ * @description Validates and stores a new provider, taking effect on the next sign-in with
3830
+ * no restart, and appends one entry (`action: upsert`) to the `auth_providers`
3831
+ * audit log in the same transaction. The client secret is stored encrypted and
3832
+ * never returned. A body carrying an unknown field is rejected with 400.
3833
+ * Instance admin or a first-run setup session; every other request receives 404.
3834
+ */
3835
+ post: operations["createAdminAuthProvider"];
3836
+ delete?: never;
3837
+ options?: never;
3838
+ head?: never;
3839
+ patch?: never;
3840
+ trace?: never;
3841
+ };
3842
+ "/api/v1/admin/settings/auth/providers/test": {
3843
+ parameters: {
3844
+ query?: never;
3845
+ header?: never;
3846
+ path?: never;
3847
+ cookie?: never;
3848
+ };
3849
+ get?: never;
3850
+ put?: never;
3851
+ /**
3852
+ * Test a sign-in identity provider
3853
+ * @description Checks a stored provider (`id`), an unsaved candidate, or a stored provider
3854
+ * with some fields replaced (see `AdminAuthProviderTestRequest`): OIDC
3855
+ * discovery for `oidc` and `google`, a credential check against GitHub for
3856
+ * `github`. Nothing is stored and nothing is audited. A failed test is still a
3857
+ * 200, reported with `is_valid: false`.
3858
+ * Instance admin or a first-run setup session; every other request receives 404.
3859
+ */
3860
+ post: operations["testAdminAuthProvider"];
3861
+ delete?: never;
3862
+ options?: never;
3863
+ head?: never;
3864
+ patch?: never;
3865
+ trace?: never;
3866
+ };
3867
+ "/api/v1/admin/settings/auth/providers/{id}": {
3868
+ parameters: {
3869
+ query?: never;
3870
+ header?: never;
3871
+ path?: never;
3872
+ cookie?: never;
3873
+ };
3874
+ get?: never;
3875
+ /**
3876
+ * Replace a sign-in identity provider
3877
+ * @description Validates and stores a whole replacement of the provider's editable fields
3878
+ * (`type` and `slug` are immutable), taking effect on the next sign-in, and
3879
+ * appends one entry (`action: upsert`) to the `auth_providers` audit log in the
3880
+ * same transaction. Omitting `client_secret` keeps the stored one.
3881
+ *
3882
+ * Lockout guard: a change that disables the last enabled provider, or the
3883
+ * provider the calling admin's session was issued by, is rejected with 409
3884
+ * `lockout_risk` (the problem's `metadata.reason` is `no_enabled_provider` or
3885
+ * `own_provider`) unless the body sets `confirm_lockout_risk: true`.
3886
+ * Instance admin or a first-run setup session; every other request receives 404.
3887
+ */
3888
+ put: operations["updateAdminAuthProvider"];
3889
+ post?: never;
3890
+ /**
3891
+ * Delete a sign-in identity provider
3892
+ * @description Removes the provider, taking effect on the next sign-in, and appends one
3893
+ * entry (`action: delete`) to the `auth_providers` audit log in the same
3894
+ * transaction.
3895
+ *
3896
+ * Lockout guard: deleting the last enabled provider, or the provider the
3897
+ * calling admin's session was issued by, is rejected with 409 `lockout_risk`
3898
+ * unless `confirm_lockout_risk=true` is passed.
3899
+ * Instance admin or a first-run setup session; every other request receives 404.
3900
+ */
3901
+ delete: operations["deleteAdminAuthProvider"];
3902
+ options?: never;
3903
+ head?: never;
3904
+ patch?: never;
3905
+ trace?: never;
3906
+ };
3907
+ "/api/v1/admin/settings/auth/allowlist": {
3908
+ parameters: {
3909
+ query?: never;
3910
+ header?: never;
3911
+ path?: never;
3912
+ cookie?: never;
3913
+ };
3914
+ /**
3915
+ * Get the sign-in access allowlist
3916
+ * @description Returns the stored access allowlist. Always 200: with nothing stored both
3917
+ * lists are empty, `active` is false and `version` is null.
3918
+ * Instance admin or a first-run setup session; every other request receives 404.
3919
+ */
3920
+ get: operations["getAdminAuthAllowlist"];
3921
+ /**
3922
+ * Replace the sign-in access allowlist
3923
+ * @description Validates, normalizes and stores a whole replacement of the access
3924
+ * allowlist, enforced on signed-in users within seconds with no restart, and
3925
+ * appends one entry (`action: upsert`) to the `auth_allowlist` audit log in the
3926
+ * same transaction. Use the preview operation first to see who would be
3927
+ * affected. A body that omits a list, sends one as null, or carries an unknown
3928
+ * field is rejected with 400.
3929
+ * Instance admin or a first-run setup session; every other request receives 404.
3930
+ */
3931
+ put: operations["updateAdminAuthAllowlist"];
3932
+ post?: never;
3933
+ /**
3934
+ * Reset the sign-in access allowlist to open access
3935
+ * @description Removes the stored allowlist, so every user may sign in, and appends one
3936
+ * entry (`action: delete`) to the `auth_allowlist` audit log. Idempotent and
3937
+ * unconditional: with nothing stored it is still a 204 and writes no audit
3938
+ * entry.
3939
+ * Instance admin or a first-run setup session; every other request receives 404.
3940
+ */
3941
+ delete: operations["resetAdminAuthAllowlist"];
3942
+ options?: never;
3943
+ head?: never;
3944
+ patch?: never;
3945
+ trace?: never;
3946
+ };
3947
+ "/api/v1/admin/settings/auth/allowlist/preview": {
3948
+ parameters: {
3949
+ query?: never;
3950
+ header?: never;
3951
+ path?: never;
3952
+ cookie?: never;
3953
+ };
3954
+ get?: never;
3955
+ put?: never;
3956
+ /**
3957
+ * Preview the impact of a candidate access allowlist
3958
+ * @description Reports the active users who would stop matching if the candidate replaced
3959
+ * the stored allowlist: their count and a capped sample of their emails.
3960
+ * Nothing is stored and nothing is audited.
3961
+ * Instance admin or a first-run setup session; every other request receives 404.
3962
+ */
3963
+ post: operations["previewAdminAuthAllowlist"];
3964
+ delete?: never;
3965
+ options?: never;
3966
+ head?: never;
3967
+ patch?: never;
3968
+ trace?: never;
3969
+ };
3970
+ "/api/v1/admin/settings/auth/admins": {
3971
+ parameters: {
3972
+ query?: never;
3973
+ header?: never;
3974
+ path?: never;
3975
+ cookie?: never;
3976
+ };
3977
+ /**
3978
+ * List the instance admins
3979
+ * @description Returns the root admins (the emails named in config.yaml's
3980
+ * `auth.instance_admins`, read-only) and the admins granted in the database.
3981
+ * Instance-admin only (a setup session is not admitted); non-admin and unauthenticated requests receive 404.
3982
+ */
3983
+ get: operations["listAdminInstanceAdmins"];
3984
+ put?: never;
3985
+ /**
3986
+ * Grant instance admin to an existing user
3987
+ * @description Makes an existing, active user an instance admin, named by `user_id` or
3988
+ * `email`, and appends one entry to the `instance_admins` audit log.
3989
+ * Idempotent: granting a user who already holds a grant returns it unchanged
3990
+ * and audits nothing. Only a ROOT admin may grant: a database-granted admin
3991
+ * receives 403.
3992
+ * Instance-admin only (a setup session is not admitted); non-admin and unauthenticated requests receive 404.
3993
+ */
3994
+ post: operations["grantAdminInstanceAdmin"];
3995
+ delete?: never;
3996
+ options?: never;
3997
+ head?: never;
3998
+ patch?: never;
3999
+ trace?: never;
4000
+ };
4001
+ "/api/v1/admin/settings/auth/admins/{user_id}": {
4002
+ parameters: {
4003
+ query?: never;
4004
+ header?: never;
4005
+ path?: never;
4006
+ cookie?: never;
4007
+ };
4008
+ get?: never;
4009
+ put?: never;
4010
+ post?: never;
4011
+ /**
4012
+ * Revoke a database-granted instance admin
4013
+ * @description Removes the user's instance admin grant and appends one entry to the
4014
+ * `instance_admins` audit log. Only a ROOT admin may revoke: a database-granted
4015
+ * admin receives 403.
4016
+ * Instance-admin only (a setup session is not admitted); non-admin and unauthenticated requests receive 404.
4017
+ */
4018
+ delete: operations["revokeAdminInstanceAdmin"];
4019
+ options?: never;
4020
+ head?: never;
4021
+ patch?: never;
4022
+ trace?: never;
4023
+ };
4024
+ "/api/v1/admin/settings/auth/audit": {
4025
+ parameters: {
4026
+ query?: never;
4027
+ header?: never;
4028
+ path?: never;
4029
+ cookie?: never;
4030
+ };
4031
+ /**
4032
+ * List an authentication setting's audit log
4033
+ * @description Returns one page of the audit log of one authentication setting
4034
+ * (`auth_providers`, `auth_allowlist`, `instance_admins` or `auth_setup`),
4035
+ * newest first, with each actor's display name resolved. Snapshots never
4036
+ * contain a credential. Pass the previous page's `next_cursor` to continue.
4037
+ * Instance-admin only (a setup session is not admitted); non-admin and unauthenticated requests receive 404.
4038
+ */
4039
+ get: operations["listAdminAuthSettingsAudit"];
4040
+ put?: never;
4041
+ post?: never;
4042
+ delete?: never;
4043
+ options?: never;
4044
+ head?: never;
4045
+ patch?: never;
4046
+ trace?: never;
4047
+ };
3754
4048
  "/api/v1/{team_id}/comments": {
3755
4049
  parameters: {
3756
4050
  query?: never;
@@ -5882,6 +6176,31 @@ export interface components {
5882
6176
  /** @description Enabled login providers, ordered by the admin-defined sort order */
5883
6177
  providers: components["schemas"]["AuthProvider"][];
5884
6178
  };
6179
+ /** @description Whether this instance is in authentication setup mode. Deliberately a single boolean: the endpoint is public, so it says nothing about which providers exist, why setup is required or whether a setup token is outstanding. */
6180
+ SetupStatusResponse: {
6181
+ /**
6182
+ * @description True while the instance has no enabled sign-in provider (or setup was deliberately re-armed) and so must be configured through the setup page.
6183
+ * @example false
6184
+ */
6185
+ setup_required: boolean;
6186
+ };
6187
+ /** @description The one-time setup token from the setup URL the server logged at boot. */
6188
+ CreateSetupSessionRequest: {
6189
+ /**
6190
+ * @description The `token` query parameter of the setup URL.
6191
+ * @example q4f1ZbX0m3c8QmYwU2dK7nL5pR9sT1vA6yB3eH8jC0g
6192
+ */
6193
+ token: string;
6194
+ };
6195
+ /** @description The setup session that was started. The session itself is the `vibexp_setup` cookie; this body only says when it ends. */
6196
+ SetupSessionResponse: {
6197
+ /**
6198
+ * Format: date-time
6199
+ * @description When the setup session stops being valid.
6200
+ * @example 2026-10-02T13:00:00Z
6201
+ */
6202
+ expires_at: string;
6203
+ };
5885
6204
  /** @description Request body for POST /api/v1/auth/dev/login (development environment only) */
5886
6205
  DevLoginRequest: {
5887
6206
  /**
@@ -12942,7 +13261,13 @@ export interface components {
12942
13261
  * only `has_credential` and, on an upsert's `after`, a `secret` marker
12943
13262
  * saying whether the credential was `changed` or `unchanged`; the `search`
12944
13263
  * and `ai_summary` snapshots are the settings' values, which hold no
12945
- * credential.
13264
+ * credential. For `auth_providers` each entry is one provider, reporting
13265
+ * only `has_client_secret` and, on an upsert's `after`, a `client_secret`
13266
+ * marker (`changed` or `unchanged`); `auth_allowlist`, `instance_admins`
13267
+ * and `auth_setup` snapshots hold no credential (the setup token and its
13268
+ * hash are never recorded). A snapshot of any of these four settings
13269
+ * carries `source: cli` when the change was made by the `vibexp admin auth`
13270
+ * commands rather than through this API.
12946
13271
  */
12947
13272
  AdminInstanceSettingsAuditEntry: {
12948
13273
  /**
@@ -12955,7 +13280,7 @@ export interface components {
12955
13280
  * @example email_provider
12956
13281
  * @enum {string}
12957
13282
  */
12958
- setting: "email_provider" | "search" | "ai_summary";
13283
+ setting: "email_provider" | "search" | "ai_summary" | "auth_providers" | "auth_allowlist" | "instance_admins" | "auth_setup";
12959
13284
  /**
12960
13285
  * @description `upsert` (created or replaced by an admin), `delete` (removed by an
12961
13286
  * admin) or `import` (the boot-time import from config.yaml, which has no
@@ -13242,59 +13567,466 @@ export interface components {
13242
13567
  */
13243
13568
  expected_version?: number | null;
13244
13569
  };
13245
- ProjectResponse: components["schemas"]["Project"] & {
13570
+ /**
13571
+ * @description The kind of sign-in identity provider. At most one `google` and one
13572
+ * `github` provider can be stored; any number of `oidc` providers.
13573
+ * @example oidc
13574
+ * @enum {string}
13575
+ */
13576
+ AdminAuthProviderType: "google" | "github" | "oidc";
13577
+ /**
13578
+ * @description The provider's build outcome on the replica that served the request:
13579
+ * `healthy` (built and offered for sign-in), `unhealthy` (enabled but it
13580
+ * failed to build, so it is excluded from sign-in), `disabled` (not enabled,
13581
+ * so never built) or `unknown` (enabled, but this replica could not resolve
13582
+ * it for this request).
13583
+ * @example healthy
13584
+ * @enum {string}
13585
+ */
13586
+ AdminAuthProviderHealthStatus: "healthy" | "unhealthy" | "disabled" | "unknown";
13587
+ /**
13588
+ * @description The provider's health as seen by the replica that served the request.
13589
+ * Health is held in memory per replica and is not persisted.
13590
+ */
13591
+ AdminAuthProviderHealth: {
13592
+ status: components["schemas"]["AdminAuthProviderHealthStatus"];
13246
13593
  /**
13247
- * @description Whether the project's git URL matches a repository accessible via the team's GitHub App installation
13248
- * @example true
13594
+ * @description Why an `unhealthy` provider failed to build; null otherwise.
13595
+ * @example null
13249
13596
  */
13250
- github_connected: boolean;
13251
- };
13252
- ResourceSelection: {
13597
+ last_error: string | null;
13253
13598
  /**
13254
- * @description Migrate every resource of this type in the source project
13255
- * @example false
13599
+ * Format: date-time
13600
+ * @description When the provider was last built (or tried); null for `disabled` and `unknown`.
13256
13601
  */
13257
- all?: boolean;
13258
- /** @description Explicit list of resource IDs to migrate (used when all is false) */
13259
- ids?: string[];
13260
- };
13261
- ResourceSelections: {
13262
- prompts?: components["schemas"]["ResourceSelection"];
13263
- artifacts?: components["schemas"]["ResourceSelection"];
13264
- blueprints?: components["schemas"]["ResourceSelection"];
13265
- feed_items?: components["schemas"]["ResourceSelection"];
13602
+ checked_at: string | null;
13266
13603
  };
13267
- MigrationRequest: {
13604
+ /**
13605
+ * @description One sign-in identity provider. The client secret is write-only: it is never
13606
+ * returned, and `has_client_secret` reports only whether one is stored.
13607
+ */
13608
+ AdminAuthProvider: {
13268
13609
  /**
13269
13610
  * Format: uuid
13270
- * @description ID of the destination project (must belong to the same team)
13271
- * @example 01234567-89ab-cdef-0123-456789abcdef
13611
+ * @description Provider id.
13272
13612
  */
13273
- destination_project_id: string;
13274
- resources?: components["schemas"]["ResourceSelections"];
13613
+ id: string;
13614
+ type: components["schemas"]["AdminAuthProviderType"];
13275
13615
  /**
13276
- * @description How slug collisions in the destination project are handled
13277
- * @default skip
13278
- * @enum {string}
13616
+ * @description The provider's url-safe name, used in the sign-in URL. Immutable.
13617
+ * @example okta
13279
13618
  */
13280
- conflict_policy: "skip" | "rename" | "overwrite";
13281
- };
13282
- ResourceInventoryItem: {
13283
- /** @description Resource identifier */
13284
- id: string;
13285
- /** @description Human-readable resource name */
13286
- name: string;
13287
- };
13288
- ResourceInventory: {
13619
+ slug: string;
13289
13620
  /**
13290
- * @description Number of resources of this type in the source project
13291
- * @example 3
13621
+ * @description The name shown on the sign-in button.
13622
+ * @example Okta
13292
13623
  */
13293
- count: number;
13294
- /** @description Resources of this type (omitted when empty) */
13295
- items?: components["schemas"]["ResourceInventoryItem"][];
13624
+ display_name: string;
13625
+ /** @description Whether the provider is offered for sign-in. */
13626
+ enabled: boolean;
13627
+ /**
13628
+ * @description Position on the sign-in page, ascending.
13629
+ * @example 0
13630
+ */
13631
+ sort_order: number;
13632
+ /**
13633
+ * @description The OAuth client id.
13634
+ * @example 0oa1b2c3d4
13635
+ */
13636
+ client_id: string;
13637
+ /** @description Whether a client secret is stored. */
13638
+ has_client_secret: boolean;
13639
+ /**
13640
+ * @description The OIDC issuer URL; null for `google` and `github`.
13641
+ * @example https://example.okta.com
13642
+ */
13643
+ issuer_url: string | null;
13644
+ /**
13645
+ * @description The redirect URI to register in the identity provider's console. It is
13646
+ * derived from the instance's own URL, is the same for every provider and
13647
+ * cannot be changed here.
13648
+ * @example https://vibexp.example.com/api/v1/auth/callback
13649
+ */
13650
+ redirect_uri: string;
13651
+ health: components["schemas"]["AdminAuthProviderHealth"];
13652
+ /** Format: date-time */
13653
+ created_at: string;
13654
+ /** Format: date-time */
13655
+ updated_at: string;
13656
+ /**
13657
+ * Format: uuid
13658
+ * @description Who last saved the provider. Null for the boot-time config import, a
13659
+ * save made on a setup session, or once that user has been deleted.
13660
+ */
13661
+ updated_by_user_id: string | null;
13296
13662
  };
13297
- MigrationInventory: {
13663
+ /**
13664
+ * @description Every stored sign-in identity provider, in sign-in page order, with the
13665
+ * `version` of the instance authentication settings. Send that `version` back
13666
+ * as `expected_version` when changing a provider.
13667
+ */
13668
+ AdminAuthProviderList: {
13669
+ providers: components["schemas"]["AdminAuthProvider"][];
13670
+ /**
13671
+ * Format: int64
13672
+ * @description The shared version of the authentication settings. Every provider and
13673
+ * allowlist change increments it.
13674
+ * @example 7
13675
+ */
13676
+ version: number;
13677
+ };
13678
+ /**
13679
+ * @description A provider as stored by a create or an update, with the settings `version`
13680
+ * after the change. `provider.health` is resolved after the change, so the
13681
+ * response waits for the provider to be built (for `oidc` and `google`, one
13682
+ * bounded discovery request) and reports whether sign-in can use it.
13683
+ */
13684
+ AdminAuthProviderSaved: {
13685
+ provider: components["schemas"]["AdminAuthProvider"];
13686
+ /**
13687
+ * Format: int64
13688
+ * @description The shared authentication settings version after the change.
13689
+ * @example 8
13690
+ */
13691
+ version: number;
13692
+ };
13693
+ /**
13694
+ * @description A new sign-in identity provider. `type` and `slug` cannot be changed later.
13695
+ * `expected_version` is optional: when present, the create is rejected with
13696
+ * 409 unless it equals the current authentication settings `version`.
13697
+ */
13698
+ AdminAuthProviderCreate: {
13699
+ type: components["schemas"]["AdminAuthProviderType"];
13700
+ /**
13701
+ * @description 1-63 lower-case letters, digits or hyphens, not starting with a hyphen.
13702
+ * @example okta
13703
+ */
13704
+ slug: string;
13705
+ /** @example Okta */
13706
+ display_name: string;
13707
+ /**
13708
+ * @description Whether the provider is offered for sign-in. Defaults to true.
13709
+ * @default true
13710
+ */
13711
+ enabled: boolean;
13712
+ /**
13713
+ * @description Position on the sign-in page, ascending. Defaults to 0.
13714
+ * @default 0
13715
+ */
13716
+ sort_order: number;
13717
+ /** @example 0oa1b2c3d4 */
13718
+ client_id: string;
13719
+ /**
13720
+ * @description The OAuth client secret. Stored encrypted and never returned.
13721
+ * @example s3cr3t-value
13722
+ */
13723
+ client_secret: string;
13724
+ /**
13725
+ * @description Required for `oidc` and rejected for `google` and `github`. An absolute
13726
+ * `https://` URL (`http://` only for localhost) with no query or fragment.
13727
+ * @example https://example.okta.com
13728
+ */
13729
+ issuer_url?: string;
13730
+ /**
13731
+ * Format: int64
13732
+ * @description The `version` the caller last read; omit or null to apply to the current version.
13733
+ */
13734
+ expected_version?: number | null;
13735
+ };
13736
+ /**
13737
+ * @description A whole replacement of a provider's editable fields; `type` and `slug` are
13738
+ * immutable and are rejected as unknown fields. `display_name`, `enabled`,
13739
+ * `sort_order`, `client_id` and `expected_version` are required.
13740
+ *
13741
+ * `client_secret` is write-only. Omit it to keep the stored secret; an empty
13742
+ * string is rejected. It cannot be omitted when `issuer_url` changes: the
13743
+ * stored secret is only ever kept for the issuer it was saved with.
13744
+ *
13745
+ * A change that disables the last enabled provider, or the provider the
13746
+ * calling admin signed in with, is rejected with 409 `lockout_risk` unless
13747
+ * `confirm_lockout_risk` is true.
13748
+ */
13749
+ AdminAuthProviderUpdate: {
13750
+ /** @example Okta */
13751
+ display_name: string;
13752
+ enabled: boolean;
13753
+ /** @example 0 */
13754
+ sort_order: number;
13755
+ /** @example 0oa1b2c3d4 */
13756
+ client_id: string;
13757
+ /**
13758
+ * @description A new client secret. Omit to keep the stored one. Never returned.
13759
+ * @example s3cr3t-value
13760
+ */
13761
+ client_secret?: string;
13762
+ /**
13763
+ * @description Required for `oidc`, rejected for `google` and `github`.
13764
+ * @example https://example.okta.com
13765
+ */
13766
+ issuer_url?: string;
13767
+ /**
13768
+ * Format: int64
13769
+ * @description The authentication settings `version` the caller last read.
13770
+ * @example 7
13771
+ */
13772
+ expected_version: number;
13773
+ /**
13774
+ * @description Set to true to apply a change that was rejected with `lockout_risk`.
13775
+ * @default false
13776
+ */
13777
+ confirm_lockout_risk: boolean;
13778
+ };
13779
+ /**
13780
+ * @description What to test. Nothing is stored and nothing is audited.
13781
+ *
13782
+ * - `id` alone tests the STORED provider with its stored secret.
13783
+ * - Without `id`, the body is an unsaved candidate: `type`, `client_id` and
13784
+ * `client_secret` are required (and `issuer_url` for `oidc`).
13785
+ * - `id` with other fields tests the stored provider with those fields
13786
+ * replaced, as an edit form does before saving. `type` cannot differ from
13787
+ * the stored one. When `client_secret` is omitted the stored secret is
13788
+ * used: it is never sent to a candidate-chosen endpoint (OIDC discovery
13789
+ * sends no secret, and the GitHub credential check goes only to GitHub).
13790
+ */
13791
+ AdminAuthProviderTestRequest: {
13792
+ /**
13793
+ * Format: uuid
13794
+ * @description A stored provider's id.
13795
+ */
13796
+ id?: string;
13797
+ type?: components["schemas"]["AdminAuthProviderType"];
13798
+ /** @example 0oa1b2c3d4 */
13799
+ client_id?: string;
13800
+ /**
13801
+ * @description The candidate client secret. Never returned.
13802
+ * @example s3cr3t-value
13803
+ */
13804
+ client_secret?: string;
13805
+ /** @example https://example.okta.com */
13806
+ issuer_url?: string;
13807
+ };
13808
+ /**
13809
+ * @description The outcome of a provider test: OIDC discovery for `oidc` and `google`, a
13810
+ * credential check against GitHub for `github`.
13811
+ */
13812
+ AdminAuthProviderTestResult: {
13813
+ /** @description Whether the provider could be built with the tested configuration. */
13814
+ is_valid: boolean;
13815
+ /**
13816
+ * @description Why the test failed; null when it passed.
13817
+ * @example null
13818
+ */
13819
+ message: string | null;
13820
+ };
13821
+ /**
13822
+ * @description The instance's sign-in access allowlist. A user may sign in when their
13823
+ * email's domain is in `domains` or the address is in `emails`. With both
13824
+ * lists empty, or nothing stored, access is open: every user may sign in
13825
+ * (`active` is false). Root instance admins are always exempt.
13826
+ */
13827
+ AdminAuthAllowlist: {
13828
+ /**
13829
+ * @example [
13830
+ * "example.com"
13831
+ * ]
13832
+ */
13833
+ domains: string[];
13834
+ /**
13835
+ * @example [
13836
+ * "contractor@partner.example"
13837
+ * ]
13838
+ */
13839
+ emails: string[];
13840
+ /** @description Whether the allowlist restricts sign-in (at least one domain or email). */
13841
+ active: boolean;
13842
+ /**
13843
+ * Format: int64
13844
+ * @description The stored allowlist's own version; null when nothing is stored.
13845
+ * @example 3
13846
+ */
13847
+ version: number | null;
13848
+ /**
13849
+ * Format: date-time
13850
+ * @description When the allowlist was last saved; null when nothing is stored.
13851
+ */
13852
+ updated_at: string | null;
13853
+ /**
13854
+ * Format: uuid
13855
+ * @description Who last saved the allowlist. Null when nothing is stored, for the
13856
+ * boot-time config import, a save made on a setup session, or once that
13857
+ * user has been deleted.
13858
+ */
13859
+ updated_by_user_id: string | null;
13860
+ };
13861
+ /**
13862
+ * @description A whole replacement of the access allowlist. Both lists are required (send
13863
+ * `[]` for none). Entries are trimmed, lower-cased and de-duplicated; a domain
13864
+ * is a DNS name of at least two labels with no leading `@`. Storing two empty
13865
+ * lists means open access.
13866
+ *
13867
+ * `expected_version` is optional: when present, the save is rejected with
13868
+ * 409 unless it equals the stored allowlist's `version` (and when nothing is
13869
+ * stored, any `expected_version` other than null is a conflict). Omit it for
13870
+ * last-write-wins.
13871
+ */
13872
+ AdminAuthAllowlistUpdate: {
13873
+ /**
13874
+ * @example [
13875
+ * "example.com"
13876
+ * ]
13877
+ */
13878
+ domains: string[];
13879
+ /**
13880
+ * @example [
13881
+ * "contractor@partner.example"
13882
+ * ]
13883
+ */
13884
+ emails: string[];
13885
+ /**
13886
+ * Format: int64
13887
+ * @description The `version` the caller last read; omit or null for last-write-wins.
13888
+ */
13889
+ expected_version?: number | null;
13890
+ };
13891
+ /** @description A candidate allowlist to preview. Both lists are required (send `[]` for none). */
13892
+ AdminAuthAllowlistPreviewRequest: {
13893
+ /**
13894
+ * @example [
13895
+ * "example.com"
13896
+ * ]
13897
+ */
13898
+ domains: string[];
13899
+ /** @example [] */
13900
+ emails: string[];
13901
+ };
13902
+ /**
13903
+ * @description What replacing the allowlist with a candidate would do: the active
13904
+ * (non-suspended) users who would stop matching it. Root instance admins are
13905
+ * exempt and never counted. An open-access candidate affects nobody.
13906
+ */
13907
+ AdminAuthAllowlistImpact: {
13908
+ /**
13909
+ * @description How many active users match neither list of the candidate.
13910
+ * @example 2
13911
+ */
13912
+ count: number;
13913
+ /**
13914
+ * @description Up to 20 of their emails, in alphabetical order.
13915
+ * @example [
13916
+ * "ada@other.example",
13917
+ * "bob@other.example"
13918
+ * ]
13919
+ */
13920
+ sample: string[];
13921
+ /** @description Whether `count` exceeds the number of emails in `sample`. */
13922
+ sample_truncated: boolean;
13923
+ };
13924
+ /** @description One instance admin granted in the database. */
13925
+ AdminInstanceAdmin: {
13926
+ /** Format: uuid */
13927
+ user_id: string;
13928
+ /** @example ada@example.com */
13929
+ email: string;
13930
+ /**
13931
+ * @description The admin's display name, when set.
13932
+ * @example Ada Admin
13933
+ */
13934
+ name: string | null;
13935
+ /**
13936
+ * Format: uuid
13937
+ * @description The root admin who granted it; null once that user has been deleted.
13938
+ */
13939
+ granted_by_user_id: string | null;
13940
+ /** Format: date-time */
13941
+ granted_at: string;
13942
+ };
13943
+ /**
13944
+ * @description The instance's admins. `root_admins` are the emails named in config.yaml's
13945
+ * `auth.instance_admins`: read-only here, they cannot be granted or revoked.
13946
+ * `admins` are the users granted in the database, oldest first.
13947
+ */
13948
+ AdminInstanceAdminList: {
13949
+ /**
13950
+ * @description The root admins' normalized emails, sorted.
13951
+ * @example [
13952
+ * "root@example.com"
13953
+ * ]
13954
+ */
13955
+ root_admins: string[];
13956
+ admins: components["schemas"]["AdminInstanceAdmin"][];
13957
+ };
13958
+ /**
13959
+ * @description The existing user to make an instance admin, named by exactly one of
13960
+ * `user_id` or `email`.
13961
+ */
13962
+ AdminInstanceAdminGrant: {
13963
+ /** Format: uuid */
13964
+ user_id?: string;
13965
+ /**
13966
+ * Format: email
13967
+ * @example ada@example.com
13968
+ */
13969
+ email?: string;
13970
+ };
13971
+ /**
13972
+ * @description Which authentication setting's audit log to read.
13973
+ * @example auth_providers
13974
+ * @enum {string}
13975
+ */
13976
+ AdminAuthSettingsAuditSetting: "auth_providers" | "auth_allowlist" | "instance_admins" | "auth_setup";
13977
+ ProjectResponse: components["schemas"]["Project"] & {
13978
+ /**
13979
+ * @description Whether the project's git URL matches a repository accessible via the team's GitHub App installation
13980
+ * @example true
13981
+ */
13982
+ github_connected: boolean;
13983
+ };
13984
+ ResourceSelection: {
13985
+ /**
13986
+ * @description Migrate every resource of this type in the source project
13987
+ * @example false
13988
+ */
13989
+ all?: boolean;
13990
+ /** @description Explicit list of resource IDs to migrate (used when all is false) */
13991
+ ids?: string[];
13992
+ };
13993
+ ResourceSelections: {
13994
+ prompts?: components["schemas"]["ResourceSelection"];
13995
+ artifacts?: components["schemas"]["ResourceSelection"];
13996
+ blueprints?: components["schemas"]["ResourceSelection"];
13997
+ feed_items?: components["schemas"]["ResourceSelection"];
13998
+ };
13999
+ MigrationRequest: {
14000
+ /**
14001
+ * Format: uuid
14002
+ * @description ID of the destination project (must belong to the same team)
14003
+ * @example 01234567-89ab-cdef-0123-456789abcdef
14004
+ */
14005
+ destination_project_id: string;
14006
+ resources?: components["schemas"]["ResourceSelections"];
14007
+ /**
14008
+ * @description How slug collisions in the destination project are handled
14009
+ * @default skip
14010
+ * @enum {string}
14011
+ */
14012
+ conflict_policy: "skip" | "rename" | "overwrite";
14013
+ };
14014
+ ResourceInventoryItem: {
14015
+ /** @description Resource identifier */
14016
+ id: string;
14017
+ /** @description Human-readable resource name */
14018
+ name: string;
14019
+ };
14020
+ ResourceInventory: {
14021
+ /**
14022
+ * @description Number of resources of this type in the source project
14023
+ * @example 3
14024
+ */
14025
+ count: number;
14026
+ /** @description Resources of this type (omitted when empty) */
14027
+ items?: components["schemas"]["ResourceInventoryItem"][];
14028
+ };
14029
+ MigrationInventory: {
13298
14030
  prompts?: components["schemas"]["ResourceInventory"];
13299
14031
  artifacts?: components["schemas"]["ResourceInventory"];
13300
14032
  blueprints?: components["schemas"]["ResourceInventory"];
@@ -14098,31 +14830,26 @@ export interface operations {
14098
14830
  };
14099
14831
  };
14100
14832
  };
14101
- listAPIKeys: {
14833
+ getSetupStatus: {
14102
14834
  parameters: {
14103
- query?: {
14104
- /** @description Page number */
14105
- page?: number;
14106
- /** @description Items per page */
14107
- limit?: number;
14108
- };
14835
+ query?: never;
14109
14836
  header?: never;
14110
14837
  path?: never;
14111
14838
  cookie?: never;
14112
14839
  };
14113
14840
  requestBody?: never;
14114
14841
  responses: {
14115
- /** @description API keys retrieved successfully */
14842
+ /** @description Setup status retrieved successfully */
14116
14843
  200: {
14117
14844
  headers: {
14118
14845
  [name: string]: unknown;
14119
14846
  };
14120
14847
  content: {
14121
- "application/json": components["schemas"]["APIKeyListResponse"];
14848
+ "application/json": components["schemas"]["SetupStatusResponse"];
14122
14849
  };
14123
14850
  };
14124
- /** @description Unauthorized */
14125
- 401: {
14851
+ /** @description The setup status could not be determined */
14852
+ 500: {
14126
14853
  headers: {
14127
14854
  [name: string]: unknown;
14128
14855
  };
@@ -14132,7 +14859,7 @@ export interface operations {
14132
14859
  };
14133
14860
  };
14134
14861
  };
14135
- createAPIKey: {
14862
+ createSetupSession: {
14136
14863
  parameters: {
14137
14864
  query?: never;
14138
14865
  header?: never;
@@ -14141,20 +14868,22 @@ export interface operations {
14141
14868
  };
14142
14869
  requestBody: {
14143
14870
  content: {
14144
- "application/json": components["schemas"]["CreateAPIKeyRequest"];
14871
+ "application/json": components["schemas"]["CreateSetupSessionRequest"];
14145
14872
  };
14146
14873
  };
14147
14874
  responses: {
14148
- /** @description API key created successfully */
14149
- 201: {
14875
+ /** @description Setup session started */
14876
+ 200: {
14150
14877
  headers: {
14878
+ /** @description Encrypted, HttpOnly, SameSite=Strict setup-session cookie (`vibexp_setup`) */
14879
+ "Set-Cookie"?: string;
14151
14880
  [name: string]: unknown;
14152
14881
  };
14153
14882
  content: {
14154
- "application/json": components["schemas"]["CreateAPIKeyResponse"];
14883
+ "application/json": components["schemas"]["SetupSessionResponse"];
14155
14884
  };
14156
14885
  };
14157
- /** @description Invalid request data */
14886
+ /** @description Malformed request body */
14158
14887
  400: {
14159
14888
  headers: {
14160
14889
  [name: string]: unknown;
@@ -14163,7 +14892,7 @@ export interface operations {
14163
14892
  "application/problem+json": components["schemas"]["ErrorResponse"];
14164
14893
  };
14165
14894
  };
14166
- /** @description Unauthorized */
14895
+ /** @description The setup token is unknown, expired or already consumed */
14167
14896
  401: {
14168
14897
  headers: {
14169
14898
  [name: string]: unknown;
@@ -14172,16 +14901,110 @@ export interface operations {
14172
14901
  "application/problem+json": components["schemas"]["ErrorResponse"];
14173
14902
  };
14174
14903
  };
14175
- };
14176
- };
14177
- deleteAPIKey: {
14178
- parameters: {
14179
- query?: never;
14180
- header?: never;
14181
- path: {
14182
- /** @description API key ID */
14183
- id: string;
14184
- };
14904
+ /** @description The instance is not in setup mode */
14905
+ 404: {
14906
+ headers: {
14907
+ [name: string]: unknown;
14908
+ };
14909
+ content: {
14910
+ "application/problem+json": components["schemas"]["ErrorResponse"];
14911
+ };
14912
+ };
14913
+ /** @description The setup session could not be started */
14914
+ 500: {
14915
+ headers: {
14916
+ [name: string]: unknown;
14917
+ };
14918
+ content: {
14919
+ "application/problem+json": components["schemas"]["ErrorResponse"];
14920
+ };
14921
+ };
14922
+ };
14923
+ };
14924
+ listAPIKeys: {
14925
+ parameters: {
14926
+ query?: {
14927
+ /** @description Page number */
14928
+ page?: number;
14929
+ /** @description Items per page */
14930
+ limit?: number;
14931
+ };
14932
+ header?: never;
14933
+ path?: never;
14934
+ cookie?: never;
14935
+ };
14936
+ requestBody?: never;
14937
+ responses: {
14938
+ /** @description API keys retrieved successfully */
14939
+ 200: {
14940
+ headers: {
14941
+ [name: string]: unknown;
14942
+ };
14943
+ content: {
14944
+ "application/json": components["schemas"]["APIKeyListResponse"];
14945
+ };
14946
+ };
14947
+ /** @description Unauthorized */
14948
+ 401: {
14949
+ headers: {
14950
+ [name: string]: unknown;
14951
+ };
14952
+ content: {
14953
+ "application/problem+json": components["schemas"]["ErrorResponse"];
14954
+ };
14955
+ };
14956
+ };
14957
+ };
14958
+ createAPIKey: {
14959
+ parameters: {
14960
+ query?: never;
14961
+ header?: never;
14962
+ path?: never;
14963
+ cookie?: never;
14964
+ };
14965
+ requestBody: {
14966
+ content: {
14967
+ "application/json": components["schemas"]["CreateAPIKeyRequest"];
14968
+ };
14969
+ };
14970
+ responses: {
14971
+ /** @description API key created successfully */
14972
+ 201: {
14973
+ headers: {
14974
+ [name: string]: unknown;
14975
+ };
14976
+ content: {
14977
+ "application/json": components["schemas"]["CreateAPIKeyResponse"];
14978
+ };
14979
+ };
14980
+ /** @description Invalid request data */
14981
+ 400: {
14982
+ headers: {
14983
+ [name: string]: unknown;
14984
+ };
14985
+ content: {
14986
+ "application/problem+json": components["schemas"]["ErrorResponse"];
14987
+ };
14988
+ };
14989
+ /** @description Unauthorized */
14990
+ 401: {
14991
+ headers: {
14992
+ [name: string]: unknown;
14993
+ };
14994
+ content: {
14995
+ "application/problem+json": components["schemas"]["ErrorResponse"];
14996
+ };
14997
+ };
14998
+ };
14999
+ };
15000
+ deleteAPIKey: {
15001
+ parameters: {
15002
+ query?: never;
15003
+ header?: never;
15004
+ path: {
15005
+ /** @description API key ID */
15006
+ id: string;
15007
+ };
14185
15008
  cookie?: never;
14186
15009
  };
14187
15010
  requestBody?: never;
@@ -25480,6 +26303,726 @@ export interface operations {
25480
26303
  };
25481
26304
  };
25482
26305
  };
26306
+ listAdminAuthProviders: {
26307
+ parameters: {
26308
+ query?: never;
26309
+ header?: never;
26310
+ path?: never;
26311
+ cookie?: never;
26312
+ };
26313
+ requestBody?: never;
26314
+ responses: {
26315
+ /** @description The stored providers and the settings version */
26316
+ 200: {
26317
+ headers: {
26318
+ [name: string]: unknown;
26319
+ };
26320
+ content: {
26321
+ "application/json": components["schemas"]["AdminAuthProviderList"];
26322
+ };
26323
+ };
26324
+ /** @description Not found — the caller is neither an instance admin nor on a setup session */
26325
+ 404: {
26326
+ headers: {
26327
+ [name: string]: unknown;
26328
+ };
26329
+ content: {
26330
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26331
+ };
26332
+ };
26333
+ /** @description Internal server error */
26334
+ 500: {
26335
+ headers: {
26336
+ [name: string]: unknown;
26337
+ };
26338
+ content: {
26339
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26340
+ };
26341
+ };
26342
+ };
26343
+ };
26344
+ createAdminAuthProvider: {
26345
+ parameters: {
26346
+ query?: never;
26347
+ header?: never;
26348
+ path?: never;
26349
+ cookie?: never;
26350
+ };
26351
+ requestBody: {
26352
+ content: {
26353
+ "application/json": components["schemas"]["AdminAuthProviderCreate"];
26354
+ };
26355
+ };
26356
+ responses: {
26357
+ /** @description The stored provider and the settings version after the change */
26358
+ 201: {
26359
+ headers: {
26360
+ [name: string]: unknown;
26361
+ };
26362
+ content: {
26363
+ "application/json": components["schemas"]["AdminAuthProviderSaved"];
26364
+ };
26365
+ };
26366
+ /**
26367
+ * @description Bad request — a field is invalid (`INSTANCE_SETTINGS_VALIDATION_FAILED`, with
26368
+ * `validation_errors` naming it), or the body is malformed or carries an
26369
+ * unknown field
26370
+ */
26371
+ 400: {
26372
+ headers: {
26373
+ [name: string]: unknown;
26374
+ };
26375
+ content: {
26376
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26377
+ };
26378
+ };
26379
+ /** @description Not found — the caller is neither an instance admin nor on a setup session */
26380
+ 404: {
26381
+ headers: {
26382
+ [name: string]: unknown;
26383
+ };
26384
+ content: {
26385
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26386
+ };
26387
+ };
26388
+ /**
26389
+ * @description Conflict — `expected_version` does not match the current version
26390
+ * (`INSTANCE_SETTINGS_VERSION_CONFLICT`), or the slug is taken or a second
26391
+ * `google`/`github` provider was sent (`INSTANCE_AUTH_PROVIDER_CONFLICT`);
26392
+ * nothing was changed
26393
+ */
26394
+ 409: {
26395
+ headers: {
26396
+ [name: string]: unknown;
26397
+ };
26398
+ content: {
26399
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26400
+ };
26401
+ };
26402
+ /** @description Internal server error */
26403
+ 500: {
26404
+ headers: {
26405
+ [name: string]: unknown;
26406
+ };
26407
+ content: {
26408
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26409
+ };
26410
+ };
26411
+ };
26412
+ };
26413
+ testAdminAuthProvider: {
26414
+ parameters: {
26415
+ query?: never;
26416
+ header?: never;
26417
+ path?: never;
26418
+ cookie?: never;
26419
+ };
26420
+ requestBody: {
26421
+ content: {
26422
+ "application/json": components["schemas"]["AdminAuthProviderTestRequest"];
26423
+ };
26424
+ };
26425
+ responses: {
26426
+ /** @description The outcome of the test */
26427
+ 200: {
26428
+ headers: {
26429
+ [name: string]: unknown;
26430
+ };
26431
+ content: {
26432
+ "application/json": components["schemas"]["AdminAuthProviderTestResult"];
26433
+ };
26434
+ };
26435
+ /**
26436
+ * @description Bad request — the candidate is invalid (`INSTANCE_SETTINGS_VALIDATION_FAILED`),
26437
+ * or the body is malformed or carries an unknown field
26438
+ */
26439
+ 400: {
26440
+ headers: {
26441
+ [name: string]: unknown;
26442
+ };
26443
+ content: {
26444
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26445
+ };
26446
+ };
26447
+ /** @description Not found — no provider has that `id`, or the caller is neither an instance admin nor on a setup session */
26448
+ 404: {
26449
+ headers: {
26450
+ [name: string]: unknown;
26451
+ };
26452
+ content: {
26453
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26454
+ };
26455
+ };
26456
+ /** @description Internal server error */
26457
+ 500: {
26458
+ headers: {
26459
+ [name: string]: unknown;
26460
+ };
26461
+ content: {
26462
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26463
+ };
26464
+ };
26465
+ };
26466
+ };
26467
+ updateAdminAuthProvider: {
26468
+ parameters: {
26469
+ query?: never;
26470
+ header?: never;
26471
+ path: {
26472
+ /** @description Provider id (UUID) */
26473
+ id: string;
26474
+ };
26475
+ cookie?: never;
26476
+ };
26477
+ requestBody: {
26478
+ content: {
26479
+ "application/json": components["schemas"]["AdminAuthProviderUpdate"];
26480
+ };
26481
+ };
26482
+ responses: {
26483
+ /** @description The stored provider and the settings version after the change */
26484
+ 200: {
26485
+ headers: {
26486
+ [name: string]: unknown;
26487
+ };
26488
+ content: {
26489
+ "application/json": components["schemas"]["AdminAuthProviderSaved"];
26490
+ };
26491
+ };
26492
+ /**
26493
+ * @description Bad request — a field is invalid (`INSTANCE_SETTINGS_VALIDATION_FAILED`, with
26494
+ * `validation_errors` naming it), the provider id is malformed, or the body is
26495
+ * malformed, omits or nulls a required field, or carries an unknown field
26496
+ */
26497
+ 400: {
26498
+ headers: {
26499
+ [name: string]: unknown;
26500
+ };
26501
+ content: {
26502
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26503
+ };
26504
+ };
26505
+ /** @description Not found — no provider has that id, or the caller is neither an instance admin nor on a setup session */
26506
+ 404: {
26507
+ headers: {
26508
+ [name: string]: unknown;
26509
+ };
26510
+ content: {
26511
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26512
+ };
26513
+ };
26514
+ /**
26515
+ * @description Conflict — `expected_version` does not match the current version
26516
+ * (`INSTANCE_SETTINGS_VERSION_CONFLICT`), or the change risks locking sign-in
26517
+ * out (`lockout_risk`); nothing was changed
26518
+ */
26519
+ 409: {
26520
+ headers: {
26521
+ [name: string]: unknown;
26522
+ };
26523
+ content: {
26524
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26525
+ };
26526
+ };
26527
+ /** @description Internal server error */
26528
+ 500: {
26529
+ headers: {
26530
+ [name: string]: unknown;
26531
+ };
26532
+ content: {
26533
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26534
+ };
26535
+ };
26536
+ };
26537
+ };
26538
+ deleteAdminAuthProvider: {
26539
+ parameters: {
26540
+ query?: {
26541
+ /** @description The authentication settings `version` the caller last read; omit to apply to the current version. */
26542
+ expected_version?: number;
26543
+ /** @description Set to true to apply a delete that was rejected with `lockout_risk`. */
26544
+ confirm_lockout_risk?: boolean;
26545
+ };
26546
+ header?: never;
26547
+ path: {
26548
+ /** @description Provider id (UUID) */
26549
+ id: string;
26550
+ };
26551
+ cookie?: never;
26552
+ };
26553
+ requestBody?: never;
26554
+ responses: {
26555
+ /** @description The provider was deleted */
26556
+ 204: {
26557
+ headers: {
26558
+ [name: string]: unknown;
26559
+ };
26560
+ content?: never;
26561
+ };
26562
+ /** @description Bad request — malformed provider id or query parameter */
26563
+ 400: {
26564
+ headers: {
26565
+ [name: string]: unknown;
26566
+ };
26567
+ content: {
26568
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26569
+ };
26570
+ };
26571
+ /** @description Not found — no provider has that id, or the caller is neither an instance admin nor on a setup session */
26572
+ 404: {
26573
+ headers: {
26574
+ [name: string]: unknown;
26575
+ };
26576
+ content: {
26577
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26578
+ };
26579
+ };
26580
+ /**
26581
+ * @description Conflict — `expected_version` does not match the current version
26582
+ * (`INSTANCE_SETTINGS_VERSION_CONFLICT`), or the delete risks locking sign-in
26583
+ * out (`lockout_risk`); nothing was changed
26584
+ */
26585
+ 409: {
26586
+ headers: {
26587
+ [name: string]: unknown;
26588
+ };
26589
+ content: {
26590
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26591
+ };
26592
+ };
26593
+ /** @description Internal server error */
26594
+ 500: {
26595
+ headers: {
26596
+ [name: string]: unknown;
26597
+ };
26598
+ content: {
26599
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26600
+ };
26601
+ };
26602
+ };
26603
+ };
26604
+ getAdminAuthAllowlist: {
26605
+ parameters: {
26606
+ query?: never;
26607
+ header?: never;
26608
+ path?: never;
26609
+ cookie?: never;
26610
+ };
26611
+ requestBody?: never;
26612
+ responses: {
26613
+ /** @description The access allowlist */
26614
+ 200: {
26615
+ headers: {
26616
+ [name: string]: unknown;
26617
+ };
26618
+ content: {
26619
+ "application/json": components["schemas"]["AdminAuthAllowlist"];
26620
+ };
26621
+ };
26622
+ /** @description Not found — the caller is neither an instance admin nor on a setup session */
26623
+ 404: {
26624
+ headers: {
26625
+ [name: string]: unknown;
26626
+ };
26627
+ content: {
26628
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26629
+ };
26630
+ };
26631
+ /** @description Internal server error */
26632
+ 500: {
26633
+ headers: {
26634
+ [name: string]: unknown;
26635
+ };
26636
+ content: {
26637
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26638
+ };
26639
+ };
26640
+ };
26641
+ };
26642
+ updateAdminAuthAllowlist: {
26643
+ parameters: {
26644
+ query?: never;
26645
+ header?: never;
26646
+ path?: never;
26647
+ cookie?: never;
26648
+ };
26649
+ requestBody: {
26650
+ content: {
26651
+ "application/json": components["schemas"]["AdminAuthAllowlistUpdate"];
26652
+ };
26653
+ };
26654
+ responses: {
26655
+ /** @description The stored allowlist */
26656
+ 200: {
26657
+ headers: {
26658
+ [name: string]: unknown;
26659
+ };
26660
+ content: {
26661
+ "application/json": components["schemas"]["AdminAuthAllowlist"];
26662
+ };
26663
+ };
26664
+ /**
26665
+ * @description Bad request — an entry is invalid (`INSTANCE_SETTINGS_VALIDATION_FAILED`, with
26666
+ * `validation_errors` naming the list), or the body is malformed, omits or
26667
+ * nulls a list, or carries an unknown field
26668
+ */
26669
+ 400: {
26670
+ headers: {
26671
+ [name: string]: unknown;
26672
+ };
26673
+ content: {
26674
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26675
+ };
26676
+ };
26677
+ /** @description Not found — the caller is neither an instance admin nor on a setup session */
26678
+ 404: {
26679
+ headers: {
26680
+ [name: string]: unknown;
26681
+ };
26682
+ content: {
26683
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26684
+ };
26685
+ };
26686
+ /** @description Conflict — `expected_version` does not match the stored version (`INSTANCE_SETTINGS_VERSION_CONFLICT`); nothing was changed */
26687
+ 409: {
26688
+ headers: {
26689
+ [name: string]: unknown;
26690
+ };
26691
+ content: {
26692
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26693
+ };
26694
+ };
26695
+ /** @description Internal server error */
26696
+ 500: {
26697
+ headers: {
26698
+ [name: string]: unknown;
26699
+ };
26700
+ content: {
26701
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26702
+ };
26703
+ };
26704
+ };
26705
+ };
26706
+ resetAdminAuthAllowlist: {
26707
+ parameters: {
26708
+ query?: never;
26709
+ header?: never;
26710
+ path?: never;
26711
+ cookie?: never;
26712
+ };
26713
+ requestBody?: never;
26714
+ responses: {
26715
+ /** @description Access is now open */
26716
+ 204: {
26717
+ headers: {
26718
+ [name: string]: unknown;
26719
+ };
26720
+ content?: never;
26721
+ };
26722
+ /** @description Not found — the caller is neither an instance admin nor on a setup session */
26723
+ 404: {
26724
+ headers: {
26725
+ [name: string]: unknown;
26726
+ };
26727
+ content: {
26728
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26729
+ };
26730
+ };
26731
+ /** @description Internal server error */
26732
+ 500: {
26733
+ headers: {
26734
+ [name: string]: unknown;
26735
+ };
26736
+ content: {
26737
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26738
+ };
26739
+ };
26740
+ };
26741
+ };
26742
+ previewAdminAuthAllowlist: {
26743
+ parameters: {
26744
+ query?: never;
26745
+ header?: never;
26746
+ path?: never;
26747
+ cookie?: never;
26748
+ };
26749
+ requestBody: {
26750
+ content: {
26751
+ "application/json": components["schemas"]["AdminAuthAllowlistPreviewRequest"];
26752
+ };
26753
+ };
26754
+ responses: {
26755
+ /** @description The impact of the candidate */
26756
+ 200: {
26757
+ headers: {
26758
+ [name: string]: unknown;
26759
+ };
26760
+ content: {
26761
+ "application/json": components["schemas"]["AdminAuthAllowlistImpact"];
26762
+ };
26763
+ };
26764
+ /**
26765
+ * @description Bad request — an entry is invalid (`INSTANCE_SETTINGS_VALIDATION_FAILED`), or
26766
+ * the body is malformed, omits or nulls a list, or carries an unknown field
26767
+ */
26768
+ 400: {
26769
+ headers: {
26770
+ [name: string]: unknown;
26771
+ };
26772
+ content: {
26773
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26774
+ };
26775
+ };
26776
+ /** @description Not found — the caller is neither an instance admin nor on a setup session */
26777
+ 404: {
26778
+ headers: {
26779
+ [name: string]: unknown;
26780
+ };
26781
+ content: {
26782
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26783
+ };
26784
+ };
26785
+ /** @description Internal server error */
26786
+ 500: {
26787
+ headers: {
26788
+ [name: string]: unknown;
26789
+ };
26790
+ content: {
26791
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26792
+ };
26793
+ };
26794
+ };
26795
+ };
26796
+ listAdminInstanceAdmins: {
26797
+ parameters: {
26798
+ query?: never;
26799
+ header?: never;
26800
+ path?: never;
26801
+ cookie?: never;
26802
+ };
26803
+ requestBody?: never;
26804
+ responses: {
26805
+ /** @description The instance admins */
26806
+ 200: {
26807
+ headers: {
26808
+ [name: string]: unknown;
26809
+ };
26810
+ content: {
26811
+ "application/json": components["schemas"]["AdminInstanceAdminList"];
26812
+ };
26813
+ };
26814
+ /** @description Not found — the caller is not an instance admin */
26815
+ 404: {
26816
+ headers: {
26817
+ [name: string]: unknown;
26818
+ };
26819
+ content: {
26820
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26821
+ };
26822
+ };
26823
+ /** @description Internal server error */
26824
+ 500: {
26825
+ headers: {
26826
+ [name: string]: unknown;
26827
+ };
26828
+ content: {
26829
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26830
+ };
26831
+ };
26832
+ };
26833
+ };
26834
+ grantAdminInstanceAdmin: {
26835
+ parameters: {
26836
+ query?: never;
26837
+ header?: never;
26838
+ path?: never;
26839
+ cookie?: never;
26840
+ };
26841
+ requestBody: {
26842
+ content: {
26843
+ "application/json": components["schemas"]["AdminInstanceAdminGrant"];
26844
+ };
26845
+ };
26846
+ responses: {
26847
+ /** @description The grant */
26848
+ 200: {
26849
+ headers: {
26850
+ [name: string]: unknown;
26851
+ };
26852
+ content: {
26853
+ "application/json": components["schemas"]["AdminInstanceAdmin"];
26854
+ };
26855
+ };
26856
+ /**
26857
+ * @description Bad request — the body names neither or both of `user_id` and `email`, the
26858
+ * user is suspended, or the body is malformed or carries an unknown field
26859
+ */
26860
+ 400: {
26861
+ headers: {
26862
+ [name: string]: unknown;
26863
+ };
26864
+ content: {
26865
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26866
+ };
26867
+ };
26868
+ /** @description Forbidden — the caller is an instance admin but not a root admin */
26869
+ 403: {
26870
+ headers: {
26871
+ [name: string]: unknown;
26872
+ };
26873
+ content: {
26874
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26875
+ };
26876
+ };
26877
+ /** @description Not found — no such user, or the caller is not an instance admin */
26878
+ 404: {
26879
+ headers: {
26880
+ [name: string]: unknown;
26881
+ };
26882
+ content: {
26883
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26884
+ };
26885
+ };
26886
+ /** @description Conflict — the user is a root admin, whose access comes from config.yaml */
26887
+ 409: {
26888
+ headers: {
26889
+ [name: string]: unknown;
26890
+ };
26891
+ content: {
26892
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26893
+ };
26894
+ };
26895
+ /** @description Internal server error */
26896
+ 500: {
26897
+ headers: {
26898
+ [name: string]: unknown;
26899
+ };
26900
+ content: {
26901
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26902
+ };
26903
+ };
26904
+ };
26905
+ };
26906
+ revokeAdminInstanceAdmin: {
26907
+ parameters: {
26908
+ query?: never;
26909
+ header?: never;
26910
+ path: {
26911
+ /** @description The granted admin's user id (UUID) */
26912
+ user_id: string;
26913
+ };
26914
+ cookie?: never;
26915
+ };
26916
+ requestBody?: never;
26917
+ responses: {
26918
+ /** @description The grant was revoked */
26919
+ 204: {
26920
+ headers: {
26921
+ [name: string]: unknown;
26922
+ };
26923
+ content?: never;
26924
+ };
26925
+ /** @description Bad request — malformed user id */
26926
+ 400: {
26927
+ headers: {
26928
+ [name: string]: unknown;
26929
+ };
26930
+ content: {
26931
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26932
+ };
26933
+ };
26934
+ /** @description Forbidden — the caller is an instance admin but not a root admin */
26935
+ 403: {
26936
+ headers: {
26937
+ [name: string]: unknown;
26938
+ };
26939
+ content: {
26940
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26941
+ };
26942
+ };
26943
+ /** @description Not found — the user holds no grant, or the caller is not an instance admin */
26944
+ 404: {
26945
+ headers: {
26946
+ [name: string]: unknown;
26947
+ };
26948
+ content: {
26949
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26950
+ };
26951
+ };
26952
+ /** @description Conflict — the user is a root admin, whose access comes from config.yaml */
26953
+ 409: {
26954
+ headers: {
26955
+ [name: string]: unknown;
26956
+ };
26957
+ content: {
26958
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26959
+ };
26960
+ };
26961
+ /** @description Internal server error */
26962
+ 500: {
26963
+ headers: {
26964
+ [name: string]: unknown;
26965
+ };
26966
+ content: {
26967
+ "application/problem+json": components["schemas"]["ErrorResponse"];
26968
+ };
26969
+ };
26970
+ };
26971
+ };
26972
+ listAdminAuthSettingsAudit: {
26973
+ parameters: {
26974
+ query: {
26975
+ /** @description Which authentication setting's audit log to read. */
26976
+ setting: components["schemas"]["AdminAuthSettingsAuditSetting"];
26977
+ /** @description Opaque cursor from a previous page's `next_cursor`. */
26978
+ cursor?: string;
26979
+ /** @description Page size. */
26980
+ limit?: number;
26981
+ };
26982
+ header?: never;
26983
+ path?: never;
26984
+ cookie?: never;
26985
+ };
26986
+ requestBody?: never;
26987
+ responses: {
26988
+ /** @description One page of audit entries, newest first */
26989
+ 200: {
26990
+ headers: {
26991
+ [name: string]: unknown;
26992
+ };
26993
+ content: {
26994
+ "application/json": components["schemas"]["AdminInstanceSettingsAuditPage"];
26995
+ };
26996
+ };
26997
+ /** @description Bad request — missing or unknown `setting`, malformed cursor, or `limit` out of range */
26998
+ 400: {
26999
+ headers: {
27000
+ [name: string]: unknown;
27001
+ };
27002
+ content: {
27003
+ "application/problem+json": components["schemas"]["ErrorResponse"];
27004
+ };
27005
+ };
27006
+ /** @description Not found — the caller is not an instance admin */
27007
+ 404: {
27008
+ headers: {
27009
+ [name: string]: unknown;
27010
+ };
27011
+ content: {
27012
+ "application/problem+json": components["schemas"]["ErrorResponse"];
27013
+ };
27014
+ };
27015
+ /** @description Internal server error */
27016
+ 500: {
27017
+ headers: {
27018
+ [name: string]: unknown;
27019
+ };
27020
+ content: {
27021
+ "application/problem+json": components["schemas"]["ErrorResponse"];
27022
+ };
27023
+ };
27024
+ };
27025
+ };
25483
27026
  listComments: {
25484
27027
  parameters: {
25485
27028
  query: {