From 96016e49a1630b23a54a74f0510861ef37b6afb5 Mon Sep 17 00:00:00 2001 From: ben-fornefeld <50748440+ben-fornefeld@users.noreply.github.com> Date: Fri, 19 Jun 2026 00:48:58 +0000 Subject: [PATCH 1/4] chore: sync infra OpenAPI specs --- spec/openapi.dashboard-api.yaml | 166 +- spec/openapi.infra.yaml | 106 +- .../shared/contracts/dashboard-api.types.ts | 3283 ++++---- src/core/shared/contracts/infra-api.types.ts | 6847 ++++++++--------- 4 files changed, 5135 insertions(+), 5267 deletions(-) diff --git a/spec/openapi.dashboard-api.yaml b/spec/openapi.dashboard-api.yaml index 7c6824b95..3e9e4b1d5 100644 --- a/spec/openapi.dashboard-api.yaml +++ b/spec/openapi.dashboard-api.yaml @@ -10,19 +10,8 @@ components: type: apiKey in: header name: X-Admin-Token - # Generated code uses security schemas in the alphabetical order. - # In order to check first the token, and then the team (so we can already use the user), - # there is a 1 and 2 present in the names of the security schemas. - Supabase1TokenAuth: - type: apiKey - in: header - name: X-Supabase-Token - Supabase2TeamAuth: - type: apiKey - in: header - name: X-Supabase-Team # AuthProviderBearerAuth / AuthProviderTeamAuth: B before T in the name - # so Bearer is validated before Team (same reason as Supabase1/2 above). + # so Bearer is validated before Team. AuthProviderBearerAuth: type: http scheme: bearer @@ -132,42 +121,6 @@ components: minimum: 1 maximum: 100 default: 50 - templates_cursor: - name: cursor - in: query - required: false - description: Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. - schema: - type: string - templates_public: - name: public - in: query - required: false - description: Filter templates by visibility (true = public, false = internal). - schema: - type: boolean - templates_search: - name: search - in: query - required: false - description: Case-insensitive substring match on template names, aliases, and template id. - schema: - type: string - templates_sort: - name: sort - in: query - required: false - description: Sort column and direction. - schema: - type: string - enum: - [ - created_at_asc, - created_at_desc, - updated_at_asc, - updated_at_desc, - ] - default: updated_at_desc templateID: name: templateID in: path @@ -213,6 +166,42 @@ components: minimum: 1 maximum: 100 default: 50 + templates_cursor: + name: cursor + in: query + required: false + description: Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. + schema: + type: string + templates_public: + name: public + in: query + required: false + description: Filter templates by visibility (true = public, false = internal). + schema: + type: boolean + templates_search: + name: search + in: query + required: false + description: Case-insensitive substring match on template names, aliases, and template id. + schema: + type: string + templates_sort: + name: sort + in: query + required: false + description: Sort column and direction. + schema: + type: string + enum: + [ + created_at_asc, + created_at_desc, + updated_at_asc, + updated_at_desc, + ] + default: created_at_desc tag_assignments_cursor: name: cursor in: query @@ -282,6 +271,12 @@ components: application/json: schema: $ref: "#/components/schemas/Error" + "409": + description: Conflict + content: + application/json: + schema: + $ref: "#/components/schemas/Error" "500": description: Server error content: @@ -1170,8 +1165,6 @@ paths: summary: List team builds tags: [builds] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1200,8 +1193,6 @@ paths: summary: Get build statuses tags: [builds] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1228,8 +1219,6 @@ paths: summary: Get build details tags: [builds] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1255,8 +1244,6 @@ paths: summary: Get sandbox record tags: [sandboxes] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1283,7 +1270,6 @@ paths: description: Returns all teams the authenticated user belongs to, with limits and default flag. tags: [teams] security: - - Supabase1TokenAuth: [] - AuthProviderBearerAuth: [] responses: "200": @@ -1300,7 +1286,6 @@ paths: summary: Create team tags: [teams] security: - - Supabase1TokenAuth: [] - AuthProviderBearerAuth: [] requestBody: required: true @@ -1322,26 +1307,6 @@ paths: "500": $ref: "#/components/responses/500" - /admin/users/{userId}/bootstrap: - post: - summary: Bootstrap user - tags: [teams] - security: - - AdminApiKeyAuth: [] - parameters: - - $ref: "#/components/parameters/userId" - responses: - "200": - description: Successfully bootstrapped user. - content: - application/json: - schema: - $ref: "#/components/schemas/TeamResolveResponse" - "401": - $ref: "#/components/responses/401" - "500": - $ref: "#/components/responses/500" - /admin/users/bootstrap: post: summary: Bootstrap auth provider user @@ -1471,13 +1436,35 @@ paths: "500": $ref: "#/components/responses/500" + /admin/users/{userId}: + delete: + summary: Delete user + description: Deletes a user by removing the identity provider record, user_identities mapping, and public.users row. + tags: [admin] + security: + - AdminApiKeyAuth: [] + parameters: + - $ref: "#/components/parameters/userId" + responses: + "204": + description: Successfully deleted user. + "400": + $ref: "#/components/responses/400" + "401": + $ref: "#/components/responses/401" + "404": + $ref: "#/components/responses/404" + "409": + $ref: "#/components/responses/409" + "500": + $ref: "#/components/responses/500" + /teams/resolve: get: summary: Resolve team identity description: Resolves a team slug to the team's identity, validating the user is a member. tags: [teams] security: - - Supabase1TokenAuth: [] - AuthProviderBearerAuth: [] parameters: - $ref: "#/components/parameters/teamSlug" @@ -1502,8 +1489,6 @@ paths: summary: Update team tags: [teams] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1535,8 +1520,6 @@ paths: summary: List team members tags: [teams] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1558,8 +1541,6 @@ paths: summary: Add team member tags: [teams] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1589,8 +1570,6 @@ paths: summary: Remove team member tags: [teams] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1614,8 +1593,6 @@ paths: description: Returns a paginated list of the team's templates (and default templates inline, unless the team is on a dedicated cluster), with filtering, search, and column sorting via keyset cursor pagination. tags: [templates] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1646,7 +1623,6 @@ paths: description: Returns the list of default templates with their latest build info and aliases. tags: [templates] security: - - Supabase1TokenAuth: [] - AuthProviderBearerAuth: [] responses: "200": @@ -1666,8 +1642,6 @@ paths: description: Returns a single template owned by the current team. Dashboard-shaped read, indexed by template ID. tags: [templates] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1694,8 +1668,6 @@ paths: description: Returns ready template tag assignment groups with bounded per-tag history, paginated over tags with keyset cursor. tags: [templates] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1729,8 +1701,6 @@ paths: description: Returns the total number of distinct ready tags for the template. tags: [templates] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1757,8 +1727,6 @@ paths: description: Checks whether a template tag has at least one ready assignment. tags: [templates] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -1788,8 +1756,6 @@ paths: description: Returns ready tag assignment events for a single tag, ordered newest first, with keyset cursor pagination. tags: [templates] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: diff --git a/spec/openapi.infra.yaml b/spec/openapi.infra.yaml index bc0c17228..b0096d0c1 100644 --- a/spec/openapi.infra.yaml +++ b/spec/openapi.infra.yaml @@ -16,19 +16,8 @@ components: type: http scheme: bearer bearerFormat: access_token - # Generated code uses security schemas in the alphabetical order. - # In order to check first the token, and then the team (so we can already use the user), - # there is a 1 and 2 present in the names of the security schemas. - Supabase1TokenAuth: - type: apiKey - in: header - name: X-Supabase-Token - Supabase2TeamAuth: - type: apiKey - in: header - name: X-Supabase-Team # AuthProviderBearerAuth / AuthProviderTeamAuth: B before T in the name - # so Bearer is validated before Team (same reason as Supabase1/2 above). + # so Bearer is validated before Team. AuthProviderBearerAuth: type: http scheme: bearer @@ -1952,7 +1941,6 @@ paths: tags: [auth] security: - AccessTokenAuth: [] - - Supabase1TokenAuth: [] - AuthProviderBearerAuth: [] responses: "200": @@ -1974,8 +1962,6 @@ paths: tags: [auth] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2020,8 +2006,6 @@ paths: tags: [auth] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2071,8 +2055,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2104,8 +2086,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2136,8 +2116,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2183,8 +2161,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2222,8 +2198,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2265,8 +2239,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2325,8 +2297,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2352,8 +2322,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2376,8 +2344,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2424,8 +2390,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2451,8 +2415,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2487,8 +2449,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2528,8 +2488,6 @@ paths: description: Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2557,8 +2515,6 @@ paths: description: Update the network configuration for a running sandbox. Replaces the current egress rules with the provided configuration. Omitting field clears it. security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2589,8 +2545,6 @@ paths: description: Refresh the sandbox extending its time to live security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2617,8 +2571,6 @@ paths: tags: [sandboxes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2653,8 +2605,6 @@ paths: tags: [snapshots] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2688,8 +2638,6 @@ paths: tags: [templates] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2724,8 +2672,6 @@ paths: tags: [templates] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2758,8 +2704,6 @@ paths: security: - AccessTokenAuth: [] - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2796,8 +2740,6 @@ paths: security: - ApiKeyAuth: [] - AccessTokenAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2828,8 +2770,6 @@ paths: tags: [templates] security: - AccessTokenAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] requestBody: @@ -2859,8 +2799,6 @@ paths: tags: [templates] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2886,8 +2824,6 @@ paths: tags: [templates] security: - AccessTokenAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -2916,8 +2852,6 @@ paths: security: - ApiKeyAuth: [] - AccessTokenAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2938,8 +2872,6 @@ paths: security: - ApiKeyAuth: [] - AccessTokenAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -2969,8 +2901,6 @@ paths: tags: [templates] security: - AccessTokenAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] parameters: @@ -2990,8 +2920,6 @@ paths: tags: [templates] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3020,8 +2948,6 @@ paths: security: - ApiKeyAuth: [] - AccessTokenAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3055,8 +2981,6 @@ paths: security: - AccessTokenAuth: [] - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3106,8 +3030,6 @@ paths: security: - AccessTokenAuth: [] - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3164,8 +3086,6 @@ paths: tags: [tags] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3196,8 +3116,6 @@ paths: tags: [tags] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3226,8 +3144,6 @@ paths: tags: [tags] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3258,8 +3174,6 @@ paths: tags: [templates] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3495,7 +3409,6 @@ paths: description: Create a new access token tags: [access-tokens] security: - - Supabase1TokenAuth: [] - AuthProviderBearerAuth: [] requestBody: required: true @@ -3520,7 +3433,6 @@ paths: description: Delete an access token tags: [access-tokens] security: - - Supabase1TokenAuth: [] - AuthProviderBearerAuth: [] parameters: - $ref: "#/components/parameters/accessTokenID" @@ -3539,8 +3451,6 @@ paths: description: List all team API keys tags: [api-keys] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3562,8 +3472,6 @@ paths: description: Create a new team API key tags: [api-keys] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] requestBody: @@ -3589,8 +3497,6 @@ paths: description: Update a team API key tags: [api-keys] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3616,8 +3522,6 @@ paths: description: Delete a team API key tags: [api-keys] security: - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3640,8 +3544,6 @@ paths: tags: [volumes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3665,8 +3567,6 @@ paths: tags: [volumes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3697,8 +3597,6 @@ paths: tags: [volumes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] @@ -3724,8 +3622,6 @@ paths: tags: [volumes] security: - ApiKeyAuth: [] - - Supabase1TokenAuth: [] - Supabase2TeamAuth: [] - AuthProviderBearerAuth: [] AuthProviderTeamAuth: [] - AdminApiKeyAuth: [] diff --git a/src/core/shared/contracts/dashboard-api.types.ts b/src/core/shared/contracts/dashboard-api.types.ts index 65d570f83..74e2e3cae 100644 --- a/src/core/shared/contracts/dashboard-api.types.ts +++ b/src/core/shared/contracts/dashboard-api.types.ts @@ -4,1643 +4,1652 @@ */ export interface paths { - '/health': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** Health check */ - get: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Health check successful */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['HealthResponse'] - } - } - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/builds': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** List team builds */ - get: { - parameters: { - query?: { - /** @description Optional filter by build identifier, template identifier, or template alias. */ - build_id_or_template?: components['parameters']['build_id_or_template'] - /** @description Comma-separated list of build statuses to include. */ - statuses?: components['parameters']['build_statuses'] - /** @description Maximum number of items to return per page. */ - limit?: components['parameters']['builds_limit'] - /** @description Cursor returned by the previous list response in `created_at|build_id` format. */ - cursor?: components['parameters']['builds_cursor'] - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned paginated builds. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['BuildsListResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/builds/statuses': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** Get build statuses */ - get: { - parameters: { - query: { - /** @description Comma-separated list of build IDs to get statuses for. */ - build_ids: components['parameters']['build_ids'] - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned build statuses */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['BuildsStatusesResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/builds/{build_id}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** Get build details */ - get: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the build. */ - build_id: components['parameters']['build_id'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned build details. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['BuildInfo'] - } - } - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/record': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** Get sandbox record */ - get: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the sandbox. */ - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned sandbox details. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['SandboxRecord'] - } - } - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/teams': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * List user teams - * @description Returns all teams the authenticated user belongs to, with limits and default flag. - */ - get: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned user teams. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['UserTeamsResponse'] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - /** Create team */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['CreateTeamRequest'] - } - } - responses: { - /** @description Successfully created team. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TeamResolveResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/users/{userId}/bootstrap': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** Bootstrap user */ - post: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the user. */ - userId: components['parameters']['userId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully bootstrapped user. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TeamResolveResponse'] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/users/bootstrap': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** Bootstrap auth provider user */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['AdminAuthProviderUserBootstrapRequest'] - } - } - responses: { - /** @description Successfully bootstrapped user. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TeamResolveResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/teams/bootstrap': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** - * Bootstrap team - * @description Creates and provisions a team for an admin-authenticated bootstrap workflow. - */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['AdminTeamBootstrapRequest'] - } - } - responses: { - /** @description Successfully bootstrapped team. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TeamResolveResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - 502: components['responses']['502'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/user-profiles/resolve': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** Resolve user profiles */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['AdminAuthProviderProfilesResolveRequest'] - } - } - responses: { - /** @description Successfully resolved profiles. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['AdminAuthProviderProfilesResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/user-profiles/by-email': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** Lookup user profiles by email */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['AdminAuthProviderProfilesLookupEmailRequest'] - } - } - responses: { - /** @description Successfully found matching profiles. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['AdminAuthProviderProfilesResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/user-profiles/{userId}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** Get user profile */ - get: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the user. */ - userId: components['parameters']['userId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully found profile. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['AdminAuthProviderProfilesResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/teams/resolve': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * Resolve team identity - * @description Resolves a team slug to the team's identity, validating the user is a member. - */ - get: { - parameters: { - query: { - /** @description Team slug to resolve. */ - slug: components['parameters']['teamSlug'] - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully resolved team. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TeamResolveResponse'] - } - } - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/teams/{teamID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - post?: never - delete?: never - options?: never - head?: never - /** Update team */ - patch: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the team. */ - teamID: components['parameters']['teamID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['UpdateTeamRequest'] - } - } - responses: { - /** @description Successfully updated team. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['UpdateTeamResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - trace?: never - } - '/teams/{teamID}/members': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** List team members */ - get: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the team. */ - teamID: components['parameters']['teamID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned team members. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TeamMembersResponse'] - } - } - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - put?: never - /** Add team member */ - post: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the team. */ - teamID: components['parameters']['teamID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['AddTeamMemberRequest'] - } - } - responses: { - /** @description Successfully added team member. */ - 201: { - headers: { - [name: string]: unknown - } - content?: never - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/teams/{teamID}/members/{userId}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - post?: never - /** Remove team member */ - delete: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the team. */ - teamID: components['parameters']['teamID'] - /** @description Identifier of the user. */ - userId: components['parameters']['userId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully removed team member. */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - options?: never - head?: never - patch?: never - trace?: never - } - '/templates': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * List team templates - * @description Returns a paginated list of the team's templates (and default templates inline, unless the team is on a dedicated cluster), with filtering, search, and column sorting via keyset cursor pagination. - */ - get: { - parameters: { - query?: { - /** @description Filter templates by visibility (true = public, false = internal). */ - public?: components['parameters']['templates_public'] - /** @description Case-insensitive substring match on template names, aliases, and template id. */ - search?: components['parameters']['templates_search'] - /** @description Sort column and direction. */ - sort?: components['parameters']['templates_sort'] - /** @description Maximum number of items to return per page. */ - limit?: components['parameters']['templates_limit'] - /** @description Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. */ - cursor?: components['parameters']['templates_cursor'] - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned paginated templates. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TeamTemplatesResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/defaults': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * List default templates - * @description Returns the list of default templates with their latest build info and aliases. - */ - get: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned default templates. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['DefaultTemplatesResponse'] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/{templateID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * Get template - * @description Returns a single template owned by the current team. Dashboard-shaped read, indexed by template ID. - */ - get: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the template. */ - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the template. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateDetail'] - } - } - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/{templateID}/tags/groups': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * List template tag groups - * @description Returns ready template tag assignment groups with bounded per-tag history, paginated over tags with keyset cursor. - */ - get: { - parameters: { - query?: { - /** @description Maximum number of ready assignment rows to return per tag. */ - assignmentLimit?: components['parameters']['tag_assignment_limit'] - /** @description Maximum number of distinct tags to return per page. */ - tagsLimit?: components['parameters']['tag_groups_limit'] - /** @description Cursor returned by the previous list response in `{sort}|{latest_assigned_at}|{tag}` format (sort-tagged, RFC3339Nano). */ - tagsCursor?: components['parameters']['tag_groups_cursor'] - /** @description Case-insensitive substring filter on tag name. Allowed characters are `a-z`, `0-9`, `.`, `_`, `-`. */ - search?: components['parameters']['tag_groups_search'] - /** @description Sort order for the returned tag groups. */ - sort?: components['parameters']['tag_groups_sort'] - } - header?: never - path: { - /** @description Identifier of the template. */ - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned template tag groups. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateTagGroupsResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/{templateID}/tags/count': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * Count template tags - * @description Returns the total number of distinct ready tags for the template. - */ - get: { - parameters: { - query?: never - header?: never - path: { - /** @description Identifier of the template. */ - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned tag count. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateTagsCountResponse'] - } - } - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/{templateID}/tags/exists': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * Check ready template tag existence - * @description Checks whether a template tag has at least one ready assignment. - */ - get: { - parameters: { - query: { - /** @description Template tag name to check. */ - tag: components['parameters']['tag'] - } - header?: never - path: { - /** @description Identifier of the template. */ - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully checked template tag existence. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateTagExistsResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/{templateID}/tags/{tag}/assignments': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * List ready assignments for a single template tag - * @description Returns ready tag assignment events for a single tag, ordered newest first, with keyset cursor pagination. - */ - get: { - parameters: { - query?: { - /** @description Cursor returned by the previous list response in `assigned_at|assignment_id` format. */ - cursor?: components['parameters']['tag_assignments_cursor'] - /** @description Maximum number of assignment rows to return per page. */ - limit?: components['parameters']['tag_assignments_limit'] - } - header?: never - path: { - /** @description Identifier of the template. */ - templateID: components['parameters']['templateID'] - /** @description Template tag name. */ - tag: components['parameters']['tag_path'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned tag assignment page. */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateTagAssignmentsResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } + "/health": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Health check */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Health check successful */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HealthResponse"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/builds": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List team builds */ + get: { + parameters: { + query?: { + /** @description Optional filter by build identifier, template identifier, or template alias. */ + build_id_or_template?: components["parameters"]["build_id_or_template"]; + /** @description Comma-separated list of build statuses to include. */ + statuses?: components["parameters"]["build_statuses"]; + /** @description Maximum number of items to return per page. */ + limit?: components["parameters"]["builds_limit"]; + /** @description Cursor returned by the previous list response in `created_at|build_id` format. */ + cursor?: components["parameters"]["builds_cursor"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned paginated builds. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BuildsListResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/builds/statuses": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get build statuses */ + get: { + parameters: { + query: { + /** @description Comma-separated list of build IDs to get statuses for. */ + build_ids: components["parameters"]["build_ids"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned build statuses */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BuildsStatusesResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/builds/{build_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get build details */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the build. */ + build_id: components["parameters"]["build_id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned build details. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BuildInfo"]; + }; + }; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/record": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get sandbox record */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the sandbox. */ + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned sandbox details. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SandboxRecord"]; + }; + }; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teams": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List user teams + * @description Returns all teams the authenticated user belongs to, with limits and default flag. + */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned user teams. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserTeamsResponse"]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + /** Create team */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateTeamRequest"]; + }; + }; + responses: { + /** @description Successfully created team. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TeamResolveResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/users/bootstrap": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Bootstrap auth provider user */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AdminAuthProviderUserBootstrapRequest"]; + }; + }; + responses: { + /** @description Successfully bootstrapped user. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TeamResolveResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/teams/bootstrap": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Bootstrap team + * @description Creates and provisions a team for an admin-authenticated bootstrap workflow. + */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AdminTeamBootstrapRequest"]; + }; + }; + responses: { + /** @description Successfully bootstrapped team. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TeamResolveResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + 502: components["responses"]["502"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/user-profiles/resolve": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Resolve user profiles */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AdminAuthProviderProfilesResolveRequest"]; + }; + }; + responses: { + /** @description Successfully resolved profiles. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AdminAuthProviderProfilesResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/user-profiles/by-email": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Lookup user profiles by email */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AdminAuthProviderProfilesLookupEmailRequest"]; + }; + }; + responses: { + /** @description Successfully found matching profiles. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AdminAuthProviderProfilesResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/user-profiles/{userId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get user profile */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the user. */ + userId: components["parameters"]["userId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully found profile. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AdminAuthProviderProfilesResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/users/{userId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Delete user + * @description Deletes a user by removing the identity provider record, user_identities mapping, and public.users row. + */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the user. */ + userId: components["parameters"]["userId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully deleted user. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 409: components["responses"]["409"]; + 500: components["responses"]["500"]; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teams/resolve": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Resolve team identity + * @description Resolves a team slug to the team's identity, validating the user is a member. + */ + get: { + parameters: { + query: { + /** @description Team slug to resolve. */ + slug: components["parameters"]["teamSlug"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully resolved team. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TeamResolveResponse"]; + }; + }; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teams/{teamID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Update team */ + patch: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the team. */ + teamID: components["parameters"]["teamID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateTeamRequest"]; + }; + }; + responses: { + /** @description Successfully updated team. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UpdateTeamResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + trace?: never; + }; + "/teams/{teamID}/members": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List team members */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the team. */ + teamID: components["parameters"]["teamID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned team members. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TeamMembersResponse"]; + }; + }; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + /** Add team member */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the team. */ + teamID: components["parameters"]["teamID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AddTeamMemberRequest"]; + }; + }; + responses: { + /** @description Successfully added team member. */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teams/{teamID}/members/{userId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Remove team member */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the team. */ + teamID: components["parameters"]["teamID"]; + /** @description Identifier of the user. */ + userId: components["parameters"]["userId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully removed team member. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List team templates + * @description Returns a paginated list of the team's templates (and default templates inline, unless the team is on a dedicated cluster), with filtering, search, and column sorting via keyset cursor pagination. + */ + get: { + parameters: { + query?: { + /** @description Filter templates by visibility (true = public, false = internal). */ + public?: components["parameters"]["templates_public"]; + /** @description Case-insensitive substring match on template names, aliases, and template id. */ + search?: components["parameters"]["templates_search"]; + /** @description Sort column and direction. */ + sort?: components["parameters"]["templates_sort"]; + /** @description Maximum number of items to return per page. */ + limit?: components["parameters"]["templates_limit"]; + /** @description Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. */ + cursor?: components["parameters"]["templates_cursor"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned paginated templates. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TeamTemplatesResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/defaults": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List default templates + * @description Returns the list of default templates with their latest build info and aliases. + */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned default templates. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DefaultTemplatesResponse"]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{templateID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get template + * @description Returns a single template owned by the current team. Dashboard-shaped read, indexed by template ID. + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the template. */ + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the template. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateDetail"]; + }; + }; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{templateID}/tags/groups": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List template tag groups + * @description Returns ready template tag assignment groups with bounded per-tag history, paginated over tags with keyset cursor. + */ + get: { + parameters: { + query?: { + /** @description Maximum number of ready assignment rows to return per tag. */ + assignmentLimit?: components["parameters"]["tag_assignment_limit"]; + /** @description Maximum number of distinct tags to return per page. */ + tagsLimit?: components["parameters"]["tag_groups_limit"]; + /** @description Cursor returned by the previous list response in `{sort}|{latest_assigned_at}|{tag}` format (sort-tagged, RFC3339Nano). */ + tagsCursor?: components["parameters"]["tag_groups_cursor"]; + /** @description Case-insensitive substring filter on tag name. Allowed characters are `a-z`, `0-9`, `.`, `_`, `-`. */ + search?: components["parameters"]["tag_groups_search"]; + /** @description Sort order for the returned tag groups. */ + sort?: components["parameters"]["tag_groups_sort"]; + }; + header?: never; + path: { + /** @description Identifier of the template. */ + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned template tag groups. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateTagGroupsResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{templateID}/tags/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Count template tags + * @description Returns the total number of distinct ready tags for the template. + */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Identifier of the template. */ + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned tag count. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateTagsCountResponse"]; + }; + }; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{templateID}/tags/exists": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Check ready template tag existence + * @description Checks whether a template tag has at least one ready assignment. + */ + get: { + parameters: { + query: { + /** @description Template tag name to check. */ + tag: components["parameters"]["tag"]; + }; + header?: never; + path: { + /** @description Identifier of the template. */ + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully checked template tag existence. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateTagExistsResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{templateID}/tags/{tag}/assignments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List ready assignments for a single template tag + * @description Returns ready tag assignment events for a single tag, ordered newest first, with keyset cursor pagination. + */ + get: { + parameters: { + query?: { + /** @description Cursor returned by the previous list response in `assigned_at|assignment_id` format. */ + cursor?: components["parameters"]["tag_assignments_cursor"]; + /** @description Maximum number of assignment rows to return per page. */ + limit?: components["parameters"]["tag_assignments_limit"]; + }; + header?: never; + path: { + /** @description Identifier of the template. */ + templateID: components["parameters"]["templateID"]; + /** @description Template tag name. */ + tag: components["parameters"]["tag_path"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned tag assignment page. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateTagAssignmentsResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } -export type webhooks = Record +export type webhooks = Record; export interface components { - schemas: { - Error: { - /** - * Format: int32 - * @description Error code. - */ - code: number - /** @description Error message. */ - message: string - } - AdminAuthProviderProfile: { - /** - * Format: uuid - * @description Internal E2B user identifier. - */ - userId: string - /** @description Email address from the configured auth provider. */ - email: string | null - } - AdminAuthProviderProfilesResponse: { - profiles: components['schemas']['AdminAuthProviderProfile'][] - } - AdminAuthProviderProfilesResolveRequest: { - userIds: string[] - } - AdminAuthProviderProfilesLookupEmailRequest: { - /** Format: email */ - email: string - } - AdminAuthProviderUserBootstrapRequest: { - oidc_issuer: string - oidc_user_id: string - /** Format: email */ - oidc_user_email: string - oidc_user_name?: string | null - signup_ip?: string - signup_user_agent?: string - } - AdminTeamBootstrapRequest: { - /** @description Team name. */ - name: string - /** - * Format: email - * @description Billing/contact email for the team. - */ - email: string - } - /** - * @description Build status mapped for dashboard clients. - * @enum {string} - */ - BuildStatus: 'building' | 'failed' | 'success' - ListedBuild: { - /** - * Format: uuid - * @description Identifier of the build. - */ - id: string - /** @description Template alias when present, otherwise template ID. */ - template: string - /** @description Identifier of the template. */ - templateId: string - status: components['schemas']['BuildStatus'] - /** @description Failure message when status is `failed`, otherwise `null`. */ - statusMessage: string | null - /** - * Format: date-time - * @description Build creation timestamp in RFC3339 format. - */ - createdAt: string - /** - * Format: date-time - * @description Build completion timestamp in RFC3339 format, if finished. - */ - finishedAt: string | null - /** - * Format: int64 - * @description CPU cores configured for the build. - */ - cpuCount: number - /** - * Format: int64 - * @description Memory in MiB configured for the build. - */ - memoryMB: number - /** - * Format: int64 - * @description Disk size in MiB configured for the build, if recorded. - */ - diskSizeMB: number | null - /** @description envd version the build was created with, if recorded. */ - envdVersion: string | null - } - BuildsListResponse: { - data: components['schemas']['ListedBuild'][] - /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ - nextCursor: string | null - } - BuildStatusItem: { - /** - * Format: uuid - * @description Identifier of the build. - */ - id: string - status: components['schemas']['BuildStatus'] - /** - * Format: date-time - * @description Build completion timestamp in RFC3339 format, if finished. - */ - finishedAt: string | null - /** @description Failure message when status is `failed`, otherwise `null`. */ - statusMessage: string | null - } - BuildsStatusesResponse: { - /** @description List of build statuses */ - buildStatuses: components['schemas']['BuildStatusItem'][] - } - BuildInfo: { - /** @description Template names related to this build, if available. */ - names?: string[] | null - /** - * Format: date-time - * @description Build creation timestamp in RFC3339 format. - */ - createdAt: string - /** - * Format: date-time - * @description Build completion timestamp in RFC3339 format, if finished. - */ - finishedAt: string | null - status: components['schemas']['BuildStatus'] - /** @description Failure message when status is `failed`, otherwise `null`. */ - statusMessage: string | null - } - /** - * Format: int64 - * @description CPU cores for the sandbox - */ - CPUCount: number - /** - * Format: int64 - * @description Memory for the sandbox in MiB - */ - MemoryMB: number - /** - * Format: int64 - * @description Disk size for the sandbox in MiB - */ - DiskSizeMB: number - SandboxRecord: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string - /** @description Alias of the template */ - alias?: string - /** @description Identifier of the sandbox */ - sandboxID: string - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string - /** - * Format: date-time - * @description Time when the sandbox was stopped - */ - stoppedAt?: string | null - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null - cpuCount: components['schemas']['CPUCount'] - memoryMB: components['schemas']['MemoryMB'] - diskSizeMB: components['schemas']['DiskSizeMB'] - } - HealthResponse: { - /** @description Human-readable health check result. */ - message: string - } - UserTeamLimits: { - /** Format: int64 */ - maxLengthHours: number - /** Format: int32 */ - concurrentSandboxes: number - /** Format: int32 */ - concurrentTemplateBuilds: number - /** Format: int32 */ - maxVcpu: number - /** Format: int32 */ - maxRamMb: number - /** Format: int32 */ - diskMb: number - } - UserTeam: { - /** Format: uuid */ - id: string - name: string - slug: string - tier: string - email: string - profilePictureUrl: string | null - isBlocked: boolean - isBanned: boolean - blockedReason: string | null - isDefault: boolean - limits: components['schemas']['UserTeamLimits'] - /** Format: date-time */ - createdAt: string - } - UserTeamsResponse: { - teams: components['schemas']['UserTeam'][] - } - TeamMember: { - /** Format: uuid */ - id: string - email: string - name?: string | null - /** Format: uri */ - profilePictureUrl?: string | null - providers: string[] - isDefault: boolean - /** Format: uuid */ - addedBy?: string | null - /** Format: date-time */ - createdAt: string | null - } - TeamMembersResponse: { - members: components['schemas']['TeamMember'][] - } - UpdateTeamRequest: { - name?: string - profilePictureUrl?: string | null - } - UpdateTeamResponse: { - /** Format: uuid */ - id: string - name: string - profilePictureUrl?: string | null - } - AddTeamMemberRequest: { - /** Format: email */ - email: string - } - CreateTeamRequest: { - name: string - } - DefaultTemplateAlias: { - alias: string - namespace?: string | null - } - DefaultTemplate: { - id: string - aliases: components['schemas']['DefaultTemplateAlias'][] - /** Format: uuid */ - buildId: string - /** Format: int64 */ - ramMb: number - /** Format: int64 */ - vcpu: number - /** Format: int64 */ - totalDiskSizeMb: number | null - envdVersion?: string | null - /** Format: date-time */ - createdAt: string - public: boolean - /** Format: int32 */ - buildCount: number - /** Format: int64 */ - spawnCount: number - } - DefaultTemplatesResponse: { - templates: components['schemas']['DefaultTemplate'][] - } - TeamTemplate: { - templateID: string - /** Format: uuid */ - buildID: string - /** Format: int64 */ - cpuCount: number - /** Format: int64 */ - memoryMB: number - /** Format: int64 */ - diskSizeMB: number | null - public: boolean - aliases: string[] - names: string[] - /** Format: date-time */ - createdAt: string - /** Format: date-time */ - updatedAt: string - createdBy: { - /** Format: uuid */ - id: string - email?: string | null - } | null - /** Format: date-time */ - lastSpawnedAt: string | null - /** Format: int64 */ - spawnCount: number - /** Format: int32 */ - buildCount: number - envdVersion: string | null - isDefault: boolean - defaultDescription?: string | null - } - TeamTemplatesResponse: { - data: components['schemas']['TeamTemplate'][] - /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ - nextCursor: string | null - } - /** @description Dashboard-shaped single-template read. Mirrors the infra-api `Template` schema fields the dashboard renders. */ - TemplateDetail: { - /** @description Identifier of the template. */ - templateID: string - /** @description Identifier of the latest ready build for the template, or the zero UUID when none. */ - buildID: string - /** @description vCPU count of the latest ready default build, or `null` when none. */ - cpuCount: components['schemas']['CPUCount'] | null - /** @description Memory in MiB of the latest ready default build, or `null` when none. */ - memoryMB: components['schemas']['MemoryMB'] | null - /** @description Disk size in MiB of the latest ready default build, or `null` when none. */ - diskSizeMB: components['schemas']['DiskSizeMB'] | null - /** @description Whether the template is public or only accessible by the team. */ - public: boolean - /** - * @deprecated - * @description Aliases of the template. - */ - aliases: string[] - /** @description Names of the template (namespace/alias format when namespaced). */ - names: string[] - /** - * Format: date-time - * @description Time when the template was created. - */ - createdAt: string - /** - * Format: date-time - * @description Time when the template was last updated. - */ - updatedAt: string - /** - * Format: date-time - * @description Time when the template was last used. - */ - lastSpawnedAt: string | null - /** - * Format: int64 - * @description Number of times the template was used. - */ - spawnCount: number - /** - * Format: int32 - * @description Number of times the template was built. - */ - buildCount: number - /** @description envd version of the latest ready default build, or `null` when none. */ - envdVersion: string | null - } - TemplateTagAssignment: { - /** - * Format: uuid - * @description Identifier of the tag assignment event. - */ - assignmentId: string - /** - * Format: uuid - * @description Identifier of the assigned build. - */ - buildId: string - /** - * Format: date-time - * @description Time when the tag was assigned to the build. - */ - assignedAt: string - /** - * Format: date-time - * @description Time when the assigned build was created. - */ - buildCreatedAt: string - /** - * Format: date-time - * @description Time when the assigned build finished. - */ - buildFinishedAt: string | null - } - TemplateTagGroup: { - /** @description Template tag name. */ - tag: string - /** @description Ready assignment events for this tag, sorted latest first. */ - assignments: components['schemas']['TemplateTagAssignment'][] - /** @description Whether more ready assignment events exist beyond the requested assignment limit. */ - hasMore: boolean - } - TemplateTagGroupsResponse: { - tags: components['schemas']['TemplateTagGroup'][] - /** @description Cursor to pass as `tagsCursor` for the next page, or `null` if there is no next page. */ - nextCursor: string | null - } - TemplateTagsCountResponse: { - /** - * Format: int64 - * @description Total distinct ready tags for the template. - */ - total: number - } - TemplateTagExistsResponse: { - /** @description Whether the template tag has at least one ready assignment. */ - exists: boolean - /** @description Normalized template tag name. */ - normalizedTag: string - } - TemplateTagAssignmentsResponse: { - /** @description Ready assignment events for the tag, sorted latest first. */ - data: components['schemas']['TemplateTagAssignment'][] - /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ - nextCursor: string | null - } - TeamResolveResponse: { - /** Format: uuid */ - id: string - slug: string - } - } - responses: { - /** @description Bad request */ - 400: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Authentication error */ - 401: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Forbidden */ - 403: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Not found */ - 404: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Server error */ - 500: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Upstream error */ - 502: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - } - parameters: { - /** @description Identifier of the build. */ - build_id: string - /** @description Identifier of the sandbox. */ - sandboxID: string - /** @description Maximum number of items to return per page. */ - builds_limit: number - /** @description Cursor returned by the previous list response in `created_at|build_id` format. */ - builds_cursor: string - /** @description Optional filter by build identifier, template identifier, or template alias. */ - build_id_or_template: string - /** @description Comma-separated list of build statuses to include. */ - build_statuses: components['schemas']['BuildStatus'][] - /** @description Comma-separated list of build IDs to get statuses for. */ - build_ids: string[] - /** @description Identifier of the team. */ - teamID: string - /** @description Identifier of the user. */ - userId: string - /** @description Team slug to resolve. */ - teamSlug: string - /** @description Maximum number of items to return per page. */ - templates_limit: number - /** @description Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. */ - templates_cursor: string - /** @description Filter templates by visibility (true = public, false = internal). */ - templates_public: boolean - /** @description Case-insensitive substring match on template names, aliases, and template id. */ - templates_search: string - /** @description Sort column and direction. */ - templates_sort: - | 'created_at_asc' - | 'created_at_desc' - | 'updated_at_asc' - | 'updated_at_desc' - /** @description Identifier of the template. */ - templateID: string - /** @description Template tag name to check. */ - tag: string - /** @description Maximum number of ready assignment rows to return per tag. */ - tag_assignment_limit: number - /** @description Template tag name. */ - tag_path: string - /** @description Maximum number of assignment rows to return per page. */ - tag_assignments_limit: number - /** @description Cursor returned by the previous list response in `assigned_at|assignment_id` format. */ - tag_assignments_cursor: string - /** @description Maximum number of distinct tags to return per page. */ - tag_groups_limit: number - /** @description Cursor returned by the previous list response in `{sort}|{latest_assigned_at}|{tag}` format (sort-tagged, RFC3339Nano). */ - tag_groups_cursor: string - /** @description Case-insensitive substring filter on tag name. Allowed characters are `a-z`, `0-9`, `.`, `_`, `-`. */ - tag_groups_search: string - /** @description Sort order for the returned tag groups. */ - tag_groups_sort: 'latest_desc' | 'latest_asc' | 'name_asc' | 'name_desc' - } - requestBodies: never - headers: never - pathItems: never + schemas: { + Error: { + /** + * Format: int32 + * @description Error code. + */ + code: number; + /** @description Error message. */ + message: string; + }; + AdminAuthProviderProfile: { + /** + * Format: uuid + * @description Internal E2B user identifier. + */ + userId: string; + /** @description Email address from the configured auth provider. */ + email: string | null; + }; + AdminAuthProviderProfilesResponse: { + profiles: components["schemas"]["AdminAuthProviderProfile"][]; + }; + AdminAuthProviderProfilesResolveRequest: { + userIds: string[]; + }; + AdminAuthProviderProfilesLookupEmailRequest: { + /** Format: email */ + email: string; + }; + AdminAuthProviderUserBootstrapRequest: { + oidc_issuer: string; + oidc_user_id: string; + /** Format: email */ + oidc_user_email: string; + oidc_user_name?: string | null; + signup_ip?: string; + signup_user_agent?: string; + }; + AdminTeamBootstrapRequest: { + /** @description Team name. */ + name: string; + /** + * Format: email + * @description Billing/contact email for the team. + */ + email: string; + }; + /** + * @description Build status mapped for dashboard clients. + * @enum {string} + */ + BuildStatus: "building" | "failed" | "success"; + ListedBuild: { + /** + * Format: uuid + * @description Identifier of the build. + */ + id: string; + /** @description Template alias when present, otherwise template ID. */ + template: string; + /** @description Identifier of the template. */ + templateId: string; + status: components["schemas"]["BuildStatus"]; + /** @description Failure message when status is `failed`, otherwise `null`. */ + statusMessage: string | null; + /** + * Format: date-time + * @description Build creation timestamp in RFC3339 format. + */ + createdAt: string; + /** + * Format: date-time + * @description Build completion timestamp in RFC3339 format, if finished. + */ + finishedAt: string | null; + /** + * Format: int64 + * @description CPU cores configured for the build. + */ + cpuCount: number; + /** + * Format: int64 + * @description Memory in MiB configured for the build. + */ + memoryMB: number; + /** + * Format: int64 + * @description Disk size in MiB configured for the build, if recorded. + */ + diskSizeMB: number | null; + /** @description envd version the build was created with, if recorded. */ + envdVersion: string | null; + }; + BuildsListResponse: { + data: components["schemas"]["ListedBuild"][]; + /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ + nextCursor: string | null; + }; + BuildStatusItem: { + /** + * Format: uuid + * @description Identifier of the build. + */ + id: string; + status: components["schemas"]["BuildStatus"]; + /** + * Format: date-time + * @description Build completion timestamp in RFC3339 format, if finished. + */ + finishedAt: string | null; + /** @description Failure message when status is `failed`, otherwise `null`. */ + statusMessage: string | null; + }; + BuildsStatusesResponse: { + /** @description List of build statuses */ + buildStatuses: components["schemas"]["BuildStatusItem"][]; + }; + BuildInfo: { + /** @description Template names related to this build, if available. */ + names?: string[] | null; + /** + * Format: date-time + * @description Build creation timestamp in RFC3339 format. + */ + createdAt: string; + /** + * Format: date-time + * @description Build completion timestamp in RFC3339 format, if finished. + */ + finishedAt: string | null; + status: components["schemas"]["BuildStatus"]; + /** @description Failure message when status is `failed`, otherwise `null`. */ + statusMessage: string | null; + }; + /** + * Format: int64 + * @description CPU cores for the sandbox + */ + CPUCount: number; + /** + * Format: int64 + * @description Memory for the sandbox in MiB + */ + MemoryMB: number; + /** + * Format: int64 + * @description Disk size for the sandbox in MiB + */ + DiskSizeMB: number; + SandboxRecord: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string; + /** @description Alias of the template */ + alias?: string; + /** @description Identifier of the sandbox */ + sandboxID: string; + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string; + /** + * Format: date-time + * @description Time when the sandbox was stopped + */ + stoppedAt?: string | null; + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null; + cpuCount: components["schemas"]["CPUCount"]; + memoryMB: components["schemas"]["MemoryMB"]; + diskSizeMB: components["schemas"]["DiskSizeMB"]; + }; + HealthResponse: { + /** @description Human-readable health check result. */ + message: string; + }; + UserTeamLimits: { + /** Format: int64 */ + maxLengthHours: number; + /** Format: int32 */ + concurrentSandboxes: number; + /** Format: int32 */ + concurrentTemplateBuilds: number; + /** Format: int32 */ + maxVcpu: number; + /** Format: int32 */ + maxRamMb: number; + /** Format: int32 */ + diskMb: number; + }; + UserTeam: { + /** Format: uuid */ + id: string; + name: string; + slug: string; + tier: string; + email: string; + profilePictureUrl: string | null; + isBlocked: boolean; + isBanned: boolean; + blockedReason: string | null; + isDefault: boolean; + limits: components["schemas"]["UserTeamLimits"]; + /** Format: date-time */ + createdAt: string; + }; + UserTeamsResponse: { + teams: components["schemas"]["UserTeam"][]; + }; + TeamMember: { + /** Format: uuid */ + id: string; + email: string; + name?: string | null; + /** Format: uri */ + profilePictureUrl?: string | null; + providers: string[]; + isDefault: boolean; + /** Format: uuid */ + addedBy?: string | null; + /** Format: date-time */ + createdAt: string | null; + }; + TeamMembersResponse: { + members: components["schemas"]["TeamMember"][]; + }; + UpdateTeamRequest: { + name?: string; + profilePictureUrl?: string | null; + }; + UpdateTeamResponse: { + /** Format: uuid */ + id: string; + name: string; + profilePictureUrl?: string | null; + }; + AddTeamMemberRequest: { + /** Format: email */ + email: string; + }; + CreateTeamRequest: { + name: string; + }; + DefaultTemplateAlias: { + alias: string; + namespace?: string | null; + }; + DefaultTemplate: { + id: string; + aliases: components["schemas"]["DefaultTemplateAlias"][]; + /** Format: uuid */ + buildId: string; + /** Format: int64 */ + ramMb: number; + /** Format: int64 */ + vcpu: number; + /** Format: int64 */ + totalDiskSizeMb: number | null; + envdVersion?: string | null; + /** Format: date-time */ + createdAt: string; + public: boolean; + /** Format: int32 */ + buildCount: number; + /** Format: int64 */ + spawnCount: number; + }; + DefaultTemplatesResponse: { + templates: components["schemas"]["DefaultTemplate"][]; + }; + TeamTemplate: { + templateID: string; + /** Format: uuid */ + buildID: string; + /** Format: int64 */ + cpuCount: number; + /** Format: int64 */ + memoryMB: number; + /** Format: int64 */ + diskSizeMB: number | null; + public: boolean; + aliases: string[]; + names: string[]; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + createdBy: { + /** Format: uuid */ + id: string; + email?: string | null; + } | null; + /** Format: date-time */ + lastSpawnedAt: string | null; + /** Format: int64 */ + spawnCount: number; + /** Format: int32 */ + buildCount: number; + envdVersion: string | null; + isDefault: boolean; + defaultDescription?: string | null; + }; + TeamTemplatesResponse: { + data: components["schemas"]["TeamTemplate"][]; + /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ + nextCursor: string | null; + }; + /** @description Dashboard-shaped single-template read. Mirrors the infra-api `Template` schema fields the dashboard renders. */ + TemplateDetail: { + /** @description Identifier of the template. */ + templateID: string; + /** @description Identifier of the latest ready build for the template, or the zero UUID when none. */ + buildID: string; + /** @description vCPU count of the latest ready default build, or `null` when none. */ + cpuCount: components["schemas"]["CPUCount"] | null; + /** @description Memory in MiB of the latest ready default build, or `null` when none. */ + memoryMB: components["schemas"]["MemoryMB"] | null; + /** @description Disk size in MiB of the latest ready default build, or `null` when none. */ + diskSizeMB: components["schemas"]["DiskSizeMB"] | null; + /** @description Whether the template is public or only accessible by the team. */ + public: boolean; + /** + * @deprecated + * @description Aliases of the template. + */ + aliases: string[]; + /** @description Names of the template (namespace/alias format when namespaced). */ + names: string[]; + /** + * Format: date-time + * @description Time when the template was created. + */ + createdAt: string; + /** + * Format: date-time + * @description Time when the template was last updated. + */ + updatedAt: string; + /** + * Format: date-time + * @description Time when the template was last used. + */ + lastSpawnedAt: string | null; + /** + * Format: int64 + * @description Number of times the template was used. + */ + spawnCount: number; + /** + * Format: int32 + * @description Number of times the template was built. + */ + buildCount: number; + /** @description envd version of the latest ready default build, or `null` when none. */ + envdVersion: string | null; + }; + TemplateTagAssignment: { + /** + * Format: uuid + * @description Identifier of the tag assignment event. + */ + assignmentId: string; + /** + * Format: uuid + * @description Identifier of the assigned build. + */ + buildId: string; + /** + * Format: date-time + * @description Time when the tag was assigned to the build. + */ + assignedAt: string; + /** + * Format: date-time + * @description Time when the assigned build was created. + */ + buildCreatedAt: string; + /** + * Format: date-time + * @description Time when the assigned build finished. + */ + buildFinishedAt: string | null; + }; + TemplateTagGroup: { + /** @description Template tag name. */ + tag: string; + /** @description Ready assignment events for this tag, sorted latest first. */ + assignments: components["schemas"]["TemplateTagAssignment"][]; + /** @description Whether more ready assignment events exist beyond the requested assignment limit. */ + hasMore: boolean; + }; + TemplateTagGroupsResponse: { + tags: components["schemas"]["TemplateTagGroup"][]; + /** @description Cursor to pass as `tagsCursor` for the next page, or `null` if there is no next page. */ + nextCursor: string | null; + }; + TemplateTagsCountResponse: { + /** + * Format: int64 + * @description Total distinct ready tags for the template. + */ + total: number; + }; + TemplateTagExistsResponse: { + /** @description Whether the template tag has at least one ready assignment. */ + exists: boolean; + /** @description Normalized template tag name. */ + normalizedTag: string; + }; + TemplateTagAssignmentsResponse: { + /** @description Ready assignment events for the tag, sorted latest first. */ + data: components["schemas"]["TemplateTagAssignment"][]; + /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ + nextCursor: string | null; + }; + TeamResolveResponse: { + /** Format: uuid */ + id: string; + slug: string; + }; + }; + responses: { + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Authentication error */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Upstream error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + }; + parameters: { + /** @description Identifier of the build. */ + build_id: string; + /** @description Identifier of the sandbox. */ + sandboxID: string; + /** @description Maximum number of items to return per page. */ + builds_limit: number; + /** @description Cursor returned by the previous list response in `created_at|build_id` format. */ + builds_cursor: string; + /** @description Optional filter by build identifier, template identifier, or template alias. */ + build_id_or_template: string; + /** @description Comma-separated list of build statuses to include. */ + build_statuses: components["schemas"]["BuildStatus"][]; + /** @description Comma-separated list of build IDs to get statuses for. */ + build_ids: string[]; + /** @description Identifier of the team. */ + teamID: string; + /** @description Identifier of the user. */ + userId: string; + /** @description Team slug to resolve. */ + teamSlug: string; + /** @description Maximum number of items to return per page. */ + templates_limit: number; + /** @description Identifier of the template. */ + templateID: string; + /** @description Template tag name to check. */ + tag: string; + /** @description Maximum number of ready assignment rows to return per tag. */ + tag_assignment_limit: number; + /** @description Template tag name. */ + tag_path: string; + /** @description Maximum number of assignment rows to return per page. */ + tag_assignments_limit: number; + /** @description Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. */ + templates_cursor: string; + /** @description Filter templates by visibility (true = public, false = internal). */ + templates_public: boolean; + /** @description Case-insensitive substring match on template names, aliases, and template id. */ + templates_search: string; + /** @description Sort column and direction. */ + templates_sort: "created_at_asc" | "created_at_desc" | "updated_at_asc" | "updated_at_desc"; + /** @description Cursor returned by the previous list response in `assigned_at|assignment_id` format. */ + tag_assignments_cursor: string; + /** @description Maximum number of distinct tags to return per page. */ + tag_groups_limit: number; + /** @description Cursor returned by the previous list response in `{sort}|{latest_assigned_at}|{tag}` format (sort-tagged, RFC3339Nano). */ + tag_groups_cursor: string; + /** @description Case-insensitive substring filter on tag name. Allowed characters are `a-z`, `0-9`, `.`, `_`, `-`. */ + tag_groups_search: string; + /** @description Sort order for the returned tag groups. */ + tag_groups_sort: "latest_desc" | "latest_asc" | "name_asc" | "name_desc"; + }; + requestBodies: never; + headers: never; + pathItems: never; } -export type $defs = Record -export type operations = Record +export type $defs = Record; +export type operations = Record; diff --git a/src/core/shared/contracts/infra-api.types.ts b/src/core/shared/contracts/infra-api.types.ts index fd88950af..c2440215d 100644 --- a/src/core/shared/contracts/infra-api.types.ts +++ b/src/core/shared/contracts/infra-api.types.ts @@ -4,3431 +4,3428 @@ */ export interface paths { - '/health': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Health check */ - get: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description The service is healthy */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/teams': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all teams */ - get: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned all teams */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Team'][] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/teams/{teamID}/metrics': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get metrics for the team */ - get: { - parameters: { - query?: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number - end?: number - } - header?: never - path: { - teamID: components['parameters']['teamID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the team metrics */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TeamMetric'][] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/teams/{teamID}/metrics/max': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get the maximum metrics for the team in the given interval */ - get: { - parameters: { - query: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number - end?: number - /** @description Metric to retrieve the maximum value for */ - metric: 'concurrent_sandboxes' | 'sandbox_start_rate' - } - header?: never - path: { - teamID: components['parameters']['teamID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the team metrics */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['MaxTeamMetric'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all running sandboxes */ - get: { - parameters: { - query?: { - /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ - metadata?: string - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned all running sandboxes */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['ListedSandbox'][] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - /** @description Create a sandbox from the template */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['NewSandbox'] - } - } - responses: { - /** @description The sandbox was created successfully */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Sandbox'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/v2/sandboxes': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all sandboxes */ - get: { - parameters: { - query?: { - /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ - metadata?: string - /** @description Filter sandboxes by one or more states */ - state?: components['schemas']['SandboxState'][] - /** @description Cursor to start the list from */ - nextToken?: components['parameters']['paginationNextToken'] - /** @description Maximum number of items to return per page */ - limit?: components['parameters']['paginationLimit'] - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned all running sandboxes */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['ListedSandbox'][] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/metrics': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List metrics for given sandboxes */ - get: { - parameters: { - query: { - /** @description Comma-separated list of sandbox IDs to get metrics for */ - sandbox_ids: string[] - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned all running sandboxes with metrics */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['SandboxesWithMetrics'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/logs': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * @deprecated - * @description Get sandbox logs. Use /v2/sandboxes/{sandboxID}/logs instead. - */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - start?: number - /** @description Maximum number of logs that should be returned */ - limit?: number - } - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the sandbox logs */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['SandboxLogs'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/v2/sandboxes/{sandboxID}/logs': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get sandbox logs */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - cursor?: number - /** @description Maximum number of logs that should be returned */ - limit?: number - /** @description Direction of the logs that should be returned */ - direction?: components['schemas']['LogsDirection'] - /** @description Minimum log level to return. Logs below this level are excluded */ - level?: components['schemas']['LogLevel'] - /** @description Case-sensitive substring match on log message content */ - search?: string - } - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the sandbox logs */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['SandboxLogsV2Response'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get a sandbox by id */ - get: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the sandbox */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['SandboxDetail'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - /** @description Kill a sandbox */ - delete: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description The sandbox was killed successfully */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/metrics': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get sandbox metrics */ - get: { - parameters: { - query?: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number - end?: number - } - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the sandbox metrics */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['SandboxMetric'][] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/pause': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** @description Pause the sandbox */ - post: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description The sandbox was paused successfully and can be resumed */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 409: components['responses']['409'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/resume': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** - * @deprecated - * @description Resume the sandbox - */ - post: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['ResumedSandbox'] - } - } - responses: { - /** @description The sandbox was resumed successfully */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Sandbox'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 409: components['responses']['409'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/connect': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */ - post: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['ConnectSandbox'] - } - } - responses: { - /** @description The sandbox was already running */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Sandbox'] - } - } - /** @description The sandbox was resumed successfully */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Sandbox'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/timeout': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */ - post: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: { - content: { - 'application/json': components['schemas']['SandboxTimeoutRequest'] - } - } - responses: { - /** @description Successfully set the sandbox timeout */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/network': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - /** @description Update the network configuration for a running sandbox. Replaces the current egress rules with the provided configuration. Omitting field clears it. */ - put: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['SandboxNetworkUpdateConfig'] - } - } - responses: { - /** @description Successfully updated the sandbox network configuration */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 409: components['responses']['409'] - 500: components['responses']['500'] - } - } - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/refreshes': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** @description Refresh the sandbox extending its time to live */ - post: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: { - content: { - 'application/json': components['schemas']['SandboxRefreshRequest'] - } - } - responses: { - /** @description Successfully refreshed the sandbox */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/sandboxes/{sandboxID}/snapshots': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** @description Create a persistent snapshot from the sandbox's current state. Snapshots can be used to create new sandboxes and persist beyond the original sandbox's lifetime. */ - post: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['SandboxSnapshotRequest'] - } - } - responses: { - /** @description Snapshot created successfully */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['SnapshotInfo'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/snapshots': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all snapshots for the team */ - get: { - parameters: { - query?: { - sandboxID?: string - /** @description Maximum number of items to return per page */ - limit?: components['parameters']['paginationLimit'] - /** @description Cursor to start the list from */ - nextToken?: components['parameters']['paginationNextToken'] - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned snapshots */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['SnapshotInfo'][] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/v3/templates': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** @description Create a new template */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['TemplateBuildRequestV3'] - } - } - responses: { - /** @description The build was requested successfully */ - 202: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateRequestResponseV3'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/v2/templates': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** - * @deprecated - * @description Create a new template - */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['TemplateBuildRequestV2'] - } - } - responses: { - /** @description The build was requested successfully */ - 202: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateLegacy'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/{templateID}/files/{hash}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get an upload link for a tar file containing build layer files */ - get: { - parameters: { - query?: never - header?: never - path: { - templateID: components['parameters']['templateID'] - hash: string - } - cookie?: never - } - requestBody?: never - responses: { - /** @description The upload link where to upload the tar file */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateBuildFileUpload'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all templates */ - get: { - parameters: { - query?: { - teamID?: string - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned all templates */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Template'][] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - /** - * @deprecated - * @description Create a new template - */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['TemplateBuildRequest'] - } - } - responses: { - /** @description The build was accepted */ - 202: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateLegacy'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/{templateID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all builds for a template */ - get: { - parameters: { - query?: { - /** @description Cursor to start the list from */ - nextToken?: components['parameters']['paginationNextToken'] - /** @description Maximum number of items to return per page */ - limit?: components['parameters']['paginationLimit'] - } - header?: never - path: { - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the template with its builds */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateWithBuilds'] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - /** - * @deprecated - * @description Rebuild an template - */ - post: { - parameters: { - query?: never - header?: never - path: { - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['TemplateBuildRequest'] - } - } - responses: { - /** @description The build was accepted */ - 202: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateLegacy'] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - /** @description Delete a template */ - delete: { - parameters: { - query?: never - header?: never - path: { - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description The template was deleted successfully */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - options?: never - head?: never - /** - * @deprecated - * @description Update template - */ - patch: { - parameters: { - query?: never - header?: never - path: { - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['TemplateUpdateRequest'] - } - } - responses: { - /** @description The template was updated successfully */ - 200: { - headers: { - [name: string]: unknown - } - content?: never - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - trace?: never - } - '/templates/{templateID}/builds/{buildID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** - * @deprecated - * @description Start the build - */ - post: { - parameters: { - query?: never - header?: never - path: { - templateID: components['parameters']['templateID'] - buildID: components['parameters']['buildID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description The build has started */ - 202: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/v2/templates/{templateID}/builds/{buildID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** @description Start the build */ - post: { - parameters: { - query?: never - header?: never - path: { - templateID: components['parameters']['templateID'] - buildID: components['parameters']['buildID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['TemplateBuildStartV2'] - } - } - responses: { - /** @description The build has started */ - 202: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/v2/templates/{templateID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - post?: never - delete?: never - options?: never - head?: never - /** @description Update template */ - patch: { - parameters: { - query?: never - header?: never - path: { - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['TemplateUpdateRequest'] - } - } - responses: { - /** @description The template was updated successfully */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateUpdateResponse'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - trace?: never - } - '/templates/{templateID}/builds/{buildID}/status': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get template build info */ - get: { - parameters: { - query?: { - /** @description Index of the starting build log that should be returned with the template */ - logsOffset?: number - /** @description Maximum number of logs that should be returned */ - limit?: number - level?: components['schemas']['LogLevel'] - } - header?: never - path: { - templateID: components['parameters']['templateID'] - buildID: components['parameters']['buildID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the template */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateBuildInfo'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/{templateID}/builds/{buildID}/logs': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get template build logs */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - cursor?: number - /** @description Maximum number of logs that should be returned */ - limit?: number - direction?: components['schemas']['LogsDirection'] - level?: components['schemas']['LogLevel'] - /** @description Source of the logs that should be returned from */ - source?: components['schemas']['LogsSource'] - } - header?: never - path: { - templateID: components['parameters']['templateID'] - buildID: components['parameters']['buildID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the template build logs */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateBuildLogsResponse'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/tags': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** @description Assign tag(s) to a template build */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['AssignTemplateTagsRequest'] - } - } - responses: { - /** @description Tag assigned successfully */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['AssignedTemplateTags'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - /** @description Delete multiple tags from templates */ - delete: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['DeleteTemplateTagsRequest'] - } - } - responses: { - /** @description Tags deleted successfully */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/{templateID}/tags': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all tags for a template */ - get: { - parameters: { - query?: never - header?: never - path: { - templateID: components['parameters']['templateID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the template tags */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateTag'][] - } - } - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/templates/aliases/{alias}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Check if template with given alias exists */ - get: { - parameters: { - query?: never - header?: never - path: { - alias: string - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully queried template by alias */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TemplateAliasResponse'] - } - } - 400: components['responses']['400'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/nodes': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all nodes */ - get: { - parameters: { - query?: { - /** @description Identifier of the cluster */ - clusterID?: string - } - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned all nodes */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Node'][] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/nodes/{nodeID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get node info */ - get: { - parameters: { - query?: { - /** @description Identifier of the cluster */ - clusterID?: string - } - header?: never - path: { - nodeID: components['parameters']['nodeID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned the node */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['NodeDetail'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - /** @description Change status of a node */ - post: { - parameters: { - query?: never - header?: never - path: { - nodeID: components['parameters']['nodeID'] - } - cookie?: never - } - requestBody?: { - content: { - 'application/json': components['schemas']['NodeStatusChange'] - } - } - responses: { - /** @description The node status was changed successfully */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/teams/{teamID}/sandboxes/kill': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** - * Kill all sandboxes for a team - * @description Kills all sandboxes for the specified team - */ - post: { - parameters: { - query?: never - header?: never - path: { - /** @description Team ID */ - teamID: string - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully killed sandboxes */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['AdminSandboxKillResult'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/teams/{teamID}/builds/cancel': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** - * Cancel all builds for a team - * @description Cancels all in-progress and pending builds for the specified team - */ - post: { - parameters: { - query?: never - header?: never - path: { - /** @description Team ID */ - teamID: string - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully cancelled builds */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['AdminBuildCancelResult'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/teams/{teamID}/api-keys': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** - * Create team API key as admin - * @description Creates a team API key for internal service workflows. - */ - post: { - parameters: { - query?: never - header?: never - path: { - /** @description Team ID */ - teamID: string - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['NewTeamAPIKey'] - } - } - responses: { - /** @description Team API key created successfully */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['CreatedTeamAPIKey'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/admin/teams/{teamID}/api-keys/{apiKeyID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - post?: never - /** - * Delete team API key as admin - * @description Deletes a team API key for internal service workflows. - */ - delete: { - parameters: { - query?: never - header?: never - path: { - /** @description Team ID */ - teamID: string - apiKeyID: components['parameters']['apiKeyID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Team API key deleted successfully */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - options?: never - head?: never - patch?: never - trace?: never - } - '/access-tokens': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** @description Create a new access token */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['NewAccessToken'] - } - } - responses: { - /** @description Access token created successfully */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['CreatedAccessToken'] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/access-tokens/{accessTokenID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - post?: never - /** @description Delete an access token */ - delete: { - parameters: { - query?: never - header?: never - path: { - accessTokenID: components['parameters']['accessTokenID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Access token deleted successfully */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - options?: never - head?: never - patch?: never - trace?: never - } - '/api-keys': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all team API keys */ - get: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully returned all team API keys */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['TeamAPIKey'][] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - /** @description Create a new team API key */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['NewTeamAPIKey'] - } - } - responses: { - /** @description Team API key created successfully */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['CreatedTeamAPIKey'] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api-keys/{apiKeyID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - post?: never - /** @description Delete a team API key */ - delete: { - parameters: { - query?: never - header?: never - path: { - apiKeyID: components['parameters']['apiKeyID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Team API key deleted successfully */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - options?: never - head?: never - /** @description Update a team API key */ - patch: { - parameters: { - query?: never - header?: never - path: { - apiKeyID: components['parameters']['apiKeyID'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['UpdateTeamAPIKey'] - } - } - responses: { - /** @description Team API key updated successfully */ - 200: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - trace?: never - } - '/volumes': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description List all team volumes */ - get: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully listed all team volumes */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Volume'][] - } - } - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - put?: never - /** @description Create a new team volume */ - post: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['NewVolume'] - } - } - responses: { - /** @description Successfully created a new team volume */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['VolumeAndToken'] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 500: components['responses']['500'] - } - } - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/volumes/{volumeID}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** @description Get team volume info */ - get: { - parameters: { - query?: never - header?: never - path: { - volumeID: components['parameters']['volumeID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully retrieved a team volume */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['VolumeAndToken'] - } - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - put?: never - post?: never - /** @description Delete a team volume */ - delete: { - parameters: { - query?: never - header?: never - path: { - volumeID: components['parameters']['volumeID'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description Successfully deleted a team volume */ - 204: { - headers: { - [name: string]: unknown - } - content?: never - } - 401: components['responses']['401'] - 404: components['responses']['404'] - 500: components['responses']['500'] - } - } - options?: never - head?: never - patch?: never - trace?: never - } + "/health": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Health check */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The service is healthy */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teams": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all teams */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned all teams */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Team"][]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teams/{teamID}/metrics": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get metrics for the team */ + get: { + parameters: { + query?: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number; + end?: number; + }; + header?: never; + path: { + teamID: components["parameters"]["teamID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the team metrics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TeamMetric"][]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teams/{teamID}/metrics/max": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get the maximum metrics for the team in the given interval */ + get: { + parameters: { + query: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number; + end?: number; + /** @description Metric to retrieve the maximum value for */ + metric: "concurrent_sandboxes" | "sandbox_start_rate"; + }; + header?: never; + path: { + teamID: components["parameters"]["teamID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the team metrics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MaxTeamMetric"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all running sandboxes */ + get: { + parameters: { + query?: { + /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ + metadata?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned all running sandboxes */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ListedSandbox"][]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + /** @description Create a sandbox from the template */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["NewSandbox"]; + }; + }; + responses: { + /** @description The sandbox was created successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Sandbox"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v2/sandboxes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all sandboxes */ + get: { + parameters: { + query?: { + /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ + metadata?: string; + /** @description Filter sandboxes by one or more states */ + state?: components["schemas"]["SandboxState"][]; + /** @description Cursor to start the list from */ + nextToken?: components["parameters"]["paginationNextToken"]; + /** @description Maximum number of items to return per page */ + limit?: components["parameters"]["paginationLimit"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned all running sandboxes */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ListedSandbox"][]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/metrics": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List metrics for given sandboxes */ + get: { + parameters: { + query: { + /** @description Comma-separated list of sandbox IDs to get metrics for */ + sandbox_ids: string[]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned all running sandboxes with metrics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SandboxesWithMetrics"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/logs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * @deprecated + * @description Get sandbox logs. Use /v2/sandboxes/{sandboxID}/logs instead. + */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + start?: number; + /** @description Maximum number of logs that should be returned */ + limit?: number; + }; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the sandbox logs */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SandboxLogs"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v2/sandboxes/{sandboxID}/logs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get sandbox logs */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + cursor?: number; + /** @description Maximum number of logs that should be returned */ + limit?: number; + /** @description Direction of the logs that should be returned */ + direction?: components["schemas"]["LogsDirection"]; + /** @description Minimum log level to return. Logs below this level are excluded */ + level?: components["schemas"]["LogLevel"]; + /** @description Case-sensitive substring match on log message content */ + search?: string; + }; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the sandbox logs */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SandboxLogsV2Response"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a sandbox by id */ + get: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the sandbox */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SandboxDetail"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + /** @description Kill a sandbox */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The sandbox was killed successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/metrics": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get sandbox metrics */ + get: { + parameters: { + query?: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number; + end?: number; + }; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the sandbox metrics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SandboxMetric"][]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/pause": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Pause the sandbox */ + post: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The sandbox was paused successfully and can be resumed */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 409: components["responses"]["409"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/resume": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * @deprecated + * @description Resume the sandbox + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ResumedSandbox"]; + }; + }; + responses: { + /** @description The sandbox was resumed successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Sandbox"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 409: components["responses"]["409"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/connect": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ConnectSandbox"]; + }; + }; + responses: { + /** @description The sandbox was already running */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Sandbox"]; + }; + }; + /** @description The sandbox was resumed successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Sandbox"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/timeout": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["SandboxTimeoutRequest"]; + }; + }; + responses: { + /** @description Successfully set the sandbox timeout */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/network": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update the network configuration for a running sandbox. Replaces the current egress rules with the provided configuration. Omitting field clears it. */ + put: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SandboxNetworkUpdateConfig"]; + }; + }; + responses: { + /** @description Successfully updated the sandbox network configuration */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 409: components["responses"]["409"]; + 500: components["responses"]["500"]; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/refreshes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Refresh the sandbox extending its time to live */ + post: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["SandboxRefreshRequest"]; + }; + }; + responses: { + /** @description Successfully refreshed the sandbox */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sandboxes/{sandboxID}/snapshots": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a persistent snapshot from the sandbox's current state. Snapshots can be used to create new sandboxes and persist beyond the original sandbox's lifetime. */ + post: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SandboxSnapshotRequest"]; + }; + }; + responses: { + /** @description Snapshot created successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SnapshotInfo"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/snapshots": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all snapshots for the team */ + get: { + parameters: { + query?: { + sandboxID?: string; + /** @description Maximum number of items to return per page */ + limit?: components["parameters"]["paginationLimit"]; + /** @description Cursor to start the list from */ + nextToken?: components["parameters"]["paginationNextToken"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned snapshots */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SnapshotInfo"][]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v3/templates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a new template */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TemplateBuildRequestV3"]; + }; + }; + responses: { + /** @description The build was requested successfully */ + 202: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateRequestResponseV3"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v2/templates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * @deprecated + * @description Create a new template + */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TemplateBuildRequestV2"]; + }; + }; + responses: { + /** @description The build was requested successfully */ + 202: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateLegacy"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{templateID}/files/{hash}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get an upload link for a tar file containing build layer files */ + get: { + parameters: { + query?: never; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + hash: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The upload link where to upload the tar file */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateBuildFileUpload"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all templates */ + get: { + parameters: { + query?: { + teamID?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned all templates */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Template"][]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + /** + * @deprecated + * @description Create a new template + */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TemplateBuildRequest"]; + }; + }; + responses: { + /** @description The build was accepted */ + 202: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateLegacy"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{templateID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all builds for a template */ + get: { + parameters: { + query?: { + /** @description Cursor to start the list from */ + nextToken?: components["parameters"]["paginationNextToken"]; + /** @description Maximum number of items to return per page */ + limit?: components["parameters"]["paginationLimit"]; + }; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the template with its builds */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateWithBuilds"]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + /** + * @deprecated + * @description Rebuild an template + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TemplateBuildRequest"]; + }; + }; + responses: { + /** @description The build was accepted */ + 202: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateLegacy"]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + /** @description Delete a template */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The template was deleted successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + options?: never; + head?: never; + /** + * @deprecated + * @description Update template + */ + patch: { + parameters: { + query?: never; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TemplateUpdateRequest"]; + }; + }; + responses: { + /** @description The template was updated successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + trace?: never; + }; + "/templates/{templateID}/builds/{buildID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * @deprecated + * @description Start the build + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + buildID: components["parameters"]["buildID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The build has started */ + 202: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v2/templates/{templateID}/builds/{buildID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Start the build */ + post: { + parameters: { + query?: never; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + buildID: components["parameters"]["buildID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TemplateBuildStartV2"]; + }; + }; + responses: { + /** @description The build has started */ + 202: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v2/templates/{templateID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** @description Update template */ + patch: { + parameters: { + query?: never; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TemplateUpdateRequest"]; + }; + }; + responses: { + /** @description The template was updated successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateUpdateResponse"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + trace?: never; + }; + "/templates/{templateID}/builds/{buildID}/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get template build info */ + get: { + parameters: { + query?: { + /** @description Index of the starting build log that should be returned with the template */ + logsOffset?: number; + /** @description Maximum number of logs that should be returned */ + limit?: number; + level?: components["schemas"]["LogLevel"]; + }; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + buildID: components["parameters"]["buildID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the template */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateBuildInfo"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{templateID}/builds/{buildID}/logs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get template build logs */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + cursor?: number; + /** @description Maximum number of logs that should be returned */ + limit?: number; + direction?: components["schemas"]["LogsDirection"]; + level?: components["schemas"]["LogLevel"]; + /** @description Source of the logs that should be returned from */ + source?: components["schemas"]["LogsSource"]; + }; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + buildID: components["parameters"]["buildID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the template build logs */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateBuildLogsResponse"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/tags": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Assign tag(s) to a template build */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AssignTemplateTagsRequest"]; + }; + }; + responses: { + /** @description Tag assigned successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AssignedTemplateTags"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + /** @description Delete multiple tags from templates */ + delete: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["DeleteTemplateTagsRequest"]; + }; + }; + responses: { + /** @description Tags deleted successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{templateID}/tags": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all tags for a template */ + get: { + parameters: { + query?: never; + header?: never; + path: { + templateID: components["parameters"]["templateID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the template tags */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateTag"][]; + }; + }; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/aliases/{alias}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Check if template with given alias exists */ + get: { + parameters: { + query?: never; + header?: never; + path: { + alias: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully queried template by alias */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TemplateAliasResponse"]; + }; + }; + 400: components["responses"]["400"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/nodes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all nodes */ + get: { + parameters: { + query?: { + /** @description Identifier of the cluster */ + clusterID?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned all nodes */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Node"][]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/nodes/{nodeID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get node info */ + get: { + parameters: { + query?: { + /** @description Identifier of the cluster */ + clusterID?: string; + }; + header?: never; + path: { + nodeID: components["parameters"]["nodeID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned the node */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NodeDetail"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + /** @description Change status of a node */ + post: { + parameters: { + query?: never; + header?: never; + path: { + nodeID: components["parameters"]["nodeID"]; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["NodeStatusChange"]; + }; + }; + responses: { + /** @description The node status was changed successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/teams/{teamID}/sandboxes/kill": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Kill all sandboxes for a team + * @description Kills all sandboxes for the specified team + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Team ID */ + teamID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully killed sandboxes */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AdminSandboxKillResult"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/teams/{teamID}/builds/cancel": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Cancel all builds for a team + * @description Cancels all in-progress and pending builds for the specified team + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Team ID */ + teamID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully cancelled builds */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AdminBuildCancelResult"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/teams/{teamID}/api-keys": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create team API key as admin + * @description Creates a team API key for internal service workflows. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Team ID */ + teamID: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["NewTeamAPIKey"]; + }; + }; + responses: { + /** @description Team API key created successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CreatedTeamAPIKey"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/teams/{teamID}/api-keys/{apiKeyID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Delete team API key as admin + * @description Deletes a team API key for internal service workflows. + */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Team ID */ + teamID: string; + apiKeyID: components["parameters"]["apiKeyID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Team API key deleted successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/access-tokens": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a new access token */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["NewAccessToken"]; + }; + }; + responses: { + /** @description Access token created successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CreatedAccessToken"]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/access-tokens/{accessTokenID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** @description Delete an access token */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + accessTokenID: components["parameters"]["accessTokenID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Access token deleted successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api-keys": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all team API keys */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully returned all team API keys */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TeamAPIKey"][]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + /** @description Create a new team API key */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["NewTeamAPIKey"]; + }; + }; + responses: { + /** @description Team API key created successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CreatedTeamAPIKey"]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api-keys/{apiKeyID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** @description Delete a team API key */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + apiKeyID: components["parameters"]["apiKeyID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Team API key deleted successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + options?: never; + head?: never; + /** @description Update a team API key */ + patch: { + parameters: { + query?: never; + header?: never; + path: { + apiKeyID: components["parameters"]["apiKeyID"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateTeamAPIKey"]; + }; + }; + responses: { + /** @description Team API key updated successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + trace?: never; + }; + "/volumes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all team volumes */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully listed all team volumes */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Volume"][]; + }; + }; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + /** @description Create a new team volume */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["NewVolume"]; + }; + }; + responses: { + /** @description Successfully created a new team volume */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VolumeAndToken"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 500: components["responses"]["500"]; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/volumes/{volumeID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get team volume info */ + get: { + parameters: { + query?: never; + header?: never; + path: { + volumeID: components["parameters"]["volumeID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully retrieved a team volume */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VolumeAndToken"]; + }; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + post?: never; + /** @description Delete a team volume */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + volumeID: components["parameters"]["volumeID"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully deleted a team volume */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 401: components["responses"]["401"]; + 404: components["responses"]["404"]; + 500: components["responses"]["500"]; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } -export type webhooks = Record +export type webhooks = Record; export interface components { - schemas: { - Team: { - /** @description Identifier of the team */ - teamID: string - /** @description Name of the team */ - name: string - /** @description API key for the team */ - apiKey: string - /** @description Whether the team is the default team */ - isDefault: boolean - } - TeamUser: { - /** - * Format: uuid - * @description Identifier of the user - */ - id: string - /** - * @deprecated - * @description Email of the user - * @default null - */ - email: string | null - } - TemplateUpdateRequest: { - /** @description Whether the template is public or only accessible by the team */ - public?: boolean - } - TemplateUpdateResponse: { - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[] - } - /** - * Format: int32 - * @description CPU cores for the sandbox - */ - CPUCount: number - /** - * Format: int32 - * @description Memory for the sandbox in MiB - */ - MemoryMB: number - /** - * Format: int32 - * @description Disk size for the sandbox in MiB - */ - DiskSizeMB: number - /** @description Version of the envd running in the sandbox */ - EnvdVersion: string - SandboxMetadata: { - [key: string]: string - } - /** - * @description State of the sandbox - * @enum {string} - */ - SandboxState: 'running' | 'paused' - SnapshotInfo: { - /** @description Identifier of the snapshot template including the tag. Uses namespace/alias when a name was provided (e.g. team-slug/my-snapshot:default), otherwise falls back to the raw template ID (e.g. abc123:default). */ - snapshotID: string - /** @description Full names of the snapshot template including team namespace and tag (e.g. team-slug/my-snapshot:v2) */ - names: string[] - } - EnvVars: { - [key: string]: string - } - /** @description MCP configuration for the sandbox */ - Mcp: { - [key: string]: unknown - } | null - SandboxNetworkConfig: { - /** - * @description Specify if the sandbox URLs should be accessible only with authentication. - * @default true - */ - allowPublicTraffic: boolean - /** @description List of allowed destinations for egress traffic. Each entry can be a CIDR block (e.g. "8.8.8.8/32"), a bare IP address (e.g. "8.8.8.8"), or a domain name (e.g. "example.com", "*.example.com"). Allowed entries always take precedence over denied entries. */ - allowOut?: string[] - /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ - denyOut?: string[] - egressProxy?: components['schemas']['SandboxEgressProxyConfig'] - /** @description Specify host mask which will be used for all sandbox requests */ - maskRequestHost?: string - /** @description Per-domain transform rules applied to matching egress HTTP/HTTPS requests. Keys are domains (e.g. "api.example.com", "example.com"). A domain listed here is not automatically allowed - use allowOut to permit the traffic. */ - rules?: { - [key: string]: components['schemas']['SandboxNetworkRule'][] - } - } - /** @description Network configuration update for a running sandbox. Replaces the current egress rules with the provided configuration. Omitting a field clears it. */ - SandboxNetworkUpdateConfig: { - /** @description List of allowed destinations for egress traffic. Each entry can be a CIDR block (e.g. "8.8.8.8/32"), a bare IP address (e.g. "8.8.8.8"), or a domain name (e.g. "example.com", "*.example.com"). Allowed entries always take precedence over denied entries. */ - allowOut?: string[] - /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ - denyOut?: string[] - egressProxy?: components['schemas']['SandboxEgressProxyConfig'] - /** @description Per-domain transform rules. Replaces all existing rules when provided. */ - rules?: { - [key: string]: components['schemas']['SandboxNetworkRule'][] - } - /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ - allow_internet_access?: boolean - } - /** @description Transform rule applied to egress requests matching a domain pattern. */ - SandboxNetworkRule: { - transform?: components['schemas']['SandboxNetworkTransform'] - } - /** @description Transformations applied to matching egress requests before forwarding. */ - SandboxNetworkTransform: { - /** @description HTTP headers to inject or override in matching requests. An existing header with the same name is replaced. Values are plain strings; secret resolution happens client-side before sending to the API. */ - headers?: { - [key: string]: string - } - } - /** @description SOCKS5 proxy for sandbox egress. Outbound TCP is tunneled through the proxy after allow/deny filtering; the sandbox is unaware. Domain-matched flows use remote DNS (ATYP=domain). */ - SandboxEgressProxyConfig: { - /** @description SOCKS5 proxy address in host:port format (e.g. "proxy.example.com:1080"). */ - address: string - /** @description Optional SOCKS5 username (RFC 1929), max 255 bytes. */ - username?: string - /** @description Optional SOCKS5 password (RFC 1929), max 255 bytes. */ - password?: string - } | null - /** - * @description Auto-resume enabled flag for paused sandboxes. Default false. - * @default false - */ - SandboxAutoResumeEnabled: boolean - /** @description Auto-resume configuration for paused sandboxes. */ - SandboxAutoResumeConfig: { - enabled: components['schemas']['SandboxAutoResumeEnabled'] - } - /** - * @description Action taken when the sandbox times out. - * @enum {string} - */ - SandboxOnTimeout: 'kill' | 'pause' - /** @description Sandbox lifecycle policy returned by sandbox info. */ - SandboxLifecycle: { - /** @description Whether the sandbox can auto-resume. */ - autoResume: boolean - onTimeout: components['schemas']['SandboxOnTimeout'] - } - /** @description Log entry with timestamp and line */ - SandboxLog: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string - /** @description Log line content */ - line: string - } - SandboxLogEntry: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string - /** @description Log message content */ - message: string - level: components['schemas']['LogLevel'] - fields: { - [key: string]: string - } - } - SandboxLogs: { - /** @description Logs of the sandbox */ - logs: components['schemas']['SandboxLog'][] - /** @description Structured logs of the sandbox */ - logEntries: components['schemas']['SandboxLogEntry'][] - } - SandboxLogsV2Response: { - /** - * @description Sandbox logs structured - * @default [] - */ - logs: components['schemas']['SandboxLogEntry'][] - } - /** @description Metric entry with timestamp and line */ - SandboxMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number - /** - * Format: int32 - * @description Number of CPU cores - */ - cpuCount: number - /** - * Format: float - * @description CPU usage percentage - */ - cpuUsedPct: number - /** - * Format: int64 - * @description Memory used in bytes - */ - memUsed: number - /** - * Format: int64 - * @description Total memory in bytes - */ - memTotal: number - /** - * Format: int64 - * @description Cached memory (page cache) in bytes - */ - memCache: number - /** - * Format: int64 - * @description Disk used in bytes - */ - diskUsed: number - /** - * Format: int64 - * @description Total disk space in bytes - */ - diskTotal: number - } - SandboxVolumeMount: { - /** @description Name of the volume */ - name: string - /** @description Path of the volume */ - path: string - } - Sandbox: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string - /** @description Identifier of the sandbox */ - sandboxID: string - /** @description Alias of the template */ - alias?: string - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string - envdVersion: components['schemas']['EnvdVersion'] - /** @description Access token used for envd communication */ - envdAccessToken?: string - /** @description Token required for accessing sandbox via proxy. */ - trafficAccessToken?: string | null - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null - } - SandboxDetail: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string - /** @description Alias of the template */ - alias?: string - /** @description Identifier of the sandbox */ - sandboxID: string - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string - /** - * Format: date-time - * @description Time when the sandbox will expire - */ - endAt: string - envdVersion: components['schemas']['EnvdVersion'] - /** @description Access token used for envd communication */ - envdAccessToken?: string - /** @description Whether internet access was explicitly enabled or disabled for the sandbox. Null means it was not explicitly set. */ - allowInternetAccess?: boolean | null - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null - cpuCount: components['schemas']['CPUCount'] - memoryMB: components['schemas']['MemoryMB'] - diskSizeMB: components['schemas']['DiskSizeMB'] - metadata?: components['schemas']['SandboxMetadata'] - state: components['schemas']['SandboxState'] - network?: components['schemas']['SandboxNetworkConfig'] - lifecycle?: components['schemas']['SandboxLifecycle'] - volumeMounts?: components['schemas']['SandboxVolumeMount'][] - } - ListedSandbox: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string - /** @description Alias of the template */ - alias?: string - /** @description Identifier of the sandbox */ - sandboxID: string - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string - /** - * Format: date-time - * @description Time when the sandbox will expire - */ - endAt: string - cpuCount: components['schemas']['CPUCount'] - memoryMB: components['schemas']['MemoryMB'] - diskSizeMB: components['schemas']['DiskSizeMB'] - metadata?: components['schemas']['SandboxMetadata'] - state: components['schemas']['SandboxState'] - envdVersion: components['schemas']['EnvdVersion'] - volumeMounts?: components['schemas']['SandboxVolumeMount'][] - } - SandboxesWithMetrics: { - sandboxes: { - [key: string]: components['schemas']['SandboxMetric'] - } - } - NewSandbox: { - /** @description Identifier of the required template */ - templateID: string - /** - * Format: int32 - * @description Time to live for the sandbox in seconds. - * @default 15 - */ - timeout: number - /** - * @description Automatically pauses the sandbox after the timeout - * @default false - */ - autoPause: boolean - autoResume?: components['schemas']['SandboxAutoResumeConfig'] - /** @description Secure all system communication with sandbox */ - secure?: boolean - /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ - allow_internet_access?: boolean - network?: components['schemas']['SandboxNetworkConfig'] - metadata?: components['schemas']['SandboxMetadata'] - envVars?: components['schemas']['EnvVars'] - mcp?: components['schemas']['Mcp'] - volumeMounts?: components['schemas']['SandboxVolumeMount'][] - } - ResumedSandbox: { - /** - * Format: int32 - * @description Time to live for the sandbox in seconds. - * @default 15 - */ - timeout: number - /** - * @deprecated - * @description Automatically pauses the sandbox after the timeout - */ - autoPause?: boolean - } - ConnectSandbox: { - /** - * Format: int32 - * @description Timeout in seconds from the current time after which the sandbox should expire - */ - timeout: number - } - SandboxTimeoutRequest: { - /** - * Format: int32 - * @description Timeout in seconds from the current time after which the sandbox should expire - */ - timeout: number - } - SandboxRefreshRequest: { - /** @description Duration for which the sandbox should be kept alive in seconds */ - duration?: number - } - SandboxSnapshotRequest: { - /** @description Optional name for the snapshot template. If a snapshot template with this name already exists, a new build will be assigned to the existing template instead of creating a new one. */ - name?: string - } - /** @description Team metric with timestamp */ - TeamMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number - /** - * Format: int32 - * @description The number of concurrent sandboxes for the team - */ - concurrentSandboxes: number - /** - * Format: float - * @description Number of sandboxes started per second - */ - sandboxStartRate: number - } - /** @description Team metric with timestamp */ - MaxTeamMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number - /** @description The maximum value of the requested metric in the given interval */ - value: number - } - AdminSandboxKillResult: { - /** @description Number of sandboxes successfully killed */ - killedCount: number - /** @description Number of sandboxes that failed to kill */ - failedCount: number - } - AdminBuildCancelResult: { - /** @description Number of builds successfully cancelled */ - cancelledCount: number - /** @description Number of builds that failed to cancel */ - failedCount: number - } - VolumeToken: { - token: string - } - Template: { - /** @description Identifier of the template */ - templateID: string - /** @description Identifier of the last successful build for given template */ - buildID: string - cpuCount: components['schemas']['CPUCount'] - memoryMB: components['schemas']['MemoryMB'] - diskSizeMB: components['schemas']['DiskSizeMB'] - /** @description Whether the template is public or only accessible by the team */ - public: boolean - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[] - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[] - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string - createdBy: components['schemas']['TeamUser'] | null - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number - /** - * Format: int32 - * @description Number of times the template was built - */ - buildCount: number - envdVersion: components['schemas']['EnvdVersion'] - buildStatus: components['schemas']['TemplateBuildStatus'] - } - TemplateRequestResponseV3: { - /** @description Identifier of the template */ - templateID: string - /** @description Identifier of the last successful build for given template */ - buildID: string - /** @description Whether the template is public or only accessible by the team */ - public: boolean - /** @description Names of the template */ - names: string[] - /** @description Tags assigned to the template build */ - tags: string[] - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[] - } - TemplateLegacy: { - /** @description Identifier of the template */ - templateID: string - /** @description Identifier of the last successful build for given template */ - buildID: string - cpuCount: components['schemas']['CPUCount'] - memoryMB: components['schemas']['MemoryMB'] - diskSizeMB: components['schemas']['DiskSizeMB'] - /** @description Whether the template is public or only accessible by the team */ - public: boolean - /** @description Aliases of the template */ - aliases: string[] - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string - createdBy: components['schemas']['TeamUser'] | null - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number - /** - * Format: int32 - * @description Number of times the template was built - */ - buildCount: number - envdVersion: components['schemas']['EnvdVersion'] - } - TemplateBuild: { - /** - * Format: uuid - * @description Identifier of the build - */ - buildID: string - status: components['schemas']['TemplateBuildStatus'] - /** - * Format: date-time - * @description Time when the build was created - */ - createdAt: string - /** - * Format: date-time - * @description Time when the build was last updated - */ - updatedAt: string - /** - * Format: date-time - * @description Time when the build was finished - */ - finishedAt?: string - cpuCount: components['schemas']['CPUCount'] - memoryMB: components['schemas']['MemoryMB'] - diskSizeMB?: components['schemas']['DiskSizeMB'] - envdVersion?: components['schemas']['EnvdVersion'] - } - TemplateWithBuilds: { - /** @description Identifier of the template */ - templateID: string - /** @description Whether the template is public or only accessible by the team */ - public: boolean - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[] - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[] - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number - /** @description List of builds for the template */ - builds: components['schemas']['TemplateBuild'][] - } - TemplateAliasResponse: { - /** @description Identifier of the template */ - templateID: string - /** @description Whether the template is public or only accessible by the team */ - public: boolean - } - TemplateBuildRequest: { - /** @description Alias of the template */ - alias?: string - /** @description Dockerfile for the template */ - dockerfile: string - /** @description Identifier of the team */ - teamID?: string - /** @description Start command to execute in the template after the build */ - startCmd?: string - /** @description Ready check command to execute in the template after the build */ - readyCmd?: string - cpuCount?: components['schemas']['CPUCount'] - memoryMB?: components['schemas']['MemoryMB'] - } - /** @description Step in the template build process */ - TemplateStep: { - /** @description Type of the step */ - type: string - /** - * @description Arguments for the step - * @default [] - */ - args: string[] - /** @description Hash of the files used in the step */ - filesHash?: string - /** - * @description Whether the step should be forced to run regardless of the cache - * @default false - */ - force: boolean - } - TemplateBuildRequestV3: { - /** @description Name of the template. Can include a tag with colon separator (e.g. "my-template" or "my-template:v1"). If tag is included, it will be treated as if the tag was provided in the tags array. */ - name?: string - /** @description Tags to assign to the template build */ - tags?: string[] - /** - * @deprecated - * @description Alias of the template. Deprecated, use name instead. - */ - alias?: string - /** - * @deprecated - * @description Identifier of the team - */ - teamID?: string - cpuCount?: components['schemas']['CPUCount'] - memoryMB?: components['schemas']['MemoryMB'] - } - TemplateBuildRequestV2: { - /** @description Alias of the template */ - alias: string - /** - * @deprecated - * @description Identifier of the team - */ - teamID?: string - cpuCount?: components['schemas']['CPUCount'] - memoryMB?: components['schemas']['MemoryMB'] - } - FromImageRegistry: - | components['schemas']['AWSRegistry'] - | components['schemas']['GCPRegistry'] - | components['schemas']['GeneralRegistry'] - AWSRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: 'aws' - /** @description AWS Access Key ID for ECR authentication */ - awsAccessKeyId: string - /** @description AWS Secret Access Key for ECR authentication */ - awsSecretAccessKey: string - /** @description AWS Region where the ECR registry is located */ - awsRegion: string - } - GCPRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: 'gcp' - /** @description Service Account JSON for GCP authentication */ - serviceAccountJson: string - } - GeneralRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: 'registry' - /** @description Username to use for the registry */ - username: string - /** @description Password to use for the registry */ - password: string - } - TemplateBuildStartV2: { - /** @description Image to use as a base for the template build */ - fromImage?: string - /** @description Template to use as a base for the template build */ - fromTemplate?: string - fromImageRegistry?: components['schemas']['FromImageRegistry'] - /** - * @description Whether the whole build should be forced to run regardless of the cache - * @default false - */ - force: boolean - /** - * @description List of steps to execute in the template build - * @default [] - */ - steps: components['schemas']['TemplateStep'][] - /** @description Start command to execute in the template after the build */ - startCmd?: string - /** @description Ready check command to execute in the template after the build */ - readyCmd?: string - } - TemplateBuildFileUpload: { - /** @description Whether the file is already present in the cache */ - present: boolean - /** @description Url where the file should be uploaded to */ - url?: string - } - /** - * @description State of the sandbox - * @enum {string} - */ - LogLevel: 'debug' | 'info' | 'warn' | 'error' - BuildLogEntry: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string - /** @description Log message content */ - message: string - level: components['schemas']['LogLevel'] - /** @description Step in the build process related to the log entry */ - step?: string - } - BuildStatusReason: { - /** @description Message with the status reason, currently reporting only for error status */ - message: string - /** @description Step that failed */ - step?: string - /** - * @description Log entries related to the status reason - * @default [] - */ - logEntries: components['schemas']['BuildLogEntry'][] - } - /** - * @description Status of the template build - * @enum {string} - */ - TemplateBuildStatus: 'building' | 'waiting' | 'ready' | 'error' - TemplateBuildInfo: { - /** - * @description Build logs - * @default [] - */ - logs: string[] - /** - * @description Build logs structured - * @default [] - */ - logEntries: components['schemas']['BuildLogEntry'][] - /** @description Identifier of the template */ - templateID: string - /** @description Identifier of the build */ - buildID: string - status: components['schemas']['TemplateBuildStatus'] - reason?: components['schemas']['BuildStatusReason'] - } - TemplateBuildLogsResponse: { - /** - * @description Build logs structured - * @default [] - */ - logs: components['schemas']['BuildLogEntry'][] - } - /** - * @description Direction of the logs that should be returned - * @enum {string} - */ - LogsDirection: 'forward' | 'backward' - /** - * @description Source of the logs that should be returned - * @enum {string} - */ - LogsSource: 'temporary' | 'persistent' - /** - * @description Status of the node. - * - draining: the node is bound to be shut down. It will not accept new sandboxes and will stop once all existing sandboxes are done. - * - standby: the node is not actively used, but it can return to ready and continue serving traffic. - * @enum {string} - */ - NodeStatus: 'ready' | 'draining' | 'connecting' | 'unhealthy' | 'standby' - NodeStatusChange: { - /** - * Format: uuid - * @description Identifier of the cluster - */ - clusterID?: string - status: components['schemas']['NodeStatus'] - } - DiskMetrics: { - /** @description Mount point of the disk */ - mountPoint: string - /** @description Device name */ - device: string - /** @description Filesystem type (e.g., ext4, xfs) */ - filesystemType: string - /** - * Format: uint64 - * @description Used space in bytes - */ - usedBytes: number - /** - * Format: uint64 - * @description Total space in bytes - */ - totalBytes: number - } - /** @description Node metrics */ - NodeMetrics: { - /** - * Format: uint32 - * @description Number of allocated CPU cores - */ - allocatedCPU: number - /** - * Format: uint32 - * @description Node CPU usage percentage - */ - cpuPercent: number - /** - * Format: uint32 - * @description Total number of CPU cores on the node - */ - cpuCount: number - /** - * Format: uint64 - * @description Amount of allocated memory in bytes - */ - allocatedMemoryBytes: number - /** - * Format: uint64 - * @description Node memory used in bytes - */ - memoryUsedBytes: number - /** - * Format: uint64 - * @description Total node memory in bytes - */ - memoryTotalBytes: number - /** @description Detailed metrics for each disk/mount point */ - disks: components['schemas']['DiskMetrics'][] - } - MachineInfo: { - /** @description CPU family of the node */ - cpuFamily: string - /** @description CPU model of the node */ - cpuModel: string - /** @description CPU model name of the node */ - cpuModelName: string - /** @description CPU architecture of the node */ - cpuArchitecture: string - } - Node: { - /** @description Version of the orchestrator */ - version: string - /** @description Commit of the orchestrator */ - commit: string - /** @description Identifier of the node */ - id: string - /** @description Service instance identifier of the node */ - serviceInstanceID: string - /** @description Identifier of the cluster */ - clusterID: string - machineInfo: components['schemas']['MachineInfo'] - status: components['schemas']['NodeStatus'] - /** - * Format: uint32 - * @description Number of sandboxes running on the node - */ - sandboxCount: number - metrics: components['schemas']['NodeMetrics'] - /** - * Format: uint64 - * @description Number of sandbox create successes - */ - createSuccesses: number - /** - * Format: uint64 - * @description Number of sandbox create fails - */ - createFails: number - /** - * Format: int - * @description Number of starting Sandboxes - */ - sandboxStartingCount: number - } - NodeDetail: { - /** @description Identifier of the cluster */ - clusterID: string - /** @description Version of the orchestrator */ - version: string - /** @description Commit of the orchestrator */ - commit: string - /** @description Identifier of the node */ - id: string - /** @description Service instance identifier of the node */ - serviceInstanceID: string - machineInfo: components['schemas']['MachineInfo'] - status: components['schemas']['NodeStatus'] - /** - * Format: uint32 - * @description Number of sandboxes running on the node - */ - sandboxCount: number - metrics: components['schemas']['NodeMetrics'] - /** @description List of cached builds id on the node */ - cachedBuilds: string[] - /** - * Format: uint64 - * @description Number of sandbox create successes - */ - createSuccesses: number - /** - * Format: uint64 - * @description Number of sandbox create fails - */ - createFails: number - } - CreatedAccessToken: { - /** - * Format: uuid - * @description Identifier of the access token - */ - id: string - /** @description Name of the access token */ - name: string - /** @description The fully created access token */ - token: string - mask: components['schemas']['IdentifierMaskingDetails'] - /** - * Format: date-time - * @description Timestamp of access token creation - */ - createdAt: string - } - NewAccessToken: { - /** @description Name of the access token */ - name: string - } - TeamAPIKey: { - /** - * Format: uuid - * @description Identifier of the API key - */ - id: string - /** @description Name of the API key */ - name: string - mask: components['schemas']['IdentifierMaskingDetails'] - /** - * Format: date-time - * @description Timestamp of API key creation - */ - createdAt: string - createdBy?: components['schemas']['TeamUser'] | null - /** - * Format: date-time - * @description Last time this API key was used - */ - lastUsed?: string | null - } - CreatedTeamAPIKey: { - /** - * Format: uuid - * @description Identifier of the API key - */ - id: string - /** @description Raw value of the API key */ - key: string - mask: components['schemas']['IdentifierMaskingDetails'] - /** @description Name of the API key */ - name: string - /** - * Format: date-time - * @description Timestamp of API key creation - */ - createdAt: string - createdBy?: components['schemas']['TeamUser'] | null - /** - * Format: date-time - * @description Last time this API key was used - */ - lastUsed?: string | null - } - NewTeamAPIKey: { - /** @description Name of the API key */ - name: string - } - UpdateTeamAPIKey: { - /** @description New name for the API key */ - name: string - } - AssignedTemplateTags: { - /** @description Assigned tags of the template */ - tags: string[] - /** - * Format: uuid - * @description Identifier of the build associated with these tags - */ - buildID: string - } - TemplateTag: { - /** @description The tag name */ - tag: string - /** - * Format: uuid - * @description Identifier of the build associated with this tag - */ - buildID: string - /** - * Format: date-time - * @description Time when the tag was assigned - */ - createdAt: string - } - AssignTemplateTagsRequest: { - /** @description Target template in "name:tag" format */ - target: string - /** @description Tags to assign to the template */ - tags: string[] - } - DeleteTemplateTagsRequest: { - /** @description Name of the template */ - name: string - /** @description Tags to delete */ - tags: string[] - } - Error: { - /** - * Format: int32 - * @description Error code - */ - code: number - /** @description Error */ - message: string - } - IdentifierMaskingDetails: { - /** @description Prefix that identifies the token or key type */ - prefix: string - /** @description Length of the token or key */ - valueLength: number - /** @description Prefix used in masked version of the token or key */ - maskedValuePrefix: string - /** @description Suffix used in masked version of the token or key */ - maskedValueSuffix: string - } - Volume: { - /** @description ID of the volume */ - volumeID: string - /** @description Name of the volume */ - name: string - } - VolumeAndToken: { - /** @description ID of the volume */ - volumeID: string - /** @description Name of the volume */ - name: string - /** @description Auth token to use for interacting with volume content */ - token: string - } - NewVolume: { - /** @description Name of the volume */ - name: string - } - } - responses: { - /** @description Bad request */ - 400: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Authentication error */ - 401: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Forbidden */ - 403: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Not found */ - 404: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Conflict */ - 409: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - /** @description Server error */ - 500: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Error'] - } - } - } - parameters: { - templateID: string - buildID: string - sandboxID: string - teamID: string - nodeID: string - apiKeyID: string - accessTokenID: string - snapshotID: string - tag: string - /** @description Maximum number of items to return per page */ - paginationLimit: number - /** @description Cursor to start the list from */ - paginationNextToken: string - volumeID: string - } - requestBodies: never - headers: never - pathItems: never + schemas: { + Team: { + /** @description Identifier of the team */ + teamID: string; + /** @description Name of the team */ + name: string; + /** @description API key for the team */ + apiKey: string; + /** @description Whether the team is the default team */ + isDefault: boolean; + }; + TeamUser: { + /** + * Format: uuid + * @description Identifier of the user + */ + id: string; + /** + * @deprecated + * @description Email of the user + * @default null + */ + email: string | null; + }; + TemplateUpdateRequest: { + /** @description Whether the template is public or only accessible by the team */ + public?: boolean; + }; + TemplateUpdateResponse: { + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[]; + }; + /** + * Format: int32 + * @description CPU cores for the sandbox + */ + CPUCount: number; + /** + * Format: int32 + * @description Memory for the sandbox in MiB + */ + MemoryMB: number; + /** + * Format: int32 + * @description Disk size for the sandbox in MiB + */ + DiskSizeMB: number; + /** @description Version of the envd running in the sandbox */ + EnvdVersion: string; + SandboxMetadata: { + [key: string]: string; + }; + /** + * @description State of the sandbox + * @enum {string} + */ + SandboxState: "running" | "paused"; + SnapshotInfo: { + /** @description Identifier of the snapshot template including the tag. Uses namespace/alias when a name was provided (e.g. team-slug/my-snapshot:default), otherwise falls back to the raw template ID (e.g. abc123:default). */ + snapshotID: string; + /** @description Full names of the snapshot template including team namespace and tag (e.g. team-slug/my-snapshot:v2) */ + names: string[]; + }; + EnvVars: { + [key: string]: string; + }; + /** @description MCP configuration for the sandbox */ + Mcp: { + [key: string]: unknown; + } | null; + SandboxNetworkConfig: { + /** + * @description Specify if the sandbox URLs should be accessible only with authentication. + * @default true + */ + allowPublicTraffic: boolean; + /** @description List of allowed destinations for egress traffic. Each entry can be a CIDR block (e.g. "8.8.8.8/32"), a bare IP address (e.g. "8.8.8.8"), or a domain name (e.g. "example.com", "*.example.com"). Allowed entries always take precedence over denied entries. */ + allowOut?: string[]; + /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ + denyOut?: string[]; + egressProxy?: components["schemas"]["SandboxEgressProxyConfig"]; + /** @description Specify host mask which will be used for all sandbox requests */ + maskRequestHost?: string; + /** @description Per-domain transform rules applied to matching egress HTTP/HTTPS requests. Keys are domains (e.g. "api.example.com", "example.com"). A domain listed here is not automatically allowed - use allowOut to permit the traffic. */ + rules?: { + [key: string]: components["schemas"]["SandboxNetworkRule"][]; + }; + }; + /** @description Network configuration update for a running sandbox. Replaces the current egress rules with the provided configuration. Omitting a field clears it. */ + SandboxNetworkUpdateConfig: { + /** @description List of allowed destinations for egress traffic. Each entry can be a CIDR block (e.g. "8.8.8.8/32"), a bare IP address (e.g. "8.8.8.8"), or a domain name (e.g. "example.com", "*.example.com"). Allowed entries always take precedence over denied entries. */ + allowOut?: string[]; + /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ + denyOut?: string[]; + egressProxy?: components["schemas"]["SandboxEgressProxyConfig"]; + /** @description Per-domain transform rules. Replaces all existing rules when provided. */ + rules?: { + [key: string]: components["schemas"]["SandboxNetworkRule"][]; + }; + /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ + allow_internet_access?: boolean; + }; + /** @description Transform rule applied to egress requests matching a domain pattern. */ + SandboxNetworkRule: { + transform?: components["schemas"]["SandboxNetworkTransform"]; + }; + /** @description Transformations applied to matching egress requests before forwarding. */ + SandboxNetworkTransform: { + /** @description HTTP headers to inject or override in matching requests. An existing header with the same name is replaced. Values are plain strings; secret resolution happens client-side before sending to the API. */ + headers?: { + [key: string]: string; + }; + }; + /** @description SOCKS5 proxy for sandbox egress. Outbound TCP is tunneled through the proxy after allow/deny filtering; the sandbox is unaware. Domain-matched flows use remote DNS (ATYP=domain). */ + SandboxEgressProxyConfig: { + /** @description SOCKS5 proxy address in host:port format (e.g. "proxy.example.com:1080"). */ + address: string; + /** @description Optional SOCKS5 username (RFC 1929), max 255 bytes. */ + username?: string; + /** @description Optional SOCKS5 password (RFC 1929), max 255 bytes. */ + password?: string; + } | null; + /** + * @description Auto-resume enabled flag for paused sandboxes. Default false. + * @default false + */ + SandboxAutoResumeEnabled: boolean; + /** @description Auto-resume configuration for paused sandboxes. */ + SandboxAutoResumeConfig: { + enabled: components["schemas"]["SandboxAutoResumeEnabled"]; + }; + /** + * @description Action taken when the sandbox times out. + * @enum {string} + */ + SandboxOnTimeout: "kill" | "pause"; + /** @description Sandbox lifecycle policy returned by sandbox info. */ + SandboxLifecycle: { + /** @description Whether the sandbox can auto-resume. */ + autoResume: boolean; + onTimeout: components["schemas"]["SandboxOnTimeout"]; + }; + /** @description Log entry with timestamp and line */ + SandboxLog: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string; + /** @description Log line content */ + line: string; + }; + SandboxLogEntry: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string; + /** @description Log message content */ + message: string; + level: components["schemas"]["LogLevel"]; + fields: { + [key: string]: string; + }; + }; + SandboxLogs: { + /** @description Logs of the sandbox */ + logs: components["schemas"]["SandboxLog"][]; + /** @description Structured logs of the sandbox */ + logEntries: components["schemas"]["SandboxLogEntry"][]; + }; + SandboxLogsV2Response: { + /** + * @description Sandbox logs structured + * @default [] + */ + logs: components["schemas"]["SandboxLogEntry"][]; + }; + /** @description Metric entry with timestamp and line */ + SandboxMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string; + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number; + /** + * Format: int32 + * @description Number of CPU cores + */ + cpuCount: number; + /** + * Format: float + * @description CPU usage percentage + */ + cpuUsedPct: number; + /** + * Format: int64 + * @description Memory used in bytes + */ + memUsed: number; + /** + * Format: int64 + * @description Total memory in bytes + */ + memTotal: number; + /** + * Format: int64 + * @description Cached memory (page cache) in bytes + */ + memCache: number; + /** + * Format: int64 + * @description Disk used in bytes + */ + diskUsed: number; + /** + * Format: int64 + * @description Total disk space in bytes + */ + diskTotal: number; + }; + SandboxVolumeMount: { + /** @description Name of the volume */ + name: string; + /** @description Path of the volume */ + path: string; + }; + Sandbox: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string; + /** @description Identifier of the sandbox */ + sandboxID: string; + /** @description Alias of the template */ + alias?: string; + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string; + envdVersion: components["schemas"]["EnvdVersion"]; + /** @description Access token used for envd communication */ + envdAccessToken?: string; + /** @description Token required for accessing sandbox via proxy. */ + trafficAccessToken?: string | null; + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null; + }; + SandboxDetail: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string; + /** @description Alias of the template */ + alias?: string; + /** @description Identifier of the sandbox */ + sandboxID: string; + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string; + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string; + /** + * Format: date-time + * @description Time when the sandbox will expire + */ + endAt: string; + envdVersion: components["schemas"]["EnvdVersion"]; + /** @description Access token used for envd communication */ + envdAccessToken?: string; + /** @description Whether internet access was explicitly enabled or disabled for the sandbox. Null means it was not explicitly set. */ + allowInternetAccess?: boolean | null; + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null; + cpuCount: components["schemas"]["CPUCount"]; + memoryMB: components["schemas"]["MemoryMB"]; + diskSizeMB: components["schemas"]["DiskSizeMB"]; + metadata?: components["schemas"]["SandboxMetadata"]; + state: components["schemas"]["SandboxState"]; + network?: components["schemas"]["SandboxNetworkConfig"]; + lifecycle?: components["schemas"]["SandboxLifecycle"]; + volumeMounts?: components["schemas"]["SandboxVolumeMount"][]; + }; + ListedSandbox: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string; + /** @description Alias of the template */ + alias?: string; + /** @description Identifier of the sandbox */ + sandboxID: string; + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string; + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string; + /** + * Format: date-time + * @description Time when the sandbox will expire + */ + endAt: string; + cpuCount: components["schemas"]["CPUCount"]; + memoryMB: components["schemas"]["MemoryMB"]; + diskSizeMB: components["schemas"]["DiskSizeMB"]; + metadata?: components["schemas"]["SandboxMetadata"]; + state: components["schemas"]["SandboxState"]; + envdVersion: components["schemas"]["EnvdVersion"]; + volumeMounts?: components["schemas"]["SandboxVolumeMount"][]; + }; + SandboxesWithMetrics: { + sandboxes: { + [key: string]: components["schemas"]["SandboxMetric"]; + }; + }; + NewSandbox: { + /** @description Identifier of the required template */ + templateID: string; + /** + * Format: int32 + * @description Time to live for the sandbox in seconds. + * @default 15 + */ + timeout: number; + /** + * @description Automatically pauses the sandbox after the timeout + * @default false + */ + autoPause: boolean; + autoResume?: components["schemas"]["SandboxAutoResumeConfig"]; + /** @description Secure all system communication with sandbox */ + secure?: boolean; + /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ + allow_internet_access?: boolean; + network?: components["schemas"]["SandboxNetworkConfig"]; + metadata?: components["schemas"]["SandboxMetadata"]; + envVars?: components["schemas"]["EnvVars"]; + mcp?: components["schemas"]["Mcp"]; + volumeMounts?: components["schemas"]["SandboxVolumeMount"][]; + }; + ResumedSandbox: { + /** + * Format: int32 + * @description Time to live for the sandbox in seconds. + * @default 15 + */ + timeout: number; + /** + * @deprecated + * @description Automatically pauses the sandbox after the timeout + */ + autoPause?: boolean; + }; + ConnectSandbox: { + /** + * Format: int32 + * @description Timeout in seconds from the current time after which the sandbox should expire + */ + timeout: number; + }; + SandboxTimeoutRequest: { + /** + * Format: int32 + * @description Timeout in seconds from the current time after which the sandbox should expire + */ + timeout: number; + }; + SandboxRefreshRequest: { + /** @description Duration for which the sandbox should be kept alive in seconds */ + duration?: number; + }; + SandboxSnapshotRequest: { + /** @description Optional name for the snapshot template. If a snapshot template with this name already exists, a new build will be assigned to the existing template instead of creating a new one. */ + name?: string; + }; + /** @description Team metric with timestamp */ + TeamMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string; + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number; + /** + * Format: int32 + * @description The number of concurrent sandboxes for the team + */ + concurrentSandboxes: number; + /** + * Format: float + * @description Number of sandboxes started per second + */ + sandboxStartRate: number; + }; + /** @description Team metric with timestamp */ + MaxTeamMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string; + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number; + /** @description The maximum value of the requested metric in the given interval */ + value: number; + }; + AdminSandboxKillResult: { + /** @description Number of sandboxes successfully killed */ + killedCount: number; + /** @description Number of sandboxes that failed to kill */ + failedCount: number; + }; + AdminBuildCancelResult: { + /** @description Number of builds successfully cancelled */ + cancelledCount: number; + /** @description Number of builds that failed to cancel */ + failedCount: number; + }; + VolumeToken: { + token: string; + }; + Template: { + /** @description Identifier of the template */ + templateID: string; + /** @description Identifier of the last successful build for given template */ + buildID: string; + cpuCount: components["schemas"]["CPUCount"]; + memoryMB: components["schemas"]["MemoryMB"]; + diskSizeMB: components["schemas"]["DiskSizeMB"]; + /** @description Whether the template is public or only accessible by the team */ + public: boolean; + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[]; + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[]; + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string; + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string; + createdBy: components["schemas"]["TeamUser"] | null; + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null; + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number; + /** + * Format: int32 + * @description Number of times the template was built + */ + buildCount: number; + envdVersion: components["schemas"]["EnvdVersion"]; + buildStatus: components["schemas"]["TemplateBuildStatus"]; + }; + TemplateRequestResponseV3: { + /** @description Identifier of the template */ + templateID: string; + /** @description Identifier of the last successful build for given template */ + buildID: string; + /** @description Whether the template is public or only accessible by the team */ + public: boolean; + /** @description Names of the template */ + names: string[]; + /** @description Tags assigned to the template build */ + tags: string[]; + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[]; + }; + TemplateLegacy: { + /** @description Identifier of the template */ + templateID: string; + /** @description Identifier of the last successful build for given template */ + buildID: string; + cpuCount: components["schemas"]["CPUCount"]; + memoryMB: components["schemas"]["MemoryMB"]; + diskSizeMB: components["schemas"]["DiskSizeMB"]; + /** @description Whether the template is public or only accessible by the team */ + public: boolean; + /** @description Aliases of the template */ + aliases: string[]; + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string; + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string; + createdBy: components["schemas"]["TeamUser"] | null; + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null; + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number; + /** + * Format: int32 + * @description Number of times the template was built + */ + buildCount: number; + envdVersion: components["schemas"]["EnvdVersion"]; + }; + TemplateBuild: { + /** + * Format: uuid + * @description Identifier of the build + */ + buildID: string; + status: components["schemas"]["TemplateBuildStatus"]; + /** + * Format: date-time + * @description Time when the build was created + */ + createdAt: string; + /** + * Format: date-time + * @description Time when the build was last updated + */ + updatedAt: string; + /** + * Format: date-time + * @description Time when the build was finished + */ + finishedAt?: string; + cpuCount: components["schemas"]["CPUCount"]; + memoryMB: components["schemas"]["MemoryMB"]; + diskSizeMB?: components["schemas"]["DiskSizeMB"]; + envdVersion?: components["schemas"]["EnvdVersion"]; + }; + TemplateWithBuilds: { + /** @description Identifier of the template */ + templateID: string; + /** @description Whether the template is public or only accessible by the team */ + public: boolean; + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[]; + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[]; + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string; + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string; + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null; + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number; + /** @description List of builds for the template */ + builds: components["schemas"]["TemplateBuild"][]; + }; + TemplateAliasResponse: { + /** @description Identifier of the template */ + templateID: string; + /** @description Whether the template is public or only accessible by the team */ + public: boolean; + }; + TemplateBuildRequest: { + /** @description Alias of the template */ + alias?: string; + /** @description Dockerfile for the template */ + dockerfile: string; + /** @description Identifier of the team */ + teamID?: string; + /** @description Start command to execute in the template after the build */ + startCmd?: string; + /** @description Ready check command to execute in the template after the build */ + readyCmd?: string; + cpuCount?: components["schemas"]["CPUCount"]; + memoryMB?: components["schemas"]["MemoryMB"]; + }; + /** @description Step in the template build process */ + TemplateStep: { + /** @description Type of the step */ + type: string; + /** + * @description Arguments for the step + * @default [] + */ + args: string[]; + /** @description Hash of the files used in the step */ + filesHash?: string; + /** + * @description Whether the step should be forced to run regardless of the cache + * @default false + */ + force: boolean; + }; + TemplateBuildRequestV3: { + /** @description Name of the template. Can include a tag with colon separator (e.g. "my-template" or "my-template:v1"). If tag is included, it will be treated as if the tag was provided in the tags array. */ + name?: string; + /** @description Tags to assign to the template build */ + tags?: string[]; + /** + * @deprecated + * @description Alias of the template. Deprecated, use name instead. + */ + alias?: string; + /** + * @deprecated + * @description Identifier of the team + */ + teamID?: string; + cpuCount?: components["schemas"]["CPUCount"]; + memoryMB?: components["schemas"]["MemoryMB"]; + }; + TemplateBuildRequestV2: { + /** @description Alias of the template */ + alias: string; + /** + * @deprecated + * @description Identifier of the team + */ + teamID?: string; + cpuCount?: components["schemas"]["CPUCount"]; + memoryMB?: components["schemas"]["MemoryMB"]; + }; + FromImageRegistry: components["schemas"]["AWSRegistry"] | components["schemas"]["GCPRegistry"] | components["schemas"]["GeneralRegistry"]; + AWSRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: "aws"; + /** @description AWS Access Key ID for ECR authentication */ + awsAccessKeyId: string; + /** @description AWS Secret Access Key for ECR authentication */ + awsSecretAccessKey: string; + /** @description AWS Region where the ECR registry is located */ + awsRegion: string; + }; + GCPRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: "gcp"; + /** @description Service Account JSON for GCP authentication */ + serviceAccountJson: string; + }; + GeneralRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: "registry"; + /** @description Username to use for the registry */ + username: string; + /** @description Password to use for the registry */ + password: string; + }; + TemplateBuildStartV2: { + /** @description Image to use as a base for the template build */ + fromImage?: string; + /** @description Template to use as a base for the template build */ + fromTemplate?: string; + fromImageRegistry?: components["schemas"]["FromImageRegistry"]; + /** + * @description Whether the whole build should be forced to run regardless of the cache + * @default false + */ + force: boolean; + /** + * @description List of steps to execute in the template build + * @default [] + */ + steps: components["schemas"]["TemplateStep"][]; + /** @description Start command to execute in the template after the build */ + startCmd?: string; + /** @description Ready check command to execute in the template after the build */ + readyCmd?: string; + }; + TemplateBuildFileUpload: { + /** @description Whether the file is already present in the cache */ + present: boolean; + /** @description Url where the file should be uploaded to */ + url?: string; + }; + /** + * @description State of the sandbox + * @enum {string} + */ + LogLevel: "debug" | "info" | "warn" | "error"; + BuildLogEntry: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string; + /** @description Log message content */ + message: string; + level: components["schemas"]["LogLevel"]; + /** @description Step in the build process related to the log entry */ + step?: string; + }; + BuildStatusReason: { + /** @description Message with the status reason, currently reporting only for error status */ + message: string; + /** @description Step that failed */ + step?: string; + /** + * @description Log entries related to the status reason + * @default [] + */ + logEntries: components["schemas"]["BuildLogEntry"][]; + }; + /** + * @description Status of the template build + * @enum {string} + */ + TemplateBuildStatus: "building" | "waiting" | "ready" | "error"; + TemplateBuildInfo: { + /** + * @description Build logs + * @default [] + */ + logs: string[]; + /** + * @description Build logs structured + * @default [] + */ + logEntries: components["schemas"]["BuildLogEntry"][]; + /** @description Identifier of the template */ + templateID: string; + /** @description Identifier of the build */ + buildID: string; + status: components["schemas"]["TemplateBuildStatus"]; + reason?: components["schemas"]["BuildStatusReason"]; + }; + TemplateBuildLogsResponse: { + /** + * @description Build logs structured + * @default [] + */ + logs: components["schemas"]["BuildLogEntry"][]; + }; + /** + * @description Direction of the logs that should be returned + * @enum {string} + */ + LogsDirection: "forward" | "backward"; + /** + * @description Source of the logs that should be returned + * @enum {string} + */ + LogsSource: "temporary" | "persistent"; + /** + * @description Status of the node. + * - draining: the node is bound to be shut down. It will not accept new sandboxes and will stop once all existing sandboxes are done. + * - standby: the node is not actively used, but it can return to ready and continue serving traffic. + * @enum {string} + */ + NodeStatus: "ready" | "draining" | "connecting" | "unhealthy" | "standby"; + NodeStatusChange: { + /** + * Format: uuid + * @description Identifier of the cluster + */ + clusterID?: string; + status: components["schemas"]["NodeStatus"]; + }; + DiskMetrics: { + /** @description Mount point of the disk */ + mountPoint: string; + /** @description Device name */ + device: string; + /** @description Filesystem type (e.g., ext4, xfs) */ + filesystemType: string; + /** + * Format: uint64 + * @description Used space in bytes + */ + usedBytes: number; + /** + * Format: uint64 + * @description Total space in bytes + */ + totalBytes: number; + }; + /** @description Node metrics */ + NodeMetrics: { + /** + * Format: uint32 + * @description Number of allocated CPU cores + */ + allocatedCPU: number; + /** + * Format: uint32 + * @description Node CPU usage percentage + */ + cpuPercent: number; + /** + * Format: uint32 + * @description Total number of CPU cores on the node + */ + cpuCount: number; + /** + * Format: uint64 + * @description Amount of allocated memory in bytes + */ + allocatedMemoryBytes: number; + /** + * Format: uint64 + * @description Node memory used in bytes + */ + memoryUsedBytes: number; + /** + * Format: uint64 + * @description Total node memory in bytes + */ + memoryTotalBytes: number; + /** @description Detailed metrics for each disk/mount point */ + disks: components["schemas"]["DiskMetrics"][]; + }; + MachineInfo: { + /** @description CPU family of the node */ + cpuFamily: string; + /** @description CPU model of the node */ + cpuModel: string; + /** @description CPU model name of the node */ + cpuModelName: string; + /** @description CPU architecture of the node */ + cpuArchitecture: string; + }; + Node: { + /** @description Version of the orchestrator */ + version: string; + /** @description Commit of the orchestrator */ + commit: string; + /** @description Identifier of the node */ + id: string; + /** @description Service instance identifier of the node */ + serviceInstanceID: string; + /** @description Identifier of the cluster */ + clusterID: string; + machineInfo: components["schemas"]["MachineInfo"]; + status: components["schemas"]["NodeStatus"]; + /** + * Format: uint32 + * @description Number of sandboxes running on the node + */ + sandboxCount: number; + metrics: components["schemas"]["NodeMetrics"]; + /** + * Format: uint64 + * @description Number of sandbox create successes + */ + createSuccesses: number; + /** + * Format: uint64 + * @description Number of sandbox create fails + */ + createFails: number; + /** + * Format: int + * @description Number of starting Sandboxes + */ + sandboxStartingCount: number; + }; + NodeDetail: { + /** @description Identifier of the cluster */ + clusterID: string; + /** @description Version of the orchestrator */ + version: string; + /** @description Commit of the orchestrator */ + commit: string; + /** @description Identifier of the node */ + id: string; + /** @description Service instance identifier of the node */ + serviceInstanceID: string; + machineInfo: components["schemas"]["MachineInfo"]; + status: components["schemas"]["NodeStatus"]; + /** + * Format: uint32 + * @description Number of sandboxes running on the node + */ + sandboxCount: number; + metrics: components["schemas"]["NodeMetrics"]; + /** @description List of cached builds id on the node */ + cachedBuilds: string[]; + /** + * Format: uint64 + * @description Number of sandbox create successes + */ + createSuccesses: number; + /** + * Format: uint64 + * @description Number of sandbox create fails + */ + createFails: number; + }; + CreatedAccessToken: { + /** + * Format: uuid + * @description Identifier of the access token + */ + id: string; + /** @description Name of the access token */ + name: string; + /** @description The fully created access token */ + token: string; + mask: components["schemas"]["IdentifierMaskingDetails"]; + /** + * Format: date-time + * @description Timestamp of access token creation + */ + createdAt: string; + }; + NewAccessToken: { + /** @description Name of the access token */ + name: string; + }; + TeamAPIKey: { + /** + * Format: uuid + * @description Identifier of the API key + */ + id: string; + /** @description Name of the API key */ + name: string; + mask: components["schemas"]["IdentifierMaskingDetails"]; + /** + * Format: date-time + * @description Timestamp of API key creation + */ + createdAt: string; + createdBy?: components["schemas"]["TeamUser"] | null; + /** + * Format: date-time + * @description Last time this API key was used + */ + lastUsed?: string | null; + }; + CreatedTeamAPIKey: { + /** + * Format: uuid + * @description Identifier of the API key + */ + id: string; + /** @description Raw value of the API key */ + key: string; + mask: components["schemas"]["IdentifierMaskingDetails"]; + /** @description Name of the API key */ + name: string; + /** + * Format: date-time + * @description Timestamp of API key creation + */ + createdAt: string; + createdBy?: components["schemas"]["TeamUser"] | null; + /** + * Format: date-time + * @description Last time this API key was used + */ + lastUsed?: string | null; + }; + NewTeamAPIKey: { + /** @description Name of the API key */ + name: string; + }; + UpdateTeamAPIKey: { + /** @description New name for the API key */ + name: string; + }; + AssignedTemplateTags: { + /** @description Assigned tags of the template */ + tags: string[]; + /** + * Format: uuid + * @description Identifier of the build associated with these tags + */ + buildID: string; + }; + TemplateTag: { + /** @description The tag name */ + tag: string; + /** + * Format: uuid + * @description Identifier of the build associated with this tag + */ + buildID: string; + /** + * Format: date-time + * @description Time when the tag was assigned + */ + createdAt: string; + }; + AssignTemplateTagsRequest: { + /** @description Target template in "name:tag" format */ + target: string; + /** @description Tags to assign to the template */ + tags: string[]; + }; + DeleteTemplateTagsRequest: { + /** @description Name of the template */ + name: string; + /** @description Tags to delete */ + tags: string[]; + }; + Error: { + /** + * Format: int32 + * @description Error code + */ + code: number; + /** @description Error */ + message: string; + }; + IdentifierMaskingDetails: { + /** @description Prefix that identifies the token or key type */ + prefix: string; + /** @description Length of the token or key */ + valueLength: number; + /** @description Prefix used in masked version of the token or key */ + maskedValuePrefix: string; + /** @description Suffix used in masked version of the token or key */ + maskedValueSuffix: string; + }; + Volume: { + /** @description ID of the volume */ + volumeID: string; + /** @description Name of the volume */ + name: string; + }; + VolumeAndToken: { + /** @description ID of the volume */ + volumeID: string; + /** @description Name of the volume */ + name: string; + /** @description Auth token to use for interacting with volume content */ + token: string; + }; + NewVolume: { + /** @description Name of the volume */ + name: string; + }; + }; + responses: { + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Authentication error */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description Server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + }; + parameters: { + templateID: string; + buildID: string; + sandboxID: string; + teamID: string; + nodeID: string; + apiKeyID: string; + accessTokenID: string; + snapshotID: string; + tag: string; + /** @description Maximum number of items to return per page */ + paginationLimit: number; + /** @description Cursor to start the list from */ + paginationNextToken: string; + volumeID: string; + }; + requestBodies: never; + headers: never; + pathItems: never; } -export type $defs = Record -export type operations = Record +export type $defs = Record; +export type operations = Record; From ae21e59bfa9df586b3ed4c91d23ed44b0e2ddd11 Mon Sep 17 00:00:00 2001 From: "e2b-generated-code-auto-fixer[bot]" <257264331+e2b-generated-code-auto-fixer[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2026 00:49:28 +0000 Subject: [PATCH 2/4] style: apply biome formatting --- .../shared/contracts/dashboard-api.types.ts | 3296 ++++---- src/core/shared/contracts/infra-api.types.ts | 6847 +++++++++-------- 2 files changed, 5075 insertions(+), 5068 deletions(-) diff --git a/src/core/shared/contracts/dashboard-api.types.ts b/src/core/shared/contracts/dashboard-api.types.ts index 74e2e3cae..0f7821b27 100644 --- a/src/core/shared/contracts/dashboard-api.types.ts +++ b/src/core/shared/contracts/dashboard-api.types.ts @@ -4,1652 +4,1656 @@ */ export interface paths { - "/health": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Health check */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Health check successful */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["HealthResponse"]; - }; - }; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/builds": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List team builds */ - get: { - parameters: { - query?: { - /** @description Optional filter by build identifier, template identifier, or template alias. */ - build_id_or_template?: components["parameters"]["build_id_or_template"]; - /** @description Comma-separated list of build statuses to include. */ - statuses?: components["parameters"]["build_statuses"]; - /** @description Maximum number of items to return per page. */ - limit?: components["parameters"]["builds_limit"]; - /** @description Cursor returned by the previous list response in `created_at|build_id` format. */ - cursor?: components["parameters"]["builds_cursor"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned paginated builds. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["BuildsListResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/builds/statuses": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get build statuses */ - get: { - parameters: { - query: { - /** @description Comma-separated list of build IDs to get statuses for. */ - build_ids: components["parameters"]["build_ids"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned build statuses */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["BuildsStatusesResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/builds/{build_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get build details */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the build. */ - build_id: components["parameters"]["build_id"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned build details. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["BuildInfo"]; - }; - }; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/record": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get sandbox record */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the sandbox. */ - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned sandbox details. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxRecord"]; - }; - }; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List user teams - * @description Returns all teams the authenticated user belongs to, with limits and default flag. - */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned user teams. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["UserTeamsResponse"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** Create team */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateTeamRequest"]; - }; - }; - responses: { - /** @description Successfully created team. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamResolveResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/users/bootstrap": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Bootstrap auth provider user */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AdminAuthProviderUserBootstrapRequest"]; - }; - }; - responses: { - /** @description Successfully bootstrapped user. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamResolveResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/teams/bootstrap": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Bootstrap team - * @description Creates and provisions a team for an admin-authenticated bootstrap workflow. - */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AdminTeamBootstrapRequest"]; - }; - }; - responses: { - /** @description Successfully bootstrapped team. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamResolveResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - 502: components["responses"]["502"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/user-profiles/resolve": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Resolve user profiles */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AdminAuthProviderProfilesResolveRequest"]; - }; - }; - responses: { - /** @description Successfully resolved profiles. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AdminAuthProviderProfilesResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/user-profiles/by-email": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Lookup user profiles by email */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AdminAuthProviderProfilesLookupEmailRequest"]; - }; - }; - responses: { - /** @description Successfully found matching profiles. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AdminAuthProviderProfilesResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/user-profiles/{userId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get user profile */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the user. */ - userId: components["parameters"]["userId"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully found profile. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AdminAuthProviderProfilesResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/users/{userId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** - * Delete user - * @description Deletes a user by removing the identity provider record, user_identities mapping, and public.users row. - */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the user. */ - userId: components["parameters"]["userId"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully deleted user. */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 409: components["responses"]["409"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams/resolve": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Resolve team identity - * @description Resolves a team slug to the team's identity, validating the user is a member. - */ - get: { - parameters: { - query: { - /** @description Team slug to resolve. */ - slug: components["parameters"]["teamSlug"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully resolved team. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamResolveResponse"]; - }; - }; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams/{teamID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Update team */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the team. */ - teamID: components["parameters"]["teamID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateTeamRequest"]; - }; - }; - responses: { - /** @description Successfully updated team. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["UpdateTeamResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; - "/teams/{teamID}/members": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List team members */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the team. */ - teamID: components["parameters"]["teamID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned team members. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamMembersResponse"]; - }; - }; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** Add team member */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the team. */ - teamID: components["parameters"]["teamID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AddTeamMemberRequest"]; - }; - }; - responses: { - /** @description Successfully added team member. */ - 201: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams/{teamID}/members/{userId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** Remove team member */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the team. */ - teamID: components["parameters"]["teamID"]; - /** @description Identifier of the user. */ - userId: components["parameters"]["userId"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully removed team member. */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List team templates - * @description Returns a paginated list of the team's templates (and default templates inline, unless the team is on a dedicated cluster), with filtering, search, and column sorting via keyset cursor pagination. - */ - get: { - parameters: { - query?: { - /** @description Filter templates by visibility (true = public, false = internal). */ - public?: components["parameters"]["templates_public"]; - /** @description Case-insensitive substring match on template names, aliases, and template id. */ - search?: components["parameters"]["templates_search"]; - /** @description Sort column and direction. */ - sort?: components["parameters"]["templates_sort"]; - /** @description Maximum number of items to return per page. */ - limit?: components["parameters"]["templates_limit"]; - /** @description Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. */ - cursor?: components["parameters"]["templates_cursor"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned paginated templates. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamTemplatesResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/defaults": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List default templates - * @description Returns the list of default templates with their latest build info and aliases. - */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned default templates. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["DefaultTemplatesResponse"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get template - * @description Returns a single template owned by the current team. Dashboard-shaped read, indexed by template ID. - */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the template. */ - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateDetail"]; - }; - }; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/tags/groups": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List template tag groups - * @description Returns ready template tag assignment groups with bounded per-tag history, paginated over tags with keyset cursor. - */ - get: { - parameters: { - query?: { - /** @description Maximum number of ready assignment rows to return per tag. */ - assignmentLimit?: components["parameters"]["tag_assignment_limit"]; - /** @description Maximum number of distinct tags to return per page. */ - tagsLimit?: components["parameters"]["tag_groups_limit"]; - /** @description Cursor returned by the previous list response in `{sort}|{latest_assigned_at}|{tag}` format (sort-tagged, RFC3339Nano). */ - tagsCursor?: components["parameters"]["tag_groups_cursor"]; - /** @description Case-insensitive substring filter on tag name. Allowed characters are `a-z`, `0-9`, `.`, `_`, `-`. */ - search?: components["parameters"]["tag_groups_search"]; - /** @description Sort order for the returned tag groups. */ - sort?: components["parameters"]["tag_groups_sort"]; - }; - header?: never; - path: { - /** @description Identifier of the template. */ - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned template tag groups. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateTagGroupsResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/tags/count": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Count template tags - * @description Returns the total number of distinct ready tags for the template. - */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Identifier of the template. */ - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned tag count. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateTagsCountResponse"]; - }; - }; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/tags/exists": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Check ready template tag existence - * @description Checks whether a template tag has at least one ready assignment. - */ - get: { - parameters: { - query: { - /** @description Template tag name to check. */ - tag: components["parameters"]["tag"]; - }; - header?: never; - path: { - /** @description Identifier of the template. */ - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully checked template tag existence. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateTagExistsResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/tags/{tag}/assignments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List ready assignments for a single template tag - * @description Returns ready tag assignment events for a single tag, ordered newest first, with keyset cursor pagination. - */ - get: { - parameters: { - query?: { - /** @description Cursor returned by the previous list response in `assigned_at|assignment_id` format. */ - cursor?: components["parameters"]["tag_assignments_cursor"]; - /** @description Maximum number of assignment rows to return per page. */ - limit?: components["parameters"]["tag_assignments_limit"]; - }; - header?: never; - path: { - /** @description Identifier of the template. */ - templateID: components["parameters"]["templateID"]; - /** @description Template tag name. */ - tag: components["parameters"]["tag_path"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned tag assignment page. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateTagAssignmentsResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; + '/health': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** Health check */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Health check successful */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['HealthResponse'] + } + } + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/builds': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** List team builds */ + get: { + parameters: { + query?: { + /** @description Optional filter by build identifier, template identifier, or template alias. */ + build_id_or_template?: components['parameters']['build_id_or_template'] + /** @description Comma-separated list of build statuses to include. */ + statuses?: components['parameters']['build_statuses'] + /** @description Maximum number of items to return per page. */ + limit?: components['parameters']['builds_limit'] + /** @description Cursor returned by the previous list response in `created_at|build_id` format. */ + cursor?: components['parameters']['builds_cursor'] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned paginated builds. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['BuildsListResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/builds/statuses': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** Get build statuses */ + get: { + parameters: { + query: { + /** @description Comma-separated list of build IDs to get statuses for. */ + build_ids: components['parameters']['build_ids'] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned build statuses */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['BuildsStatusesResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/builds/{build_id}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** Get build details */ + get: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the build. */ + build_id: components['parameters']['build_id'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned build details. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['BuildInfo'] + } + } + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/record': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** Get sandbox record */ + get: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the sandbox. */ + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned sandbox details. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxRecord'] + } + } + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * List user teams + * @description Returns all teams the authenticated user belongs to, with limits and default flag. + */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned user teams. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['UserTeamsResponse'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** Create team */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['CreateTeamRequest'] + } + } + responses: { + /** @description Successfully created team. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamResolveResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/users/bootstrap': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** Bootstrap auth provider user */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AdminAuthProviderUserBootstrapRequest'] + } + } + responses: { + /** @description Successfully bootstrapped user. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamResolveResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/teams/bootstrap': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * Bootstrap team + * @description Creates and provisions a team for an admin-authenticated bootstrap workflow. + */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AdminTeamBootstrapRequest'] + } + } + responses: { + /** @description Successfully bootstrapped team. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamResolveResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + 502: components['responses']['502'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/user-profiles/resolve': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** Resolve user profiles */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AdminAuthProviderProfilesResolveRequest'] + } + } + responses: { + /** @description Successfully resolved profiles. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AdminAuthProviderProfilesResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/user-profiles/by-email': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** Lookup user profiles by email */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AdminAuthProviderProfilesLookupEmailRequest'] + } + } + responses: { + /** @description Successfully found matching profiles. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AdminAuthProviderProfilesResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/user-profiles/{userId}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** Get user profile */ + get: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the user. */ + userId: components['parameters']['userId'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully found profile. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AdminAuthProviderProfilesResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/users/{userId}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + /** + * Delete user + * @description Deletes a user by removing the identity provider record, user_identities mapping, and public.users row. + */ + delete: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the user. */ + userId: components['parameters']['userId'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully deleted user. */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 409: components['responses']['409'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/teams/resolve': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * Resolve team identity + * @description Resolves a team slug to the team's identity, validating the user is a member. + */ + get: { + parameters: { + query: { + /** @description Team slug to resolve. */ + slug: components['parameters']['teamSlug'] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully resolved team. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamResolveResponse'] + } + } + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams/{teamID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + delete?: never + options?: never + head?: never + /** Update team */ + patch: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the team. */ + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['UpdateTeamRequest'] + } + } + responses: { + /** @description Successfully updated team. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['UpdateTeamResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + trace?: never + } + '/teams/{teamID}/members': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** List team members */ + get: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the team. */ + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned team members. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamMembersResponse'] + } + } + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + /** Add team member */ + post: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the team. */ + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AddTeamMemberRequest'] + } + } + responses: { + /** @description Successfully added team member. */ + 201: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams/{teamID}/members/{userId}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + /** Remove team member */ + delete: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the team. */ + teamID: components['parameters']['teamID'] + /** @description Identifier of the user. */ + userId: components['parameters']['userId'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully removed team member. */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * List team templates + * @description Returns a paginated list of the team's templates (and default templates inline, unless the team is on a dedicated cluster), with filtering, search, and column sorting via keyset cursor pagination. + */ + get: { + parameters: { + query?: { + /** @description Filter templates by visibility (true = public, false = internal). */ + public?: components['parameters']['templates_public'] + /** @description Case-insensitive substring match on template names, aliases, and template id. */ + search?: components['parameters']['templates_search'] + /** @description Sort column and direction. */ + sort?: components['parameters']['templates_sort'] + /** @description Maximum number of items to return per page. */ + limit?: components['parameters']['templates_limit'] + /** @description Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. */ + cursor?: components['parameters']['templates_cursor'] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned paginated templates. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamTemplatesResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/defaults': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * List default templates + * @description Returns the list of default templates with their latest build info and aliases. + */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned default templates. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['DefaultTemplatesResponse'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * Get template + * @description Returns a single template owned by the current team. Dashboard-shaped read, indexed by template ID. + */ + get: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the template. */ + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateDetail'] + } + } + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/tags/groups': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * List template tag groups + * @description Returns ready template tag assignment groups with bounded per-tag history, paginated over tags with keyset cursor. + */ + get: { + parameters: { + query?: { + /** @description Maximum number of ready assignment rows to return per tag. */ + assignmentLimit?: components['parameters']['tag_assignment_limit'] + /** @description Maximum number of distinct tags to return per page. */ + tagsLimit?: components['parameters']['tag_groups_limit'] + /** @description Cursor returned by the previous list response in `{sort}|{latest_assigned_at}|{tag}` format (sort-tagged, RFC3339Nano). */ + tagsCursor?: components['parameters']['tag_groups_cursor'] + /** @description Case-insensitive substring filter on tag name. Allowed characters are `a-z`, `0-9`, `.`, `_`, `-`. */ + search?: components['parameters']['tag_groups_search'] + /** @description Sort order for the returned tag groups. */ + sort?: components['parameters']['tag_groups_sort'] + } + header?: never + path: { + /** @description Identifier of the template. */ + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned template tag groups. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateTagGroupsResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/tags/count': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * Count template tags + * @description Returns the total number of distinct ready tags for the template. + */ + get: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the template. */ + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned tag count. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateTagsCountResponse'] + } + } + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/tags/exists': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * Check ready template tag existence + * @description Checks whether a template tag has at least one ready assignment. + */ + get: { + parameters: { + query: { + /** @description Template tag name to check. */ + tag: components['parameters']['tag'] + } + header?: never + path: { + /** @description Identifier of the template. */ + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully checked template tag existence. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateTagExistsResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/tags/{tag}/assignments': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * List ready assignments for a single template tag + * @description Returns ready tag assignment events for a single tag, ordered newest first, with keyset cursor pagination. + */ + get: { + parameters: { + query?: { + /** @description Cursor returned by the previous list response in `assigned_at|assignment_id` format. */ + cursor?: components['parameters']['tag_assignments_cursor'] + /** @description Maximum number of assignment rows to return per page. */ + limit?: components['parameters']['tag_assignments_limit'] + } + header?: never + path: { + /** @description Identifier of the template. */ + templateID: components['parameters']['templateID'] + /** @description Template tag name. */ + tag: components['parameters']['tag_path'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned tag assignment page. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateTagAssignmentsResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } } -export type webhooks = Record; +export type webhooks = Record export interface components { - schemas: { - Error: { - /** - * Format: int32 - * @description Error code. - */ - code: number; - /** @description Error message. */ - message: string; - }; - AdminAuthProviderProfile: { - /** - * Format: uuid - * @description Internal E2B user identifier. - */ - userId: string; - /** @description Email address from the configured auth provider. */ - email: string | null; - }; - AdminAuthProviderProfilesResponse: { - profiles: components["schemas"]["AdminAuthProviderProfile"][]; - }; - AdminAuthProviderProfilesResolveRequest: { - userIds: string[]; - }; - AdminAuthProviderProfilesLookupEmailRequest: { - /** Format: email */ - email: string; - }; - AdminAuthProviderUserBootstrapRequest: { - oidc_issuer: string; - oidc_user_id: string; - /** Format: email */ - oidc_user_email: string; - oidc_user_name?: string | null; - signup_ip?: string; - signup_user_agent?: string; - }; - AdminTeamBootstrapRequest: { - /** @description Team name. */ - name: string; - /** - * Format: email - * @description Billing/contact email for the team. - */ - email: string; - }; - /** - * @description Build status mapped for dashboard clients. - * @enum {string} - */ - BuildStatus: "building" | "failed" | "success"; - ListedBuild: { - /** - * Format: uuid - * @description Identifier of the build. - */ - id: string; - /** @description Template alias when present, otherwise template ID. */ - template: string; - /** @description Identifier of the template. */ - templateId: string; - status: components["schemas"]["BuildStatus"]; - /** @description Failure message when status is `failed`, otherwise `null`. */ - statusMessage: string | null; - /** - * Format: date-time - * @description Build creation timestamp in RFC3339 format. - */ - createdAt: string; - /** - * Format: date-time - * @description Build completion timestamp in RFC3339 format, if finished. - */ - finishedAt: string | null; - /** - * Format: int64 - * @description CPU cores configured for the build. - */ - cpuCount: number; - /** - * Format: int64 - * @description Memory in MiB configured for the build. - */ - memoryMB: number; - /** - * Format: int64 - * @description Disk size in MiB configured for the build, if recorded. - */ - diskSizeMB: number | null; - /** @description envd version the build was created with, if recorded. */ - envdVersion: string | null; - }; - BuildsListResponse: { - data: components["schemas"]["ListedBuild"][]; - /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ - nextCursor: string | null; - }; - BuildStatusItem: { - /** - * Format: uuid - * @description Identifier of the build. - */ - id: string; - status: components["schemas"]["BuildStatus"]; - /** - * Format: date-time - * @description Build completion timestamp in RFC3339 format, if finished. - */ - finishedAt: string | null; - /** @description Failure message when status is `failed`, otherwise `null`. */ - statusMessage: string | null; - }; - BuildsStatusesResponse: { - /** @description List of build statuses */ - buildStatuses: components["schemas"]["BuildStatusItem"][]; - }; - BuildInfo: { - /** @description Template names related to this build, if available. */ - names?: string[] | null; - /** - * Format: date-time - * @description Build creation timestamp in RFC3339 format. - */ - createdAt: string; - /** - * Format: date-time - * @description Build completion timestamp in RFC3339 format, if finished. - */ - finishedAt: string | null; - status: components["schemas"]["BuildStatus"]; - /** @description Failure message when status is `failed`, otherwise `null`. */ - statusMessage: string | null; - }; - /** - * Format: int64 - * @description CPU cores for the sandbox - */ - CPUCount: number; - /** - * Format: int64 - * @description Memory for the sandbox in MiB - */ - MemoryMB: number; - /** - * Format: int64 - * @description Disk size for the sandbox in MiB - */ - DiskSizeMB: number; - SandboxRecord: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Alias of the template */ - alias?: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string; - /** - * Format: date-time - * @description Time when the sandbox was stopped - */ - stoppedAt?: string | null; - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - }; - HealthResponse: { - /** @description Human-readable health check result. */ - message: string; - }; - UserTeamLimits: { - /** Format: int64 */ - maxLengthHours: number; - /** Format: int32 */ - concurrentSandboxes: number; - /** Format: int32 */ - concurrentTemplateBuilds: number; - /** Format: int32 */ - maxVcpu: number; - /** Format: int32 */ - maxRamMb: number; - /** Format: int32 */ - diskMb: number; - }; - UserTeam: { - /** Format: uuid */ - id: string; - name: string; - slug: string; - tier: string; - email: string; - profilePictureUrl: string | null; - isBlocked: boolean; - isBanned: boolean; - blockedReason: string | null; - isDefault: boolean; - limits: components["schemas"]["UserTeamLimits"]; - /** Format: date-time */ - createdAt: string; - }; - UserTeamsResponse: { - teams: components["schemas"]["UserTeam"][]; - }; - TeamMember: { - /** Format: uuid */ - id: string; - email: string; - name?: string | null; - /** Format: uri */ - profilePictureUrl?: string | null; - providers: string[]; - isDefault: boolean; - /** Format: uuid */ - addedBy?: string | null; - /** Format: date-time */ - createdAt: string | null; - }; - TeamMembersResponse: { - members: components["schemas"]["TeamMember"][]; - }; - UpdateTeamRequest: { - name?: string; - profilePictureUrl?: string | null; - }; - UpdateTeamResponse: { - /** Format: uuid */ - id: string; - name: string; - profilePictureUrl?: string | null; - }; - AddTeamMemberRequest: { - /** Format: email */ - email: string; - }; - CreateTeamRequest: { - name: string; - }; - DefaultTemplateAlias: { - alias: string; - namespace?: string | null; - }; - DefaultTemplate: { - id: string; - aliases: components["schemas"]["DefaultTemplateAlias"][]; - /** Format: uuid */ - buildId: string; - /** Format: int64 */ - ramMb: number; - /** Format: int64 */ - vcpu: number; - /** Format: int64 */ - totalDiskSizeMb: number | null; - envdVersion?: string | null; - /** Format: date-time */ - createdAt: string; - public: boolean; - /** Format: int32 */ - buildCount: number; - /** Format: int64 */ - spawnCount: number; - }; - DefaultTemplatesResponse: { - templates: components["schemas"]["DefaultTemplate"][]; - }; - TeamTemplate: { - templateID: string; - /** Format: uuid */ - buildID: string; - /** Format: int64 */ - cpuCount: number; - /** Format: int64 */ - memoryMB: number; - /** Format: int64 */ - diskSizeMB: number | null; - public: boolean; - aliases: string[]; - names: string[]; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - createdBy: { - /** Format: uuid */ - id: string; - email?: string | null; - } | null; - /** Format: date-time */ - lastSpawnedAt: string | null; - /** Format: int64 */ - spawnCount: number; - /** Format: int32 */ - buildCount: number; - envdVersion: string | null; - isDefault: boolean; - defaultDescription?: string | null; - }; - TeamTemplatesResponse: { - data: components["schemas"]["TeamTemplate"][]; - /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ - nextCursor: string | null; - }; - /** @description Dashboard-shaped single-template read. Mirrors the infra-api `Template` schema fields the dashboard renders. */ - TemplateDetail: { - /** @description Identifier of the template. */ - templateID: string; - /** @description Identifier of the latest ready build for the template, or the zero UUID when none. */ - buildID: string; - /** @description vCPU count of the latest ready default build, or `null` when none. */ - cpuCount: components["schemas"]["CPUCount"] | null; - /** @description Memory in MiB of the latest ready default build, or `null` when none. */ - memoryMB: components["schemas"]["MemoryMB"] | null; - /** @description Disk size in MiB of the latest ready default build, or `null` when none. */ - diskSizeMB: components["schemas"]["DiskSizeMB"] | null; - /** @description Whether the template is public or only accessible by the team. */ - public: boolean; - /** - * @deprecated - * @description Aliases of the template. - */ - aliases: string[]; - /** @description Names of the template (namespace/alias format when namespaced). */ - names: string[]; - /** - * Format: date-time - * @description Time when the template was created. - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated. - */ - updatedAt: string; - /** - * Format: date-time - * @description Time when the template was last used. - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used. - */ - spawnCount: number; - /** - * Format: int32 - * @description Number of times the template was built. - */ - buildCount: number; - /** @description envd version of the latest ready default build, or `null` when none. */ - envdVersion: string | null; - }; - TemplateTagAssignment: { - /** - * Format: uuid - * @description Identifier of the tag assignment event. - */ - assignmentId: string; - /** - * Format: uuid - * @description Identifier of the assigned build. - */ - buildId: string; - /** - * Format: date-time - * @description Time when the tag was assigned to the build. - */ - assignedAt: string; - /** - * Format: date-time - * @description Time when the assigned build was created. - */ - buildCreatedAt: string; - /** - * Format: date-time - * @description Time when the assigned build finished. - */ - buildFinishedAt: string | null; - }; - TemplateTagGroup: { - /** @description Template tag name. */ - tag: string; - /** @description Ready assignment events for this tag, sorted latest first. */ - assignments: components["schemas"]["TemplateTagAssignment"][]; - /** @description Whether more ready assignment events exist beyond the requested assignment limit. */ - hasMore: boolean; - }; - TemplateTagGroupsResponse: { - tags: components["schemas"]["TemplateTagGroup"][]; - /** @description Cursor to pass as `tagsCursor` for the next page, or `null` if there is no next page. */ - nextCursor: string | null; - }; - TemplateTagsCountResponse: { - /** - * Format: int64 - * @description Total distinct ready tags for the template. - */ - total: number; - }; - TemplateTagExistsResponse: { - /** @description Whether the template tag has at least one ready assignment. */ - exists: boolean; - /** @description Normalized template tag name. */ - normalizedTag: string; - }; - TemplateTagAssignmentsResponse: { - /** @description Ready assignment events for the tag, sorted latest first. */ - data: components["schemas"]["TemplateTagAssignment"][]; - /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ - nextCursor: string | null; - }; - TeamResolveResponse: { - /** Format: uuid */ - id: string; - slug: string; - }; - }; - responses: { - /** @description Bad request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Authentication error */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Forbidden */ - 403: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Conflict */ - 409: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Upstream error */ - 502: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - }; - parameters: { - /** @description Identifier of the build. */ - build_id: string; - /** @description Identifier of the sandbox. */ - sandboxID: string; - /** @description Maximum number of items to return per page. */ - builds_limit: number; - /** @description Cursor returned by the previous list response in `created_at|build_id` format. */ - builds_cursor: string; - /** @description Optional filter by build identifier, template identifier, or template alias. */ - build_id_or_template: string; - /** @description Comma-separated list of build statuses to include. */ - build_statuses: components["schemas"]["BuildStatus"][]; - /** @description Comma-separated list of build IDs to get statuses for. */ - build_ids: string[]; - /** @description Identifier of the team. */ - teamID: string; - /** @description Identifier of the user. */ - userId: string; - /** @description Team slug to resolve. */ - teamSlug: string; - /** @description Maximum number of items to return per page. */ - templates_limit: number; - /** @description Identifier of the template. */ - templateID: string; - /** @description Template tag name to check. */ - tag: string; - /** @description Maximum number of ready assignment rows to return per tag. */ - tag_assignment_limit: number; - /** @description Template tag name. */ - tag_path: string; - /** @description Maximum number of assignment rows to return per page. */ - tag_assignments_limit: number; - /** @description Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. */ - templates_cursor: string; - /** @description Filter templates by visibility (true = public, false = internal). */ - templates_public: boolean; - /** @description Case-insensitive substring match on template names, aliases, and template id. */ - templates_search: string; - /** @description Sort column and direction. */ - templates_sort: "created_at_asc" | "created_at_desc" | "updated_at_asc" | "updated_at_desc"; - /** @description Cursor returned by the previous list response in `assigned_at|assignment_id` format. */ - tag_assignments_cursor: string; - /** @description Maximum number of distinct tags to return per page. */ - tag_groups_limit: number; - /** @description Cursor returned by the previous list response in `{sort}|{latest_assigned_at}|{tag}` format (sort-tagged, RFC3339Nano). */ - tag_groups_cursor: string; - /** @description Case-insensitive substring filter on tag name. Allowed characters are `a-z`, `0-9`, `.`, `_`, `-`. */ - tag_groups_search: string; - /** @description Sort order for the returned tag groups. */ - tag_groups_sort: "latest_desc" | "latest_asc" | "name_asc" | "name_desc"; - }; - requestBodies: never; - headers: never; - pathItems: never; + schemas: { + Error: { + /** + * Format: int32 + * @description Error code. + */ + code: number + /** @description Error message. */ + message: string + } + AdminAuthProviderProfile: { + /** + * Format: uuid + * @description Internal E2B user identifier. + */ + userId: string + /** @description Email address from the configured auth provider. */ + email: string | null + } + AdminAuthProviderProfilesResponse: { + profiles: components['schemas']['AdminAuthProviderProfile'][] + } + AdminAuthProviderProfilesResolveRequest: { + userIds: string[] + } + AdminAuthProviderProfilesLookupEmailRequest: { + /** Format: email */ + email: string + } + AdminAuthProviderUserBootstrapRequest: { + oidc_issuer: string + oidc_user_id: string + /** Format: email */ + oidc_user_email: string + oidc_user_name?: string | null + signup_ip?: string + signup_user_agent?: string + } + AdminTeamBootstrapRequest: { + /** @description Team name. */ + name: string + /** + * Format: email + * @description Billing/contact email for the team. + */ + email: string + } + /** + * @description Build status mapped for dashboard clients. + * @enum {string} + */ + BuildStatus: 'building' | 'failed' | 'success' + ListedBuild: { + /** + * Format: uuid + * @description Identifier of the build. + */ + id: string + /** @description Template alias when present, otherwise template ID. */ + template: string + /** @description Identifier of the template. */ + templateId: string + status: components['schemas']['BuildStatus'] + /** @description Failure message when status is `failed`, otherwise `null`. */ + statusMessage: string | null + /** + * Format: date-time + * @description Build creation timestamp in RFC3339 format. + */ + createdAt: string + /** + * Format: date-time + * @description Build completion timestamp in RFC3339 format, if finished. + */ + finishedAt: string | null + /** + * Format: int64 + * @description CPU cores configured for the build. + */ + cpuCount: number + /** + * Format: int64 + * @description Memory in MiB configured for the build. + */ + memoryMB: number + /** + * Format: int64 + * @description Disk size in MiB configured for the build, if recorded. + */ + diskSizeMB: number | null + /** @description envd version the build was created with, if recorded. */ + envdVersion: string | null + } + BuildsListResponse: { + data: components['schemas']['ListedBuild'][] + /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ + nextCursor: string | null + } + BuildStatusItem: { + /** + * Format: uuid + * @description Identifier of the build. + */ + id: string + status: components['schemas']['BuildStatus'] + /** + * Format: date-time + * @description Build completion timestamp in RFC3339 format, if finished. + */ + finishedAt: string | null + /** @description Failure message when status is `failed`, otherwise `null`. */ + statusMessage: string | null + } + BuildsStatusesResponse: { + /** @description List of build statuses */ + buildStatuses: components['schemas']['BuildStatusItem'][] + } + BuildInfo: { + /** @description Template names related to this build, if available. */ + names?: string[] | null + /** + * Format: date-time + * @description Build creation timestamp in RFC3339 format. + */ + createdAt: string + /** + * Format: date-time + * @description Build completion timestamp in RFC3339 format, if finished. + */ + finishedAt: string | null + status: components['schemas']['BuildStatus'] + /** @description Failure message when status is `failed`, otherwise `null`. */ + statusMessage: string | null + } + /** + * Format: int64 + * @description CPU cores for the sandbox + */ + CPUCount: number + /** + * Format: int64 + * @description Memory for the sandbox in MiB + */ + MemoryMB: number + /** + * Format: int64 + * @description Disk size for the sandbox in MiB + */ + DiskSizeMB: number + SandboxRecord: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Alias of the template */ + alias?: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string + /** + * Format: date-time + * @description Time when the sandbox was stopped + */ + stoppedAt?: string | null + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + } + HealthResponse: { + /** @description Human-readable health check result. */ + message: string + } + UserTeamLimits: { + /** Format: int64 */ + maxLengthHours: number + /** Format: int32 */ + concurrentSandboxes: number + /** Format: int32 */ + concurrentTemplateBuilds: number + /** Format: int32 */ + maxVcpu: number + /** Format: int32 */ + maxRamMb: number + /** Format: int32 */ + diskMb: number + } + UserTeam: { + /** Format: uuid */ + id: string + name: string + slug: string + tier: string + email: string + profilePictureUrl: string | null + isBlocked: boolean + isBanned: boolean + blockedReason: string | null + isDefault: boolean + limits: components['schemas']['UserTeamLimits'] + /** Format: date-time */ + createdAt: string + } + UserTeamsResponse: { + teams: components['schemas']['UserTeam'][] + } + TeamMember: { + /** Format: uuid */ + id: string + email: string + name?: string | null + /** Format: uri */ + profilePictureUrl?: string | null + providers: string[] + isDefault: boolean + /** Format: uuid */ + addedBy?: string | null + /** Format: date-time */ + createdAt: string | null + } + TeamMembersResponse: { + members: components['schemas']['TeamMember'][] + } + UpdateTeamRequest: { + name?: string + profilePictureUrl?: string | null + } + UpdateTeamResponse: { + /** Format: uuid */ + id: string + name: string + profilePictureUrl?: string | null + } + AddTeamMemberRequest: { + /** Format: email */ + email: string + } + CreateTeamRequest: { + name: string + } + DefaultTemplateAlias: { + alias: string + namespace?: string | null + } + DefaultTemplate: { + id: string + aliases: components['schemas']['DefaultTemplateAlias'][] + /** Format: uuid */ + buildId: string + /** Format: int64 */ + ramMb: number + /** Format: int64 */ + vcpu: number + /** Format: int64 */ + totalDiskSizeMb: number | null + envdVersion?: string | null + /** Format: date-time */ + createdAt: string + public: boolean + /** Format: int32 */ + buildCount: number + /** Format: int64 */ + spawnCount: number + } + DefaultTemplatesResponse: { + templates: components['schemas']['DefaultTemplate'][] + } + TeamTemplate: { + templateID: string + /** Format: uuid */ + buildID: string + /** Format: int64 */ + cpuCount: number + /** Format: int64 */ + memoryMB: number + /** Format: int64 */ + diskSizeMB: number | null + public: boolean + aliases: string[] + names: string[] + /** Format: date-time */ + createdAt: string + /** Format: date-time */ + updatedAt: string + createdBy: { + /** Format: uuid */ + id: string + email?: string | null + } | null + /** Format: date-time */ + lastSpawnedAt: string | null + /** Format: int64 */ + spawnCount: number + /** Format: int32 */ + buildCount: number + envdVersion: string | null + isDefault: boolean + defaultDescription?: string | null + } + TeamTemplatesResponse: { + data: components['schemas']['TeamTemplate'][] + /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ + nextCursor: string | null + } + /** @description Dashboard-shaped single-template read. Mirrors the infra-api `Template` schema fields the dashboard renders. */ + TemplateDetail: { + /** @description Identifier of the template. */ + templateID: string + /** @description Identifier of the latest ready build for the template, or the zero UUID when none. */ + buildID: string + /** @description vCPU count of the latest ready default build, or `null` when none. */ + cpuCount: components['schemas']['CPUCount'] | null + /** @description Memory in MiB of the latest ready default build, or `null` when none. */ + memoryMB: components['schemas']['MemoryMB'] | null + /** @description Disk size in MiB of the latest ready default build, or `null` when none. */ + diskSizeMB: components['schemas']['DiskSizeMB'] | null + /** @description Whether the template is public or only accessible by the team. */ + public: boolean + /** + * @deprecated + * @description Aliases of the template. + */ + aliases: string[] + /** @description Names of the template (namespace/alias format when namespaced). */ + names: string[] + /** + * Format: date-time + * @description Time when the template was created. + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated. + */ + updatedAt: string + /** + * Format: date-time + * @description Time when the template was last used. + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used. + */ + spawnCount: number + /** + * Format: int32 + * @description Number of times the template was built. + */ + buildCount: number + /** @description envd version of the latest ready default build, or `null` when none. */ + envdVersion: string | null + } + TemplateTagAssignment: { + /** + * Format: uuid + * @description Identifier of the tag assignment event. + */ + assignmentId: string + /** + * Format: uuid + * @description Identifier of the assigned build. + */ + buildId: string + /** + * Format: date-time + * @description Time when the tag was assigned to the build. + */ + assignedAt: string + /** + * Format: date-time + * @description Time when the assigned build was created. + */ + buildCreatedAt: string + /** + * Format: date-time + * @description Time when the assigned build finished. + */ + buildFinishedAt: string | null + } + TemplateTagGroup: { + /** @description Template tag name. */ + tag: string + /** @description Ready assignment events for this tag, sorted latest first. */ + assignments: components['schemas']['TemplateTagAssignment'][] + /** @description Whether more ready assignment events exist beyond the requested assignment limit. */ + hasMore: boolean + } + TemplateTagGroupsResponse: { + tags: components['schemas']['TemplateTagGroup'][] + /** @description Cursor to pass as `tagsCursor` for the next page, or `null` if there is no next page. */ + nextCursor: string | null + } + TemplateTagsCountResponse: { + /** + * Format: int64 + * @description Total distinct ready tags for the template. + */ + total: number + } + TemplateTagExistsResponse: { + /** @description Whether the template tag has at least one ready assignment. */ + exists: boolean + /** @description Normalized template tag name. */ + normalizedTag: string + } + TemplateTagAssignmentsResponse: { + /** @description Ready assignment events for the tag, sorted latest first. */ + data: components['schemas']['TemplateTagAssignment'][] + /** @description Cursor to pass to the next list request, or `null` if there is no next page. */ + nextCursor: string | null + } + TeamResolveResponse: { + /** Format: uuid */ + id: string + slug: string + } + } + responses: { + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Authentication error */ + 401: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Server error */ + 500: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Upstream error */ + 502: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + } + parameters: { + /** @description Identifier of the build. */ + build_id: string + /** @description Identifier of the sandbox. */ + sandboxID: string + /** @description Maximum number of items to return per page. */ + builds_limit: number + /** @description Cursor returned by the previous list response in `created_at|build_id` format. */ + builds_cursor: string + /** @description Optional filter by build identifier, template identifier, or template alias. */ + build_id_or_template: string + /** @description Comma-separated list of build statuses to include. */ + build_statuses: components['schemas']['BuildStatus'][] + /** @description Comma-separated list of build IDs to get statuses for. */ + build_ids: string[] + /** @description Identifier of the team. */ + teamID: string + /** @description Identifier of the user. */ + userId: string + /** @description Team slug to resolve. */ + teamSlug: string + /** @description Maximum number of items to return per page. */ + templates_limit: number + /** @description Identifier of the template. */ + templateID: string + /** @description Template tag name to check. */ + tag: string + /** @description Maximum number of ready assignment rows to return per tag. */ + tag_assignment_limit: number + /** @description Template tag name. */ + tag_path: string + /** @description Maximum number of assignment rows to return per page. */ + tag_assignments_limit: number + /** @description Cursor returned by the previous list response in `{sort}|{value}|{templateID}` format. Rejected if its sort does not match the request. */ + templates_cursor: string + /** @description Filter templates by visibility (true = public, false = internal). */ + templates_public: boolean + /** @description Case-insensitive substring match on template names, aliases, and template id. */ + templates_search: string + /** @description Sort column and direction. */ + templates_sort: + | 'created_at_asc' + | 'created_at_desc' + | 'updated_at_asc' + | 'updated_at_desc' + /** @description Cursor returned by the previous list response in `assigned_at|assignment_id` format. */ + tag_assignments_cursor: string + /** @description Maximum number of distinct tags to return per page. */ + tag_groups_limit: number + /** @description Cursor returned by the previous list response in `{sort}|{latest_assigned_at}|{tag}` format (sort-tagged, RFC3339Nano). */ + tag_groups_cursor: string + /** @description Case-insensitive substring filter on tag name. Allowed characters are `a-z`, `0-9`, `.`, `_`, `-`. */ + tag_groups_search: string + /** @description Sort order for the returned tag groups. */ + tag_groups_sort: 'latest_desc' | 'latest_asc' | 'name_asc' | 'name_desc' + } + requestBodies: never + headers: never + pathItems: never } -export type $defs = Record; -export type operations = Record; +export type $defs = Record +export type operations = Record diff --git a/src/core/shared/contracts/infra-api.types.ts b/src/core/shared/contracts/infra-api.types.ts index c2440215d..fd88950af 100644 --- a/src/core/shared/contracts/infra-api.types.ts +++ b/src/core/shared/contracts/infra-api.types.ts @@ -4,3428 +4,3431 @@ */ export interface paths { - "/health": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Health check */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The service is healthy */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all teams */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all teams */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Team"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams/{teamID}/metrics": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get metrics for the team */ - get: { - parameters: { - query?: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number; - end?: number; - }; - header?: never; - path: { - teamID: components["parameters"]["teamID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the team metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamMetric"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams/{teamID}/metrics/max": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get the maximum metrics for the team in the given interval */ - get: { - parameters: { - query: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number; - end?: number; - /** @description Metric to retrieve the maximum value for */ - metric: "concurrent_sandboxes" | "sandbox_start_rate"; - }; - header?: never; - path: { - teamID: components["parameters"]["teamID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the team metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["MaxTeamMetric"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all running sandboxes */ - get: { - parameters: { - query?: { - /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ - metadata?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all running sandboxes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ListedSandbox"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Create a sandbox from the template */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewSandbox"]; - }; - }; - responses: { - /** @description The sandbox was created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/sandboxes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all sandboxes */ - get: { - parameters: { - query?: { - /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ - metadata?: string; - /** @description Filter sandboxes by one or more states */ - state?: components["schemas"]["SandboxState"][]; - /** @description Cursor to start the list from */ - nextToken?: components["parameters"]["paginationNextToken"]; - /** @description Maximum number of items to return per page */ - limit?: components["parameters"]["paginationLimit"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all running sandboxes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ListedSandbox"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/metrics": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List metrics for given sandboxes */ - get: { - parameters: { - query: { - /** @description Comma-separated list of sandbox IDs to get metrics for */ - sandbox_ids: string[]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all running sandboxes with metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxesWithMetrics"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * @deprecated - * @description Get sandbox logs. Use /v2/sandboxes/{sandboxID}/logs instead. - */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - start?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - }; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox logs */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxLogs"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/sandboxes/{sandboxID}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get sandbox logs */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - cursor?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - /** @description Direction of the logs that should be returned */ - direction?: components["schemas"]["LogsDirection"]; - /** @description Minimum log level to return. Logs below this level are excluded */ - level?: components["schemas"]["LogLevel"]; - /** @description Case-sensitive substring match on log message content */ - search?: string; - }; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox logs */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxLogsV2Response"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get a sandbox by id */ - get: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxDetail"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - /** @description Kill a sandbox */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The sandbox was killed successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/metrics": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get sandbox metrics */ - get: { - parameters: { - query?: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number; - end?: number; - }; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxMetric"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/pause": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Pause the sandbox */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The sandbox was paused successfully and can be resumed */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 409: components["responses"]["409"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/resume": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * @deprecated - * @description Resume the sandbox - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ResumedSandbox"]; - }; - }; - responses: { - /** @description The sandbox was resumed successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 409: components["responses"]["409"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/connect": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ConnectSandbox"]; - }; - }; - responses: { - /** @description The sandbox was already running */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - /** @description The sandbox was resumed successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/timeout": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": components["schemas"]["SandboxTimeoutRequest"]; - }; - }; - responses: { - /** @description Successfully set the sandbox timeout */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/network": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** @description Update the network configuration for a running sandbox. Replaces the current egress rules with the provided configuration. Omitting field clears it. */ - put: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["SandboxNetworkUpdateConfig"]; - }; - }; - responses: { - /** @description Successfully updated the sandbox network configuration */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 409: components["responses"]["409"]; - 500: components["responses"]["500"]; - }; - }; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/refreshes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Refresh the sandbox extending its time to live */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": components["schemas"]["SandboxRefreshRequest"]; - }; - }; - responses: { - /** @description Successfully refreshed the sandbox */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/snapshots": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Create a persistent snapshot from the sandbox's current state. Snapshots can be used to create new sandboxes and persist beyond the original sandbox's lifetime. */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["SandboxSnapshotRequest"]; - }; - }; - responses: { - /** @description Snapshot created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SnapshotInfo"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/snapshots": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all snapshots for the team */ - get: { - parameters: { - query?: { - sandboxID?: string; - /** @description Maximum number of items to return per page */ - limit?: components["parameters"]["paginationLimit"]; - /** @description Cursor to start the list from */ - nextToken?: components["parameters"]["paginationNextToken"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned snapshots */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SnapshotInfo"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v3/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Create a new template */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequestV3"]; - }; - }; - responses: { - /** @description The build was requested successfully */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateRequestResponseV3"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * @deprecated - * @description Create a new template - */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequestV2"]; - }; - }; - responses: { - /** @description The build was requested successfully */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateLegacy"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/files/{hash}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get an upload link for a tar file containing build layer files */ - get: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - hash: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The upload link where to upload the tar file */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateBuildFileUpload"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all templates */ - get: { - parameters: { - query?: { - teamID?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all templates */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Template"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** - * @deprecated - * @description Create a new template - */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequest"]; - }; - }; - responses: { - /** @description The build was accepted */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateLegacy"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all builds for a template */ - get: { - parameters: { - query?: { - /** @description Cursor to start the list from */ - nextToken?: components["parameters"]["paginationNextToken"]; - /** @description Maximum number of items to return per page */ - limit?: components["parameters"]["paginationLimit"]; - }; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template with its builds */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateWithBuilds"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** - * @deprecated - * @description Rebuild an template - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequest"]; - }; - }; - responses: { - /** @description The build was accepted */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateLegacy"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - /** @description Delete a template */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The template was deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - /** - * @deprecated - * @description Update template - */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateUpdateRequest"]; - }; - }; - responses: { - /** @description The template was updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; - "/templates/{templateID}/builds/{buildID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * @deprecated - * @description Start the build - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The build has started */ - 202: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/templates/{templateID}/builds/{buildID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Start the build */ - post: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildStartV2"]; - }; - }; - responses: { - /** @description The build has started */ - 202: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/templates/{templateID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** @description Update template */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateUpdateRequest"]; - }; - }; - responses: { - /** @description The template was updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateUpdateResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; - "/templates/{templateID}/builds/{buildID}/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get template build info */ - get: { - parameters: { - query?: { - /** @description Index of the starting build log that should be returned with the template */ - logsOffset?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - level?: components["schemas"]["LogLevel"]; - }; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateBuildInfo"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/builds/{buildID}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get template build logs */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - cursor?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - direction?: components["schemas"]["LogsDirection"]; - level?: components["schemas"]["LogLevel"]; - /** @description Source of the logs that should be returned from */ - source?: components["schemas"]["LogsSource"]; - }; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template build logs */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateBuildLogsResponse"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/tags": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Assign tag(s) to a template build */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AssignTemplateTagsRequest"]; - }; - }; - responses: { - /** @description Tag assigned successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AssignedTemplateTags"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - /** @description Delete multiple tags from templates */ - delete: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["DeleteTemplateTagsRequest"]; - }; - }; - responses: { - /** @description Tags deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/tags": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all tags for a template */ - get: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template tags */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateTag"][]; - }; - }; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/aliases/{alias}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Check if template with given alias exists */ - get: { - parameters: { - query?: never; - header?: never; - path: { - alias: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully queried template by alias */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateAliasResponse"]; - }; - }; - 400: components["responses"]["400"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/nodes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all nodes */ - get: { - parameters: { - query?: { - /** @description Identifier of the cluster */ - clusterID?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all nodes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Node"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/nodes/{nodeID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get node info */ - get: { - parameters: { - query?: { - /** @description Identifier of the cluster */ - clusterID?: string; - }; - header?: never; - path: { - nodeID: components["parameters"]["nodeID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the node */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["NodeDetail"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Change status of a node */ - post: { - parameters: { - query?: never; - header?: never; - path: { - nodeID: components["parameters"]["nodeID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": components["schemas"]["NodeStatusChange"]; - }; - }; - responses: { - /** @description The node status was changed successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/teams/{teamID}/sandboxes/kill": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Kill all sandboxes for a team - * @description Kills all sandboxes for the specified team - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Team ID */ - teamID: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully killed sandboxes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AdminSandboxKillResult"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/teams/{teamID}/builds/cancel": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Cancel all builds for a team - * @description Cancels all in-progress and pending builds for the specified team - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Team ID */ - teamID: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully cancelled builds */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AdminBuildCancelResult"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/teams/{teamID}/api-keys": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Create team API key as admin - * @description Creates a team API key for internal service workflows. - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Team ID */ - teamID: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewTeamAPIKey"]; - }; - }; - responses: { - /** @description Team API key created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["CreatedTeamAPIKey"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/teams/{teamID}/api-keys/{apiKeyID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** - * Delete team API key as admin - * @description Deletes a team API key for internal service workflows. - */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Team ID */ - teamID: string; - apiKeyID: components["parameters"]["apiKeyID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Team API key deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/access-tokens": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Create a new access token */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewAccessToken"]; - }; - }; - responses: { - /** @description Access token created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["CreatedAccessToken"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/access-tokens/{accessTokenID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** @description Delete an access token */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - accessTokenID: components["parameters"]["accessTokenID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Access token deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api-keys": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all team API keys */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all team API keys */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamAPIKey"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Create a new team API key */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewTeamAPIKey"]; - }; - }; - responses: { - /** @description Team API key created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["CreatedTeamAPIKey"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api-keys/{apiKeyID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** @description Delete a team API key */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - apiKeyID: components["parameters"]["apiKeyID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Team API key deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - /** @description Update a team API key */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - apiKeyID: components["parameters"]["apiKeyID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateTeamAPIKey"]; - }; - }; - responses: { - /** @description Team API key updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; - "/volumes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all team volumes */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully listed all team volumes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Volume"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Create a new team volume */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewVolume"]; - }; - }; - responses: { - /** @description Successfully created a new team volume */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["VolumeAndToken"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/volumes/{volumeID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get team volume info */ - get: { - parameters: { - query?: never; - header?: never; - path: { - volumeID: components["parameters"]["volumeID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully retrieved a team volume */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["VolumeAndToken"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - /** @description Delete a team volume */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - volumeID: components["parameters"]["volumeID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully deleted a team volume */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; + '/health': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Health check */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description The service is healthy */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all teams */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all teams */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Team'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams/{teamID}/metrics': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get metrics for the team */ + get: { + parameters: { + query?: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number + end?: number + } + header?: never + path: { + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the team metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamMetric'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams/{teamID}/metrics/max': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get the maximum metrics for the team in the given interval */ + get: { + parameters: { + query: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number + end?: number + /** @description Metric to retrieve the maximum value for */ + metric: 'concurrent_sandboxes' | 'sandbox_start_rate' + } + header?: never + path: { + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the team metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['MaxTeamMetric'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all running sandboxes */ + get: { + parameters: { + query?: { + /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ + metadata?: string + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all running sandboxes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ListedSandbox'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Create a sandbox from the template */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewSandbox'] + } + } + responses: { + /** @description The sandbox was created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/sandboxes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all sandboxes */ + get: { + parameters: { + query?: { + /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ + metadata?: string + /** @description Filter sandboxes by one or more states */ + state?: components['schemas']['SandboxState'][] + /** @description Cursor to start the list from */ + nextToken?: components['parameters']['paginationNextToken'] + /** @description Maximum number of items to return per page */ + limit?: components['parameters']['paginationLimit'] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all running sandboxes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ListedSandbox'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/metrics': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List metrics for given sandboxes */ + get: { + parameters: { + query: { + /** @description Comma-separated list of sandbox IDs to get metrics for */ + sandbox_ids: string[] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all running sandboxes with metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxesWithMetrics'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/logs': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * @deprecated + * @description Get sandbox logs. Use /v2/sandboxes/{sandboxID}/logs instead. + */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + start?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + } + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox logs */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxLogs'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/sandboxes/{sandboxID}/logs': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get sandbox logs */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + cursor?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + /** @description Direction of the logs that should be returned */ + direction?: components['schemas']['LogsDirection'] + /** @description Minimum log level to return. Logs below this level are excluded */ + level?: components['schemas']['LogLevel'] + /** @description Case-sensitive substring match on log message content */ + search?: string + } + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox logs */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxLogsV2Response'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get a sandbox by id */ + get: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxDetail'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + /** @description Kill a sandbox */ + delete: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The sandbox was killed successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/metrics': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get sandbox metrics */ + get: { + parameters: { + query?: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number + end?: number + } + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxMetric'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/pause': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Pause the sandbox */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The sandbox was paused successfully and can be resumed */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 409: components['responses']['409'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/resume': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * @deprecated + * @description Resume the sandbox + */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['ResumedSandbox'] + } + } + responses: { + /** @description The sandbox was resumed successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 409: components['responses']['409'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/connect': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['ConnectSandbox'] + } + } + responses: { + /** @description The sandbox was already running */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + /** @description The sandbox was resumed successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/timeout': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': components['schemas']['SandboxTimeoutRequest'] + } + } + responses: { + /** @description Successfully set the sandbox timeout */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/network': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + /** @description Update the network configuration for a running sandbox. Replaces the current egress rules with the provided configuration. Omitting field clears it. */ + put: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['SandboxNetworkUpdateConfig'] + } + } + responses: { + /** @description Successfully updated the sandbox network configuration */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 409: components['responses']['409'] + 500: components['responses']['500'] + } + } + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/refreshes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Refresh the sandbox extending its time to live */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': components['schemas']['SandboxRefreshRequest'] + } + } + responses: { + /** @description Successfully refreshed the sandbox */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/snapshots': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Create a persistent snapshot from the sandbox's current state. Snapshots can be used to create new sandboxes and persist beyond the original sandbox's lifetime. */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['SandboxSnapshotRequest'] + } + } + responses: { + /** @description Snapshot created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SnapshotInfo'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/snapshots': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all snapshots for the team */ + get: { + parameters: { + query?: { + sandboxID?: string + /** @description Maximum number of items to return per page */ + limit?: components['parameters']['paginationLimit'] + /** @description Cursor to start the list from */ + nextToken?: components['parameters']['paginationNextToken'] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned snapshots */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SnapshotInfo'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v3/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Create a new template */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequestV3'] + } + } + responses: { + /** @description The build was requested successfully */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateRequestResponseV3'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * @deprecated + * @description Create a new template + */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequestV2'] + } + } + responses: { + /** @description The build was requested successfully */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateLegacy'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/files/{hash}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get an upload link for a tar file containing build layer files */ + get: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + hash: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The upload link where to upload the tar file */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateBuildFileUpload'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all templates */ + get: { + parameters: { + query?: { + teamID?: string + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all templates */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Template'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** + * @deprecated + * @description Create a new template + */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequest'] + } + } + responses: { + /** @description The build was accepted */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateLegacy'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all builds for a template */ + get: { + parameters: { + query?: { + /** @description Cursor to start the list from */ + nextToken?: components['parameters']['paginationNextToken'] + /** @description Maximum number of items to return per page */ + limit?: components['parameters']['paginationLimit'] + } + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template with its builds */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateWithBuilds'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** + * @deprecated + * @description Rebuild an template + */ + post: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequest'] + } + } + responses: { + /** @description The build was accepted */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateLegacy'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + /** @description Delete a template */ + delete: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The template was deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + /** + * @deprecated + * @description Update template + */ + patch: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateUpdateRequest'] + } + } + responses: { + /** @description The template was updated successfully */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + trace?: never + } + '/templates/{templateID}/builds/{buildID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * @deprecated + * @description Start the build + */ + post: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The build has started */ + 202: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/templates/{templateID}/builds/{buildID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Start the build */ + post: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildStartV2'] + } + } + responses: { + /** @description The build has started */ + 202: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/templates/{templateID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + delete?: never + options?: never + head?: never + /** @description Update template */ + patch: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateUpdateRequest'] + } + } + responses: { + /** @description The template was updated successfully */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateUpdateResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + trace?: never + } + '/templates/{templateID}/builds/{buildID}/status': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get template build info */ + get: { + parameters: { + query?: { + /** @description Index of the starting build log that should be returned with the template */ + logsOffset?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + level?: components['schemas']['LogLevel'] + } + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateBuildInfo'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/builds/{buildID}/logs': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get template build logs */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + cursor?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + direction?: components['schemas']['LogsDirection'] + level?: components['schemas']['LogLevel'] + /** @description Source of the logs that should be returned from */ + source?: components['schemas']['LogsSource'] + } + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template build logs */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateBuildLogsResponse'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/tags': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Assign tag(s) to a template build */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AssignTemplateTagsRequest'] + } + } + responses: { + /** @description Tag assigned successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AssignedTemplateTags'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + /** @description Delete multiple tags from templates */ + delete: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['DeleteTemplateTagsRequest'] + } + } + responses: { + /** @description Tags deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/tags': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all tags for a template */ + get: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template tags */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateTag'][] + } + } + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/aliases/{alias}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Check if template with given alias exists */ + get: { + parameters: { + query?: never + header?: never + path: { + alias: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully queried template by alias */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateAliasResponse'] + } + } + 400: components['responses']['400'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/nodes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all nodes */ + get: { + parameters: { + query?: { + /** @description Identifier of the cluster */ + clusterID?: string + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all nodes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Node'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/nodes/{nodeID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get node info */ + get: { + parameters: { + query?: { + /** @description Identifier of the cluster */ + clusterID?: string + } + header?: never + path: { + nodeID: components['parameters']['nodeID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the node */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['NodeDetail'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Change status of a node */ + post: { + parameters: { + query?: never + header?: never + path: { + nodeID: components['parameters']['nodeID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': components['schemas']['NodeStatusChange'] + } + } + responses: { + /** @description The node status was changed successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/teams/{teamID}/sandboxes/kill': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * Kill all sandboxes for a team + * @description Kills all sandboxes for the specified team + */ + post: { + parameters: { + query?: never + header?: never + path: { + /** @description Team ID */ + teamID: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully killed sandboxes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AdminSandboxKillResult'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/teams/{teamID}/builds/cancel': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * Cancel all builds for a team + * @description Cancels all in-progress and pending builds for the specified team + */ + post: { + parameters: { + query?: never + header?: never + path: { + /** @description Team ID */ + teamID: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully cancelled builds */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AdminBuildCancelResult'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/teams/{teamID}/api-keys': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * Create team API key as admin + * @description Creates a team API key for internal service workflows. + */ + post: { + parameters: { + query?: never + header?: never + path: { + /** @description Team ID */ + teamID: string + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewTeamAPIKey'] + } + } + responses: { + /** @description Team API key created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['CreatedTeamAPIKey'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/teams/{teamID}/api-keys/{apiKeyID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + /** + * Delete team API key as admin + * @description Deletes a team API key for internal service workflows. + */ + delete: { + parameters: { + query?: never + header?: never + path: { + /** @description Team ID */ + teamID: string + apiKeyID: components['parameters']['apiKeyID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Team API key deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/access-tokens': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Create a new access token */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewAccessToken'] + } + } + responses: { + /** @description Access token created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['CreatedAccessToken'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/access-tokens/{accessTokenID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + /** @description Delete an access token */ + delete: { + parameters: { + query?: never + header?: never + path: { + accessTokenID: components['parameters']['accessTokenID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Access token deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/api-keys': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all team API keys */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all team API keys */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamAPIKey'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Create a new team API key */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewTeamAPIKey'] + } + } + responses: { + /** @description Team API key created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['CreatedTeamAPIKey'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/api-keys/{apiKeyID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + /** @description Delete a team API key */ + delete: { + parameters: { + query?: never + header?: never + path: { + apiKeyID: components['parameters']['apiKeyID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Team API key deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + /** @description Update a team API key */ + patch: { + parameters: { + query?: never + header?: never + path: { + apiKeyID: components['parameters']['apiKeyID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['UpdateTeamAPIKey'] + } + } + responses: { + /** @description Team API key updated successfully */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + trace?: never + } + '/volumes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all team volumes */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully listed all team volumes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Volume'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Create a new team volume */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewVolume'] + } + } + responses: { + /** @description Successfully created a new team volume */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['VolumeAndToken'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/volumes/{volumeID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get team volume info */ + get: { + parameters: { + query?: never + header?: never + path: { + volumeID: components['parameters']['volumeID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully retrieved a team volume */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['VolumeAndToken'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + /** @description Delete a team volume */ + delete: { + parameters: { + query?: never + header?: never + path: { + volumeID: components['parameters']['volumeID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully deleted a team volume */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } } -export type webhooks = Record; +export type webhooks = Record export interface components { - schemas: { - Team: { - /** @description Identifier of the team */ - teamID: string; - /** @description Name of the team */ - name: string; - /** @description API key for the team */ - apiKey: string; - /** @description Whether the team is the default team */ - isDefault: boolean; - }; - TeamUser: { - /** - * Format: uuid - * @description Identifier of the user - */ - id: string; - /** - * @deprecated - * @description Email of the user - * @default null - */ - email: string | null; - }; - TemplateUpdateRequest: { - /** @description Whether the template is public or only accessible by the team */ - public?: boolean; - }; - TemplateUpdateResponse: { - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[]; - }; - /** - * Format: int32 - * @description CPU cores for the sandbox - */ - CPUCount: number; - /** - * Format: int32 - * @description Memory for the sandbox in MiB - */ - MemoryMB: number; - /** - * Format: int32 - * @description Disk size for the sandbox in MiB - */ - DiskSizeMB: number; - /** @description Version of the envd running in the sandbox */ - EnvdVersion: string; - SandboxMetadata: { - [key: string]: string; - }; - /** - * @description State of the sandbox - * @enum {string} - */ - SandboxState: "running" | "paused"; - SnapshotInfo: { - /** @description Identifier of the snapshot template including the tag. Uses namespace/alias when a name was provided (e.g. team-slug/my-snapshot:default), otherwise falls back to the raw template ID (e.g. abc123:default). */ - snapshotID: string; - /** @description Full names of the snapshot template including team namespace and tag (e.g. team-slug/my-snapshot:v2) */ - names: string[]; - }; - EnvVars: { - [key: string]: string; - }; - /** @description MCP configuration for the sandbox */ - Mcp: { - [key: string]: unknown; - } | null; - SandboxNetworkConfig: { - /** - * @description Specify if the sandbox URLs should be accessible only with authentication. - * @default true - */ - allowPublicTraffic: boolean; - /** @description List of allowed destinations for egress traffic. Each entry can be a CIDR block (e.g. "8.8.8.8/32"), a bare IP address (e.g. "8.8.8.8"), or a domain name (e.g. "example.com", "*.example.com"). Allowed entries always take precedence over denied entries. */ - allowOut?: string[]; - /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ - denyOut?: string[]; - egressProxy?: components["schemas"]["SandboxEgressProxyConfig"]; - /** @description Specify host mask which will be used for all sandbox requests */ - maskRequestHost?: string; - /** @description Per-domain transform rules applied to matching egress HTTP/HTTPS requests. Keys are domains (e.g. "api.example.com", "example.com"). A domain listed here is not automatically allowed - use allowOut to permit the traffic. */ - rules?: { - [key: string]: components["schemas"]["SandboxNetworkRule"][]; - }; - }; - /** @description Network configuration update for a running sandbox. Replaces the current egress rules with the provided configuration. Omitting a field clears it. */ - SandboxNetworkUpdateConfig: { - /** @description List of allowed destinations for egress traffic. Each entry can be a CIDR block (e.g. "8.8.8.8/32"), a bare IP address (e.g. "8.8.8.8"), or a domain name (e.g. "example.com", "*.example.com"). Allowed entries always take precedence over denied entries. */ - allowOut?: string[]; - /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ - denyOut?: string[]; - egressProxy?: components["schemas"]["SandboxEgressProxyConfig"]; - /** @description Per-domain transform rules. Replaces all existing rules when provided. */ - rules?: { - [key: string]: components["schemas"]["SandboxNetworkRule"][]; - }; - /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ - allow_internet_access?: boolean; - }; - /** @description Transform rule applied to egress requests matching a domain pattern. */ - SandboxNetworkRule: { - transform?: components["schemas"]["SandboxNetworkTransform"]; - }; - /** @description Transformations applied to matching egress requests before forwarding. */ - SandboxNetworkTransform: { - /** @description HTTP headers to inject or override in matching requests. An existing header with the same name is replaced. Values are plain strings; secret resolution happens client-side before sending to the API. */ - headers?: { - [key: string]: string; - }; - }; - /** @description SOCKS5 proxy for sandbox egress. Outbound TCP is tunneled through the proxy after allow/deny filtering; the sandbox is unaware. Domain-matched flows use remote DNS (ATYP=domain). */ - SandboxEgressProxyConfig: { - /** @description SOCKS5 proxy address in host:port format (e.g. "proxy.example.com:1080"). */ - address: string; - /** @description Optional SOCKS5 username (RFC 1929), max 255 bytes. */ - username?: string; - /** @description Optional SOCKS5 password (RFC 1929), max 255 bytes. */ - password?: string; - } | null; - /** - * @description Auto-resume enabled flag for paused sandboxes. Default false. - * @default false - */ - SandboxAutoResumeEnabled: boolean; - /** @description Auto-resume configuration for paused sandboxes. */ - SandboxAutoResumeConfig: { - enabled: components["schemas"]["SandboxAutoResumeEnabled"]; - }; - /** - * @description Action taken when the sandbox times out. - * @enum {string} - */ - SandboxOnTimeout: "kill" | "pause"; - /** @description Sandbox lifecycle policy returned by sandbox info. */ - SandboxLifecycle: { - /** @description Whether the sandbox can auto-resume. */ - autoResume: boolean; - onTimeout: components["schemas"]["SandboxOnTimeout"]; - }; - /** @description Log entry with timestamp and line */ - SandboxLog: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string; - /** @description Log line content */ - line: string; - }; - SandboxLogEntry: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string; - /** @description Log message content */ - message: string; - level: components["schemas"]["LogLevel"]; - fields: { - [key: string]: string; - }; - }; - SandboxLogs: { - /** @description Logs of the sandbox */ - logs: components["schemas"]["SandboxLog"][]; - /** @description Structured logs of the sandbox */ - logEntries: components["schemas"]["SandboxLogEntry"][]; - }; - SandboxLogsV2Response: { - /** - * @description Sandbox logs structured - * @default [] - */ - logs: components["schemas"]["SandboxLogEntry"][]; - }; - /** @description Metric entry with timestamp and line */ - SandboxMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string; - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number; - /** - * Format: int32 - * @description Number of CPU cores - */ - cpuCount: number; - /** - * Format: float - * @description CPU usage percentage - */ - cpuUsedPct: number; - /** - * Format: int64 - * @description Memory used in bytes - */ - memUsed: number; - /** - * Format: int64 - * @description Total memory in bytes - */ - memTotal: number; - /** - * Format: int64 - * @description Cached memory (page cache) in bytes - */ - memCache: number; - /** - * Format: int64 - * @description Disk used in bytes - */ - diskUsed: number; - /** - * Format: int64 - * @description Total disk space in bytes - */ - diskTotal: number; - }; - SandboxVolumeMount: { - /** @description Name of the volume */ - name: string; - /** @description Path of the volume */ - path: string; - }; - Sandbox: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** @description Alias of the template */ - alias?: string; - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string; - envdVersion: components["schemas"]["EnvdVersion"]; - /** @description Access token used for envd communication */ - envdAccessToken?: string; - /** @description Token required for accessing sandbox via proxy. */ - trafficAccessToken?: string | null; - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null; - }; - SandboxDetail: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Alias of the template */ - alias?: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string; - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string; - /** - * Format: date-time - * @description Time when the sandbox will expire - */ - endAt: string; - envdVersion: components["schemas"]["EnvdVersion"]; - /** @description Access token used for envd communication */ - envdAccessToken?: string; - /** @description Whether internet access was explicitly enabled or disabled for the sandbox. Null means it was not explicitly set. */ - allowInternetAccess?: boolean | null; - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - metadata?: components["schemas"]["SandboxMetadata"]; - state: components["schemas"]["SandboxState"]; - network?: components["schemas"]["SandboxNetworkConfig"]; - lifecycle?: components["schemas"]["SandboxLifecycle"]; - volumeMounts?: components["schemas"]["SandboxVolumeMount"][]; - }; - ListedSandbox: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Alias of the template */ - alias?: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string; - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string; - /** - * Format: date-time - * @description Time when the sandbox will expire - */ - endAt: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - metadata?: components["schemas"]["SandboxMetadata"]; - state: components["schemas"]["SandboxState"]; - envdVersion: components["schemas"]["EnvdVersion"]; - volumeMounts?: components["schemas"]["SandboxVolumeMount"][]; - }; - SandboxesWithMetrics: { - sandboxes: { - [key: string]: components["schemas"]["SandboxMetric"]; - }; - }; - NewSandbox: { - /** @description Identifier of the required template */ - templateID: string; - /** - * Format: int32 - * @description Time to live for the sandbox in seconds. - * @default 15 - */ - timeout: number; - /** - * @description Automatically pauses the sandbox after the timeout - * @default false - */ - autoPause: boolean; - autoResume?: components["schemas"]["SandboxAutoResumeConfig"]; - /** @description Secure all system communication with sandbox */ - secure?: boolean; - /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ - allow_internet_access?: boolean; - network?: components["schemas"]["SandboxNetworkConfig"]; - metadata?: components["schemas"]["SandboxMetadata"]; - envVars?: components["schemas"]["EnvVars"]; - mcp?: components["schemas"]["Mcp"]; - volumeMounts?: components["schemas"]["SandboxVolumeMount"][]; - }; - ResumedSandbox: { - /** - * Format: int32 - * @description Time to live for the sandbox in seconds. - * @default 15 - */ - timeout: number; - /** - * @deprecated - * @description Automatically pauses the sandbox after the timeout - */ - autoPause?: boolean; - }; - ConnectSandbox: { - /** - * Format: int32 - * @description Timeout in seconds from the current time after which the sandbox should expire - */ - timeout: number; - }; - SandboxTimeoutRequest: { - /** - * Format: int32 - * @description Timeout in seconds from the current time after which the sandbox should expire - */ - timeout: number; - }; - SandboxRefreshRequest: { - /** @description Duration for which the sandbox should be kept alive in seconds */ - duration?: number; - }; - SandboxSnapshotRequest: { - /** @description Optional name for the snapshot template. If a snapshot template with this name already exists, a new build will be assigned to the existing template instead of creating a new one. */ - name?: string; - }; - /** @description Team metric with timestamp */ - TeamMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string; - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number; - /** - * Format: int32 - * @description The number of concurrent sandboxes for the team - */ - concurrentSandboxes: number; - /** - * Format: float - * @description Number of sandboxes started per second - */ - sandboxStartRate: number; - }; - /** @description Team metric with timestamp */ - MaxTeamMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string; - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number; - /** @description The maximum value of the requested metric in the given interval */ - value: number; - }; - AdminSandboxKillResult: { - /** @description Number of sandboxes successfully killed */ - killedCount: number; - /** @description Number of sandboxes that failed to kill */ - failedCount: number; - }; - AdminBuildCancelResult: { - /** @description Number of builds successfully cancelled */ - cancelledCount: number; - /** @description Number of builds that failed to cancel */ - failedCount: number; - }; - VolumeToken: { - token: string; - }; - Template: { - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the last successful build for given template */ - buildID: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[]; - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[]; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string; - createdBy: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number; - /** - * Format: int32 - * @description Number of times the template was built - */ - buildCount: number; - envdVersion: components["schemas"]["EnvdVersion"]; - buildStatus: components["schemas"]["TemplateBuildStatus"]; - }; - TemplateRequestResponseV3: { - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the last successful build for given template */ - buildID: string; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** @description Names of the template */ - names: string[]; - /** @description Tags assigned to the template build */ - tags: string[]; - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[]; - }; - TemplateLegacy: { - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the last successful build for given template */ - buildID: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** @description Aliases of the template */ - aliases: string[]; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string; - createdBy: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number; - /** - * Format: int32 - * @description Number of times the template was built - */ - buildCount: number; - envdVersion: components["schemas"]["EnvdVersion"]; - }; - TemplateBuild: { - /** - * Format: uuid - * @description Identifier of the build - */ - buildID: string; - status: components["schemas"]["TemplateBuildStatus"]; - /** - * Format: date-time - * @description Time when the build was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the build was last updated - */ - updatedAt: string; - /** - * Format: date-time - * @description Time when the build was finished - */ - finishedAt?: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB?: components["schemas"]["DiskSizeMB"]; - envdVersion?: components["schemas"]["EnvdVersion"]; - }; - TemplateWithBuilds: { - /** @description Identifier of the template */ - templateID: string; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[]; - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[]; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string; - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number; - /** @description List of builds for the template */ - builds: components["schemas"]["TemplateBuild"][]; - }; - TemplateAliasResponse: { - /** @description Identifier of the template */ - templateID: string; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - }; - TemplateBuildRequest: { - /** @description Alias of the template */ - alias?: string; - /** @description Dockerfile for the template */ - dockerfile: string; - /** @description Identifier of the team */ - teamID?: string; - /** @description Start command to execute in the template after the build */ - startCmd?: string; - /** @description Ready check command to execute in the template after the build */ - readyCmd?: string; - cpuCount?: components["schemas"]["CPUCount"]; - memoryMB?: components["schemas"]["MemoryMB"]; - }; - /** @description Step in the template build process */ - TemplateStep: { - /** @description Type of the step */ - type: string; - /** - * @description Arguments for the step - * @default [] - */ - args: string[]; - /** @description Hash of the files used in the step */ - filesHash?: string; - /** - * @description Whether the step should be forced to run regardless of the cache - * @default false - */ - force: boolean; - }; - TemplateBuildRequestV3: { - /** @description Name of the template. Can include a tag with colon separator (e.g. "my-template" or "my-template:v1"). If tag is included, it will be treated as if the tag was provided in the tags array. */ - name?: string; - /** @description Tags to assign to the template build */ - tags?: string[]; - /** - * @deprecated - * @description Alias of the template. Deprecated, use name instead. - */ - alias?: string; - /** - * @deprecated - * @description Identifier of the team - */ - teamID?: string; - cpuCount?: components["schemas"]["CPUCount"]; - memoryMB?: components["schemas"]["MemoryMB"]; - }; - TemplateBuildRequestV2: { - /** @description Alias of the template */ - alias: string; - /** - * @deprecated - * @description Identifier of the team - */ - teamID?: string; - cpuCount?: components["schemas"]["CPUCount"]; - memoryMB?: components["schemas"]["MemoryMB"]; - }; - FromImageRegistry: components["schemas"]["AWSRegistry"] | components["schemas"]["GCPRegistry"] | components["schemas"]["GeneralRegistry"]; - AWSRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "aws"; - /** @description AWS Access Key ID for ECR authentication */ - awsAccessKeyId: string; - /** @description AWS Secret Access Key for ECR authentication */ - awsSecretAccessKey: string; - /** @description AWS Region where the ECR registry is located */ - awsRegion: string; - }; - GCPRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "gcp"; - /** @description Service Account JSON for GCP authentication */ - serviceAccountJson: string; - }; - GeneralRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "registry"; - /** @description Username to use for the registry */ - username: string; - /** @description Password to use for the registry */ - password: string; - }; - TemplateBuildStartV2: { - /** @description Image to use as a base for the template build */ - fromImage?: string; - /** @description Template to use as a base for the template build */ - fromTemplate?: string; - fromImageRegistry?: components["schemas"]["FromImageRegistry"]; - /** - * @description Whether the whole build should be forced to run regardless of the cache - * @default false - */ - force: boolean; - /** - * @description List of steps to execute in the template build - * @default [] - */ - steps: components["schemas"]["TemplateStep"][]; - /** @description Start command to execute in the template after the build */ - startCmd?: string; - /** @description Ready check command to execute in the template after the build */ - readyCmd?: string; - }; - TemplateBuildFileUpload: { - /** @description Whether the file is already present in the cache */ - present: boolean; - /** @description Url where the file should be uploaded to */ - url?: string; - }; - /** - * @description State of the sandbox - * @enum {string} - */ - LogLevel: "debug" | "info" | "warn" | "error"; - BuildLogEntry: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string; - /** @description Log message content */ - message: string; - level: components["schemas"]["LogLevel"]; - /** @description Step in the build process related to the log entry */ - step?: string; - }; - BuildStatusReason: { - /** @description Message with the status reason, currently reporting only for error status */ - message: string; - /** @description Step that failed */ - step?: string; - /** - * @description Log entries related to the status reason - * @default [] - */ - logEntries: components["schemas"]["BuildLogEntry"][]; - }; - /** - * @description Status of the template build - * @enum {string} - */ - TemplateBuildStatus: "building" | "waiting" | "ready" | "error"; - TemplateBuildInfo: { - /** - * @description Build logs - * @default [] - */ - logs: string[]; - /** - * @description Build logs structured - * @default [] - */ - logEntries: components["schemas"]["BuildLogEntry"][]; - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the build */ - buildID: string; - status: components["schemas"]["TemplateBuildStatus"]; - reason?: components["schemas"]["BuildStatusReason"]; - }; - TemplateBuildLogsResponse: { - /** - * @description Build logs structured - * @default [] - */ - logs: components["schemas"]["BuildLogEntry"][]; - }; - /** - * @description Direction of the logs that should be returned - * @enum {string} - */ - LogsDirection: "forward" | "backward"; - /** - * @description Source of the logs that should be returned - * @enum {string} - */ - LogsSource: "temporary" | "persistent"; - /** - * @description Status of the node. - * - draining: the node is bound to be shut down. It will not accept new sandboxes and will stop once all existing sandboxes are done. - * - standby: the node is not actively used, but it can return to ready and continue serving traffic. - * @enum {string} - */ - NodeStatus: "ready" | "draining" | "connecting" | "unhealthy" | "standby"; - NodeStatusChange: { - /** - * Format: uuid - * @description Identifier of the cluster - */ - clusterID?: string; - status: components["schemas"]["NodeStatus"]; - }; - DiskMetrics: { - /** @description Mount point of the disk */ - mountPoint: string; - /** @description Device name */ - device: string; - /** @description Filesystem type (e.g., ext4, xfs) */ - filesystemType: string; - /** - * Format: uint64 - * @description Used space in bytes - */ - usedBytes: number; - /** - * Format: uint64 - * @description Total space in bytes - */ - totalBytes: number; - }; - /** @description Node metrics */ - NodeMetrics: { - /** - * Format: uint32 - * @description Number of allocated CPU cores - */ - allocatedCPU: number; - /** - * Format: uint32 - * @description Node CPU usage percentage - */ - cpuPercent: number; - /** - * Format: uint32 - * @description Total number of CPU cores on the node - */ - cpuCount: number; - /** - * Format: uint64 - * @description Amount of allocated memory in bytes - */ - allocatedMemoryBytes: number; - /** - * Format: uint64 - * @description Node memory used in bytes - */ - memoryUsedBytes: number; - /** - * Format: uint64 - * @description Total node memory in bytes - */ - memoryTotalBytes: number; - /** @description Detailed metrics for each disk/mount point */ - disks: components["schemas"]["DiskMetrics"][]; - }; - MachineInfo: { - /** @description CPU family of the node */ - cpuFamily: string; - /** @description CPU model of the node */ - cpuModel: string; - /** @description CPU model name of the node */ - cpuModelName: string; - /** @description CPU architecture of the node */ - cpuArchitecture: string; - }; - Node: { - /** @description Version of the orchestrator */ - version: string; - /** @description Commit of the orchestrator */ - commit: string; - /** @description Identifier of the node */ - id: string; - /** @description Service instance identifier of the node */ - serviceInstanceID: string; - /** @description Identifier of the cluster */ - clusterID: string; - machineInfo: components["schemas"]["MachineInfo"]; - status: components["schemas"]["NodeStatus"]; - /** - * Format: uint32 - * @description Number of sandboxes running on the node - */ - sandboxCount: number; - metrics: components["schemas"]["NodeMetrics"]; - /** - * Format: uint64 - * @description Number of sandbox create successes - */ - createSuccesses: number; - /** - * Format: uint64 - * @description Number of sandbox create fails - */ - createFails: number; - /** - * Format: int - * @description Number of starting Sandboxes - */ - sandboxStartingCount: number; - }; - NodeDetail: { - /** @description Identifier of the cluster */ - clusterID: string; - /** @description Version of the orchestrator */ - version: string; - /** @description Commit of the orchestrator */ - commit: string; - /** @description Identifier of the node */ - id: string; - /** @description Service instance identifier of the node */ - serviceInstanceID: string; - machineInfo: components["schemas"]["MachineInfo"]; - status: components["schemas"]["NodeStatus"]; - /** - * Format: uint32 - * @description Number of sandboxes running on the node - */ - sandboxCount: number; - metrics: components["schemas"]["NodeMetrics"]; - /** @description List of cached builds id on the node */ - cachedBuilds: string[]; - /** - * Format: uint64 - * @description Number of sandbox create successes - */ - createSuccesses: number; - /** - * Format: uint64 - * @description Number of sandbox create fails - */ - createFails: number; - }; - CreatedAccessToken: { - /** - * Format: uuid - * @description Identifier of the access token - */ - id: string; - /** @description Name of the access token */ - name: string; - /** @description The fully created access token */ - token: string; - mask: components["schemas"]["IdentifierMaskingDetails"]; - /** - * Format: date-time - * @description Timestamp of access token creation - */ - createdAt: string; - }; - NewAccessToken: { - /** @description Name of the access token */ - name: string; - }; - TeamAPIKey: { - /** - * Format: uuid - * @description Identifier of the API key - */ - id: string; - /** @description Name of the API key */ - name: string; - mask: components["schemas"]["IdentifierMaskingDetails"]; - /** - * Format: date-time - * @description Timestamp of API key creation - */ - createdAt: string; - createdBy?: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Last time this API key was used - */ - lastUsed?: string | null; - }; - CreatedTeamAPIKey: { - /** - * Format: uuid - * @description Identifier of the API key - */ - id: string; - /** @description Raw value of the API key */ - key: string; - mask: components["schemas"]["IdentifierMaskingDetails"]; - /** @description Name of the API key */ - name: string; - /** - * Format: date-time - * @description Timestamp of API key creation - */ - createdAt: string; - createdBy?: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Last time this API key was used - */ - lastUsed?: string | null; - }; - NewTeamAPIKey: { - /** @description Name of the API key */ - name: string; - }; - UpdateTeamAPIKey: { - /** @description New name for the API key */ - name: string; - }; - AssignedTemplateTags: { - /** @description Assigned tags of the template */ - tags: string[]; - /** - * Format: uuid - * @description Identifier of the build associated with these tags - */ - buildID: string; - }; - TemplateTag: { - /** @description The tag name */ - tag: string; - /** - * Format: uuid - * @description Identifier of the build associated with this tag - */ - buildID: string; - /** - * Format: date-time - * @description Time when the tag was assigned - */ - createdAt: string; - }; - AssignTemplateTagsRequest: { - /** @description Target template in "name:tag" format */ - target: string; - /** @description Tags to assign to the template */ - tags: string[]; - }; - DeleteTemplateTagsRequest: { - /** @description Name of the template */ - name: string; - /** @description Tags to delete */ - tags: string[]; - }; - Error: { - /** - * Format: int32 - * @description Error code - */ - code: number; - /** @description Error */ - message: string; - }; - IdentifierMaskingDetails: { - /** @description Prefix that identifies the token or key type */ - prefix: string; - /** @description Length of the token or key */ - valueLength: number; - /** @description Prefix used in masked version of the token or key */ - maskedValuePrefix: string; - /** @description Suffix used in masked version of the token or key */ - maskedValueSuffix: string; - }; - Volume: { - /** @description ID of the volume */ - volumeID: string; - /** @description Name of the volume */ - name: string; - }; - VolumeAndToken: { - /** @description ID of the volume */ - volumeID: string; - /** @description Name of the volume */ - name: string; - /** @description Auth token to use for interacting with volume content */ - token: string; - }; - NewVolume: { - /** @description Name of the volume */ - name: string; - }; - }; - responses: { - /** @description Bad request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Authentication error */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Forbidden */ - 403: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Conflict */ - 409: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - }; - parameters: { - templateID: string; - buildID: string; - sandboxID: string; - teamID: string; - nodeID: string; - apiKeyID: string; - accessTokenID: string; - snapshotID: string; - tag: string; - /** @description Maximum number of items to return per page */ - paginationLimit: number; - /** @description Cursor to start the list from */ - paginationNextToken: string; - volumeID: string; - }; - requestBodies: never; - headers: never; - pathItems: never; + schemas: { + Team: { + /** @description Identifier of the team */ + teamID: string + /** @description Name of the team */ + name: string + /** @description API key for the team */ + apiKey: string + /** @description Whether the team is the default team */ + isDefault: boolean + } + TeamUser: { + /** + * Format: uuid + * @description Identifier of the user + */ + id: string + /** + * @deprecated + * @description Email of the user + * @default null + */ + email: string | null + } + TemplateUpdateRequest: { + /** @description Whether the template is public or only accessible by the team */ + public?: boolean + } + TemplateUpdateResponse: { + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[] + } + /** + * Format: int32 + * @description CPU cores for the sandbox + */ + CPUCount: number + /** + * Format: int32 + * @description Memory for the sandbox in MiB + */ + MemoryMB: number + /** + * Format: int32 + * @description Disk size for the sandbox in MiB + */ + DiskSizeMB: number + /** @description Version of the envd running in the sandbox */ + EnvdVersion: string + SandboxMetadata: { + [key: string]: string + } + /** + * @description State of the sandbox + * @enum {string} + */ + SandboxState: 'running' | 'paused' + SnapshotInfo: { + /** @description Identifier of the snapshot template including the tag. Uses namespace/alias when a name was provided (e.g. team-slug/my-snapshot:default), otherwise falls back to the raw template ID (e.g. abc123:default). */ + snapshotID: string + /** @description Full names of the snapshot template including team namespace and tag (e.g. team-slug/my-snapshot:v2) */ + names: string[] + } + EnvVars: { + [key: string]: string + } + /** @description MCP configuration for the sandbox */ + Mcp: { + [key: string]: unknown + } | null + SandboxNetworkConfig: { + /** + * @description Specify if the sandbox URLs should be accessible only with authentication. + * @default true + */ + allowPublicTraffic: boolean + /** @description List of allowed destinations for egress traffic. Each entry can be a CIDR block (e.g. "8.8.8.8/32"), a bare IP address (e.g. "8.8.8.8"), or a domain name (e.g. "example.com", "*.example.com"). Allowed entries always take precedence over denied entries. */ + allowOut?: string[] + /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ + denyOut?: string[] + egressProxy?: components['schemas']['SandboxEgressProxyConfig'] + /** @description Specify host mask which will be used for all sandbox requests */ + maskRequestHost?: string + /** @description Per-domain transform rules applied to matching egress HTTP/HTTPS requests. Keys are domains (e.g. "api.example.com", "example.com"). A domain listed here is not automatically allowed - use allowOut to permit the traffic. */ + rules?: { + [key: string]: components['schemas']['SandboxNetworkRule'][] + } + } + /** @description Network configuration update for a running sandbox. Replaces the current egress rules with the provided configuration. Omitting a field clears it. */ + SandboxNetworkUpdateConfig: { + /** @description List of allowed destinations for egress traffic. Each entry can be a CIDR block (e.g. "8.8.8.8/32"), a bare IP address (e.g. "8.8.8.8"), or a domain name (e.g. "example.com", "*.example.com"). Allowed entries always take precedence over denied entries. */ + allowOut?: string[] + /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ + denyOut?: string[] + egressProxy?: components['schemas']['SandboxEgressProxyConfig'] + /** @description Per-domain transform rules. Replaces all existing rules when provided. */ + rules?: { + [key: string]: components['schemas']['SandboxNetworkRule'][] + } + /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ + allow_internet_access?: boolean + } + /** @description Transform rule applied to egress requests matching a domain pattern. */ + SandboxNetworkRule: { + transform?: components['schemas']['SandboxNetworkTransform'] + } + /** @description Transformations applied to matching egress requests before forwarding. */ + SandboxNetworkTransform: { + /** @description HTTP headers to inject or override in matching requests. An existing header with the same name is replaced. Values are plain strings; secret resolution happens client-side before sending to the API. */ + headers?: { + [key: string]: string + } + } + /** @description SOCKS5 proxy for sandbox egress. Outbound TCP is tunneled through the proxy after allow/deny filtering; the sandbox is unaware. Domain-matched flows use remote DNS (ATYP=domain). */ + SandboxEgressProxyConfig: { + /** @description SOCKS5 proxy address in host:port format (e.g. "proxy.example.com:1080"). */ + address: string + /** @description Optional SOCKS5 username (RFC 1929), max 255 bytes. */ + username?: string + /** @description Optional SOCKS5 password (RFC 1929), max 255 bytes. */ + password?: string + } | null + /** + * @description Auto-resume enabled flag for paused sandboxes. Default false. + * @default false + */ + SandboxAutoResumeEnabled: boolean + /** @description Auto-resume configuration for paused sandboxes. */ + SandboxAutoResumeConfig: { + enabled: components['schemas']['SandboxAutoResumeEnabled'] + } + /** + * @description Action taken when the sandbox times out. + * @enum {string} + */ + SandboxOnTimeout: 'kill' | 'pause' + /** @description Sandbox lifecycle policy returned by sandbox info. */ + SandboxLifecycle: { + /** @description Whether the sandbox can auto-resume. */ + autoResume: boolean + onTimeout: components['schemas']['SandboxOnTimeout'] + } + /** @description Log entry with timestamp and line */ + SandboxLog: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string + /** @description Log line content */ + line: string + } + SandboxLogEntry: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string + /** @description Log message content */ + message: string + level: components['schemas']['LogLevel'] + fields: { + [key: string]: string + } + } + SandboxLogs: { + /** @description Logs of the sandbox */ + logs: components['schemas']['SandboxLog'][] + /** @description Structured logs of the sandbox */ + logEntries: components['schemas']['SandboxLogEntry'][] + } + SandboxLogsV2Response: { + /** + * @description Sandbox logs structured + * @default [] + */ + logs: components['schemas']['SandboxLogEntry'][] + } + /** @description Metric entry with timestamp and line */ + SandboxMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number + /** + * Format: int32 + * @description Number of CPU cores + */ + cpuCount: number + /** + * Format: float + * @description CPU usage percentage + */ + cpuUsedPct: number + /** + * Format: int64 + * @description Memory used in bytes + */ + memUsed: number + /** + * Format: int64 + * @description Total memory in bytes + */ + memTotal: number + /** + * Format: int64 + * @description Cached memory (page cache) in bytes + */ + memCache: number + /** + * Format: int64 + * @description Disk used in bytes + */ + diskUsed: number + /** + * Format: int64 + * @description Total disk space in bytes + */ + diskTotal: number + } + SandboxVolumeMount: { + /** @description Name of the volume */ + name: string + /** @description Path of the volume */ + path: string + } + Sandbox: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** @description Alias of the template */ + alias?: string + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string + envdVersion: components['schemas']['EnvdVersion'] + /** @description Access token used for envd communication */ + envdAccessToken?: string + /** @description Token required for accessing sandbox via proxy. */ + trafficAccessToken?: string | null + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null + } + SandboxDetail: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Alias of the template */ + alias?: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string + /** + * Format: date-time + * @description Time when the sandbox will expire + */ + endAt: string + envdVersion: components['schemas']['EnvdVersion'] + /** @description Access token used for envd communication */ + envdAccessToken?: string + /** @description Whether internet access was explicitly enabled or disabled for the sandbox. Null means it was not explicitly set. */ + allowInternetAccess?: boolean | null + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + metadata?: components['schemas']['SandboxMetadata'] + state: components['schemas']['SandboxState'] + network?: components['schemas']['SandboxNetworkConfig'] + lifecycle?: components['schemas']['SandboxLifecycle'] + volumeMounts?: components['schemas']['SandboxVolumeMount'][] + } + ListedSandbox: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Alias of the template */ + alias?: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string + /** + * Format: date-time + * @description Time when the sandbox will expire + */ + endAt: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + metadata?: components['schemas']['SandboxMetadata'] + state: components['schemas']['SandboxState'] + envdVersion: components['schemas']['EnvdVersion'] + volumeMounts?: components['schemas']['SandboxVolumeMount'][] + } + SandboxesWithMetrics: { + sandboxes: { + [key: string]: components['schemas']['SandboxMetric'] + } + } + NewSandbox: { + /** @description Identifier of the required template */ + templateID: string + /** + * Format: int32 + * @description Time to live for the sandbox in seconds. + * @default 15 + */ + timeout: number + /** + * @description Automatically pauses the sandbox after the timeout + * @default false + */ + autoPause: boolean + autoResume?: components['schemas']['SandboxAutoResumeConfig'] + /** @description Secure all system communication with sandbox */ + secure?: boolean + /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ + allow_internet_access?: boolean + network?: components['schemas']['SandboxNetworkConfig'] + metadata?: components['schemas']['SandboxMetadata'] + envVars?: components['schemas']['EnvVars'] + mcp?: components['schemas']['Mcp'] + volumeMounts?: components['schemas']['SandboxVolumeMount'][] + } + ResumedSandbox: { + /** + * Format: int32 + * @description Time to live for the sandbox in seconds. + * @default 15 + */ + timeout: number + /** + * @deprecated + * @description Automatically pauses the sandbox after the timeout + */ + autoPause?: boolean + } + ConnectSandbox: { + /** + * Format: int32 + * @description Timeout in seconds from the current time after which the sandbox should expire + */ + timeout: number + } + SandboxTimeoutRequest: { + /** + * Format: int32 + * @description Timeout in seconds from the current time after which the sandbox should expire + */ + timeout: number + } + SandboxRefreshRequest: { + /** @description Duration for which the sandbox should be kept alive in seconds */ + duration?: number + } + SandboxSnapshotRequest: { + /** @description Optional name for the snapshot template. If a snapshot template with this name already exists, a new build will be assigned to the existing template instead of creating a new one. */ + name?: string + } + /** @description Team metric with timestamp */ + TeamMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number + /** + * Format: int32 + * @description The number of concurrent sandboxes for the team + */ + concurrentSandboxes: number + /** + * Format: float + * @description Number of sandboxes started per second + */ + sandboxStartRate: number + } + /** @description Team metric with timestamp */ + MaxTeamMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number + /** @description The maximum value of the requested metric in the given interval */ + value: number + } + AdminSandboxKillResult: { + /** @description Number of sandboxes successfully killed */ + killedCount: number + /** @description Number of sandboxes that failed to kill */ + failedCount: number + } + AdminBuildCancelResult: { + /** @description Number of builds successfully cancelled */ + cancelledCount: number + /** @description Number of builds that failed to cancel */ + failedCount: number + } + VolumeToken: { + token: string + } + Template: { + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the last successful build for given template */ + buildID: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[] + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[] + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string + createdBy: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number + /** + * Format: int32 + * @description Number of times the template was built + */ + buildCount: number + envdVersion: components['schemas']['EnvdVersion'] + buildStatus: components['schemas']['TemplateBuildStatus'] + } + TemplateRequestResponseV3: { + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the last successful build for given template */ + buildID: string + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** @description Names of the template */ + names: string[] + /** @description Tags assigned to the template build */ + tags: string[] + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[] + } + TemplateLegacy: { + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the last successful build for given template */ + buildID: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** @description Aliases of the template */ + aliases: string[] + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string + createdBy: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number + /** + * Format: int32 + * @description Number of times the template was built + */ + buildCount: number + envdVersion: components['schemas']['EnvdVersion'] + } + TemplateBuild: { + /** + * Format: uuid + * @description Identifier of the build + */ + buildID: string + status: components['schemas']['TemplateBuildStatus'] + /** + * Format: date-time + * @description Time when the build was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the build was last updated + */ + updatedAt: string + /** + * Format: date-time + * @description Time when the build was finished + */ + finishedAt?: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB?: components['schemas']['DiskSizeMB'] + envdVersion?: components['schemas']['EnvdVersion'] + } + TemplateWithBuilds: { + /** @description Identifier of the template */ + templateID: string + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[] + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[] + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number + /** @description List of builds for the template */ + builds: components['schemas']['TemplateBuild'][] + } + TemplateAliasResponse: { + /** @description Identifier of the template */ + templateID: string + /** @description Whether the template is public or only accessible by the team */ + public: boolean + } + TemplateBuildRequest: { + /** @description Alias of the template */ + alias?: string + /** @description Dockerfile for the template */ + dockerfile: string + /** @description Identifier of the team */ + teamID?: string + /** @description Start command to execute in the template after the build */ + startCmd?: string + /** @description Ready check command to execute in the template after the build */ + readyCmd?: string + cpuCount?: components['schemas']['CPUCount'] + memoryMB?: components['schemas']['MemoryMB'] + } + /** @description Step in the template build process */ + TemplateStep: { + /** @description Type of the step */ + type: string + /** + * @description Arguments for the step + * @default [] + */ + args: string[] + /** @description Hash of the files used in the step */ + filesHash?: string + /** + * @description Whether the step should be forced to run regardless of the cache + * @default false + */ + force: boolean + } + TemplateBuildRequestV3: { + /** @description Name of the template. Can include a tag with colon separator (e.g. "my-template" or "my-template:v1"). If tag is included, it will be treated as if the tag was provided in the tags array. */ + name?: string + /** @description Tags to assign to the template build */ + tags?: string[] + /** + * @deprecated + * @description Alias of the template. Deprecated, use name instead. + */ + alias?: string + /** + * @deprecated + * @description Identifier of the team + */ + teamID?: string + cpuCount?: components['schemas']['CPUCount'] + memoryMB?: components['schemas']['MemoryMB'] + } + TemplateBuildRequestV2: { + /** @description Alias of the template */ + alias: string + /** + * @deprecated + * @description Identifier of the team + */ + teamID?: string + cpuCount?: components['schemas']['CPUCount'] + memoryMB?: components['schemas']['MemoryMB'] + } + FromImageRegistry: + | components['schemas']['AWSRegistry'] + | components['schemas']['GCPRegistry'] + | components['schemas']['GeneralRegistry'] + AWSRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: 'aws' + /** @description AWS Access Key ID for ECR authentication */ + awsAccessKeyId: string + /** @description AWS Secret Access Key for ECR authentication */ + awsSecretAccessKey: string + /** @description AWS Region where the ECR registry is located */ + awsRegion: string + } + GCPRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: 'gcp' + /** @description Service Account JSON for GCP authentication */ + serviceAccountJson: string + } + GeneralRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: 'registry' + /** @description Username to use for the registry */ + username: string + /** @description Password to use for the registry */ + password: string + } + TemplateBuildStartV2: { + /** @description Image to use as a base for the template build */ + fromImage?: string + /** @description Template to use as a base for the template build */ + fromTemplate?: string + fromImageRegistry?: components['schemas']['FromImageRegistry'] + /** + * @description Whether the whole build should be forced to run regardless of the cache + * @default false + */ + force: boolean + /** + * @description List of steps to execute in the template build + * @default [] + */ + steps: components['schemas']['TemplateStep'][] + /** @description Start command to execute in the template after the build */ + startCmd?: string + /** @description Ready check command to execute in the template after the build */ + readyCmd?: string + } + TemplateBuildFileUpload: { + /** @description Whether the file is already present in the cache */ + present: boolean + /** @description Url where the file should be uploaded to */ + url?: string + } + /** + * @description State of the sandbox + * @enum {string} + */ + LogLevel: 'debug' | 'info' | 'warn' | 'error' + BuildLogEntry: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string + /** @description Log message content */ + message: string + level: components['schemas']['LogLevel'] + /** @description Step in the build process related to the log entry */ + step?: string + } + BuildStatusReason: { + /** @description Message with the status reason, currently reporting only for error status */ + message: string + /** @description Step that failed */ + step?: string + /** + * @description Log entries related to the status reason + * @default [] + */ + logEntries: components['schemas']['BuildLogEntry'][] + } + /** + * @description Status of the template build + * @enum {string} + */ + TemplateBuildStatus: 'building' | 'waiting' | 'ready' | 'error' + TemplateBuildInfo: { + /** + * @description Build logs + * @default [] + */ + logs: string[] + /** + * @description Build logs structured + * @default [] + */ + logEntries: components['schemas']['BuildLogEntry'][] + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the build */ + buildID: string + status: components['schemas']['TemplateBuildStatus'] + reason?: components['schemas']['BuildStatusReason'] + } + TemplateBuildLogsResponse: { + /** + * @description Build logs structured + * @default [] + */ + logs: components['schemas']['BuildLogEntry'][] + } + /** + * @description Direction of the logs that should be returned + * @enum {string} + */ + LogsDirection: 'forward' | 'backward' + /** + * @description Source of the logs that should be returned + * @enum {string} + */ + LogsSource: 'temporary' | 'persistent' + /** + * @description Status of the node. + * - draining: the node is bound to be shut down. It will not accept new sandboxes and will stop once all existing sandboxes are done. + * - standby: the node is not actively used, but it can return to ready and continue serving traffic. + * @enum {string} + */ + NodeStatus: 'ready' | 'draining' | 'connecting' | 'unhealthy' | 'standby' + NodeStatusChange: { + /** + * Format: uuid + * @description Identifier of the cluster + */ + clusterID?: string + status: components['schemas']['NodeStatus'] + } + DiskMetrics: { + /** @description Mount point of the disk */ + mountPoint: string + /** @description Device name */ + device: string + /** @description Filesystem type (e.g., ext4, xfs) */ + filesystemType: string + /** + * Format: uint64 + * @description Used space in bytes + */ + usedBytes: number + /** + * Format: uint64 + * @description Total space in bytes + */ + totalBytes: number + } + /** @description Node metrics */ + NodeMetrics: { + /** + * Format: uint32 + * @description Number of allocated CPU cores + */ + allocatedCPU: number + /** + * Format: uint32 + * @description Node CPU usage percentage + */ + cpuPercent: number + /** + * Format: uint32 + * @description Total number of CPU cores on the node + */ + cpuCount: number + /** + * Format: uint64 + * @description Amount of allocated memory in bytes + */ + allocatedMemoryBytes: number + /** + * Format: uint64 + * @description Node memory used in bytes + */ + memoryUsedBytes: number + /** + * Format: uint64 + * @description Total node memory in bytes + */ + memoryTotalBytes: number + /** @description Detailed metrics for each disk/mount point */ + disks: components['schemas']['DiskMetrics'][] + } + MachineInfo: { + /** @description CPU family of the node */ + cpuFamily: string + /** @description CPU model of the node */ + cpuModel: string + /** @description CPU model name of the node */ + cpuModelName: string + /** @description CPU architecture of the node */ + cpuArchitecture: string + } + Node: { + /** @description Version of the orchestrator */ + version: string + /** @description Commit of the orchestrator */ + commit: string + /** @description Identifier of the node */ + id: string + /** @description Service instance identifier of the node */ + serviceInstanceID: string + /** @description Identifier of the cluster */ + clusterID: string + machineInfo: components['schemas']['MachineInfo'] + status: components['schemas']['NodeStatus'] + /** + * Format: uint32 + * @description Number of sandboxes running on the node + */ + sandboxCount: number + metrics: components['schemas']['NodeMetrics'] + /** + * Format: uint64 + * @description Number of sandbox create successes + */ + createSuccesses: number + /** + * Format: uint64 + * @description Number of sandbox create fails + */ + createFails: number + /** + * Format: int + * @description Number of starting Sandboxes + */ + sandboxStartingCount: number + } + NodeDetail: { + /** @description Identifier of the cluster */ + clusterID: string + /** @description Version of the orchestrator */ + version: string + /** @description Commit of the orchestrator */ + commit: string + /** @description Identifier of the node */ + id: string + /** @description Service instance identifier of the node */ + serviceInstanceID: string + machineInfo: components['schemas']['MachineInfo'] + status: components['schemas']['NodeStatus'] + /** + * Format: uint32 + * @description Number of sandboxes running on the node + */ + sandboxCount: number + metrics: components['schemas']['NodeMetrics'] + /** @description List of cached builds id on the node */ + cachedBuilds: string[] + /** + * Format: uint64 + * @description Number of sandbox create successes + */ + createSuccesses: number + /** + * Format: uint64 + * @description Number of sandbox create fails + */ + createFails: number + } + CreatedAccessToken: { + /** + * Format: uuid + * @description Identifier of the access token + */ + id: string + /** @description Name of the access token */ + name: string + /** @description The fully created access token */ + token: string + mask: components['schemas']['IdentifierMaskingDetails'] + /** + * Format: date-time + * @description Timestamp of access token creation + */ + createdAt: string + } + NewAccessToken: { + /** @description Name of the access token */ + name: string + } + TeamAPIKey: { + /** + * Format: uuid + * @description Identifier of the API key + */ + id: string + /** @description Name of the API key */ + name: string + mask: components['schemas']['IdentifierMaskingDetails'] + /** + * Format: date-time + * @description Timestamp of API key creation + */ + createdAt: string + createdBy?: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Last time this API key was used + */ + lastUsed?: string | null + } + CreatedTeamAPIKey: { + /** + * Format: uuid + * @description Identifier of the API key + */ + id: string + /** @description Raw value of the API key */ + key: string + mask: components['schemas']['IdentifierMaskingDetails'] + /** @description Name of the API key */ + name: string + /** + * Format: date-time + * @description Timestamp of API key creation + */ + createdAt: string + createdBy?: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Last time this API key was used + */ + lastUsed?: string | null + } + NewTeamAPIKey: { + /** @description Name of the API key */ + name: string + } + UpdateTeamAPIKey: { + /** @description New name for the API key */ + name: string + } + AssignedTemplateTags: { + /** @description Assigned tags of the template */ + tags: string[] + /** + * Format: uuid + * @description Identifier of the build associated with these tags + */ + buildID: string + } + TemplateTag: { + /** @description The tag name */ + tag: string + /** + * Format: uuid + * @description Identifier of the build associated with this tag + */ + buildID: string + /** + * Format: date-time + * @description Time when the tag was assigned + */ + createdAt: string + } + AssignTemplateTagsRequest: { + /** @description Target template in "name:tag" format */ + target: string + /** @description Tags to assign to the template */ + tags: string[] + } + DeleteTemplateTagsRequest: { + /** @description Name of the template */ + name: string + /** @description Tags to delete */ + tags: string[] + } + Error: { + /** + * Format: int32 + * @description Error code + */ + code: number + /** @description Error */ + message: string + } + IdentifierMaskingDetails: { + /** @description Prefix that identifies the token or key type */ + prefix: string + /** @description Length of the token or key */ + valueLength: number + /** @description Prefix used in masked version of the token or key */ + maskedValuePrefix: string + /** @description Suffix used in masked version of the token or key */ + maskedValueSuffix: string + } + Volume: { + /** @description ID of the volume */ + volumeID: string + /** @description Name of the volume */ + name: string + } + VolumeAndToken: { + /** @description ID of the volume */ + volumeID: string + /** @description Name of the volume */ + name: string + /** @description Auth token to use for interacting with volume content */ + token: string + } + NewVolume: { + /** @description Name of the volume */ + name: string + } + } + responses: { + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Authentication error */ + 401: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Server error */ + 500: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + } + parameters: { + templateID: string + buildID: string + sandboxID: string + teamID: string + nodeID: string + apiKeyID: string + accessTokenID: string + snapshotID: string + tag: string + /** @description Maximum number of items to return per page */ + paginationLimit: number + /** @description Cursor to start the list from */ + paginationNextToken: string + volumeID: string + } + requestBodies: never + headers: never + pathItems: never } -export type $defs = Record; -export type operations = Record; +export type $defs = Record +export type operations = Record From 98282104fe295a95a8632a26fa1a8e1478b45964 Mon Sep 17 00:00:00 2001 From: ben-fornefeld Date: Thu, 18 Jun 2026 18:27:12 -0700 Subject: [PATCH 3/4] Use admin repository for Ory bootstrap --- .../modules/users/admin-repository.server.ts | 18 ++-- .../server/auth/ory/dashboard-bootstrap.ts | 85 ++++++++----------- .../functions/team/resolve-user-team.ts | 19 ++++- 3 files changed, 65 insertions(+), 57 deletions(-) diff --git a/src/core/modules/users/admin-repository.server.ts b/src/core/modules/users/admin-repository.server.ts index f9e12ccba..c22c7088c 100644 --- a/src/core/modules/users/admin-repository.server.ts +++ b/src/core/modules/users/admin-repository.server.ts @@ -3,9 +3,13 @@ import 'server-only' import { ADMIN_AUTH_HEADERS } from '@/configs/api' import type { ResolvedTeam } from '@/core/modules/teams/models' import { api } from '@/core/shared/clients/api' +import type { components as DashboardApiComponents } from '@/core/shared/contracts/dashboard-api.types' import { repoErrorFromHttp } from '@/core/shared/errors' import { err, ok, type RepoResult } from '@/core/shared/result' +export type AdminAuthProviderUserBootstrapRequest = + DashboardApiComponents['schemas']['AdminAuthProviderUserBootstrapRequest'] + type AdminUsersRepositoryDeps = { apiClient: typeof api adminHeaders: typeof ADMIN_AUTH_HEADERS @@ -13,7 +17,9 @@ type AdminUsersRepositoryDeps = { } export interface AdminUsersRepository { - bootstrapUser(userId: string): Promise> + bootstrapAuthProviderUser( + body: AdminAuthProviderUserBootstrapRequest + ): Promise> } export function createAdminUsersRepository( @@ -24,7 +30,7 @@ export function createAdminUsersRepository( } ): AdminUsersRepository { return { - async bootstrapUser(userId) { + async bootstrapAuthProviderUser(body) { if (!deps.adminToken) { return err( repoErrorFromHttp( @@ -36,13 +42,9 @@ export function createAdminUsersRepository( } const { data, error, response } = await deps.apiClient.POST( - '/admin/users/{userId}/bootstrap', + '/admin/users/bootstrap', { - params: { - path: { - userId, - }, - }, + body, headers: deps.adminHeaders(deps.adminToken), } ) diff --git a/src/core/server/auth/ory/dashboard-bootstrap.ts b/src/core/server/auth/ory/dashboard-bootstrap.ts index 0f6f5cddc..2b96e5e03 100644 --- a/src/core/server/auth/ory/dashboard-bootstrap.ts +++ b/src/core/server/auth/ory/dashboard-bootstrap.ts @@ -1,10 +1,8 @@ import 'server-only' -import { ADMIN_AUTH_HEADERS } from '@/configs/api' -import { api } from '@/core/shared/clients/api' +import { createAdminUsersRepository } from '@/core/modules/users/admin-repository.server' import { l, serializeErrorForLog } from '@/core/shared/clients/logger/logger' import type { components as DashboardApiComponents } from '@/core/shared/contracts/dashboard-api.types' -import { repoErrorFromHttp } from '@/core/shared/errors' import { decodeJwtClaims, readStringClaim, tokenFormat } from './jwt-claims' import { readOrySignupMetadataCookie } from './signup-metadata' @@ -33,19 +31,44 @@ type OryTokenClaims = { export async function ensureOryUserBootstrapped( input: BootstrapOryUserInput ): Promise { - const claims = readBootstrapClaims(input) - if (!claims) return false + const body = await createOryUserBootstrapRequest(input) + if (!body) return false - return bootstrapOryUserWithClaims(claims, input.provider) + return bootstrapOryUserWithRequest(body, input.provider) } export async function bootstrapOryUser( input: BootstrapOryUserInput ): Promise { + const body = await createOryUserBootstrapRequest(input) + if (!body) return false + + return bootstrapOryUserWithRequest(body, input.provider) +} + +export async function createOryUserBootstrapRequest( + input: BootstrapOryUserInput +): Promise< + | DashboardApiComponents['schemas']['AdminAuthProviderUserBootstrapRequest'] + | null +> { const claims = readBootstrapClaims(input) - if (!claims) return false + if (!claims) return null + + const signupMetadata = await readOrySignupMetadataCookie() - return bootstrapOryUserWithClaims(claims, input.provider) + return { + oidc_issuer: claims.oidcIssuer, + oidc_user_id: claims.oidcUserId, + oidc_user_email: claims.oidcUserEmail, + oidc_user_name: claims.oidcUserName, + ...(signupMetadata?.signup_ip + ? { signup_ip: signupMetadata.signup_ip } + : {}), + ...(signupMetadata?.signup_user_agent + ? { signup_user_agent: signupMetadata.signup_user_agent } + : {}), + } satisfies DashboardApiComponents['schemas']['AdminAuthProviderUserBootstrapRequest'] } function readBootstrapClaims( @@ -94,61 +117,27 @@ function readBootstrapClaims( } } -async function bootstrapOryUserWithClaims( - claims: OryBootstrapClaims, +async function bootstrapOryUserWithRequest( + body: DashboardApiComponents['schemas']['AdminAuthProviderUserBootstrapRequest'], provider?: string ): Promise { try { - const adminToken = process.env.DASHBOARD_API_ADMIN_TOKEN - if (!adminToken) { - l.error( - { - key: 'auth_events:bootstrap_user:missing_admin_token', - context: { provider }, - }, - 'DASHBOARD_API_ADMIN_TOKEN is not configured' - ) - return false - } + const bootstrapResult = + await createAdminUsersRepository().bootstrapAuthProviderUser(body) - const signupMetadata = await readOrySignupMetadataCookie() - const body = { - oidc_issuer: claims.oidcIssuer, - oidc_user_id: claims.oidcUserId, - oidc_user_email: claims.oidcUserEmail, - oidc_user_name: claims.oidcUserName, - ...(signupMetadata?.signup_ip - ? { signup_ip: signupMetadata.signup_ip } - : {}), - ...(signupMetadata?.signup_user_agent - ? { signup_user_agent: signupMetadata.signup_user_agent } - : {}), - } satisfies DashboardApiComponents['schemas']['AdminAuthProviderUserBootstrapRequest'] - - const { error, response } = await api.POST('/admin/users/bootstrap', { - body, - headers: ADMIN_AUTH_HEADERS(adminToken), - }) - - if (!response.ok || error) { - const repoError = repoErrorFromHttp( - response.status, - error?.message ?? 'Failed to bootstrap user', - error - ) + if (!bootstrapResult.ok) { l.error( { key: 'auth_events:bootstrap_user:error', context: { provider, - error_status: response.status, has_oidc_issuer: body.oidc_issuer !== '', has_oidc_user_id: body.oidc_user_id !== '', has_oidc_user_email: body.oidc_user_email !== '', has_oidc_user_name: body.oidc_user_name !== null, }, }, - `bootstrap_user failed: ${repoError.message}` + `bootstrap_user failed: ${bootstrapResult.error.message}` ) return false } diff --git a/src/core/server/functions/team/resolve-user-team.ts b/src/core/server/functions/team/resolve-user-team.ts index 61281d2fa..b17e9cf63 100644 --- a/src/core/server/functions/team/resolve-user-team.ts +++ b/src/core/server/functions/team/resolve-user-team.ts @@ -6,6 +6,7 @@ import { ENABLE_USER_BOOTSTRAP } from '@/configs/env-flags' import type { ResolvedTeam } from '@/core/modules/teams/models' import { createUserTeamsRepository } from '@/core/modules/teams/user-teams-repository.server' import { createAdminUsersRepository } from '@/core/modules/users/admin-repository.server' +import { createOryUserBootstrapRequest } from '@/core/server/auth/ory/dashboard-bootstrap' import { l } from '@/core/shared/clients/logger/logger' export async function resolveUserTeam( @@ -71,8 +72,24 @@ export async function resolveUserTeam( return null } + const bootstrapRequest = await createOryUserBootstrapRequest({ + accessToken, + }) + if (!bootstrapRequest) { + l.error( + { + key: 'resolve_user_team:bootstrap_claims_error', + user_id: userId, + }, + 'Failed to build auth provider user bootstrap request' + ) + + return null + } + const adminUsersRepository = createAdminUsersRepository() - const bootstrapResult = await adminUsersRepository.bootstrapUser(userId) + const bootstrapResult = + await adminUsersRepository.bootstrapAuthProviderUser(bootstrapRequest) if (!bootstrapResult.ok) { l.error( From aeb2bf9b3c84195f954c7a74cf33793d86ca1211 Mon Sep 17 00:00:00 2001 From: ben-fornefeld Date: Thu, 18 Jun 2026 18:30:06 -0700 Subject: [PATCH 4/4] Update resolve user team bootstrap tests --- tests/integration/resolve-user-team.test.ts | 49 ++++++++++++++++----- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/tests/integration/resolve-user-team.test.ts b/tests/integration/resolve-user-team.test.ts index e0e52fd79..cbae4655c 100644 --- a/tests/integration/resolve-user-team.test.ts +++ b/tests/integration/resolve-user-team.test.ts @@ -5,7 +5,7 @@ const { mockFlags, mockCookieStore, mockListUserTeams, - mockBootstrapUser, + mockBootstrapAuthProviderUser, mockResolveTeamBySlug, mockCreateUserTeamsRepository, mockCreateAdminUsersRepository, @@ -17,7 +17,7 @@ const { get: vi.fn(), }, mockListUserTeams: vi.fn(), - mockBootstrapUser: vi.fn(), + mockBootstrapAuthProviderUser: vi.fn(), mockResolveTeamBySlug: vi.fn(), mockCreateUserTeamsRepository: vi.fn(), mockCreateAdminUsersRepository: vi.fn(), @@ -44,7 +44,22 @@ vi.mock('@/configs/env-flags', () => ({ import { resolveUserTeam } from '@/core/server/functions/team/resolve-user-team' const TEST_USER_ID = 'user-123' -const TEST_ACCESS_TOKEN = 'access-token' +const TEST_ACCESS_TOKEN = createTestJwt({ + iss: 'https://auth.example.test', + sub: TEST_USER_ID, + email: 'user-123@example.test', + name: 'Ada Lovelace', +}) + +function createTestJwt(payload: Record) { + return [ + Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString( + 'base64url' + ), + Buffer.from(JSON.stringify(payload)).toString('base64url'), + 'signature', + ].join('.') +} function setupCookies(cookieValues: Record) { mockCookieStore.get.mockImplementation((key: string) => { @@ -73,7 +88,7 @@ describe('resolveUserTeam', () => { resolveTeamBySlug: mockResolveTeamBySlug, }) mockCreateAdminUsersRepository.mockReturnValue({ - bootstrapUser: mockBootstrapUser, + bootstrapAuthProviderUser: mockBootstrapAuthProviderUser, }) }) @@ -226,7 +241,7 @@ describe('resolveUserTeam', () => { ok: true, data: [], }) - mockBootstrapUser.mockResolvedValue({ + mockBootstrapAuthProviderUser.mockResolvedValue({ ok: true, data: { id: 'bootstrapped-team', @@ -241,8 +256,13 @@ describe('resolveUserTeam', () => { slug: 'bootstrapped-team', }) expect(mockCreateAdminUsersRepository).toHaveBeenCalledTimes(1) - expect(mockBootstrapUser).toHaveBeenCalledTimes(1) - expect(mockBootstrapUser).toHaveBeenCalledWith(TEST_USER_ID) + expect(mockBootstrapAuthProviderUser).toHaveBeenCalledTimes(1) + expect(mockBootstrapAuthProviderUser).toHaveBeenCalledWith({ + oidc_issuer: 'https://auth.example.test', + oidc_user_id: TEST_USER_ID, + oidc_user_email: 'user-123@example.test', + oidc_user_name: 'Ada Lovelace', + }) }) it('returns null when bootstrap fails after empty team lookup', async () => { @@ -251,7 +271,7 @@ describe('resolveUserTeam', () => { ok: true, data: [], }) - mockBootstrapUser.mockResolvedValue({ + mockBootstrapAuthProviderUser.mockResolvedValue({ ok: false, error: new Error('Failed to bootstrap user'), }) @@ -260,8 +280,13 @@ describe('resolveUserTeam', () => { expect(result).toBeNull() expect(mockCreateAdminUsersRepository).toHaveBeenCalledTimes(1) - expect(mockBootstrapUser).toHaveBeenCalledTimes(1) - expect(mockBootstrapUser).toHaveBeenCalledWith(TEST_USER_ID) + expect(mockBootstrapAuthProviderUser).toHaveBeenCalledTimes(1) + expect(mockBootstrapAuthProviderUser).toHaveBeenCalledWith({ + oidc_issuer: 'https://auth.example.test', + oidc_user_id: TEST_USER_ID, + oidc_user_email: 'user-123@example.test', + oidc_user_name: 'Ada Lovelace', + }) }) it('returns null without bootstrapping when bootstrap is disabled', async () => { @@ -276,7 +301,7 @@ describe('resolveUserTeam', () => { expect(result).toBeNull() expect(mockCreateAdminUsersRepository).not.toHaveBeenCalled() - expect(mockBootstrapUser).not.toHaveBeenCalled() + expect(mockBootstrapAuthProviderUser).not.toHaveBeenCalled() }) it('returns null when listing teams fails', async () => { @@ -289,6 +314,6 @@ describe('resolveUserTeam', () => { const result = await resolveUserTeam(TEST_USER_ID, TEST_ACCESS_TOKEN) expect(result).toBeNull() - expect(mockBootstrapUser).not.toHaveBeenCalled() + expect(mockBootstrapAuthProviderUser).not.toHaveBeenCalled() }) })