From d04d848aa38fa6c66c161ade60507943ec9ff386 Mon Sep 17 00:00:00 2001 From: dobrac <4323173+dobrac@users.noreply.github.com> Date: Fri, 7 Aug 2026 15:37:02 +0000 Subject: [PATCH] chore: sync infra OpenAPI specs --- spec/openapi.dashboard-api.yaml | 284 +++++++++++++++--- spec/openapi.infra.yaml | 58 +++- .../shared/contracts/dashboard-api.types.ts | 260 +++++++++++++--- src/core/shared/contracts/infra-api.types.ts | 25 +- 4 files changed, 536 insertions(+), 91 deletions(-) diff --git a/spec/openapi.dashboard-api.yaml b/spec/openapi.dashboard-api.yaml index 09bbedd64..c1c46f8f6 100644 --- a/spec/openapi.dashboard-api.yaml +++ b/spec/openapi.dashboard-api.yaml @@ -400,6 +400,50 @@ components: format: email description: Billing/contact email for the team. + AdminClusterCreateRequest: + type: object + required: + - name + - endpoint + - endpoint_tls + - token + properties: + name: + type: string + minLength: 1 + endpoint: + type: string + minLength: 1 + endpoint_tls: + type: boolean + token: + type: string + minLength: 1 + sandbox_proxy_domain: + type: string + nullable: true + auth_org_id: + type: string + nullable: true + + AdminClusterCreateResponse: + type: object + required: + - cluster_id + properties: + cluster_id: + type: string + format: uuid + + AdminTeamClusterAssignmentRequest: + type: object + required: + - cluster_id + properties: + cluster_id: + type: string + format: uuid + BuildStatus: type: string description: Build status mapped for dashboard clients. @@ -1162,13 +1206,19 @@ components: slug: type: string - AdminControlPlaneProjectType: - type: string - enum: [development, staging, production] - - AdminControlPlaneProjectUpsertRequest: + ManagementProjectUpsertRequest: type: object - required: [name, slug, project_type] + description: >- + The properties of a project this side stores. Every one is synchronized + by the caller and sent on every push, so a reconcile is a complete + statement of the project rather than a patch. + + + A project's tier is not among them. It is assigned once, at creation, + from this side's own default, and no push moves it — limits arrive + separately and in full through upsertProjectLimits, which takes + precedence over the tier anyway. + required: [name, slug, email] properties: name: type: string @@ -1178,12 +1228,21 @@ components: type: string minLength: 1 maxLength: 63 - project_type: - $ref: "#/components/schemas/AdminControlPlaneProjectType" + description: >- + Changing it renames the project, and nothing follows it. Template + names embed the slug they were built under, so a renamed project + keeps its existing template names and only new ones carry the new + slug. A slug already held on this control plane is a 409, on a + rename as much as on a create. + email: + type: string + minLength: 1 + maxLength: 255 + description: Contact address recorded on the project. - AdminControlPlaneProject: + ManagementProject: allOf: - - $ref: "#/components/schemas/AdminControlPlaneProjectUpsertRequest" + - $ref: "#/components/schemas/ManagementProjectUpsertRequest" - type: object required: [id] properties: @@ -1191,15 +1250,51 @@ components: type: string format: uuid - AdminControlPlaneMemberUpsertRequest: + ManagementMemberUpsertRequest: type: object properties: added_by: type: string format: uuid - AdminControlPlaneProjectLimits: + ManagementMemberBatchEntry: type: object + required: + - user_id + - present + properties: + user_id: + type: string + format: uuid + present: + type: boolean + description: >- + Whether the user should be a member after this call. Presence is + stated rather than implied by inclusion, so one request carries + both additions and removals and the caller never has to order them. + + ManagementMemberBatchRequest: + type: array + description: >- + Desired membership for the listed users, ignoring everyone unlisted. + Entries are independent, so applying them in any order converges. + items: + $ref: "#/components/schemas/ManagementMemberBatchEntry" + maxItems: 1024 + + ManagementProjectLimits: + type: object + description: >- + A project's effective limits, already resolved by the caller. Every + field is absolute: this side stores what it is given and performs no + arithmetic of its own. + + + The minimums below track the CHECK constraints on tiers, which is the + contract for what a limit may be. project_limits stores the same values + under looser constraints on purpose — it is a push target, and a floor + that only rejects the impossible keeps a future decision about what is + allowed a change to this schema rather than a migration. required: - concurrent_sandboxes - max_sandbox_length_hours @@ -1208,6 +1303,8 @@ components: - disk_mb - concurrent_template_builds - events_ttl_days + - default_free_disk_size_mb + - max_disk_size_mb properties: concurrent_sandboxes: type: integer @@ -1237,14 +1334,25 @@ components: type: integer format: int32 minimum: 1 + default_free_disk_size_mb: + type: integer + format: int64 + minimum: 0 + description: >- + Free rootfs allowance. Must not exceed max_disk_size_mb; the two + are stored together and rejected as a pair if they disagree. + max_disk_size_mb: + type: integer + format: int64 + minimum: 1 tags: - name: builds + - name: control-plane-management + description: Workspace control-plane operations authenticated with service JWTs. - name: sandboxes - name: teams - name: templates - - name: workspace-admin - description: Workspace control-plane admin operations authenticated with service JWTs. paths: /health: @@ -1463,6 +1571,62 @@ paths: "500": $ref: "#/components/responses/500" + /admin/clusters: + post: + summary: Create an immutable cluster + description: Creates a cluster row. Existing cluster rows are never modified. + tags: [admin] + security: + - AdminApiKeyAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/AdminClusterCreateRequest" + responses: + "201": + description: Cluster created. + content: + application/json: + schema: + $ref: "#/components/schemas/AdminClusterCreateResponse" + "400": + $ref: "#/components/responses/400" + "401": + $ref: "#/components/responses/401" + "409": + $ref: "#/components/responses/409" + "500": + $ref: "#/components/responses/500" + + /admin/teams/{teamID}/cluster: + put: + summary: Assign a cluster to a team + description: Updates the team's cluster reference to an existing cluster. + tags: [admin] + security: + - AdminApiKeyAuth: [] + parameters: + - $ref: "#/components/parameters/teamID" + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/AdminTeamClusterAssignmentRequest" + responses: + "204": + description: Cluster assigned. + "400": + $ref: "#/components/responses/400" + "401": + $ref: "#/components/responses/401" + "404": + $ref: "#/components/responses/404" + "500": + $ref: "#/components/responses/500" + /admin/user-profiles/resolve: post: summary: Resolve user profiles @@ -1889,13 +2053,13 @@ paths: "500": $ref: "#/components/responses/500" - /admin/v1/projects/{teamID}: + /v1/management/projects/{teamID}: parameters: - $ref: "#/components/parameters/teamID" put: - operationId: upsertProject - summary: Create or reconcile a project. - tags: [workspace-admin] + operationId: managementUpsertProject + summary: Create or reconcile a project (v1). + tags: [control-plane-management] security: - AdminJWTAuth: [] requestBody: @@ -1903,20 +2067,20 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/AdminControlPlaneProjectUpsertRequest" + $ref: "#/components/schemas/ManagementProjectUpsertRequest" responses: "200": description: Existing project reconciled. content: application/json: schema: - $ref: "#/components/schemas/AdminControlPlaneProject" + $ref: "#/components/schemas/ManagementProject" "201": description: Project created. content: application/json: schema: - $ref: "#/components/schemas/AdminControlPlaneProject" + $ref: "#/components/schemas/ManagementProject" "400": $ref: "#/components/responses/400" "401": @@ -1928,9 +2092,15 @@ paths: "501": $ref: "#/components/responses/501" delete: - operationId: deleteProject - summary: Delete a project and its control-plane state. - tags: [workspace-admin] + operationId: managementDeleteProject + summary: Delete a project and its control-plane state (v1). + description: >- + Declared, and answered with 501 by every control plane. Deleting a + project means reclaiming templates, snapshots, volumes, running + sandboxes and their stored artifacts, and no single service can reach + all of them today. Callers should not depend on this operation until + that changes. + tags: [control-plane-management] security: - AdminJWTAuth: [] responses: @@ -1945,14 +2115,14 @@ paths: "501": $ref: "#/components/responses/501" - /admin/v1/projects/{teamID}/members/{userId}: + /v1/management/projects/{teamID}/members/{userId}: parameters: - $ref: "#/components/parameters/teamID" - $ref: "#/components/parameters/userId" put: - operationId: upsertProjectMember - summary: Reconcile an opaque user UUID as a project member. - tags: [workspace-admin] + operationId: managementUpsertProjectMember + summary: Reconcile an opaque user UUID as a project member (v1). + tags: [control-plane-management] security: - AdminJWTAuth: [] requestBody: @@ -1960,7 +2130,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/AdminControlPlaneMemberUpsertRequest" + $ref: "#/components/schemas/ManagementMemberUpsertRequest" responses: "204": description: Membership is present. @@ -1975,9 +2145,9 @@ paths: "501": $ref: "#/components/responses/501" delete: - operationId: deleteProjectMember - summary: Remove a project member. - tags: [workspace-admin] + operationId: managementDeleteProjectMember + summary: Remove a project member (v1). + tags: [control-plane-management] security: - AdminJWTAuth: [] responses: @@ -1994,13 +2164,45 @@ paths: "501": $ref: "#/components/responses/501" - /admin/v1/projects/{teamID}/limits: + /v1/management/projects/{teamID}/members/batch: + parameters: + - $ref: "#/components/parameters/teamID" + post: + operationId: managementBatchSyncProjectMembers + summary: Reconcile many project memberships in one call (v1). + description: >- + The bulk path behind group and directory fan-outs, where the per-member + routes would cost one request each. Callers chunk larger sets. + tags: [control-plane-management] + security: + - AdminJWTAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/ManagementMemberBatchRequest" + responses: + "204": + description: Every listed membership matches the request. + "400": + $ref: "#/components/responses/400" + "401": + $ref: "#/components/responses/401" + "404": + $ref: "#/components/responses/404" + "500": + $ref: "#/components/responses/500" + "501": + $ref: "#/components/responses/501" + + /v1/management/projects/{teamID}/limits: parameters: - $ref: "#/components/parameters/teamID" put: - operationId: upsertProjectLimits - summary: Reconcile effective limits for a project. - tags: [workspace-admin] + operationId: managementUpsertProjectLimits + summary: Reconcile effective limits for a project (v1). + tags: [control-plane-management] security: - AdminJWTAuth: [] requestBody: @@ -2008,7 +2210,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/AdminControlPlaneProjectLimits" + $ref: "#/components/schemas/ManagementProjectLimits" responses: "204": description: Effective limits are synchronized. @@ -2023,13 +2225,13 @@ paths: "501": $ref: "#/components/responses/501" - /admin/v1/users/{userId}: + /v1/management/users/{userId}: parameters: - $ref: "#/components/parameters/userId" delete: - operationId: purgeUser - summary: Purge shard-local membership and access-token state for an opaque user UUID. - tags: [workspace-admin] + operationId: managementPurgeUser + summary: Purge shard-local membership and access-token state for an opaque user UUID (v1). + tags: [control-plane-management] security: - AdminJWTAuth: [] responses: diff --git a/spec/openapi.infra.yaml b/spec/openapi.infra.yaml index 4a26b3a42..3baff1fbc 100644 --- a/spec/openapi.infra.yaml +++ b/spec/openapi.infra.yaml @@ -123,6 +123,19 @@ components: schema: type: string + headers: + XNextToken: + description: Cursor to fetch the next page of results, if more exist + schema: + type: string + XTotalRunning: + description: > + Number of running sandboxes matching the filters, before pagination is applied. + Only present when running sandboxes were requested. + schema: + type: integer + format: int32 + responses: "400": description: Bad request @@ -298,7 +311,13 @@ components: items: type: string egressProxy: - $ref: "#/components/schemas/SandboxEgressProxyConfig" + allOf: + - $ref: "#/components/schemas/SandboxEgressProxyConfig" + 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). + x-not-implemented: true maskRequestHost: type: string description: Specify host mask which will be used for all sandbox requests @@ -328,7 +347,13 @@ components: items: type: string egressProxy: - $ref: "#/components/schemas/SandboxEgressProxyConfig" + allOf: + - $ref: "#/components/schemas/SandboxEgressProxyConfig" + 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). + x-not-implemented: true rules: type: object description: Per-domain transform rules. Replaces all existing rules when provided. @@ -365,6 +390,7 @@ components: SandboxEgressProxyConfig: type: object nullable: true + x-not-implemented: true description: >- SOCKS5 proxy for sandbox egress. Outbound TCP is tunneled through the proxy after allow/deny filtering; the sandbox is unaware. Domain-matched @@ -1749,7 +1775,6 @@ components: - status - statusChangedAt - sandboxCount - - cachedBuilds - createSuccesses - createFails - version @@ -1786,11 +1811,6 @@ components: description: Number of sandboxes running on the node metrics: $ref: "#/components/schemas/NodeMetrics" - cachedBuilds: - type: array - description: List of cached builds id on the node - items: - type: string createSuccesses: type: integer format: uint64 @@ -2032,6 +2052,13 @@ components: token: type: string description: Auth token to use for interacting with volume content + domain: + type: string + description: | + Domain to use as the destination for volume content requests, + replacing the default `api.`. Only returned when the + team is connected to a custom (BYOC) cluster; absent otherwise, in + which case the default domain is used. required: - volumeID - name @@ -2281,6 +2308,11 @@ paths: responses: "200": description: Successfully returned all running sandboxes + headers: + X-Next-Token: + $ref: "#/components/headers/XNextToken" + X-Total-Running: + $ref: "#/components/headers/XTotalRunning" content: application/json: schema: @@ -2832,6 +2864,9 @@ paths: responses: "200": description: Successfully returned snapshots + headers: + X-Next-Token: + $ref: "#/components/headers/XNextToken" content: application/json: schema: @@ -2903,9 +2938,7 @@ paths: description: Successfully returned all templates headers: X-Next-Token: - description: Cursor to fetch the next page of results, if more exist - schema: - type: string + $ref: "#/components/headers/XNextToken" content: application/json: schema: @@ -3070,6 +3103,9 @@ paths: responses: "200": description: Successfully returned the template with its builds + headers: + X-Next-Token: + $ref: "#/components/headers/XNextToken" content: application/json: schema: diff --git a/src/core/shared/contracts/dashboard-api.types.ts b/src/core/shared/contracts/dashboard-api.types.ts index abe271801..970d1759d 100644 --- a/src/core/shared/contracts/dashboard-api.types.ts +++ b/src/core/shared/contracts/dashboard-api.types.ts @@ -376,6 +376,101 @@ export interface paths { patch?: never trace?: never } + '/admin/clusters': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * Create an immutable cluster + * @description Creates a cluster row. Existing cluster rows are never modified. + */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AdminClusterCreateRequest'] + } + } + responses: { + /** @description Cluster created. */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AdminClusterCreateResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 409: components['responses']['409'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/teams/{teamID}/cluster': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + /** + * Assign a cluster to a team + * @description Updates the team's cluster reference to an existing cluster. + */ + put: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the team. */ + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AdminTeamClusterAssignmentRequest'] + } + } + responses: { + /** @description Cluster assigned. */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } '/admin/user-profiles/resolve': { parameters: { query?: never @@ -1106,7 +1201,7 @@ export interface paths { patch?: never trace?: never } - '/admin/v1/projects/{teamID}': { + '/v1/management/projects/{teamID}': { parameters: { query?: never header?: never @@ -1117,17 +1212,20 @@ export interface paths { cookie?: never } get?: never - /** Create or reconcile a project. */ - put: operations['upsertProject'] + /** Create or reconcile a project (v1). */ + put: operations['managementUpsertProject'] post?: never - /** Delete a project and its control-plane state. */ - delete: operations['deleteProject'] + /** + * Delete a project and its control-plane state (v1). + * @description Declared, and answered with 501 by every control plane. Deleting a project means reclaiming templates, snapshots, volumes, running sandboxes and their stored artifacts, and no single service can reach all of them today. Callers should not depend on this operation until that changes. + */ + delete: operations['managementDeleteProject'] options?: never head?: never patch?: never trace?: never } - '/admin/v1/projects/{teamID}/members/{userId}': { + '/v1/management/projects/{teamID}/members/{userId}': { parameters: { query?: never header?: never @@ -1140,17 +1238,17 @@ export interface paths { cookie?: never } get?: never - /** Reconcile an opaque user UUID as a project member. */ - put: operations['upsertProjectMember'] + /** Reconcile an opaque user UUID as a project member (v1). */ + put: operations['managementUpsertProjectMember'] post?: never - /** Remove a project member. */ - delete: operations['deleteProjectMember'] + /** Remove a project member (v1). */ + delete: operations['managementDeleteProjectMember'] options?: never head?: never patch?: never trace?: never } - '/admin/v1/projects/{teamID}/limits': { + '/v1/management/projects/{teamID}/members/batch': { parameters: { query?: never header?: never @@ -1161,8 +1259,31 @@ export interface paths { cookie?: never } get?: never - /** Reconcile effective limits for a project. */ - put: operations['upsertProjectLimits'] + put?: never + /** + * Reconcile many project memberships in one call (v1). + * @description The bulk path behind group and directory fan-outs, where the per-member routes would cost one request each. Callers chunk larger sets. + */ + post: operations['managementBatchSyncProjectMembers'] + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v1/management/projects/{teamID}/limits': { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the team. */ + teamID: components['parameters']['teamID'] + } + cookie?: never + } + get?: never + /** Reconcile effective limits for a project (v1). */ + put: operations['managementUpsertProjectLimits'] post?: never delete?: never options?: never @@ -1170,7 +1291,7 @@ export interface paths { patch?: never trace?: never } - '/admin/v1/users/{userId}': { + '/v1/management/users/{userId}': { parameters: { query?: never header?: never @@ -1183,8 +1304,8 @@ export interface paths { get?: never put?: never post?: never - /** Purge shard-local membership and access-token state for an opaque user UUID. */ - delete: operations['purgeUser'] + /** Purge shard-local membership and access-token state for an opaque user UUID (v1). */ + delete: operations['managementPurgeUser'] options?: never head?: never patch?: never @@ -1240,6 +1361,22 @@ export interface components { */ email: string } + AdminClusterCreateRequest: { + name: string + endpoint: string + endpoint_tls: boolean + token: string + sandbox_proxy_domain?: string | null + auth_org_id?: string | null + } + AdminClusterCreateResponse: { + /** Format: uuid */ + cluster_id: string + } + AdminTeamClusterAssignmentRequest: { + /** Format: uuid */ + cluster_id: string + } /** * @description Build status mapped for dashboard clients. * @enum {string} @@ -1619,22 +1756,40 @@ export interface components { id: string slug: string } - /** @enum {string} */ - AdminControlPlaneProjectType: 'development' | 'staging' | 'production' - AdminControlPlaneProjectUpsertRequest: { + /** + * @description The properties of a project this side stores. Every one is synchronized by the caller and sent on every push, so a reconcile is a complete statement of the project rather than a patch. + * + * A project's tier is not among them. It is assigned once, at creation, from this side's own default, and no push moves it — limits arrive separately and in full through upsertProjectLimits, which takes precedence over the tier anyway. + */ + ManagementProjectUpsertRequest: { name: string + /** @description Changing it renames the project, and nothing follows it. Template names embed the slug they were built under, so a renamed project keeps its existing template names and only new ones carry the new slug. A slug already held on this control plane is a 409, on a rename as much as on a create. */ slug: string - project_type: components['schemas']['AdminControlPlaneProjectType'] + /** @description Contact address recorded on the project. */ + email: string } - AdminControlPlaneProject: components['schemas']['AdminControlPlaneProjectUpsertRequest'] & { + ManagementProject: components['schemas']['ManagementProjectUpsertRequest'] & { /** Format: uuid */ id: string } - AdminControlPlaneMemberUpsertRequest: { + ManagementMemberUpsertRequest: { /** Format: uuid */ added_by?: string } - AdminControlPlaneProjectLimits: { + ManagementMemberBatchEntry: { + /** Format: uuid */ + user_id: string + /** @description Whether the user should be a member after this call. Presence is stated rather than implied by inclusion, so one request carries both additions and removals and the caller never has to order them. */ + present: boolean + } + /** @description Desired membership for the listed users, ignoring everyone unlisted. Entries are independent, so applying them in any order converges. */ + ManagementMemberBatchRequest: components['schemas']['ManagementMemberBatchEntry'][] + /** + * @description A project's effective limits, already resolved by the caller. Every field is absolute: this side stores what it is given and performs no arithmetic of its own. + * + * The minimums below track the CHECK constraints on tiers, which is the contract for what a limit may be. project_limits stores the same values under looser constraints on purpose — it is a push target, and a floor that only rejects the impossible keeps a future decision about what is allowed a change to this schema rather than a migration. + */ + ManagementProjectLimits: { /** Format: int32 */ concurrent_sandboxes: number /** Format: int32 */ @@ -1649,6 +1804,13 @@ export interface components { concurrent_template_builds: number /** Format: int32 */ events_ttl_days: number + /** + * Format: int64 + * @description Free rootfs allowance. Must not exceed max_disk_size_mb; the two are stored together and rejected as a pair if they disagree. + */ + default_free_disk_size_mb: number + /** Format: int64 */ + max_disk_size_mb: number } } responses: { @@ -1787,7 +1949,7 @@ export interface components { } export type $defs = Record export interface operations { - upsertProject: { + managementUpsertProject: { parameters: { query?: never header?: never @@ -1799,7 +1961,7 @@ export interface operations { } requestBody: { content: { - 'application/json': components['schemas']['AdminControlPlaneProjectUpsertRequest'] + 'application/json': components['schemas']['ManagementProjectUpsertRequest'] } } responses: { @@ -1809,7 +1971,7 @@ export interface operations { [name: string]: unknown } content: { - 'application/json': components['schemas']['AdminControlPlaneProject'] + 'application/json': components['schemas']['ManagementProject'] } } /** @description Project created. */ @@ -1818,7 +1980,7 @@ export interface operations { [name: string]: unknown } content: { - 'application/json': components['schemas']['AdminControlPlaneProject'] + 'application/json': components['schemas']['ManagementProject'] } } 400: components['responses']['400'] @@ -1828,7 +1990,7 @@ export interface operations { 501: components['responses']['501'] } } - deleteProject: { + managementDeleteProject: { parameters: { query?: never header?: never @@ -1853,7 +2015,7 @@ export interface operations { 501: components['responses']['501'] } } - upsertProjectMember: { + managementUpsertProjectMember: { parameters: { query?: never header?: never @@ -1867,7 +2029,7 @@ export interface operations { } requestBody?: { content: { - 'application/json': components['schemas']['AdminControlPlaneMemberUpsertRequest'] + 'application/json': components['schemas']['ManagementMemberUpsertRequest'] } } responses: { @@ -1885,7 +2047,7 @@ export interface operations { 501: components['responses']['501'] } } - deleteProjectMember: { + managementDeleteProjectMember: { parameters: { query?: never header?: never @@ -1913,7 +2075,37 @@ export interface operations { 501: components['responses']['501'] } } - upsertProjectLimits: { + managementBatchSyncProjectMembers: { + parameters: { + query?: never + header?: never + path: { + /** @description Identifier of the team. */ + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['ManagementMemberBatchRequest'] + } + } + responses: { + /** @description Every listed membership matches the request. */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + 501: components['responses']['501'] + } + } + managementUpsertProjectLimits: { parameters: { query?: never header?: never @@ -1925,7 +2117,7 @@ export interface operations { } requestBody: { content: { - 'application/json': components['schemas']['AdminControlPlaneProjectLimits'] + 'application/json': components['schemas']['ManagementProjectLimits'] } } responses: { @@ -1943,7 +2135,7 @@ export interface operations { 501: components['responses']['501'] } } - purgeUser: { + managementPurgeUser: { parameters: { query?: never header?: never diff --git a/src/core/shared/contracts/infra-api.types.ts b/src/core/shared/contracts/infra-api.types.ts index 4e306d805..d8a80d8c6 100644 --- a/src/core/shared/contracts/infra-api.types.ts +++ b/src/core/shared/contracts/infra-api.types.ts @@ -291,6 +291,8 @@ export interface paths { /** @description Successfully returned all running sandboxes */ 200: { headers: { + 'X-Next-Token': components['headers']['XNextToken'] + 'X-Total-Running': components['headers']['XTotalRunning'] [name: string]: unknown } content: { @@ -1001,6 +1003,7 @@ export interface paths { /** @description Successfully returned snapshots */ 200: { headers: { + 'X-Next-Token': components['headers']['XNextToken'] [name: string]: unknown } content: { @@ -1095,8 +1098,7 @@ export interface paths { /** @description Successfully returned all templates */ 200: { headers: { - /** @description Cursor to fetch the next page of results, if more exist */ - 'X-Next-Token'?: string + 'X-Next-Token': components['headers']['XNextToken'] [name: string]: unknown } content: { @@ -1299,6 +1301,7 @@ export interface paths { /** @description Successfully returned the template with its builds */ 200: { headers: { + 'X-Next-Token': components['headers']['XNextToken'] [name: string]: unknown } content: { @@ -2576,6 +2579,7 @@ export interface components { allowOut?: string[] /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ denyOut?: 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). */ egressProxy?: components['schemas']['SandboxEgressProxyConfig'] /** @description Specify host mask which will be used for all sandbox requests */ maskRequestHost?: string @@ -2590,6 +2594,7 @@ export interface components { allowOut?: string[] /** @description List of denied CIDR blocks or IP addresses for egress traffic. Domain names are not supported for deny rules. */ denyOut?: 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). */ egressProxy?: components['schemas']['SandboxEgressProxyConfig'] /** @description Per-domain transform rules. Replaces all existing rules when provided. */ rules?: { @@ -3508,8 +3513,6 @@ export interface components { */ 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 @@ -3661,6 +3664,13 @@ export interface components { name: string /** @description Auth token to use for interacting with volume content */ token: string + /** + * @description Domain to use as the destination for volume content requests, + * replacing the default `api.`. Only returned when the + * team is connected to a custom (BYOC) cluster; absent otherwise, in + * which case the default domain is used. + */ + domain?: string } NewVolume: { /** @description Name of the volume */ @@ -3749,7 +3759,12 @@ export interface components { volumeID: string } requestBodies: never - headers: never + headers: { + /** @description Cursor to fetch the next page of results, if more exist */ + XNextToken: string + /** @description Number of running sandboxes matching the filters, before pagination is applied. Only present when running sandboxes were requested. */ + XTotalRunning: number + } pathItems: never } export type $defs = Record