From 842290973b3c7471f00444c56260fd4d2c4ea205 Mon Sep 17 00:00:00 2001 From: dobrac <4323173+dobrac@users.noreply.github.com> Date: Fri, 17 Jul 2026 15:48:36 +0000 Subject: [PATCH 1/2] chore: sync infra OpenAPI specs --- spec/openapi.dashboard-api.yaml | 20 +- spec/openapi.infra.yaml | 105 + .../shared/contracts/dashboard-api.types.ts | 3304 ++++---- src/core/shared/contracts/infra-api.types.ts | 7369 +++++++++-------- 4 files changed, 5496 insertions(+), 5302 deletions(-) diff --git a/spec/openapi.dashboard-api.yaml b/spec/openapi.dashboard-api.yaml index 6e15f856b..ae3578c10 100644 --- a/spec/openapi.dashboard-api.yaml +++ b/spec/openapi.dashboard-api.yaml @@ -194,13 +194,7 @@ components: description: Sort column and direction. schema: type: string - enum: - [ - created_at_asc, - created_at_desc, - updated_at_asc, - updated_at_desc, - ] + enum: [created_at_asc, created_at_desc, updated_at_asc, updated_at_desc] default: created_at_desc tag_assignments_cursor: name: cursor @@ -471,7 +465,7 @@ components: nextCursor: type: string nullable: true - description: Cursor to pass to the next list request, or `null` if there is no next page. + description: Cursor to pass to the next list request, or `null` if there is no next page. BuildStatusItem: type: object @@ -566,6 +560,7 @@ components: - memoryMB - diskSizeMB - retentionExpired + - eventsRetentionExpired properties: templateID: type: string @@ -597,7 +592,10 @@ components: $ref: "#/components/schemas/DiskSizeMB" retentionExpired: type: boolean - description: Whether the sandbox ended more than the retention window ago, so its monitoring, events, and logs data is no longer available + description: Whether the sandbox ended more than the fixed retention window ago, so its monitoring and logs data is no longer available + eventsRetentionExpired: + type: boolean + description: Whether the sandbox ended more than the team's events retention window ago, so its events data is no longer available HealthResponse: type: object @@ -617,6 +615,7 @@ components: - maxVcpu - maxRamMb - diskMb + - eventsTtlDays properties: maxLengthHours: type: integer @@ -636,6 +635,9 @@ components: diskMb: type: integer format: int32 + eventsTtlDays: + type: integer + format: int32 UserTeam: type: object diff --git a/spec/openapi.infra.yaml b/spec/openapi.infra.yaml index ee4fcb539..9c7121bb6 100644 --- a/spec/openapi.infra.yaml +++ b/spec/openapi.infra.yaml @@ -822,6 +822,39 @@ components: resume); auto-resume, which can be triggered by arbitrary traffic, refuses such a sandbox. Defaults to true. + SandboxForkRequest: + type: object + properties: + timeout: + type: integer + format: int32 + minimum: 0 + default: 15 + description: Time to live for the new forked sandboxes in seconds. + count: + type: integer + format: int32 + minimum: 1 + maximum: 100 + default: 1 + description: >- + Number of forked sandboxes to create. All forks boot from the same + snapshot, so the snapshot is captured once regardless of count. + Each fork succeeds or fails independently; the outcome of each is + reported in its entry of the response list. + + SandboxForkResult: + type: object + description: >- + Result of one requested fork. Exactly one of sandbox or error is set: + sandbox when the fork started successfully, error when it failed to + start. + properties: + sandbox: + $ref: "#/components/schemas/Sandbox" + error: + $ref: "#/components/schemas/Error" + TeamMetric: description: Team metric with timestamp required: @@ -1549,6 +1582,10 @@ components: - cpuCount - memoryTotalBytes - disks + - hugePagesTotal + - hugePagesUsed + - hugePagesReserved + - hugePageSizeBytes properties: allocatedCPU: type: integer @@ -1574,6 +1611,22 @@ components: type: integer format: uint64 description: Total node memory in bytes + hugePagesTotal: + type: integer + format: uint64 + description: Total number of preallocated hugepages on the node + hugePagesUsed: + type: integer + format: uint64 + description: Number of hugepages in use (total - free) + hugePagesReserved: + type: integer + format: uint64 + description: Number of reserved hugepages (committed but not yet faulted) + hugePageSizeBytes: + type: integer + format: uint64 + description: Size of a single hugepage in bytes disks: type: array description: Detailed metrics for each disk/mount point @@ -2512,6 +2565,52 @@ paths: "500": $ref: "#/components/responses/500" + /sandboxes/{sandboxID}/fork: + post: + summary: Fork sandbox + description: >- + Fork the sandbox: checkpoint the running sandbox in place (it is + briefly paused, snapshotted with its full memory state, and resumed on + its node, keeping its ID and expiration untouched) and create count + new sandboxes from that snapshot. Returns one result per requested + fork, each carrying either the created sandbox or the error that + prevented it from starting. A non-201 status means the request failed + before any fork was attempted. + tags: [sandboxes] + security: + - ApiKeyAuth: [] + - AuthProviderBearerAuth: [] + AuthProviderTeamAuth: [] + - AdminApiKeyAuth: [] + AdminTeamAuth: [] + parameters: + - $ref: "#/components/parameters/sandboxID" + requestBody: + required: false + content: + application/json: + schema: + $ref: "#/components/schemas/SandboxForkRequest" + responses: + "201": + description: >- + The sandbox was snapshotted and the forks were attempted; each + entry reports one fork's outcome + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/SandboxForkResult" + "409": + $ref: "#/components/responses/409" + "404": + $ref: "#/components/responses/404" + "401": + $ref: "#/components/responses/401" + "500": + $ref: "#/components/responses/500" + /sandboxes/{sandboxID}/connect: post: summary: Connect sandbox @@ -2691,6 +2790,12 @@ paths: schema: type: string description: Filter snapshots by source sandbox ID + - name: name + in: query + description: Filter snapshots by name or ID, optionally tag-qualified (e.g. "my-snapshot", "my-team/my-snapshot" or "my-snapshot:v1"). + required: false + schema: + type: string - $ref: "#/components/parameters/paginationLimit" - $ref: "#/components/parameters/paginationNextToken" responses: diff --git a/src/core/shared/contracts/dashboard-api.types.ts b/src/core/shared/contracts/dashboard-api.types.ts index 9d581f35f..054e14f34 100644 --- a/src/core/shared/contracts/dashboard-api.types.ts +++ b/src/core/shared/contracts/dashboard-api.types.ts @@ -4,1658 +4,1658 @@ */ 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 - } - /** 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 - } - /** 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 - } - /** 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 - } - /** 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 - } - /** - * 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; + }; + /** 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; + }; + /** 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; + }; + /** 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; + }; + /** 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; + }; + /** + * 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'] - /** @description Whether the sandbox ended more than the retention window ago, so its monitoring, events, and logs data is no longer available */ - retentionExpired: boolean - } - 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"]; + /** @description Whether the sandbox ended more than the fixed retention window ago, so its monitoring and logs data is no longer available */ + retentionExpired: boolean; + /** @description Whether the sandbox ended more than the team's events retention window ago, so its events data is no longer available */ + eventsRetentionExpired: boolean; + }; + 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; + /** Format: int32 */ + eventsTtlDays: 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 f3f508a50..54d865682 100644 --- a/src/core/shared/contracts/infra-api.types.ts +++ b/src/core/shared/contracts/infra-api.types.ts @@ -4,3647 +4,3734 @@ */ export interface paths { - '/health': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** - * Health check - * @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 - } - /** - * List teams - * @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 - } - /** - * Team metrics - * @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 - } - /** - * Maximum team metrics - * @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 - } - /** - * List running sandboxes - * @deprecated - * @description List all running sandboxes. Use GET /v2/sandboxes instead. - */ - 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 - /** - * Create sandbox - * @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 - } - /** - * List sandboxes (v2) - * @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 - } - /** - * List sandbox metrics - * @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 - } - /** - * Sandbox logs - * @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 - } - /** - * Sandbox logs (v2) - * @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 - } - /** - * Sandbox - * @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 - /** - * Kill sandbox - * @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 - } - /** - * Sandbox metrics - * @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 - /** - * Pause sandbox - * @description Pause the sandbox - */ - post: { - parameters: { - query?: never - header?: never - path: { - sandboxID: components['parameters']['sandboxID'] - } - cookie?: never - } - requestBody?: { - content: { - 'application/json': components['schemas']['SandboxPauseRequest'] - } - } - 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 - /** - * Resume sandbox - * @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 - /** - * Connect sandbox - * @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 - /** - * Set sandbox timeout - * @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 - /** - * Update sandbox network - * @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 - /** - * Refresh sandbox - * @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 - /** - * Create snapshot - * @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 - } - /** - * List snapshots - * @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 - /** - * Create template (v3) - * @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 - } - /** - * List templates (v2) - * @description List all templates - */ - get: { - parameters: { - query?: { - teamID?: string - /** @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 templates */ - 200: { - headers: { - /** @description Cursor to fetch the next page of results, if more exist */ - 'X-Next-Token'?: string - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Template'][] - } - } - 400: components['responses']['400'] - 401: components['responses']['401'] - 403: components['responses']['403'] - 500: components['responses']['500'] - } - } - put?: never - /** - * Create template (v2) - * @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 - } - /** - * Template build file upload URL - * @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 - } - /** - * List templates - * @deprecated - * @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 - /** - * Create template - * @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 - } - /** - * List template builds - * @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 - /** - * Rebuild template - * @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'] - } - } - /** - * Delete template - * @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 - /** - * Update template - * @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 - /** - * Start template build - * @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 - /** - * Start template build (v2) - * @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 - /** - * Update template (v2) - * @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 - } - /** - * Template build status - * @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 - } - /** - * Template build logs - * @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 - /** - * Assign template tags - * @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'] - } - } - /** - * Delete template tags - * @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 - } - /** - * List template tags - * @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 - } - /** - * Check template alias - * @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 - } - /** - * List nodes - * @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 - } - /** - * Node info - * @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 - /** - * Change node status - * @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 - /** - * Create access token - * @deprecated - * @description Create a new access token. Deprecated; use an API key (E2B_API_KEY) instead. - */ - 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'] - 410: components['responses']['410'] - 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 - /** - * Delete access token - * @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 - } - /** - * List team API keys - * @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 - /** - * Create team API key - * @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 - /** - * Delete team API key - * @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 - /** - * Update team API key - * @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 - } - /** - * List team volumes - * @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 - /** - * Create team volume - * @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 - } - /** - * Team volume - * @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 - /** - * Delete team volume - * @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; + }; + /** + * Health check + * @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; + }; + /** + * List teams + * @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; + }; + /** + * Team metrics + * @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; + }; + /** + * Maximum team metrics + * @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; + }; + /** + * List running sandboxes + * @deprecated + * @description List all running sandboxes. Use GET /v2/sandboxes instead. + */ + 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; + /** + * Create sandbox + * @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; + }; + /** + * List sandboxes (v2) + * @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; + }; + /** + * List sandbox metrics + * @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; + }; + /** + * Sandbox logs + * @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; + }; + /** + * Sandbox logs (v2) + * @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; + }; + /** + * Sandbox + * @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; + /** + * Kill sandbox + * @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; + }; + /** + * Sandbox metrics + * @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; + /** + * Pause sandbox + * @description Pause the sandbox + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["SandboxPauseRequest"]; + }; + }; + 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; + /** + * Resume sandbox + * @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}/fork": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Fork sandbox + * @description Fork the sandbox: checkpoint the running sandbox in place (it is briefly paused, snapshotted with its full memory state, and resumed on its node, keeping its ID and expiration untouched) and create count new sandboxes from that snapshot. Returns one result per requested fork, each carrying either the created sandbox or the error that prevented it from starting. A non-201 status means the request failed before any fork was attempted. + */ + post: { + parameters: { + query?: never; + header?: never; + path: { + sandboxID: components["parameters"]["sandboxID"]; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["SandboxForkRequest"]; + }; + }; + responses: { + /** @description The sandbox was snapshotted and the forks were attempted; each entry reports one fork's outcome */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SandboxForkResult"][]; + }; + }; + 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; + /** + * Connect sandbox + * @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; + /** + * Set sandbox timeout + * @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; + /** + * Update sandbox network + * @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; + /** + * Refresh sandbox + * @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; + /** + * Create snapshot + * @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; + }; + /** + * List snapshots + * @description List all snapshots for the team + */ + get: { + parameters: { + query?: { + sandboxID?: string; + /** @description Filter snapshots by name or ID, optionally tag-qualified (e.g. "my-snapshot", "my-team/my-snapshot" or "my-snapshot:v1"). */ + name?: 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; + /** + * Create template (v3) + * @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; + }; + /** + * List templates (v2) + * @description List all templates + */ + get: { + parameters: { + query?: { + teamID?: string; + /** @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 templates */ + 200: { + headers: { + /** @description Cursor to fetch the next page of results, if more exist */ + "X-Next-Token"?: string; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Template"][]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 500: components["responses"]["500"]; + }; + }; + put?: never; + /** + * Create template (v2) + * @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; + }; + /** + * Template build file upload URL + * @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; + }; + /** + * List templates + * @deprecated + * @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; + /** + * Create template + * @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; + }; + /** + * List template builds + * @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; + /** + * Rebuild template + * @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"]; + }; + }; + /** + * Delete template + * @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; + /** + * Update template + * @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; + /** + * Start template build + * @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; + /** + * Start template build (v2) + * @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; + /** + * Update template (v2) + * @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; + }; + /** + * Template build status + * @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; + }; + /** + * Template build logs + * @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; + /** + * Assign template tags + * @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"]; + }; + }; + /** + * Delete template tags + * @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; + }; + /** + * List template tags + * @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; + }; + /** + * Check template alias + * @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; + }; + /** + * List nodes + * @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; + }; + /** + * Node info + * @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; + /** + * Change node status + * @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; + /** + * Create access token + * @deprecated + * @description Create a new access token. Deprecated; use an API key (E2B_API_KEY) instead. + */ + 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"]; + 410: components["responses"]["410"]; + 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; + /** + * Delete access token + * @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; + }; + /** + * List team API keys + * @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; + /** + * Create team API key + * @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; + /** + * Delete team API key + * @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; + /** + * Update team API key + * @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; + }; + /** + * List team volumes + * @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; + /** + * Create team volume + * @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; + }; + /** + * Team volume + * @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; + /** + * Delete team volume + * @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 - /** - * @description Controls the snapshot kind taken when the sandbox auto-pauses on timeout (only relevant when autoPause is true). When false, the auto-pause drops the in-memory state and persists only the filesystem (a filesystem-only snapshot); resuming it cold-boots (reboots) the sandbox from disk. Such a snapshot cannot be auto-resumed by traffic and must be resumed explicitly, so it cannot be combined with autoResume. Defaults to true (full memory snapshot). - * @default true - */ - autoPauseMemory: 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 - } - SandboxPauseRequest: { - /** - * @description Whether to capture a full memory snapshot. When false, only the filesystem is persisted and resuming the sandbox cold-boots (reboots) it from disk, losing in-memory state, running processes, and open connections. Resume it with an explicit request (connect or resume); auto-resume, which can be triggered by arbitrary traffic, refuses such a sandbox. Defaults to true. - * @default true - */ - memory: boolean - } - /** @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: date-time - * @description Time when the node status was last changed - */ - statusChangedAt: string - /** - * 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: date-time - * @description Time when the node status was last changed - */ - statusChangedAt: string - /** - * 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 Gone */ - 410: { - 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; + /** + * @description Controls the snapshot kind taken when the sandbox auto-pauses on timeout (only relevant when autoPause is true). When false, the auto-pause drops the in-memory state and persists only the filesystem (a filesystem-only snapshot); resuming it cold-boots (reboots) the sandbox from disk. Such a snapshot cannot be auto-resumed by traffic and must be resumed explicitly, so it cannot be combined with autoResume. Defaults to true (full memory snapshot). + * @default true + */ + autoPauseMemory: 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; + }; + SandboxPauseRequest: { + /** + * @description Whether to capture a full memory snapshot. When false, only the filesystem is persisted and resuming the sandbox cold-boots (reboots) it from disk, losing in-memory state, running processes, and open connections. Resume it with an explicit request (connect or resume); auto-resume, which can be triggered by arbitrary traffic, refuses such a sandbox. Defaults to true. + * @default true + */ + memory: boolean; + }; + SandboxForkRequest: { + /** + * Format: int32 + * @description Time to live for the new forked sandboxes in seconds. + * @default 15 + */ + timeout: number; + /** + * Format: int32 + * @description Number of forked sandboxes to create. All forks boot from the same snapshot, so the snapshot is captured once regardless of count. Each fork succeeds or fails independently; the outcome of each is reported in its entry of the response list. + * @default 1 + */ + count: number; + }; + /** @description Result of one requested fork. Exactly one of sandbox or error is set: sandbox when the fork started successfully, error when it failed to start. */ + SandboxForkResult: { + sandbox?: components["schemas"]["Sandbox"]; + error?: components["schemas"]["Error"]; + }; + /** @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; + /** + * Format: uint64 + * @description Total number of preallocated hugepages on the node + */ + hugePagesTotal: number; + /** + * Format: uint64 + * @description Number of hugepages in use (total - free) + */ + hugePagesUsed: number; + /** + * Format: uint64 + * @description Number of reserved hugepages (committed but not yet faulted) + */ + hugePagesReserved: number; + /** + * Format: uint64 + * @description Size of a single hugepage in bytes + */ + hugePageSizeBytes: 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: date-time + * @description Time when the node status was last changed + */ + statusChangedAt: string; + /** + * 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: date-time + * @description Time when the node status was last changed + */ + statusChangedAt: string; + /** + * 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 Gone */ + 410: { + 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 869215346d3492c53ce427f7e7784aac1db33c9e 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, 17 Jul 2026 15:49:06 +0000 Subject: [PATCH 2/2] style: apply biome formatting --- .../shared/contracts/dashboard-api.types.ts | 3308 ++++---- src/core/shared/contracts/infra-api.types.ts | 7459 +++++++++-------- 2 files changed, 5387 insertions(+), 5380 deletions(-) diff --git a/src/core/shared/contracts/dashboard-api.types.ts b/src/core/shared/contracts/dashboard-api.types.ts index 054e14f34..1e30823fa 100644 --- a/src/core/shared/contracts/dashboard-api.types.ts +++ b/src/core/shared/contracts/dashboard-api.types.ts @@ -4,1658 +4,1662 @@ */ 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; - }; - /** 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; - }; - /** 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; - }; - /** 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; - }; - /** 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; - }; - /** - * 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 + } + /** 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 + } + /** 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 + } + /** 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 + } + /** 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 + } + /** + * 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"]; - /** @description Whether the sandbox ended more than the fixed retention window ago, so its monitoring and logs data is no longer available */ - retentionExpired: boolean; - /** @description Whether the sandbox ended more than the team's events retention window ago, so its events data is no longer available */ - eventsRetentionExpired: boolean; - }; - 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; - /** Format: int32 */ - eventsTtlDays: 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'] + /** @description Whether the sandbox ended more than the fixed retention window ago, so its monitoring and logs data is no longer available */ + retentionExpired: boolean + /** @description Whether the sandbox ended more than the team's events retention window ago, so its events data is no longer available */ + eventsRetentionExpired: boolean + } + 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 + /** Format: int32 */ + eventsTtlDays: 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 54d865682..6afcb5dd0 100644 --- a/src/core/shared/contracts/infra-api.types.ts +++ b/src/core/shared/contracts/infra-api.types.ts @@ -4,3734 +4,3737 @@ */ export interface paths { - "/health": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Health check - * @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; - }; - /** - * List teams - * @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; - }; - /** - * Team metrics - * @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; - }; - /** - * Maximum team metrics - * @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; - }; - /** - * List running sandboxes - * @deprecated - * @description List all running sandboxes. Use GET /v2/sandboxes instead. - */ - 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; - /** - * Create sandbox - * @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; - }; - /** - * List sandboxes (v2) - * @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; - }; - /** - * List sandbox metrics - * @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; - }; - /** - * Sandbox logs - * @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; - }; - /** - * Sandbox logs (v2) - * @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; - }; - /** - * Sandbox - * @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; - /** - * Kill sandbox - * @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; - }; - /** - * Sandbox metrics - * @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; - /** - * Pause sandbox - * @description Pause the sandbox - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": components["schemas"]["SandboxPauseRequest"]; - }; - }; - 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; - /** - * Resume sandbox - * @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}/fork": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Fork sandbox - * @description Fork the sandbox: checkpoint the running sandbox in place (it is briefly paused, snapshotted with its full memory state, and resumed on its node, keeping its ID and expiration untouched) and create count new sandboxes from that snapshot. Returns one result per requested fork, each carrying either the created sandbox or the error that prevented it from starting. A non-201 status means the request failed before any fork was attempted. - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": components["schemas"]["SandboxForkRequest"]; - }; - }; - responses: { - /** @description The sandbox was snapshotted and the forks were attempted; each entry reports one fork's outcome */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxForkResult"][]; - }; - }; - 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; - /** - * Connect sandbox - * @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; - /** - * Set sandbox timeout - * @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; - /** - * Update sandbox network - * @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; - /** - * Refresh sandbox - * @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; - /** - * Create snapshot - * @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; - }; - /** - * List snapshots - * @description List all snapshots for the team - */ - get: { - parameters: { - query?: { - sandboxID?: string; - /** @description Filter snapshots by name or ID, optionally tag-qualified (e.g. "my-snapshot", "my-team/my-snapshot" or "my-snapshot:v1"). */ - name?: 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; - /** - * Create template (v3) - * @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; - }; - /** - * List templates (v2) - * @description List all templates - */ - get: { - parameters: { - query?: { - teamID?: string; - /** @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 templates */ - 200: { - headers: { - /** @description Cursor to fetch the next page of results, if more exist */ - "X-Next-Token"?: string; - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Template"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** - * Create template (v2) - * @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; - }; - /** - * Template build file upload URL - * @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; - }; - /** - * List templates - * @deprecated - * @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; - /** - * Create template - * @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; - }; - /** - * List template builds - * @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; - /** - * Rebuild template - * @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"]; - }; - }; - /** - * Delete template - * @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; - /** - * Update template - * @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; - /** - * Start template build - * @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; - /** - * Start template build (v2) - * @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; - /** - * Update template (v2) - * @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; - }; - /** - * Template build status - * @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; - }; - /** - * Template build logs - * @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; - /** - * Assign template tags - * @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"]; - }; - }; - /** - * Delete template tags - * @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; - }; - /** - * List template tags - * @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; - }; - /** - * Check template alias - * @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; - }; - /** - * List nodes - * @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; - }; - /** - * Node info - * @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; - /** - * Change node status - * @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; - /** - * Create access token - * @deprecated - * @description Create a new access token. Deprecated; use an API key (E2B_API_KEY) instead. - */ - 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"]; - 410: components["responses"]["410"]; - 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; - /** - * Delete access token - * @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; - }; - /** - * List team API keys - * @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; - /** - * Create team API key - * @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; - /** - * Delete team API key - * @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; - /** - * Update team API key - * @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; - }; - /** - * List team volumes - * @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; - /** - * Create team volume - * @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; - }; - /** - * Team volume - * @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; - /** - * Delete team volume - * @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 + } + /** + * Health check + * @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 + } + /** + * List teams + * @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 + } + /** + * Team metrics + * @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 + } + /** + * Maximum team metrics + * @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 + } + /** + * List running sandboxes + * @deprecated + * @description List all running sandboxes. Use GET /v2/sandboxes instead. + */ + 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 + /** + * Create sandbox + * @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 + } + /** + * List sandboxes (v2) + * @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 + } + /** + * List sandbox metrics + * @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 + } + /** + * Sandbox logs + * @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 + } + /** + * Sandbox logs (v2) + * @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 + } + /** + * Sandbox + * @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 + /** + * Kill sandbox + * @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 + } + /** + * Sandbox metrics + * @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 + /** + * Pause sandbox + * @description Pause the sandbox + */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': components['schemas']['SandboxPauseRequest'] + } + } + 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 + /** + * Resume sandbox + * @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}/fork': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * Fork sandbox + * @description Fork the sandbox: checkpoint the running sandbox in place (it is briefly paused, snapshotted with its full memory state, and resumed on its node, keeping its ID and expiration untouched) and create count new sandboxes from that snapshot. Returns one result per requested fork, each carrying either the created sandbox or the error that prevented it from starting. A non-201 status means the request failed before any fork was attempted. + */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': components['schemas']['SandboxForkRequest'] + } + } + responses: { + /** @description The sandbox was snapshotted and the forks were attempted; each entry reports one fork's outcome */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxForkResult'][] + } + } + 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 + /** + * Connect sandbox + * @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 + /** + * Set sandbox timeout + * @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 + /** + * Update sandbox network + * @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 + /** + * Refresh sandbox + * @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 + /** + * Create snapshot + * @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 + } + /** + * List snapshots + * @description List all snapshots for the team + */ + get: { + parameters: { + query?: { + sandboxID?: string + /** @description Filter snapshots by name or ID, optionally tag-qualified (e.g. "my-snapshot", "my-team/my-snapshot" or "my-snapshot:v1"). */ + name?: 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 + /** + * Create template (v3) + * @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 + } + /** + * List templates (v2) + * @description List all templates + */ + get: { + parameters: { + query?: { + teamID?: string + /** @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 templates */ + 200: { + headers: { + /** @description Cursor to fetch the next page of results, if more exist */ + 'X-Next-Token'?: string + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Template'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + /** + * Create template (v2) + * @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 + } + /** + * Template build file upload URL + * @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 + } + /** + * List templates + * @deprecated + * @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 + /** + * Create template + * @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 + } + /** + * List template builds + * @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 + /** + * Rebuild template + * @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'] + } + } + /** + * Delete template + * @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 + /** + * Update template + * @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 + /** + * Start template build + * @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 + /** + * Start template build (v2) + * @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 + /** + * Update template (v2) + * @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 + } + /** + * Template build status + * @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 + } + /** + * Template build logs + * @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 + /** + * Assign template tags + * @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'] + } + } + /** + * Delete template tags + * @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 + } + /** + * List template tags + * @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 + } + /** + * Check template alias + * @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 + } + /** + * List nodes + * @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 + } + /** + * Node info + * @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 + /** + * Change node status + * @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 + /** + * Create access token + * @deprecated + * @description Create a new access token. Deprecated; use an API key (E2B_API_KEY) instead. + */ + 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'] + 410: components['responses']['410'] + 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 + /** + * Delete access token + * @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 + } + /** + * List team API keys + * @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 + /** + * Create team API key + * @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 + /** + * Delete team API key + * @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 + /** + * Update team API key + * @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 + } + /** + * List team volumes + * @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 + /** + * Create team volume + * @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 + } + /** + * Team volume + * @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 + /** + * Delete team volume + * @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; - /** - * @description Controls the snapshot kind taken when the sandbox auto-pauses on timeout (only relevant when autoPause is true). When false, the auto-pause drops the in-memory state and persists only the filesystem (a filesystem-only snapshot); resuming it cold-boots (reboots) the sandbox from disk. Such a snapshot cannot be auto-resumed by traffic and must be resumed explicitly, so it cannot be combined with autoResume. Defaults to true (full memory snapshot). - * @default true - */ - autoPauseMemory: 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; - }; - SandboxPauseRequest: { - /** - * @description Whether to capture a full memory snapshot. When false, only the filesystem is persisted and resuming the sandbox cold-boots (reboots) it from disk, losing in-memory state, running processes, and open connections. Resume it with an explicit request (connect or resume); auto-resume, which can be triggered by arbitrary traffic, refuses such a sandbox. Defaults to true. - * @default true - */ - memory: boolean; - }; - SandboxForkRequest: { - /** - * Format: int32 - * @description Time to live for the new forked sandboxes in seconds. - * @default 15 - */ - timeout: number; - /** - * Format: int32 - * @description Number of forked sandboxes to create. All forks boot from the same snapshot, so the snapshot is captured once regardless of count. Each fork succeeds or fails independently; the outcome of each is reported in its entry of the response list. - * @default 1 - */ - count: number; - }; - /** @description Result of one requested fork. Exactly one of sandbox or error is set: sandbox when the fork started successfully, error when it failed to start. */ - SandboxForkResult: { - sandbox?: components["schemas"]["Sandbox"]; - error?: components["schemas"]["Error"]; - }; - /** @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; - /** - * Format: uint64 - * @description Total number of preallocated hugepages on the node - */ - hugePagesTotal: number; - /** - * Format: uint64 - * @description Number of hugepages in use (total - free) - */ - hugePagesUsed: number; - /** - * Format: uint64 - * @description Number of reserved hugepages (committed but not yet faulted) - */ - hugePagesReserved: number; - /** - * Format: uint64 - * @description Size of a single hugepage in bytes - */ - hugePageSizeBytes: 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: date-time - * @description Time when the node status was last changed - */ - statusChangedAt: string; - /** - * 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: date-time - * @description Time when the node status was last changed - */ - statusChangedAt: string; - /** - * 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 Gone */ - 410: { - 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 + /** + * @description Controls the snapshot kind taken when the sandbox auto-pauses on timeout (only relevant when autoPause is true). When false, the auto-pause drops the in-memory state and persists only the filesystem (a filesystem-only snapshot); resuming it cold-boots (reboots) the sandbox from disk. Such a snapshot cannot be auto-resumed by traffic and must be resumed explicitly, so it cannot be combined with autoResume. Defaults to true (full memory snapshot). + * @default true + */ + autoPauseMemory: 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 + } + SandboxPauseRequest: { + /** + * @description Whether to capture a full memory snapshot. When false, only the filesystem is persisted and resuming the sandbox cold-boots (reboots) it from disk, losing in-memory state, running processes, and open connections. Resume it with an explicit request (connect or resume); auto-resume, which can be triggered by arbitrary traffic, refuses such a sandbox. Defaults to true. + * @default true + */ + memory: boolean + } + SandboxForkRequest: { + /** + * Format: int32 + * @description Time to live for the new forked sandboxes in seconds. + * @default 15 + */ + timeout: number + /** + * Format: int32 + * @description Number of forked sandboxes to create. All forks boot from the same snapshot, so the snapshot is captured once regardless of count. Each fork succeeds or fails independently; the outcome of each is reported in its entry of the response list. + * @default 1 + */ + count: number + } + /** @description Result of one requested fork. Exactly one of sandbox or error is set: sandbox when the fork started successfully, error when it failed to start. */ + SandboxForkResult: { + sandbox?: components['schemas']['Sandbox'] + error?: components['schemas']['Error'] + } + /** @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 + /** + * Format: uint64 + * @description Total number of preallocated hugepages on the node + */ + hugePagesTotal: number + /** + * Format: uint64 + * @description Number of hugepages in use (total - free) + */ + hugePagesUsed: number + /** + * Format: uint64 + * @description Number of reserved hugepages (committed but not yet faulted) + */ + hugePagesReserved: number + /** + * Format: uint64 + * @description Size of a single hugepage in bytes + */ + hugePageSizeBytes: 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: date-time + * @description Time when the node status was last changed + */ + statusChangedAt: string + /** + * 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: date-time + * @description Time when the node status was last changed + */ + statusChangedAt: string + /** + * 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 Gone */ + 410: { + 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