diff --git a/.github/workflows/test.yml b/.github/workflows/ci.yml
similarity index 55%
rename from .github/workflows/test.yml
rename to .github/workflows/ci.yml
index 4a3d335de..3c484ccb6 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/ci.yml
@@ -1,4 +1,4 @@
-name: Run Tests
+name: CI
on:
push:
@@ -17,10 +17,13 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
+ - name: Parse .tool-versions
+ uses: wistia/parse-tool-versions@v2.1.1
+
- name: Setup Bun
uses: oven-sh/setup-bun@v1
with:
- bun-version: 1.2.20
+ bun-version: '${{ env.BUN }}'
- name: Install dependencies
run: bun install
@@ -28,10 +31,47 @@ jobs:
- name: Run unit tests
run: bun test:unit
+ lint:
+ name: Lint
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Parse .tool-versions
+ uses: wistia/parse-tool-versions@v2.1.1
+
+ - name: Setup Bun
+ uses: oven-sh/setup-bun@v1
+ with:
+ bun-version: '${{ env.BUN }}'
+
+ - name: Run linters and formatters
+ run: |
+ bun install
+ bun run format
+ bun run lint:fix
+ bun run lint
+
+ - name: Fail if source files changed
+ run: |
+ # Check for changes excluding bun.lock (platform-specific)
+ CHANGED_FILES=$(git status --porcelain | grep -v "bun.lock" || true)
+
+ if [[ -z "$CHANGED_FILES" ]]; then
+ echo "✅ No source file changes detected."
+ exit 0
+ fi
+
+ echo "❌ Code is not properly formatted. Please run 'bun run format && bun run lint:fix' and commit the changes."
+ echo "$CHANGED_FILES"
+ exit 1
+
integration-tests:
name: Integration Tests
runs-on: ubuntu-latest
- needs: unit-tests # run after unit tests pass
+ needs: unit-tests # run after unit tests pass
# these are placeholders which is fine for integration tests
env:
@@ -54,10 +94,13 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
+ - name: Parse .tool-versions
+ uses: wistia/parse-tool-versions@v2.1.1
+
- name: Setup Bun
uses: oven-sh/setup-bun@v1
with:
- bun-version: 1.2.20
+ bun-version: '${{ env.BUN }}'
- name: Install dependencies
run: bun install
diff --git a/.tool-versions b/.tool-versions
new file mode 100644
index 000000000..24c0ffe7e
--- /dev/null
+++ b/.tool-versions
@@ -0,0 +1 @@
+bun 1.2.20
\ No newline at end of file
diff --git a/bun.lock b/bun.lock
index 4d8bbfcc5..bc386b3d8 100644
--- a/bun.lock
+++ b/bun.lock
@@ -71,6 +71,7 @@
"echarts": "^6.0.0",
"echarts-for-react": "^3.0.2",
"fast-xml-parser": "^4.5.1",
+ "file-type": "^21.3.0",
"geist": "^1.3.1",
"immer": "^10.1.1",
"lucide-react": "^0.525.0",
@@ -211,6 +212,8 @@
"@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="],
+ "@borewit/text-codec": ["@borewit/text-codec@0.2.1", "", {}, "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw=="],
+
"@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.1", "", {}, "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw=="],
"@bufbuild/buf": ["@bufbuild/buf@1.59.0", "", { "optionalDependencies": { "@bufbuild/buf-darwin-arm64": "1.59.0", "@bufbuild/buf-darwin-x64": "1.59.0", "@bufbuild/buf-linux-aarch64": "1.59.0", "@bufbuild/buf-linux-armv7": "1.59.0", "@bufbuild/buf-linux-x64": "1.59.0", "@bufbuild/buf-win32-arm64": "1.59.0", "@bufbuild/buf-win32-x64": "1.59.0" }, "bin": { "buf": "bin/buf", "protoc-gen-buf-breaking": "bin/protoc-gen-buf-breaking", "protoc-gen-buf-lint": "bin/protoc-gen-buf-lint" } }, "sha512-VdLuGnFp1OKJaiMevlLow6Jcvv9omOyM02Qa1zexl8dBB4Ac2ggz6bpT3Zb06tmCnqd8tFrI/Im1fbom3CznlQ=="],
@@ -963,6 +966,10 @@
"@theguild/remark-mermaid": ["@theguild/remark-mermaid@0.2.0", "", { "dependencies": { "mermaid": "^11.0.0", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-o8n57TJy0OI4PCrNw8z6S+vpHtrwoQZzTA5Y3fL0U1NDRIoMg/78duWgEBFsCZcWM1G6zjE91yg1aKCsDwgE2Q=="],
+ "@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="],
+
+ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
+
"@tootallnate/once": ["@tootallnate/once@2.0.0", "", {}, "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="],
"@trpc/client": ["@trpc/client@11.7.1", "", { "peerDependencies": { "@trpc/server": "11.7.1", "typescript": ">=5.7.2" } }, "sha512-uOnAjElKI892/U6aQMcBHYs3x7mme3Cvv1F87ytBL56rBvs7+DyK7r43zgaXKf13+GtPEI6ex5xjVUfyDW8XcQ=="],
@@ -1759,6 +1766,8 @@
"file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
+ "file-type": ["file-type@21.3.0", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA=="],
+
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
"find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
@@ -1895,6 +1904,8 @@
"iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
"immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="],
@@ -2639,6 +2650,8 @@
"strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="],
+ "strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="],
+
"stubs": ["stubs@3.0.0", "", {}, "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw=="],
"style-to-js": ["style-to-js@1.1.19", "", { "dependencies": { "style-to-object": "1.0.12" } }, "sha512-Ev+SgeqiNGT1ufsXyVC5RrJRXdrkRJ1Gol9Qw7Pb72YCKJXrBvP0ckZhBeVSrw2m06DJpei2528uIpjMb4TsoQ=="],
@@ -2697,6 +2710,8 @@
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+ "token-types": ["token-types@6.1.2", "", { "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww=="],
+
"totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="],
"tr46": ["tr46@4.1.1", "", { "dependencies": { "punycode": "^2.3.0" } }, "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw=="],
@@ -2739,6 +2754,8 @@
"ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
+ "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="],
+
"unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
"uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 063fdd975..d5d4ac643 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -5,6 +5,7 @@ const compat = new FlatCompat({
})
const eslintConfig = [
+ { ignores: ['.next/'] },
...compat.config({
extends: ['next/core-web-vitals', 'next/typescript'],
plugins: ['eslint-plugin-prettier'],
diff --git a/package.json b/package.json
index a49a3cedd..43d136b2e 100644
--- a/package.json
+++ b/package.json
@@ -8,8 +8,8 @@
"build": "next build --turbopack",
"start": "next start | pino-pretty --colorize",
"preview": "next build --turbopack && next start | pino-pretty --colorize",
- "lint": "next lint",
- "lint:fix": "next lint --fix",
+ "lint": "eslint",
+ "lint:fix": "eslint --fix",
"format": "prettier --write .",
"prebuild": "bun scripts:check-app-env",
"<<<<<<< Development Tools": "",
diff --git a/spec/openapi.argus.yaml b/spec/openapi.argus.yaml
index 87baf4dca..5400cab82 100644
--- a/spec/openapi.argus.yaml
+++ b/spec/openapi.argus.yaml
@@ -48,36 +48,36 @@ components:
format: uuid
responses:
- "400":
+ '400':
description: Bad request
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
- "401":
+ $ref: '#/components/schemas/Error'
+ '401':
description: Authentication error
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
- "404":
+ $ref: '#/components/schemas/Error'
+ '404':
description: Not found
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
- "409":
+ $ref: '#/components/schemas/Error'
+ '409':
description: Conflict
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
- "500":
+ $ref: '#/components/schemas/Error'
+ '500':
description: Server error
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
schemas:
Error:
@@ -274,8 +274,8 @@ paths:
200:
description: Request was successful
401:
- $ref: "#/components/responses/401"
-
+ $ref: '#/components/responses/401'
+
/events/sandboxes/{sandboxID}:
get:
description: Get sandbox events
@@ -285,7 +285,7 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
- name: offset
in: query
required: false
@@ -310,20 +310,20 @@ paths:
type: boolean
default: false
responses:
- "200":
+ '200':
description: Successfully returned the sandbox events
content:
application/json:
schema:
type: array
items:
- $ref: "#/components/schemas/SandboxEvent"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/SandboxEvent'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/events/sandboxes:
get:
@@ -358,20 +358,20 @@ paths:
type: boolean
default: false
responses:
- "200":
+ '200':
description: Successfully returned the sandbox events
content:
application/json:
schema:
type: array
items:
- $ref: "#/components/schemas/SandboxEvent"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/SandboxEvent'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/events/webhooks:
post:
@@ -387,45 +387,45 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/WebhookCreate"
+ $ref: '#/components/schemas/WebhookCreate'
responses:
- "201":
+ '201':
description: Successfully created webhook.
content:
application/json:
schema:
- $ref: "#/components/schemas/WebhookCreation"
- "400":
- $ref: "#/components/responses/400"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/WebhookCreation'
+ '400':
+ $ref: '#/components/responses/400'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
get:
- operationId: webhooksList
- description: List registered webhooks.
- tags: [webhooks]
- security:
- - ApiKeyAuth: []
- - Supabase1TokenAuth: []
- Supabase2TeamAuth: []
- responses:
- "200":
- description: List of registered webhooks.
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: "#/components/schemas/WebhookDetail"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ operationId: webhooksList
+ description: List registered webhooks.
+ tags: [webhooks]
+ security:
+ - ApiKeyAuth: []
+ - Supabase1TokenAuth: []
+ Supabase2TeamAuth: []
+ responses:
+ '200':
+ description: List of registered webhooks.
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/WebhookDetail'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/events/webhooks/{webhookID}:
get:
@@ -437,20 +437,20 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/webhookID"
+ - $ref: '#/components/parameters/webhookID'
responses:
- "200":
+ '200':
description: Successfully returned the webhook configuration.
content:
application/json:
schema:
- $ref: "#/components/schemas/WebhookDetail"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/WebhookDetail'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
patch:
operationId: webhookUpdate
@@ -461,28 +461,28 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/webhookID"
+ - $ref: '#/components/parameters/webhookID'
requestBody:
required: true
content:
application/json:
schema:
- $ref: "#/components/schemas/WebhookConfiguration"
+ $ref: '#/components/schemas/WebhookConfiguration'
responses:
- "200":
+ '200':
description: Successfully updated webhook.
content:
application/json:
schema:
- $ref: "#/components/schemas/WebhookDetail"
- "400":
- $ref: "#/components/responses/400"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/WebhookDetail'
+ '400':
+ $ref: '#/components/responses/400'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
delete:
operationId: webhookDelete
@@ -493,13 +493,13 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/webhookID"
+ - $ref: '#/components/parameters/webhookID'
responses:
- "200":
+ '200':
description: Successfully deleted webhook.
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
\ No newline at end of file
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
diff --git a/spec/openapi.infra.yaml b/spec/openapi.infra.yaml
index 8979f5ee5..d88cb1ebe 100644
--- a/spec/openapi.infra.yaml
+++ b/spec/openapi.infra.yaml
@@ -95,42 +95,42 @@ components:
type: string
responses:
- "400":
+ '400':
description: Bad request
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
- "401":
+ $ref: '#/components/schemas/Error'
+ '401':
description: Authentication error
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
- "403":
+ $ref: '#/components/schemas/Error'
+ '403':
description: Forbidden
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
- "404":
+ $ref: '#/components/schemas/Error'
+ '404':
description: Not found
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
- "409":
+ $ref: '#/components/schemas/Error'
+ '409':
description: Conflict
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
- "500":
+ $ref: '#/components/schemas/Error'
+ '500':
description: Server error
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
schemas:
Team:
@@ -267,7 +267,7 @@ components:
type: string
description: Log message content
level:
- $ref: "#/components/schemas/LogLevel"
+ $ref: '#/components/schemas/LogLevel'
fields:
type: object
additionalProperties:
@@ -282,12 +282,12 @@ components:
description: Logs of the sandbox
type: array
items:
- $ref: "#/components/schemas/SandboxLog"
+ $ref: '#/components/schemas/SandboxLog'
logEntries:
description: Structured logs of the sandbox
type: array
items:
- $ref: "#/components/schemas/SandboxLogEntry"
+ $ref: '#/components/schemas/SandboxLogEntry'
SandboxMetric:
description: Metric entry with timestamp and line
@@ -356,7 +356,7 @@ components:
deprecated: true
description: Identifier of the client
envdVersion:
- $ref: "#/components/schemas/EnvdVersion"
+ $ref: '#/components/schemas/EnvdVersion'
envdAccessToken:
type: string
description: Access token used for envd communication
@@ -404,7 +404,7 @@ components:
format: date-time
description: Time when the sandbox will expire
envdVersion:
- $ref: "#/components/schemas/EnvdVersion"
+ $ref: '#/components/schemas/EnvdVersion'
envdAccessToken:
type: string
description: Access token used for envd communication
@@ -413,15 +413,15 @@ components:
nullable: true
description: Base domain where the sandbox traffic is accessible
cpuCount:
- $ref: "#/components/schemas/CPUCount"
+ $ref: '#/components/schemas/CPUCount'
memoryMB:
- $ref: "#/components/schemas/MemoryMB"
+ $ref: '#/components/schemas/MemoryMB'
diskSizeMB:
- $ref: "#/components/schemas/DiskSizeMB"
+ $ref: '#/components/schemas/DiskSizeMB'
metadata:
- $ref: "#/components/schemas/SandboxMetadata"
+ $ref: '#/components/schemas/SandboxMetadata'
state:
- $ref: "#/components/schemas/SandboxState"
+ $ref: '#/components/schemas/SandboxState'
ListedSandbox:
required:
@@ -458,17 +458,17 @@ components:
format: date-time
description: Time when the sandbox will expire
cpuCount:
- $ref: "#/components/schemas/CPUCount"
+ $ref: '#/components/schemas/CPUCount'
memoryMB:
- $ref: "#/components/schemas/MemoryMB"
+ $ref: '#/components/schemas/MemoryMB'
diskSizeMB:
- $ref: "#/components/schemas/DiskSizeMB"
+ $ref: '#/components/schemas/DiskSizeMB'
metadata:
- $ref: "#/components/schemas/SandboxMetadata"
+ $ref: '#/components/schemas/SandboxMetadata'
state:
- $ref: "#/components/schemas/SandboxState"
+ $ref: '#/components/schemas/SandboxState'
envdVersion:
- $ref: "#/components/schemas/EnvdVersion"
+ $ref: '#/components/schemas/EnvdVersion'
SandboxesWithMetrics:
required:
@@ -476,7 +476,7 @@ components:
properties:
sandboxes:
additionalProperties:
- $ref: "#/components/schemas/SandboxMetric"
+ $ref: '#/components/schemas/SandboxMetric'
NewSandbox:
required:
@@ -504,13 +504,13 @@ components:
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.
network:
- $ref: "#/components/schemas/SandboxNetworkConfig"
+ $ref: '#/components/schemas/SandboxNetworkConfig'
metadata:
- $ref: "#/components/schemas/SandboxMetadata"
+ $ref: '#/components/schemas/SandboxMetadata'
envVars:
- $ref: "#/components/schemas/EnvVars"
+ $ref: '#/components/schemas/EnvVars'
mcp:
- $ref: "#/components/schemas/Mcp"
+ $ref: '#/components/schemas/Mcp'
ResumedSandbox:
properties:
@@ -619,11 +619,11 @@ components:
type: string
description: Identifier of the last successful build for given template
cpuCount:
- $ref: "#/components/schemas/CPUCount"
+ $ref: '#/components/schemas/CPUCount'
memoryMB:
- $ref: "#/components/schemas/MemoryMB"
+ $ref: '#/components/schemas/MemoryMB'
diskSizeMB:
- $ref: "#/components/schemas/DiskSizeMB"
+ $ref: '#/components/schemas/DiskSizeMB'
public:
type: boolean
description: Whether the template is public or only accessible by the team
@@ -642,7 +642,7 @@ components:
description: Time when the template was last updated
createdBy:
allOf:
- - $ref: "#/components/schemas/TeamUser"
+ - $ref: '#/components/schemas/TeamUser'
nullable: true
lastSpawnedAt:
type: string
@@ -658,9 +658,9 @@ components:
format: int32
description: Number of times the template was built
envdVersion:
- $ref: "#/components/schemas/EnvdVersion"
+ $ref: '#/components/schemas/EnvdVersion'
buildStatus:
- $ref: "#/components/schemas/TemplateBuildStatus"
+ $ref: '#/components/schemas/TemplateBuildStatus'
TemplateRequestResponseV3:
required:
@@ -708,11 +708,11 @@ components:
type: string
description: Identifier of the last successful build for given template
cpuCount:
- $ref: "#/components/schemas/CPUCount"
+ $ref: '#/components/schemas/CPUCount'
memoryMB:
- $ref: "#/components/schemas/MemoryMB"
+ $ref: '#/components/schemas/MemoryMB'
diskSizeMB:
- $ref: "#/components/schemas/DiskSizeMB"
+ $ref: '#/components/schemas/DiskSizeMB'
public:
type: boolean
description: Whether the template is public or only accessible by the team
@@ -731,7 +731,7 @@ components:
description: Time when the template was last updated
createdBy:
allOf:
- - $ref: "#/components/schemas/TeamUser"
+ - $ref: '#/components/schemas/TeamUser'
nullable: true
lastSpawnedAt:
type: string
@@ -747,7 +747,7 @@ components:
format: int32
description: Number of times the template was built
envdVersion:
- $ref: "#/components/schemas/EnvdVersion"
+ $ref: '#/components/schemas/EnvdVersion'
TemplateBuild:
required:
@@ -763,7 +763,7 @@ components:
format: uuid
description: Identifier of the build
status:
- $ref: "#/components/schemas/TemplateBuildStatus"
+ $ref: '#/components/schemas/TemplateBuildStatus'
createdAt:
type: string
format: date-time
@@ -777,13 +777,13 @@ components:
format: date-time
description: Time when the build was finished
cpuCount:
- $ref: "#/components/schemas/CPUCount"
+ $ref: '#/components/schemas/CPUCount'
memoryMB:
- $ref: "#/components/schemas/MemoryMB"
+ $ref: '#/components/schemas/MemoryMB'
diskSizeMB:
- $ref: "#/components/schemas/DiskSizeMB"
+ $ref: '#/components/schemas/DiskSizeMB'
envdVersion:
- $ref: "#/components/schemas/EnvdVersion"
+ $ref: '#/components/schemas/EnvdVersion'
TemplateWithBuilds:
required:
@@ -828,7 +828,7 @@ components:
type: array
description: List of builds for the template
items:
- $ref: "#/components/schemas/TemplateBuild"
+ $ref: '#/components/schemas/TemplateBuild'
TemplateBuildRequest:
required:
@@ -850,9 +850,9 @@ components:
description: Ready check command to execute in the template after the build
type: string
cpuCount:
- $ref: "#/components/schemas/CPUCount"
+ $ref: '#/components/schemas/CPUCount'
memoryMB:
- $ref: "#/components/schemas/MemoryMB"
+ $ref: '#/components/schemas/MemoryMB'
TemplateStep:
description: Step in the template build process
@@ -887,9 +887,9 @@ components:
type: string
description: Identifier of the team
cpuCount:
- $ref: "#/components/schemas/CPUCount"
+ $ref: '#/components/schemas/CPUCount'
memoryMB:
- $ref: "#/components/schemas/MemoryMB"
+ $ref: '#/components/schemas/MemoryMB'
TemplateBuildRequestV2:
required:
@@ -902,21 +902,21 @@ components:
type: string
description: Identifier of the team
cpuCount:
- $ref: "#/components/schemas/CPUCount"
+ $ref: '#/components/schemas/CPUCount'
memoryMB:
- $ref: "#/components/schemas/MemoryMB"
+ $ref: '#/components/schemas/MemoryMB'
FromImageRegistry:
oneOf:
- - $ref: "#/components/schemas/AWSRegistry"
- - $ref: "#/components/schemas/GCPRegistry"
- - $ref: "#/components/schemas/GeneralRegistry"
+ - $ref: '#/components/schemas/AWSRegistry'
+ - $ref: '#/components/schemas/GCPRegistry'
+ - $ref: '#/components/schemas/GeneralRegistry'
discriminator:
propertyName: type
mapping:
- aws: "#/components/schemas/AWSRegistry"
- gcp: "#/components/schemas/GCPRegistry"
- registry: "#/components/schemas/GeneralRegistry"
+ aws: '#/components/schemas/AWSRegistry'
+ gcp: '#/components/schemas/GCPRegistry'
+ registry: '#/components/schemas/GeneralRegistry'
AWSRegistry:
type: object
@@ -982,7 +982,7 @@ components:
type: string
description: Template to use as a base for the template build
fromImageRegistry:
- $ref: "#/components/schemas/FromImageRegistry"
+ $ref: '#/components/schemas/FromImageRegistry'
force:
default: false
type: boolean
@@ -992,7 +992,7 @@ components:
description: List of steps to execute in the template build
type: array
items:
- $ref: "#/components/schemas/TemplateStep"
+ $ref: '#/components/schemas/TemplateStep'
startCmd:
description: Start command to execute in the template after the build
type: string
@@ -1034,7 +1034,7 @@ components:
type: string
description: Log message content
level:
- $ref: "#/components/schemas/LogLevel"
+ $ref: '#/components/schemas/LogLevel'
step:
type: string
description: Step in the build process related to the log entry
@@ -1054,7 +1054,7 @@ components:
description: Log entries related to the status reason
type: array
items:
- $ref: "#/components/schemas/BuildLogEntry"
+ $ref: '#/components/schemas/BuildLogEntry'
TemplateBuildStatus:
type: string
@@ -1084,7 +1084,7 @@ components:
description: Build logs structured
type: array
items:
- $ref: "#/components/schemas/BuildLogEntry"
+ $ref: '#/components/schemas/BuildLogEntry'
templateID:
type: string
description: Identifier of the template
@@ -1092,9 +1092,9 @@ components:
type: string
description: Identifier of the build
status:
- $ref: "#/components/schemas/TemplateBuildStatus"
+ $ref: '#/components/schemas/TemplateBuildStatus'
reason:
- $ref: "#/components/schemas/BuildStatusReason"
+ $ref: '#/components/schemas/BuildStatusReason'
TemplateBuildLogsResponse:
required:
@@ -1105,7 +1105,7 @@ components:
description: Build logs structured
type: array
items:
- $ref: "#/components/schemas/BuildLogEntry"
+ $ref: '#/components/schemas/BuildLogEntry'
LogsDirection:
type: string
@@ -1150,7 +1150,7 @@ components:
format: uuid
description: Identifier of the cluster
status:
- $ref: "#/components/schemas/NodeStatus"
+ $ref: '#/components/schemas/NodeStatus'
DiskMetrics:
required:
@@ -1217,7 +1217,7 @@ components:
type: array
description: Detailed metrics for each disk/mount point
items:
- $ref: "#/components/schemas/DiskMetrics"
+ $ref: '#/components/schemas/DiskMetrics'
MachineInfo:
required:
- cpuFamily
@@ -1274,15 +1274,15 @@ components:
type: string
description: Identifier of the cluster
machineInfo:
- $ref: "#/components/schemas/MachineInfo"
+ $ref: '#/components/schemas/MachineInfo'
status:
- $ref: "#/components/schemas/NodeStatus"
+ $ref: '#/components/schemas/NodeStatus'
sandboxCount:
type: integer
format: uint32
description: Number of sandboxes running on the node
metrics:
- $ref: "#/components/schemas/NodeMetrics"
+ $ref: '#/components/schemas/NodeMetrics'
createSuccesses:
type: integer
format: uint64
@@ -1332,16 +1332,16 @@ components:
deprecated: true
description: Identifier of the nomad node
machineInfo:
- $ref: "#/components/schemas/MachineInfo"
+ $ref: '#/components/schemas/MachineInfo'
status:
- $ref: "#/components/schemas/NodeStatus"
+ $ref: '#/components/schemas/NodeStatus'
sandboxes:
type: array
description: List of sandboxes running on the node
items:
- $ref: "#/components/schemas/ListedSandbox"
+ $ref: '#/components/schemas/ListedSandbox'
metrics:
- $ref: "#/components/schemas/NodeMetrics"
+ $ref: '#/components/schemas/NodeMetrics'
cachedBuilds:
type: array
description: List of cached builds id on the node
@@ -1375,7 +1375,7 @@ components:
type: string
description: The fully created access token
mask:
- $ref: "#/components/schemas/IdentifierMaskingDetails"
+ $ref: '#/components/schemas/IdentifierMaskingDetails'
createdAt:
type: string
format: date-time
@@ -1404,14 +1404,14 @@ components:
type: string
description: Name of the API key
mask:
- $ref: "#/components/schemas/IdentifierMaskingDetails"
+ $ref: '#/components/schemas/IdentifierMaskingDetails'
createdAt:
type: string
format: date-time
description: Timestamp of API key creation
createdBy:
allOf:
- - $ref: "#/components/schemas/TeamUser"
+ - $ref: '#/components/schemas/TeamUser'
nullable: true
lastUsed:
type: string
@@ -1435,7 +1435,7 @@ components:
type: string
description: Raw value of the API key
mask:
- $ref: "#/components/schemas/IdentifierMaskingDetails"
+ $ref: '#/components/schemas/IdentifierMaskingDetails'
name:
type: string
description: Name of the API key
@@ -1445,7 +1445,7 @@ components:
description: Timestamp of API key creation
createdBy:
allOf:
- - $ref: "#/components/schemas/TeamUser"
+ - $ref: '#/components/schemas/TeamUser'
nullable: true
lastUsed:
type: string
@@ -1514,10 +1514,10 @@ paths:
get:
description: Health check
responses:
- "200":
+ '200':
description: Request was successful
- "401":
- $ref: "#/components/responses/401"
+ '401':
+ $ref: '#/components/responses/401'
/teams:
get:
@@ -1527,7 +1527,7 @@ paths:
- AccessTokenAuth: []
- Supabase1TokenAuth: []
responses:
- "200":
+ '200':
description: Successfully returned all teams
content:
application/json:
@@ -1535,11 +1535,11 @@ paths:
type: array
items:
allOf:
- - $ref: "#/components/schemas/Team"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ - $ref: '#/components/schemas/Team'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/teams/{teamID}/metrics:
get:
@@ -1550,7 +1550,7 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/teamID"
+ - $ref: '#/components/parameters/teamID'
- in: query
name: start
schema:
@@ -1566,22 +1566,22 @@ paths:
minimum: 0
description: Unix timestamp for the end of the interval, in seconds, for which the metrics
responses:
- "200":
+ '200':
description: Successfully returned the team metrics
content:
application/json:
schema:
type: array
items:
- $ref: "#/components/schemas/TeamMetric"
- "400":
- $ref: "#/components/responses/400"
- "401":
- $ref: "#/components/responses/401"
- "403":
- $ref: "#/components/responses/403"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TeamMetric'
+ '400':
+ $ref: '#/components/responses/400'
+ '401':
+ $ref: '#/components/responses/401'
+ '403':
+ $ref: '#/components/responses/403'
+ '500':
+ $ref: '#/components/responses/500'
/teams/{teamID}/metrics/max:
get:
@@ -1592,7 +1592,7 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/teamID"
+ - $ref: '#/components/parameters/teamID'
- in: query
name: start
schema:
@@ -1615,20 +1615,20 @@ paths:
enum: [concurrent_sandboxes, sandbox_start_rate]
description: Metric to retrieve the maximum value for
responses:
- "200":
+ '200':
description: Successfully returned the team metrics
content:
application/json:
schema:
- $ref: "#/components/schemas/MaxTeamMetric"
- "400":
- $ref: "#/components/responses/400"
- "401":
- $ref: "#/components/responses/401"
- "403":
- $ref: "#/components/responses/403"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/MaxTeamMetric'
+ '400':
+ $ref: '#/components/responses/400'
+ '401':
+ $ref: '#/components/responses/401'
+ '403':
+ $ref: '#/components/responses/403'
+ '500':
+ $ref: '#/components/responses/500'
/sandboxes:
get:
@@ -1646,7 +1646,7 @@ paths:
schema:
type: string
responses:
- "200":
+ '200':
description: Successfully returned all running sandboxes
content:
application/json:
@@ -1654,13 +1654,13 @@ paths:
type: array
items:
allOf:
- - $ref: "#/components/schemas/ListedSandbox"
- "401":
- $ref: "#/components/responses/401"
- "400":
- $ref: "#/components/responses/400"
- "500":
- $ref: "#/components/responses/500"
+ - $ref: '#/components/schemas/ListedSandbox'
+ '401':
+ $ref: '#/components/responses/401'
+ '400':
+ $ref: '#/components/responses/400'
+ '500':
+ $ref: '#/components/responses/500'
post:
description: Create a sandbox from the template
tags: [sandboxes]
@@ -1673,20 +1673,20 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/NewSandbox"
+ $ref: '#/components/schemas/NewSandbox'
responses:
- "201":
+ '201':
description: The sandbox was created successfully
content:
application/json:
schema:
- $ref: "#/components/schemas/Sandbox"
- "401":
- $ref: "#/components/responses/401"
- "400":
- $ref: "#/components/responses/400"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/Sandbox'
+ '401':
+ $ref: '#/components/responses/401'
+ '400':
+ $ref: '#/components/responses/400'
+ '500':
+ $ref: '#/components/responses/500'
/v2/sandboxes:
get:
@@ -1710,13 +1710,13 @@ paths:
schema:
type: array
items:
- $ref: "#/components/schemas/SandboxState"
+ $ref: '#/components/schemas/SandboxState'
style: form
explode: false
- - $ref: "#/components/parameters/paginationNextToken"
- - $ref: "#/components/parameters/paginationLimit"
+ - $ref: '#/components/parameters/paginationNextToken'
+ - $ref: '#/components/parameters/paginationLimit'
responses:
- "200":
+ '200':
description: Successfully returned all running sandboxes
content:
application/json:
@@ -1724,13 +1724,13 @@ paths:
type: array
items:
allOf:
- - $ref: "#/components/schemas/ListedSandbox"
- "401":
- $ref: "#/components/responses/401"
- "400":
- $ref: "#/components/responses/400"
- "500":
- $ref: "#/components/responses/500"
+ - $ref: '#/components/schemas/ListedSandbox'
+ '401':
+ $ref: '#/components/responses/401'
+ '400':
+ $ref: '#/components/responses/400'
+ '500':
+ $ref: '#/components/responses/500'
/sandboxes/metrics:
get:
@@ -1753,18 +1753,18 @@ paths:
maxItems: 100
uniqueItems: true
responses:
- "200":
+ '200':
description: Successfully returned all running sandboxes with metrics
content:
application/json:
schema:
- $ref: "#/components/schemas/SandboxesWithMetrics"
- "401":
- $ref: "#/components/responses/401"
- "400":
- $ref: "#/components/responses/400"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/SandboxesWithMetrics'
+ '401':
+ $ref: '#/components/responses/401'
+ '400':
+ $ref: '#/components/responses/400'
+ '500':
+ $ref: '#/components/responses/500'
/sandboxes/{sandboxID}/logs:
get:
@@ -1775,7 +1775,7 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
- in: query
name: start
schema:
@@ -1792,18 +1792,18 @@ paths:
type: integer
description: Maximum number of logs that should be returned
responses:
- "200":
+ '200':
description: Successfully returned the sandbox logs
content:
application/json:
schema:
- $ref: "#/components/schemas/SandboxLogs"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/SandboxLogs'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/sandboxes/{sandboxID}:
get:
@@ -1814,20 +1814,20 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
responses:
- "200":
+ '200':
description: Successfully returned the sandbox
content:
application/json:
schema:
- $ref: "#/components/schemas/SandboxDetail"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/SandboxDetail'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
delete:
description: Kill a sandbox
@@ -1837,16 +1837,16 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
responses:
- "204":
+ '204':
description: The sandbox was killed successfully
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/sandboxes/{sandboxID}/metrics:
get:
@@ -1857,7 +1857,7 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
- in: query
name: start
schema:
@@ -1874,22 +1874,22 @@ paths:
description: Unix timestamp for the end of the interval, in seconds, for which the metrics
responses:
- "200":
+ '200':
description: Successfully returned the sandbox metrics
content:
application/json:
schema:
type: array
items:
- $ref: "#/components/schemas/SandboxMetric"
- "400":
- $ref: "#/components/responses/400"
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/SandboxMetric'
+ '400':
+ $ref: '#/components/responses/400'
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
# TODO: Pause and resume might be exposed as POST /sandboxes/{sandboxID}/snapshot and then POST /sandboxes with specified snapshotting setup
/sandboxes/{sandboxID}/pause:
@@ -1901,18 +1901,18 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
responses:
- "204":
+ '204':
description: The sandbox was paused successfully and can be resumed
- "409":
- $ref: "#/components/responses/409"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ '409':
+ $ref: '#/components/responses/409'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/sandboxes/{sandboxID}/resume:
post:
@@ -1924,28 +1924,28 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
requestBody:
required: true
content:
application/json:
schema:
- $ref: "#/components/schemas/ResumedSandbox"
+ $ref: '#/components/schemas/ResumedSandbox'
responses:
- "201":
+ '201':
description: The sandbox was resumed successfully
content:
application/json:
schema:
- $ref: "#/components/schemas/Sandbox"
- "409":
- $ref: "#/components/responses/409"
- "404":
- $ref: "#/components/responses/404"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/Sandbox'
+ '409':
+ $ref: '#/components/responses/409'
+ '404':
+ $ref: '#/components/responses/404'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/sandboxes/{sandboxID}/connect:
post:
@@ -1956,34 +1956,34 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
requestBody:
required: true
content:
application/json:
schema:
- $ref: "#/components/schemas/ConnectSandbox"
+ $ref: '#/components/schemas/ConnectSandbox'
responses:
- "200":
+ '200':
description: The sandbox was already running
content:
application/json:
schema:
- $ref: "#/components/schemas/Sandbox"
- "201":
+ $ref: '#/components/schemas/Sandbox'
+ '201':
description: The sandbox was resumed successfully
content:
application/json:
schema:
- $ref: "#/components/schemas/Sandbox"
- "400":
- $ref: "#/components/responses/400"
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/Sandbox'
+ '400':
+ $ref: '#/components/responses/400'
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
/sandboxes/{sandboxID}/timeout:
post:
@@ -2007,16 +2007,16 @@ paths:
format: int32
minimum: 0
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
responses:
- "204":
+ '204':
description: Successfully set the sandbox timeout
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
/sandboxes/{sandboxID}/refreshes:
post:
@@ -2038,14 +2038,14 @@ paths:
maximum: 3600 # 1 hour
minimum: 0
parameters:
- - $ref: "#/components/parameters/sandboxID"
+ - $ref: '#/components/parameters/sandboxID'
responses:
- "204":
+ '204':
description: Successfully refreshed the sandbox
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
/v3/templates:
post:
@@ -2059,21 +2059,21 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateBuildRequestV3"
+ $ref: '#/components/schemas/TemplateBuildRequestV3'
responses:
- "202":
+ '202':
description: The build was requested successfully
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateRequestResponseV3"
- "400":
- $ref: "#/components/responses/400"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TemplateRequestResponseV3'
+ '400':
+ $ref: '#/components/responses/400'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/v2/templates:
post:
@@ -2088,21 +2088,21 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateBuildRequestV2"
+ $ref: '#/components/schemas/TemplateBuildRequestV2'
responses:
- "202":
+ '202':
description: The build was requested successfully
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateLegacy"
- "400":
- $ref: "#/components/responses/400"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TemplateLegacy'
+ '400':
+ $ref: '#/components/responses/400'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/templates/{templateID}/files/{hash}:
get:
@@ -2113,7 +2113,7 @@ paths:
- ApiKeyAuth: []
- Supabase1TokenAuth: []
parameters:
- - $ref: "#/components/parameters/templateID"
+ - $ref: '#/components/parameters/templateID'
- in: path
name: hash
required: true
@@ -2122,20 +2122,20 @@ paths:
description: Hash of the files
responses:
- "201":
+ '201':
description: The upload link where to upload the tar file
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateBuildFileUpload"
- "400":
- $ref: "#/components/responses/400"
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TemplateBuildFileUpload'
+ '400':
+ $ref: '#/components/responses/400'
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
/templates:
get:
@@ -2153,7 +2153,7 @@ paths:
type: string
description: Identifier of the team
responses:
- "200":
+ '200':
description: Successfully returned all templates
content:
application/json:
@@ -2161,11 +2161,11 @@ paths:
type: array
items:
allOf:
- - $ref: "#/components/schemas/Template"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ - $ref: '#/components/schemas/Template'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
post:
description: Create a new template
deprecated: true
@@ -2178,21 +2178,21 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateBuildRequest"
+ $ref: '#/components/schemas/TemplateBuildRequest'
responses:
- "202":
+ '202':
description: The build was accepted
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateLegacy"
- "400":
- $ref: "#/components/responses/400"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TemplateLegacy'
+ '400':
+ $ref: '#/components/responses/400'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/templates/{templateID}:
get:
@@ -2203,20 +2203,20 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/templateID"
- - $ref: "#/components/parameters/paginationNextToken"
- - $ref: "#/components/parameters/paginationLimit"
+ - $ref: '#/components/parameters/templateID'
+ - $ref: '#/components/parameters/paginationNextToken'
+ - $ref: '#/components/parameters/paginationLimit'
responses:
- "200":
+ '200':
description: Successfully returned the template with its builds
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateWithBuilds"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TemplateWithBuilds'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
post:
description: Rebuild an template
deprecated: true
@@ -2225,25 +2225,25 @@ paths:
- AccessTokenAuth: []
- Supabase1TokenAuth: []
parameters:
- - $ref: "#/components/parameters/templateID"
+ - $ref: '#/components/parameters/templateID'
requestBody:
required: true
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateBuildRequest"
+ $ref: '#/components/schemas/TemplateBuildRequest'
responses:
- "202":
+ '202':
description: The build was accepted
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateLegacy"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TemplateLegacy'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
delete:
description: Delete a template
tags: [templates]
@@ -2252,14 +2252,14 @@ paths:
- AccessTokenAuth: []
- Supabase1TokenAuth: []
parameters:
- - $ref: "#/components/parameters/templateID"
+ - $ref: '#/components/parameters/templateID'
responses:
- "204":
+ '204':
description: The template was deleted successfully
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
patch:
description: Update template
tags: [templates]
@@ -2268,22 +2268,22 @@ paths:
- AccessTokenAuth: []
- Supabase1TokenAuth: []
parameters:
- - $ref: "#/components/parameters/templateID"
+ - $ref: '#/components/parameters/templateID'
requestBody:
required: true
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateUpdateRequest"
+ $ref: '#/components/schemas/TemplateUpdateRequest'
responses:
- "200":
+ '200':
description: The template was updated successfully
- "400":
- $ref: "#/components/responses/400"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ '400':
+ $ref: '#/components/responses/400'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/templates/{templateID}/builds/{buildID}:
post:
@@ -2294,15 +2294,15 @@ paths:
- AccessTokenAuth: []
- Supabase1TokenAuth: []
parameters:
- - $ref: "#/components/parameters/templateID"
- - $ref: "#/components/parameters/buildID"
+ - $ref: '#/components/parameters/templateID'
+ - $ref: '#/components/parameters/buildID'
responses:
- "202":
+ '202':
description: The build has started
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/v2/templates/{templateID}/builds/{buildID}:
post:
@@ -2312,21 +2312,21 @@ paths:
- ApiKeyAuth: []
- Supabase1TokenAuth: []
parameters:
- - $ref: "#/components/parameters/templateID"
- - $ref: "#/components/parameters/buildID"
+ - $ref: '#/components/parameters/templateID'
+ - $ref: '#/components/parameters/buildID'
requestBody:
required: true
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateBuildStartV2"
+ $ref: '#/components/schemas/TemplateBuildStartV2'
responses:
- "202":
+ '202':
description: The build has started
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/templates/{templateID}/builds/{buildID}/status:
get:
@@ -2337,8 +2337,8 @@ paths:
- ApiKeyAuth: []
- Supabase1TokenAuth: []
parameters:
- - $ref: "#/components/parameters/templateID"
- - $ref: "#/components/parameters/buildID"
+ - $ref: '#/components/parameters/templateID'
+ - $ref: '#/components/parameters/buildID'
- in: query
name: logsOffset
schema:
@@ -2359,20 +2359,20 @@ paths:
- in: query
name: level
schema:
- $ref: "#/components/schemas/LogLevel"
+ $ref: '#/components/schemas/LogLevel'
responses:
- "200":
+ '200':
description: Successfully returned the template
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateBuildInfo"
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TemplateBuildInfo'
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
/templates/{templateID}/builds/{buildID}/logs:
get:
@@ -2383,8 +2383,8 @@ paths:
- ApiKeyAuth: []
- Supabase1TokenAuth: []
parameters:
- - $ref: "#/components/parameters/templateID"
- - $ref: "#/components/parameters/buildID"
+ - $ref: '#/components/parameters/templateID'
+ - $ref: '#/components/parameters/buildID'
- in: query
name: cursor
schema:
@@ -2404,29 +2404,29 @@ paths:
- in: query
name: direction
schema:
- $ref: "#/components/schemas/LogsDirection"
+ $ref: '#/components/schemas/LogsDirection'
- in: query
name: level
schema:
- $ref: "#/components/schemas/LogLevel"
+ $ref: '#/components/schemas/LogLevel'
- in: query
name: source
schema:
- $ref: "#/components/schemas/LogsSource"
+ $ref: '#/components/schemas/LogsSource'
description: Source of the logs that should be returned from
responses:
- "200":
+ '200':
description: Successfully returned the template build logs
content:
application/json:
schema:
- $ref: "#/components/schemas/TemplateBuildLogsResponse"
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TemplateBuildLogsResponse'
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
/nodes:
get:
@@ -2435,7 +2435,7 @@ paths:
security:
- AdminTokenAuth: []
responses:
- "200":
+ '200':
description: Successfully returned all nodes
content:
application/json:
@@ -2443,11 +2443,11 @@ paths:
type: array
items:
allOf:
- - $ref: "#/components/schemas/Node"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ - $ref: '#/components/schemas/Node'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/nodes/{nodeID}:
get:
@@ -2456,7 +2456,7 @@ paths:
security:
- AdminTokenAuth: []
parameters:
- - $ref: "#/components/parameters/nodeID"
+ - $ref: '#/components/parameters/nodeID'
- in: query
name: clusterID
description: Identifier of the cluster
@@ -2465,39 +2465,39 @@ paths:
type: string
format: uuid
responses:
- "200":
+ '200':
description: Successfully returned the node
content:
application/json:
schema:
- $ref: "#/components/schemas/NodeDetail"
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/NodeDetail'
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
post:
description: Change status of a node
tags: [admin]
security:
- AdminTokenAuth: []
parameters:
- - $ref: "#/components/parameters/nodeID"
+ - $ref: '#/components/parameters/nodeID'
requestBody:
content:
application/json:
schema:
- $ref: "#/components/schemas/NodeStatusChange"
+ $ref: '#/components/schemas/NodeStatusChange'
responses:
- "204":
+ '204':
description: The node status was changed successfully
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
/admin/teams/{teamID}/sandboxes/kill:
post:
@@ -2515,18 +2515,18 @@ paths:
format: uuid
description: Team ID
responses:
- "200":
+ '200':
description: Successfully killed sandboxes
content:
application/json:
schema:
- $ref: "#/components/schemas/AdminSandboxKillResult"
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/AdminSandboxKillResult'
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
/access-tokens:
post:
@@ -2539,18 +2539,18 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/NewAccessToken"
+ $ref: '#/components/schemas/NewAccessToken'
responses:
- "201":
+ '201':
description: Access token created successfully
content:
application/json:
schema:
- $ref: "#/components/schemas/CreatedAccessToken"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/CreatedAccessToken'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/access-tokens/{accessTokenID}:
delete:
@@ -2559,16 +2559,16 @@ paths:
security:
- Supabase1TokenAuth: []
parameters:
- - $ref: "#/components/parameters/accessTokenID"
+ - $ref: '#/components/parameters/accessTokenID'
responses:
- "204":
+ '204':
description: Access token deleted successfully
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
/api-keys:
get:
@@ -2578,18 +2578,18 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
responses:
- "200":
+ '200':
description: Successfully returned all team API keys
content:
application/json:
schema:
type: array
items:
- $ref: "#/components/schemas/TeamAPIKey"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/TeamAPIKey'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
post:
description: Create a new team API key
tags: [api-keys]
@@ -2601,18 +2601,18 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/NewTeamAPIKey"
+ $ref: '#/components/schemas/NewTeamAPIKey'
responses:
- "201":
+ '201':
description: Team API key created successfully
content:
application/json:
schema:
- $ref: "#/components/schemas/CreatedTeamAPIKey"
- "401":
- $ref: "#/components/responses/401"
- "500":
- $ref: "#/components/responses/500"
+ $ref: '#/components/schemas/CreatedTeamAPIKey'
+ '401':
+ $ref: '#/components/responses/401'
+ '500':
+ $ref: '#/components/responses/500'
/api-keys/{apiKeyID}:
patch:
@@ -2622,22 +2622,22 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/apiKeyID"
+ - $ref: '#/components/parameters/apiKeyID'
requestBody:
required: true
content:
application/json:
schema:
- $ref: "#/components/schemas/UpdateTeamAPIKey"
+ $ref: '#/components/schemas/UpdateTeamAPIKey'
responses:
- "200":
+ '200':
description: Team API key updated successfully
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
delete:
description: Delete a team API key
tags: [api-keys]
@@ -2645,13 +2645,13 @@ paths:
- Supabase1TokenAuth: []
Supabase2TeamAuth: []
parameters:
- - $ref: "#/components/parameters/apiKeyID"
+ - $ref: '#/components/parameters/apiKeyID'
responses:
- "204":
+ '204':
description: Team API key deleted successfully
- "401":
- $ref: "#/components/responses/401"
- "404":
- $ref: "#/components/responses/404"
- "500":
- $ref: "#/components/responses/500"
+ '401':
+ $ref: '#/components/responses/401'
+ '404':
+ $ref: '#/components/responses/404'
+ '500':
+ $ref: '#/components/responses/500'
diff --git a/src/__test__/integration/auth.test.ts b/src/__test__/integration/auth.test.ts
index 5e3c6aaed..c2b4f1517 100644
--- a/src/__test__/integration/auth.test.ts
+++ b/src/__test__/integration/auth.test.ts
@@ -150,7 +150,6 @@ describe('Auth Actions - Integration Tests', () => {
expect(result?.validationErrors?.fieldErrors.returnTo).toBeDefined()
})
-
it('should throw validation error if returnTo is a malicious URL', async () => {
mockSupabaseClient.auth.signInWithPassword.mockResolvedValue({
data: { user: { id: 'user-123' } },
diff --git a/src/features/auth/oauth-provider-buttons.tsx b/src/features/auth/oauth-provider-buttons.tsx
index 0d79fe9a9..8b67a129c 100644
--- a/src/features/auth/oauth-provider-buttons.tsx
+++ b/src/features/auth/oauth-provider-buttons.tsx
@@ -15,7 +15,9 @@ export function OAuthProviders() {
execute({ provider: 'google', returnTo: returnTo || undefined })}
+ onClick={() =>
+ execute({ provider: 'google', returnTo: returnTo || undefined })
+ }
className="flex items-center gap-2"
disabled={isTransitioning}
>
@@ -42,7 +44,9 @@ export function OAuthProviders() {
execute({ provider: 'github', returnTo: returnTo || undefined })}
+ onClick={() =>
+ execute({ provider: 'github', returnTo: returnTo || undefined })
+ }
className="flex items-center gap-2"
disabled={isTransitioning}
>
diff --git a/src/features/dashboard/billing/concurrent-sandboxes-addon-dialog.tsx b/src/features/dashboard/billing/concurrent-sandboxes-addon-dialog.tsx
index 4792feba5..7a91361af 100644
--- a/src/features/dashboard/billing/concurrent-sandboxes-addon-dialog.tsx
+++ b/src/features/dashboard/billing/concurrent-sandboxes-addon-dialog.tsx
@@ -32,7 +32,10 @@ import { useAction } from 'next-safe-action/hooks'
import { useRouter } from 'next/navigation'
import { useState } from 'react'
import { useDashboard } from '../context'
-import { ADDON_PURCHASE_ACTION_ERRORS, ADDON_PURCHASE_MESSAGES } from './constants'
+import {
+ ADDON_PURCHASE_ACTION_ERRORS,
+ ADDON_PURCHASE_MESSAGES,
+} from './constants'
import {
stripePromise,
usePaymentConfirmation,
@@ -102,8 +105,15 @@ function DialogContent_Inner({
},
onError: ({ error }) => {
console.error('[Payment] Failed to confirm order:', error.serverError)
- if (error.serverError === ADDON_PURCHASE_ACTION_ERRORS.missingPaymentMethod) {
- toast(defaultErrorToast(ADDON_PURCHASE_MESSAGES.error.missingPaymentMethod))
+ if (
+ error.serverError ===
+ ADDON_PURCHASE_ACTION_ERRORS.missingPaymentMethod
+ ) {
+ toast(
+ defaultErrorToast(
+ ADDON_PURCHASE_MESSAGES.error.missingPaymentMethod
+ )
+ )
} else {
toast(defaultErrorToast(ADDON_PURCHASE_MESSAGES.error.generic))
}
diff --git a/src/features/dashboard/build/header-cells.tsx b/src/features/dashboard/build/header-cells.tsx
index ddb8e5238..e7a660997 100644
--- a/src/features/dashboard/build/header-cells.tsx
+++ b/src/features/dashboard/build/header-cells.tsx
@@ -7,7 +7,6 @@ import {
import { cn } from '@/lib/utils/ui'
import CopyButtonInline from '@/ui/copy-button-inline'
import { Button } from '@/ui/primitives/button'
-import { ArrowUpRight } from 'lucide-react'
import { useParams, useRouter } from 'next/navigation'
import { useEffect, useState } from 'react'
import { useTemplateTableStore } from '../templates/list/stores/table-store'
@@ -85,7 +84,10 @@ export function RanFor({
const formattedTimestamp = formatCompactDate(finishedAt)
return (
-
+
In {formatDurationCompact(duration)}{' '}
· {formattedTimestamp}
@@ -100,7 +102,10 @@ export function StartedAt({ timestamp }: { timestamp: number }) {
const formattedTimestamp = formatCompactDate(timestamp)
return (
-
+
{formatTimeAgoCompact(elapsed)}{' '}
· {formattedTimestamp}
diff --git a/src/features/dashboard/layouts/header.tsx b/src/features/dashboard/layouts/header.tsx
index 1dce270a8..a97b33f89 100644
--- a/src/features/dashboard/layouts/header.tsx
+++ b/src/features/dashboard/layouts/header.tsx
@@ -65,7 +65,9 @@ function HeaderTitle({ title }: { title: string | TitleSegment[] }) {
{title.map((segment, index) => (
- {index > 0 && / }
+ {index > 0 && (
+ /
+ )}
{segment.href ? (
-
+
{children}
diff --git a/src/features/dashboard/sandbox/inspect/stopped-banner.tsx b/src/features/dashboard/sandbox/inspect/stopped-banner.tsx
index 8cf049af9..f0190a77c 100644
--- a/src/features/dashboard/sandbox/inspect/stopped-banner.tsx
+++ b/src/features/dashboard/sandbox/inspect/stopped-banner.tsx
@@ -7,8 +7,8 @@ import {
CardTitle,
cardVariants,
} from '@/ui/primitives/card'
-import { AnimatePresence, motion } from 'motion/react'
import { AlertTriangle } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useMemo } from 'react'
import { useSandboxContext } from '../context'
import { useLastUpdated, useWatcherError } from './hooks/use-watcher'
diff --git a/src/features/dashboard/sandboxes/monitoring/header.client.tsx b/src/features/dashboard/sandboxes/monitoring/header.client.tsx
index ee5badfd8..f8732771e 100644
--- a/src/features/dashboard/sandboxes/monitoring/header.client.tsx
+++ b/src/features/dashboard/sandboxes/monitoring/header.client.tsx
@@ -31,7 +31,7 @@ export function ConcurrentSandboxesClient({
value={lastConcurrentSandboxes}
className="prose-value-big mt-1"
/>
- {!!(limit) && (
+ {!!limit && (
LIMIT: {formatNumber(limit)}
diff --git a/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx b/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx
index c20d28609..b70070e42 100644
--- a/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx
+++ b/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx
@@ -242,9 +242,9 @@ export function WebhookAddEditDialogSteps({
This secret is used to verify webhook authenticity. Each request
- includes an e2b-signature{' '}
- header generated with HMAC SHA-256. Validate this in your endpoint
- to ensure requests are from E2B and untampered.
+ includes an e2b-signature header
+ generated with HMAC SHA-256. Validate this in your endpoint to
+ ensure requests are from E2B and untampered.
;
+export type webhooks = Record
export interface components {
- schemas: {
- Error: {
- /**
- * Format: int32
- * @description Error code
- */
- code: number;
- /** @description Error */
- message: string;
- };
- /** @description Sandbox event */
- SandboxEvent: {
- /**
- * Format: uuid
- * @description Event unique identifier
- */
- id: string;
- /** @description Event structure version */
- version: string;
- /** @description Event name */
- type: string;
- /**
- * @deprecated
- * @description Category of the event (e.g., 'lifecycle', 'process', etc.)
- */
- eventCategory?: string;
- /**
- * @deprecated
- * @description Label for the specific event type (e.g., 'sandbox_started', 'process_oom', etc.)
- */
- eventLabel?: string;
- /** @description Optional JSON data associated with the event */
- eventData?: Record | null;
- /**
- * Format: date-time
- * @description Timestamp of the event
- */
- timestamp: string;
- /**
- * Format: string
- * @description Unique identifier for the sandbox
- */
- sandboxId: string;
- /**
- * Format: string
- * @description Unique identifier for the sandbox execution
- */
- sandboxExecutionId: string;
- /**
- * Format: string
- * @description Unique identifier for the sandbox template
- */
- sandboxTemplateId: string;
- /**
- * Format: string
- * @description Unique identifier for the sandbox build
- */
- sandboxBuildId: string;
- /**
- * Format: uuid
- * @description Team identifier associated with the sandbox
- */
- sandboxTeamId: string;
- };
- /** @description Configuration for registering new webhooks */
- WebhookCreate: {
- name: string;
- /** Format: uri */
- url: string;
- events: string[];
- /** @default true */
- enabled: boolean;
- /** @description Secret used to sign the webhook payloads */
- signatureSecret: string;
- };
- /** @description Webhook creation response */
- WebhookCreation: {
- /** @description Webhook unique identifier */
- id: string;
- /** @description Webhook user friendly name */
- name: string;
- /**
- * Format: date-time
- * @description Time when the template was created
- */
- createdAt: string;
- /** @description Unique identifier for the team */
- teamId: string;
- /** Format: uri */
- url: string;
- enabled: boolean;
- events: string[];
- };
- /** @description Webhook detail response */
- WebhookDetail: {
- /** @description Webhook unique identifier */
- id: string;
- /** @description Unique identifier for the team */
- teamId: string;
- /** @description Webhook user friendly name */
- name: string;
- /**
- * Format: date-time
- * @description Time when the template was created
- */
- createdAt: string;
- /** Format: uri */
- url: string;
- enabled: boolean;
- events: string[];
- };
- /** @description Configuration for updating existing webhooks */
- WebhookConfiguration: {
- enabled?: boolean;
- /** @description Webhook user friendly name */
- name?: string;
- /** Format: uri */
- url?: string;
- events?: string[];
- /** @description Secret used to sign the webhook payloads */
- signatureSecret?: 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 Not found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Error"];
- };
- };
- /** @description Conflict */
- 409: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Error"];
- };
- };
- /** @description Server error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Error"];
- };
- };
- };
- parameters: {
- sandboxID: string;
- webhookID: string;
- };
- requestBodies: never;
- headers: never;
- pathItems: never;
+ schemas: {
+ Error: {
+ /**
+ * Format: int32
+ * @description Error code
+ */
+ code: number
+ /** @description Error */
+ message: string
+ }
+ /** @description Sandbox event */
+ SandboxEvent: {
+ /**
+ * Format: uuid
+ * @description Event unique identifier
+ */
+ id: string
+ /** @description Event structure version */
+ version: string
+ /** @description Event name */
+ type: string
+ /**
+ * @deprecated
+ * @description Category of the event (e.g., 'lifecycle', 'process', etc.)
+ */
+ eventCategory?: string
+ /**
+ * @deprecated
+ * @description Label for the specific event type (e.g., 'sandbox_started', 'process_oom', etc.)
+ */
+ eventLabel?: string
+ /** @description Optional JSON data associated with the event */
+ eventData?: Record | null
+ /**
+ * Format: date-time
+ * @description Timestamp of the event
+ */
+ timestamp: string
+ /**
+ * Format: string
+ * @description Unique identifier for the sandbox
+ */
+ sandboxId: string
+ /**
+ * Format: string
+ * @description Unique identifier for the sandbox execution
+ */
+ sandboxExecutionId: string
+ /**
+ * Format: string
+ * @description Unique identifier for the sandbox template
+ */
+ sandboxTemplateId: string
+ /**
+ * Format: string
+ * @description Unique identifier for the sandbox build
+ */
+ sandboxBuildId: string
+ /**
+ * Format: uuid
+ * @description Team identifier associated with the sandbox
+ */
+ sandboxTeamId: string
+ }
+ /** @description Configuration for registering new webhooks */
+ WebhookCreate: {
+ name: string
+ /** Format: uri */
+ url: string
+ events: string[]
+ /** @default true */
+ enabled: boolean
+ /** @description Secret used to sign the webhook payloads */
+ signatureSecret: string
+ }
+ /** @description Webhook creation response */
+ WebhookCreation: {
+ /** @description Webhook unique identifier */
+ id: string
+ /** @description Webhook user friendly name */
+ name: string
+ /**
+ * Format: date-time
+ * @description Time when the template was created
+ */
+ createdAt: string
+ /** @description Unique identifier for the team */
+ teamId: string
+ /** Format: uri */
+ url: string
+ enabled: boolean
+ events: string[]
+ }
+ /** @description Webhook detail response */
+ WebhookDetail: {
+ /** @description Webhook unique identifier */
+ id: string
+ /** @description Unique identifier for the team */
+ teamId: string
+ /** @description Webhook user friendly name */
+ name: string
+ /**
+ * Format: date-time
+ * @description Time when the template was created
+ */
+ createdAt: string
+ /** Format: uri */
+ url: string
+ enabled: boolean
+ events: string[]
+ }
+ /** @description Configuration for updating existing webhooks */
+ WebhookConfiguration: {
+ enabled?: boolean
+ /** @description Webhook user friendly name */
+ name?: string
+ /** Format: uri */
+ url?: string
+ events?: string[]
+ /** @description Secret used to sign the webhook payloads */
+ signatureSecret?: 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 Not found */
+ 404: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Error']
+ }
+ }
+ /** @description Conflict */
+ 409: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Error']
+ }
+ }
+ /** @description Server error */
+ 500: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Error']
+ }
+ }
+ }
+ parameters: {
+ sandboxID: string
+ webhookID: string
+ }
+ requestBodies: never
+ headers: never
+ pathItems: never
}
-export type $defs = Record;
+export type $defs = Record
export interface operations {
- webhooksList: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description List of registered webhooks. */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["WebhookDetail"][];
- };
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- webhookCreate: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["WebhookCreate"];
- };
- };
- responses: {
- /** @description Successfully created webhook. */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["WebhookCreation"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- webhookGet: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- webhookID: components["parameters"]["webhookID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned the webhook configuration. */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["WebhookDetail"];
- };
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- webhookDelete: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- webhookID: components["parameters"]["webhookID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully deleted webhook. */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- webhookUpdate: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- webhookID: components["parameters"]["webhookID"];
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["WebhookConfiguration"];
- };
- };
- responses: {
- /** @description Successfully updated webhook. */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["WebhookDetail"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
+ webhooksList: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description List of registered webhooks. */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['WebhookDetail'][]
+ }
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ webhookCreate: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['WebhookCreate']
+ }
+ }
+ responses: {
+ /** @description Successfully created webhook. */
+ 201: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['WebhookCreation']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ webhookGet: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ webhookID: components['parameters']['webhookID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned the webhook configuration. */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['WebhookDetail']
+ }
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ webhookDelete: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ webhookID: components['parameters']['webhookID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully deleted webhook. */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ webhookUpdate: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ webhookID: components['parameters']['webhookID']
+ }
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['WebhookConfiguration']
+ }
+ }
+ responses: {
+ /** @description Successfully updated webhook. */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['WebhookDetail']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
}
diff --git a/src/types/database.types.ts b/src/types/database.types.ts
index fa2c34974..e843a29f3 100644
--- a/src/types/database.types.ts
+++ b/src/types/database.types.ts
@@ -10,7 +10,7 @@ export type Database = {
// Allows to automatically instantiate createClient with right options
// instead of createClient(URL, KEY)
__InternalSupabase: {
- PostgrestVersion: "10.2.0 (e07807d)"
+ PostgrestVersion: '10.2.0 (e07807d)'
}
public: {
Tables: {
@@ -71,11 +71,11 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "access_tokens_users_access_tokens"
- columns: ["user_id"]
+ foreignKeyName: 'access_tokens_users_access_tokens'
+ columns: ['user_id']
isOneToOne: false
- referencedRelation: "auth_users"
- referencedColumns: ["id"]
+ referencedRelation: 'auth_users'
+ referencedColumns: ['id']
},
]
}
@@ -127,25 +127,25 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "addons_teams_addons"
- columns: ["team_id"]
+ foreignKeyName: 'addons_teams_addons'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "team_limits"
- referencedColumns: ["id"]
+ referencedRelation: 'team_limits'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "addons_teams_addons"
- columns: ["team_id"]
+ foreignKeyName: 'addons_teams_addons'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "teams"
- referencedColumns: ["id"]
+ referencedRelation: 'teams'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "addons_users_addons"
- columns: ["added_by"]
+ foreignKeyName: 'addons_users_addons'
+ columns: ['added_by']
isOneToOne: false
- referencedRelation: "auth_users"
- referencedColumns: ["id"]
+ referencedRelation: 'auth_users'
+ referencedColumns: ['id']
},
]
}
@@ -191,11 +191,11 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "env_aliases_envs_env_aliases"
- columns: ["env_id"]
+ foreignKeyName: 'env_aliases_envs_env_aliases'
+ columns: ['env_id']
isOneToOne: false
- referencedRelation: "envs"
- referencedColumns: ["id"]
+ referencedRelation: 'envs'
+ referencedColumns: ['id']
},
]
}
@@ -265,11 +265,11 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "env_builds_envs_builds"
- columns: ["env_id"]
+ foreignKeyName: 'env_builds_envs_builds'
+ columns: ['env_id']
isOneToOne: false
- referencedRelation: "envs"
- referencedColumns: ["id"]
+ referencedRelation: 'envs'
+ referencedColumns: ['id']
},
]
}
@@ -288,11 +288,11 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "env_defaults_env_id_fkey"
- columns: ["env_id"]
+ foreignKeyName: 'env_defaults_env_id_fkey'
+ columns: ['env_id']
isOneToOne: true
- referencedRelation: "envs"
- referencedColumns: ["id"]
+ referencedRelation: 'envs'
+ referencedColumns: ['id']
},
]
}
@@ -335,32 +335,32 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "envs_cluster_id_fkey"
- columns: ["cluster_id"]
+ foreignKeyName: 'envs_cluster_id_fkey'
+ columns: ['cluster_id']
isOneToOne: false
- referencedRelation: "clusters"
- referencedColumns: ["id"]
+ referencedRelation: 'clusters'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "envs_teams_envs"
- columns: ["team_id"]
+ foreignKeyName: 'envs_teams_envs'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "team_limits"
- referencedColumns: ["id"]
+ referencedRelation: 'team_limits'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "envs_teams_envs"
- columns: ["team_id"]
+ foreignKeyName: 'envs_teams_envs'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "teams"
- referencedColumns: ["id"]
+ referencedRelation: 'teams'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "envs_users_created_envs"
- columns: ["created_by"]
+ foreignKeyName: 'envs_users_created_envs'
+ columns: ['created_by']
isOneToOne: false
- referencedRelation: "auth_users"
- referencedColumns: ["id"]
+ referencedRelation: 'auth_users'
+ referencedColumns: ['id']
},
]
}
@@ -388,11 +388,11 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "feedback_user_id_fkey"
- columns: ["user_id"]
+ foreignKeyName: 'feedback_user_id_fkey'
+ columns: ['user_id']
isOneToOne: false
- referencedRelation: "auth_users"
- referencedColumns: ["id"]
+ referencedRelation: 'auth_users'
+ referencedColumns: ['id']
},
]
}
@@ -441,32 +441,32 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "fk_snapshots_team"
- columns: ["team_id"]
+ foreignKeyName: 'fk_snapshots_team'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "team_limits"
- referencedColumns: ["id"]
+ referencedRelation: 'team_limits'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "fk_snapshots_team"
- columns: ["team_id"]
+ foreignKeyName: 'fk_snapshots_team'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "teams"
- referencedColumns: ["id"]
+ referencedRelation: 'teams'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "snapshots_envs_base_env_id"
- columns: ["base_env_id"]
+ foreignKeyName: 'snapshots_envs_base_env_id'
+ columns: ['base_env_id']
isOneToOne: false
- referencedRelation: "envs"
- referencedColumns: ["id"]
+ referencedRelation: 'envs'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "snapshots_envs_env_id"
- columns: ["env_id"]
+ foreignKeyName: 'snapshots_envs_env_id'
+ columns: ['env_id']
isOneToOne: false
- referencedRelation: "envs"
- referencedColumns: ["id"]
+ referencedRelation: 'envs'
+ referencedColumns: ['id']
},
]
}
@@ -515,25 +515,25 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "team_api_keys_teams_team_api_keys"
- columns: ["team_id"]
+ foreignKeyName: 'team_api_keys_teams_team_api_keys'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "team_limits"
- referencedColumns: ["id"]
+ referencedRelation: 'team_limits'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "team_api_keys_teams_team_api_keys"
- columns: ["team_id"]
+ foreignKeyName: 'team_api_keys_teams_team_api_keys'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "teams"
- referencedColumns: ["id"]
+ referencedRelation: 'teams'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "team_api_keys_users_created_api_keys"
- columns: ["created_by"]
+ foreignKeyName: 'team_api_keys_users_created_api_keys'
+ columns: ['created_by']
isOneToOne: false
- referencedRelation: "auth_users"
- referencedColumns: ["id"]
+ referencedRelation: 'auth_users'
+ referencedColumns: ['id']
},
]
}
@@ -582,18 +582,18 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "teams_cluster_id_fkey"
- columns: ["cluster_id"]
+ foreignKeyName: 'teams_cluster_id_fkey'
+ columns: ['cluster_id']
isOneToOne: false
- referencedRelation: "clusters"
- referencedColumns: ["id"]
+ referencedRelation: 'clusters'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "teams_tiers_teams"
- columns: ["tier"]
+ foreignKeyName: 'teams_tiers_teams'
+ columns: ['tier']
isOneToOne: false
- referencedRelation: "tiers"
- referencedColumns: ["id"]
+ referencedRelation: 'tiers'
+ referencedColumns: ['id']
},
]
}
@@ -657,32 +657,32 @@ export type Database = {
}
Relationships: [
{
- foreignKeyName: "users_teams_added_by_user"
- columns: ["added_by"]
+ foreignKeyName: 'users_teams_added_by_user'
+ columns: ['added_by']
isOneToOne: false
- referencedRelation: "auth_users"
- referencedColumns: ["id"]
+ referencedRelation: 'auth_users'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "users_teams_teams_teams"
- columns: ["team_id"]
+ foreignKeyName: 'users_teams_teams_teams'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "team_limits"
- referencedColumns: ["id"]
+ referencedRelation: 'team_limits'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "users_teams_teams_teams"
- columns: ["team_id"]
+ foreignKeyName: 'users_teams_teams_teams'
+ columns: ['team_id']
isOneToOne: false
- referencedRelation: "teams"
- referencedColumns: ["id"]
+ referencedRelation: 'teams'
+ referencedColumns: ['id']
},
{
- foreignKeyName: "users_teams_users_users"
- columns: ["user_id"]
+ foreignKeyName: 'users_teams_users_users'
+ columns: ['user_id']
isOneToOne: false
- referencedRelation: "auth_users"
- referencedColumns: ["id"]
+ referencedRelation: 'auth_users'
+ referencedColumns: ['id']
},
]
}
@@ -735,10 +735,10 @@ export type Database = {
Returns: boolean
}
temp_create_access_token: { Args: never; Returns: string }
- unaccent: { Args: { "": string }; Returns: string }
+ unaccent: { Args: { '': string }; Returns: string }
}
Enums: {
- deployment_state: "generating" | "deploying" | "finished" | "error"
+ deployment_state: 'generating' | 'deploying' | 'finished' | 'error'
}
CompositeTypes: {
[_ in never]: never
@@ -746,33 +746,33 @@ export type Database = {
}
}
-type DatabaseWithoutInternals = Omit
+type DatabaseWithoutInternals = Omit
-type DefaultSchema = DatabaseWithoutInternals[Extract]
+type DefaultSchema = DatabaseWithoutInternals[Extract]
export type Tables<
DefaultSchemaTableNameOrOptions extends
- | keyof (DefaultSchema["Tables"] & DefaultSchema["Views"])
+ | keyof (DefaultSchema['Tables'] & DefaultSchema['Views'])
| { schema: keyof DatabaseWithoutInternals },
TableName extends DefaultSchemaTableNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? keyof (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] &
- DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"])
+ ? keyof (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] &
+ DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Views'])
: never = never,
> = DefaultSchemaTableNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] &
- DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"])[TableName] extends {
+ ? (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] &
+ DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Views'])[TableName] extends {
Row: infer R
}
? R
: never
- : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema["Tables"] &
- DefaultSchema["Views"])
- ? (DefaultSchema["Tables"] &
- DefaultSchema["Views"])[DefaultSchemaTableNameOrOptions] extends {
+ : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema['Tables'] &
+ DefaultSchema['Views'])
+ ? (DefaultSchema['Tables'] &
+ DefaultSchema['Views'])[DefaultSchemaTableNameOrOptions] extends {
Row: infer R
}
? R
@@ -781,23 +781,23 @@ export type Tables<
export type TablesInsert<
DefaultSchemaTableNameOrOptions extends
- | keyof DefaultSchema["Tables"]
+ | keyof DefaultSchema['Tables']
| { schema: keyof DatabaseWithoutInternals },
TableName extends DefaultSchemaTableNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"]
+ ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables']
: never = never,
> = DefaultSchemaTableNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends {
+ ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends {
Insert: infer I
}
? I
: never
- : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"]
- ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends {
+ : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables']
+ ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends {
Insert: infer I
}
? I
@@ -806,23 +806,23 @@ export type TablesInsert<
export type TablesUpdate<
DefaultSchemaTableNameOrOptions extends
- | keyof DefaultSchema["Tables"]
+ | keyof DefaultSchema['Tables']
| { schema: keyof DatabaseWithoutInternals },
TableName extends DefaultSchemaTableNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"]
+ ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables']
: never = never,
> = DefaultSchemaTableNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends {
+ ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends {
Update: infer U
}
? U
: never
- : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"]
- ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends {
+ : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables']
+ ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends {
Update: infer U
}
? U
@@ -831,42 +831,42 @@ export type TablesUpdate<
export type Enums<
DefaultSchemaEnumNameOrOptions extends
- | keyof DefaultSchema["Enums"]
+ | keyof DefaultSchema['Enums']
| { schema: keyof DatabaseWithoutInternals },
EnumName extends DefaultSchemaEnumNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"]
+ ? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions['schema']]['Enums']
: never = never,
> = DefaultSchemaEnumNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"][EnumName]
- : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema["Enums"]
- ? DefaultSchema["Enums"][DefaultSchemaEnumNameOrOptions]
+ ? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions['schema']]['Enums'][EnumName]
+ : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema['Enums']
+ ? DefaultSchema['Enums'][DefaultSchemaEnumNameOrOptions]
: never
export type CompositeTypes<
PublicCompositeTypeNameOrOptions extends
- | keyof DefaultSchema["CompositeTypes"]
+ | keyof DefaultSchema['CompositeTypes']
| { schema: keyof DatabaseWithoutInternals },
CompositeTypeName extends PublicCompositeTypeNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? keyof DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"]
+ ? keyof DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions['schema']]['CompositeTypes']
: never = never,
> = PublicCompositeTypeNameOrOptions extends {
schema: keyof DatabaseWithoutInternals
}
- ? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName]
- : PublicCompositeTypeNameOrOptions extends keyof DefaultSchema["CompositeTypes"]
- ? DefaultSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions]
+ ? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions['schema']]['CompositeTypes'][CompositeTypeName]
+ : PublicCompositeTypeNameOrOptions extends keyof DefaultSchema['CompositeTypes']
+ ? DefaultSchema['CompositeTypes'][PublicCompositeTypeNameOrOptions]
: never
export const Constants = {
public: {
Enums: {
- deployment_state: ["generating", "deploying", "finished", "error"],
+ deployment_state: ['generating', 'deploying', 'finished', 'error'],
},
},
} as const
diff --git a/src/types/infra-api.types.ts b/src/types/infra-api.types.ts
index c86ee374f..aa72e8ae2 100644
--- a/src/types/infra-api.types.ts
+++ b/src/types/infra-api.types.ts
@@ -4,2562 +4,2565 @@
*/
export interface paths {
- "/health": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Health check */
- get: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Request was successful */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/teams": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description List all teams */
- get: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned all teams */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Team"][];
- };
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/teams/{teamID}/metrics": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Get metrics for the team */
- get: {
- parameters: {
- query?: {
- /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */
- start?: number;
- end?: number;
- };
- header?: never;
- path: {
- teamID: components["parameters"]["teamID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned the team metrics */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TeamMetric"][];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 403: components["responses"]["403"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/teams/{teamID}/metrics/max": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Get the maximum metrics for the team in the given interval */
- get: {
- parameters: {
- query: {
- /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */
- start?: number;
- end?: number;
- /** @description Metric to retrieve the maximum value for */
- metric: "concurrent_sandboxes" | "sandbox_start_rate";
- };
- header?: never;
- path: {
- teamID: components["parameters"]["teamID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned the team metrics */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["MaxTeamMetric"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 403: components["responses"]["403"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/sandboxes": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description List all running sandboxes */
- get: {
- parameters: {
- query?: {
- /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */
- metadata?: string;
- };
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned all running sandboxes */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ListedSandbox"][];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- /** @description Create a sandbox from the template */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["NewSandbox"];
- };
- };
- responses: {
- /** @description The sandbox was created successfully */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Sandbox"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/v2/sandboxes": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description List all sandboxes */
- get: {
- parameters: {
- query?: {
- /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */
- metadata?: string;
- /** @description Filter sandboxes by one or more states */
- state?: components["schemas"]["SandboxState"][];
- /** @description Cursor to start the list from */
- nextToken?: components["parameters"]["paginationNextToken"];
- /** @description Maximum number of items to return per page */
- limit?: components["parameters"]["paginationLimit"];
- };
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned all running sandboxes */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ListedSandbox"][];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/sandboxes/metrics": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description List metrics for given sandboxes */
- get: {
- parameters: {
- query: {
- /** @description Comma-separated list of sandbox IDs to get metrics for */
- sandbox_ids: string[];
- };
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned all running sandboxes with metrics */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SandboxesWithMetrics"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/sandboxes/{sandboxID}/logs": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Get sandbox logs */
- 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;
- };
- "/sandboxes/{sandboxID}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Get a sandbox by id */
- get: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- sandboxID: components["parameters"]["sandboxID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned the sandbox */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SandboxDetail"];
- };
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- /** @description Kill a sandbox */
- delete: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- sandboxID: components["parameters"]["sandboxID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description The sandbox was killed successfully */
- 204: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/sandboxes/{sandboxID}/metrics": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Get sandbox metrics */
- get: {
- parameters: {
- query?: {
- /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */
- start?: number;
- end?: number;
- };
- header?: never;
- path: {
- sandboxID: components["parameters"]["sandboxID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned the sandbox metrics */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SandboxMetric"][];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/sandboxes/{sandboxID}/pause": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** @description Pause the sandbox */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- sandboxID: components["parameters"]["sandboxID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description The sandbox was paused successfully and can be resumed */
- 204: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 409: components["responses"]["409"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/sandboxes/{sandboxID}/resume": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /**
- * @deprecated
- * @description Resume the sandbox
- */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- sandboxID: components["parameters"]["sandboxID"];
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["ResumedSandbox"];
- };
- };
- responses: {
- /** @description The sandbox was resumed successfully */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Sandbox"];
- };
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 409: components["responses"]["409"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/sandboxes/{sandboxID}/connect": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- sandboxID: components["parameters"]["sandboxID"];
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["ConnectSandbox"];
- };
- };
- responses: {
- /** @description The sandbox was already running */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Sandbox"];
- };
- };
- /** @description The sandbox was resumed successfully */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Sandbox"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/sandboxes/{sandboxID}/timeout": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- sandboxID: components["parameters"]["sandboxID"];
- };
- cookie?: never;
- };
- requestBody?: {
- content: {
- "application/json": {
- /**
- * Format: int32
- * @description Timeout in seconds from the current time after which the sandbox should expire
- */
- timeout: number;
- };
- };
- };
- 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}/refreshes": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** @description Refresh the sandbox extending its time to live */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- sandboxID: components["parameters"]["sandboxID"];
- };
- cookie?: never;
- };
- requestBody?: {
- content: {
- "application/json": {
- /** @description Duration for which the sandbox should be kept alive in seconds */
- duration?: number;
- };
- };
- };
- 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;
- };
- "/v3/templates": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** @description Create a new template */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["TemplateBuildRequestV3"];
- };
- };
- responses: {
- /** @description The build was requested successfully */
- 202: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TemplateRequestResponseV3"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/v2/templates": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /**
- * @deprecated
- * @description Create a new template
- */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["TemplateBuildRequestV2"];
- };
- };
- responses: {
- /** @description The build was requested successfully */
- 202: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TemplateLegacy"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/templates/{templateID}/files/{hash}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Get an upload link for a tar file containing build layer files */
- get: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- templateID: components["parameters"]["templateID"];
- hash: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description The upload link where to upload the tar file */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TemplateBuildFileUpload"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/templates": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description List all templates */
- get: {
- parameters: {
- query?: {
- teamID?: string;
- };
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned all templates */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Template"][];
- };
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- /**
- * @deprecated
- * @description Create a new template
- */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["TemplateBuildRequest"];
- };
- };
- responses: {
- /** @description The build was accepted */
- 202: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TemplateLegacy"];
- };
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/templates/{templateID}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description List all builds for a template */
- get: {
- parameters: {
- query?: {
- /** @description Cursor to start the list from */
- nextToken?: components["parameters"]["paginationNextToken"];
- /** @description Maximum number of items to return per page */
- limit?: components["parameters"]["paginationLimit"];
- };
- header?: never;
- path: {
- templateID: components["parameters"]["templateID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned the template with its builds */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TemplateWithBuilds"];
- };
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- /**
- * @deprecated
- * @description Rebuild an template
- */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- templateID: components["parameters"]["templateID"];
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["TemplateBuildRequest"];
- };
- };
- responses: {
- /** @description The build was accepted */
- 202: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TemplateLegacy"];
- };
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- /** @description Delete a template */
- delete: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- templateID: components["parameters"]["templateID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description The template was deleted successfully */
- 204: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- options?: never;
- head?: never;
- /** @description Update template */
- patch: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- templateID: components["parameters"]["templateID"];
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["TemplateUpdateRequest"];
- };
- };
- responses: {
- /** @description The template was updated successfully */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 400: components["responses"]["400"];
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- trace?: never;
- };
- "/templates/{templateID}/builds/{buildID}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /**
- * @deprecated
- * @description Start the build
- */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- templateID: components["parameters"]["templateID"];
- buildID: components["parameters"]["buildID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description The build has started */
- 202: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/v2/templates/{templateID}/builds/{buildID}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** @description Start the build */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- templateID: components["parameters"]["templateID"];
- buildID: components["parameters"]["buildID"];
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["TemplateBuildStartV2"];
- };
- };
- responses: {
- /** @description The build has started */
- 202: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/templates/{templateID}/builds/{buildID}/status": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Get template build info */
- get: {
- parameters: {
- query?: {
- /** @description Index of the starting build log that should be returned with the template */
- logsOffset?: number;
- /** @description Maximum number of logs that should be returned */
- limit?: number;
- level?: components["schemas"]["LogLevel"];
- };
- header?: never;
- path: {
- templateID: components["parameters"]["templateID"];
- buildID: components["parameters"]["buildID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned the template */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TemplateBuildInfo"];
- };
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/templates/{templateID}/builds/{buildID}/logs": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Get template build logs */
- get: {
- parameters: {
- query?: {
- /** @description Starting timestamp of the logs that should be returned in milliseconds */
- cursor?: number;
- /** @description Maximum number of logs that should be returned */
- limit?: number;
- direction?: components["schemas"]["LogsDirection"];
- level?: components["schemas"]["LogLevel"];
- /** @description Source of the logs that should be returned from */
- source?: components["schemas"]["LogsSource"];
- };
- header?: never;
- path: {
- templateID: components["parameters"]["templateID"];
- buildID: components["parameters"]["buildID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned the template build logs */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TemplateBuildLogsResponse"];
- };
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/nodes": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description List all nodes */
- get: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned all nodes */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["Node"][];
- };
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/nodes/{nodeID}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description Get node info */
- get: {
- parameters: {
- query?: {
- /** @description Identifier of the cluster */
- clusterID?: string;
- };
- header?: never;
- path: {
- nodeID: components["parameters"]["nodeID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned the node */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["NodeDetail"];
- };
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- /** @description Change status of a node */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- nodeID: components["parameters"]["nodeID"];
- };
- cookie?: never;
- };
- requestBody?: {
- content: {
- "application/json": components["schemas"]["NodeStatusChange"];
- };
- };
- responses: {
- /** @description The node status was changed successfully */
- 204: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/admin/teams/{teamID}/sandboxes/kill": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /**
- * Kill all sandboxes for a team
- * @description Kills all sandboxes for the specified team
- */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Team ID */
- teamID: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully killed sandboxes */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["AdminSandboxKillResult"];
- };
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/access-tokens": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** @description Create a new access token */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["NewAccessToken"];
- };
- };
- responses: {
- /** @description Access token created successfully */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["CreatedAccessToken"];
- };
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/access-tokens/{accessTokenID}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- post?: never;
- /** @description Delete an access token */
- delete: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- accessTokenID: components["parameters"]["accessTokenID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Access token deleted successfully */
- 204: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api-keys": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** @description List all team API keys */
- get: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Successfully returned all team API keys */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["TeamAPIKey"][];
- };
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- put?: never;
- /** @description Create a new team API key */
- post: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["NewTeamAPIKey"];
- };
- };
- responses: {
- /** @description Team API key created successfully */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["CreatedTeamAPIKey"];
- };
- };
- 401: components["responses"]["401"];
- 500: components["responses"]["500"];
- };
- };
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api-keys/{apiKeyID}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- post?: never;
- /** @description Delete a team API key */
- delete: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- apiKeyID: components["parameters"]["apiKeyID"];
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description Team API key deleted successfully */
- 204: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- options?: never;
- head?: never;
- /** @description Update a team API key */
- patch: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- apiKeyID: components["parameters"]["apiKeyID"];
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["UpdateTeamAPIKey"];
- };
- };
- responses: {
- /** @description Team API key updated successfully */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content?: never;
- };
- 401: components["responses"]["401"];
- 404: components["responses"]["404"];
- 500: components["responses"]["500"];
- };
- };
- trace?: never;
- };
-}
-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;
- /** @description Email of the user */
- email: string;
- };
- TemplateUpdateRequest: {
- /** @description Whether the template is public or only accessible by the team */
- public?: boolean;
- };
- /**
- * 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";
- 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 CIDR blocks or IP addresses for egress traffic. Allowed addresses always take precedence over blocked addresses. */
- allowOut?: string[];
- /** @description List of denied CIDR blocks or IP addresses for egress traffic */
- denyOut?: string[];
- /** @description Specify host mask which will be used for all sandbox requests */
- maskRequestHost?: string;
- };
- /** @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"][];
- };
- /** @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 Disk used in bytes
- */
- diskUsed: number;
- /**
- * Format: int64
- * @description Total disk space in bytes
- */
- diskTotal: number;
- };
- 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 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"];
- };
- 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"];
- };
- 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 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"];
- };
- 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: {
+ '/health': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Health check */
+ get: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Request was successful */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/teams': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description List all teams */
+ get: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned all teams */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Team'][]
+ }
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/teams/{teamID}/metrics': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Get metrics for the team */
+ get: {
+ parameters: {
+ query?: {
+ /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */
+ start?: number
+ end?: number
+ }
+ header?: never
+ path: {
+ teamID: components['parameters']['teamID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned the team metrics */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TeamMetric'][]
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 403: components['responses']['403']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/teams/{teamID}/metrics/max': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Get the maximum metrics for the team in the given interval */
+ get: {
+ parameters: {
+ query: {
+ /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */
+ start?: number
+ end?: number
+ /** @description Metric to retrieve the maximum value for */
+ metric: 'concurrent_sandboxes' | 'sandbox_start_rate'
+ }
+ header?: never
+ path: {
+ teamID: components['parameters']['teamID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned the team metrics */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['MaxTeamMetric']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 403: components['responses']['403']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/sandboxes': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description List all running sandboxes */
+ get: {
+ parameters: {
+ query?: {
+ /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */
+ metadata?: string
+ }
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned all running sandboxes */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['ListedSandbox'][]
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ /** @description Create a sandbox from the template */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['NewSandbox']
+ }
+ }
+ responses: {
+ /** @description The sandbox was created successfully */
+ 201: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Sandbox']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/v2/sandboxes': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description List all sandboxes */
+ get: {
+ parameters: {
+ query?: {
+ /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */
+ metadata?: string
+ /** @description Filter sandboxes by one or more states */
+ state?: components['schemas']['SandboxState'][]
+ /** @description Cursor to start the list from */
+ nextToken?: components['parameters']['paginationNextToken']
+ /** @description Maximum number of items to return per page */
+ limit?: components['parameters']['paginationLimit']
+ }
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned all running sandboxes */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['ListedSandbox'][]
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/sandboxes/metrics': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description List metrics for given sandboxes */
+ get: {
+ parameters: {
+ query: {
+ /** @description Comma-separated list of sandbox IDs to get metrics for */
+ sandbox_ids: string[]
+ }
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned all running sandboxes with metrics */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['SandboxesWithMetrics']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/sandboxes/{sandboxID}/logs': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Get sandbox logs */
+ 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
+ }
+ '/sandboxes/{sandboxID}': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Get a sandbox by id */
+ get: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ sandboxID: components['parameters']['sandboxID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned the sandbox */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['SandboxDetail']
+ }
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ /** @description Kill a sandbox */
+ delete: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ sandboxID: components['parameters']['sandboxID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description The sandbox was killed successfully */
+ 204: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/sandboxes/{sandboxID}/metrics': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Get sandbox metrics */
+ get: {
+ parameters: {
+ query?: {
+ /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */
+ start?: number
+ end?: number
+ }
+ header?: never
+ path: {
+ sandboxID: components['parameters']['sandboxID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned the sandbox metrics */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['SandboxMetric'][]
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/sandboxes/{sandboxID}/pause': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /** @description Pause the sandbox */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ sandboxID: components['parameters']['sandboxID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description The sandbox was paused successfully and can be resumed */
+ 204: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 409: components['responses']['409']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/sandboxes/{sandboxID}/resume': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /**
+ * @deprecated
+ * @description Resume the sandbox
+ */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ sandboxID: components['parameters']['sandboxID']
+ }
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['ResumedSandbox']
+ }
+ }
+ responses: {
+ /** @description The sandbox was resumed successfully */
+ 201: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Sandbox']
+ }
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 409: components['responses']['409']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/sandboxes/{sandboxID}/connect': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ sandboxID: components['parameters']['sandboxID']
+ }
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['ConnectSandbox']
+ }
+ }
+ responses: {
+ /** @description The sandbox was already running */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Sandbox']
+ }
+ }
+ /** @description The sandbox was resumed successfully */
+ 201: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Sandbox']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/sandboxes/{sandboxID}/timeout': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ sandboxID: components['parameters']['sandboxID']
+ }
+ cookie?: never
+ }
+ requestBody?: {
+ content: {
+ 'application/json': {
/**
* Format: int32
* @description Timeout in seconds from the current time after which the sandbox should expire
*/
- timeout: number;
- };
- /** @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;
- };
- 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;
- /** @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"];
- 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 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;
- /** @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;
- /**
- * 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"][];
- };
- 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 Alias of the template */
- alias: string;
- /** @description Identifier of the team */
- teamID?: string;
- cpuCount?: components["schemas"]["CPUCount"];
- memoryMB?: components["schemas"]["MemoryMB"];
- };
- TemplateBuildRequestV2: {
- /** @description Alias of the template */
- alias: string;
- /** @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
- * @enum {string}
- */
- NodeStatus: "ready" | "draining" | "connecting" | "unhealthy";
- 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;
- /**
- * @deprecated
- * @description Identifier of the nomad node
- */
- nodeID: string;
- /** @description Identifier of the node */
- id: string;
- /** @description Service instance identifier of the node */
- serviceInstanceID: string;
- /** @description Identifier of the cluster */
- clusterID: string;
- machineInfo: components["schemas"]["MachineInfo"];
- status: components["schemas"]["NodeStatus"];
- /**
- * Format: uint32
- * @description Number of sandboxes running on the node
- */
- sandboxCount: number;
- metrics: components["schemas"]["NodeMetrics"];
- /**
- * Format: uint64
- * @description Number of sandbox create successes
- */
- createSuccesses: number;
- /**
- * Format: uint64
- * @description Number of sandbox create fails
- */
- createFails: number;
- /**
- * Format: int
- * @description Number of starting Sandboxes
- */
- sandboxStartingCount: number;
- };
- NodeDetail: {
- /** @description Identifier of the cluster */
- clusterID: string;
- /** @description Version of the orchestrator */
- version: string;
- /** @description Commit of the orchestrator */
- commit: string;
- /** @description Identifier of the node */
- id: string;
- /** @description Service instance identifier of the node */
- serviceInstanceID: string;
- /**
- * @deprecated
- * @description Identifier of the nomad node
- */
- nodeID: string;
- machineInfo: components["schemas"]["MachineInfo"];
- status: components["schemas"]["NodeStatus"];
- /** @description List of sandboxes running on the node */
- sandboxes: components["schemas"]["ListedSandbox"][];
- 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;
- };
- 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;
- };
- };
- 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"];
- };
- };
- };
+ timeout: number
+ }
+ }
+ }
+ 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}/refreshes': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /** @description Refresh the sandbox extending its time to live */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ sandboxID: components['parameters']['sandboxID']
+ }
+ cookie?: never
+ }
+ requestBody?: {
+ content: {
+ 'application/json': {
+ /** @description Duration for which the sandbox should be kept alive in seconds */
+ duration?: number
+ }
+ }
+ }
+ 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
+ }
+ '/v3/templates': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /** @description Create a new template */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['TemplateBuildRequestV3']
+ }
+ }
+ responses: {
+ /** @description The build was requested successfully */
+ 202: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TemplateRequestResponseV3']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/v2/templates': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /**
+ * @deprecated
+ * @description Create a new template
+ */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['TemplateBuildRequestV2']
+ }
+ }
+ responses: {
+ /** @description The build was requested successfully */
+ 202: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TemplateLegacy']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/templates/{templateID}/files/{hash}': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Get an upload link for a tar file containing build layer files */
+ get: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ templateID: components['parameters']['templateID']
+ hash: string
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description The upload link where to upload the tar file */
+ 201: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TemplateBuildFileUpload']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/templates': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description List all templates */
+ get: {
+ parameters: {
+ query?: {
+ teamID?: string
+ }
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned all templates */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Template'][]
+ }
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ /**
+ * @deprecated
+ * @description Create a new template
+ */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['TemplateBuildRequest']
+ }
+ }
+ responses: {
+ /** @description The build was accepted */
+ 202: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TemplateLegacy']
+ }
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/templates/{templateID}': {
parameters: {
- templateID: string;
- buildID: string;
- sandboxID: string;
- teamID: string;
- nodeID: string;
- apiKeyID: string;
- accessTokenID: string;
- /** @description Maximum number of items to return per page */
- paginationLimit: number;
- /** @description Cursor to start the list from */
- paginationNextToken: string;
- };
- requestBodies: never;
- headers: never;
- pathItems: never;
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description List all builds for a template */
+ get: {
+ parameters: {
+ query?: {
+ /** @description Cursor to start the list from */
+ nextToken?: components['parameters']['paginationNextToken']
+ /** @description Maximum number of items to return per page */
+ limit?: components['parameters']['paginationLimit']
+ }
+ header?: never
+ path: {
+ templateID: components['parameters']['templateID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned the template with its builds */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TemplateWithBuilds']
+ }
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ /**
+ * @deprecated
+ * @description Rebuild an template
+ */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ templateID: components['parameters']['templateID']
+ }
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['TemplateBuildRequest']
+ }
+ }
+ responses: {
+ /** @description The build was accepted */
+ 202: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TemplateLegacy']
+ }
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ /** @description Delete a template */
+ delete: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ templateID: components['parameters']['templateID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description The template was deleted successfully */
+ 204: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ options?: never
+ head?: never
+ /** @description Update template */
+ patch: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ templateID: components['parameters']['templateID']
+ }
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['TemplateUpdateRequest']
+ }
+ }
+ responses: {
+ /** @description The template was updated successfully */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 400: components['responses']['400']
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ trace?: never
+ }
+ '/templates/{templateID}/builds/{buildID}': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /**
+ * @deprecated
+ * @description Start the build
+ */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ templateID: components['parameters']['templateID']
+ buildID: components['parameters']['buildID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description The build has started */
+ 202: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/v2/templates/{templateID}/builds/{buildID}': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /** @description Start the build */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ templateID: components['parameters']['templateID']
+ buildID: components['parameters']['buildID']
+ }
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['TemplateBuildStartV2']
+ }
+ }
+ responses: {
+ /** @description The build has started */
+ 202: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/templates/{templateID}/builds/{buildID}/status': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Get template build info */
+ get: {
+ parameters: {
+ query?: {
+ /** @description Index of the starting build log that should be returned with the template */
+ logsOffset?: number
+ /** @description Maximum number of logs that should be returned */
+ limit?: number
+ level?: components['schemas']['LogLevel']
+ }
+ header?: never
+ path: {
+ templateID: components['parameters']['templateID']
+ buildID: components['parameters']['buildID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned the template */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TemplateBuildInfo']
+ }
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/templates/{templateID}/builds/{buildID}/logs': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Get template build logs */
+ get: {
+ parameters: {
+ query?: {
+ /** @description Starting timestamp of the logs that should be returned in milliseconds */
+ cursor?: number
+ /** @description Maximum number of logs that should be returned */
+ limit?: number
+ direction?: components['schemas']['LogsDirection']
+ level?: components['schemas']['LogLevel']
+ /** @description Source of the logs that should be returned from */
+ source?: components['schemas']['LogsSource']
+ }
+ header?: never
+ path: {
+ templateID: components['parameters']['templateID']
+ buildID: components['parameters']['buildID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned the template build logs */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TemplateBuildLogsResponse']
+ }
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/nodes': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description List all nodes */
+ get: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned all nodes */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Node'][]
+ }
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/nodes/{nodeID}': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description Get node info */
+ get: {
+ parameters: {
+ query?: {
+ /** @description Identifier of the cluster */
+ clusterID?: string
+ }
+ header?: never
+ path: {
+ nodeID: components['parameters']['nodeID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned the node */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['NodeDetail']
+ }
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ /** @description Change status of a node */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ nodeID: components['parameters']['nodeID']
+ }
+ cookie?: never
+ }
+ requestBody?: {
+ content: {
+ 'application/json': components['schemas']['NodeStatusChange']
+ }
+ }
+ responses: {
+ /** @description The node status was changed successfully */
+ 204: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/admin/teams/{teamID}/sandboxes/kill': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /**
+ * Kill all sandboxes for a team
+ * @description Kills all sandboxes for the specified team
+ */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ /** @description Team ID */
+ teamID: string
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully killed sandboxes */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['AdminSandboxKillResult']
+ }
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/access-tokens': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ /** @description Create a new access token */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['NewAccessToken']
+ }
+ }
+ responses: {
+ /** @description Access token created successfully */
+ 201: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['CreatedAccessToken']
+ }
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/access-tokens/{accessTokenID}': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ post?: never
+ /** @description Delete an access token */
+ delete: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ accessTokenID: components['parameters']['accessTokenID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Access token deleted successfully */
+ 204: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/api-keys': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** @description List all team API keys */
+ get: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Successfully returned all team API keys */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['TeamAPIKey'][]
+ }
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ put?: never
+ /** @description Create a new team API key */
+ post: {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['NewTeamAPIKey']
+ }
+ }
+ responses: {
+ /** @description Team API key created successfully */
+ 201: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['CreatedTeamAPIKey']
+ }
+ }
+ 401: components['responses']['401']
+ 500: components['responses']['500']
+ }
+ }
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
+ '/api-keys/{apiKeyID}': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ get?: never
+ put?: never
+ post?: never
+ /** @description Delete a team API key */
+ delete: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ apiKeyID: components['parameters']['apiKeyID']
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Team API key deleted successfully */
+ 204: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ options?: never
+ head?: never
+ /** @description Update a team API key */
+ patch: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ apiKeyID: components['parameters']['apiKeyID']
+ }
+ cookie?: never
+ }
+ requestBody: {
+ content: {
+ 'application/json': components['schemas']['UpdateTeamAPIKey']
+ }
+ }
+ responses: {
+ /** @description Team API key updated successfully */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ 401: components['responses']['401']
+ 404: components['responses']['404']
+ 500: components['responses']['500']
+ }
+ }
+ trace?: never
+ }
+}
+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
+ /** @description Email of the user */
+ email: string
+ }
+ TemplateUpdateRequest: {
+ /** @description Whether the template is public or only accessible by the team */
+ public?: boolean
+ }
+ /**
+ * 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'
+ 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 CIDR blocks or IP addresses for egress traffic. Allowed addresses always take precedence over blocked addresses. */
+ allowOut?: string[]
+ /** @description List of denied CIDR blocks or IP addresses for egress traffic */
+ denyOut?: string[]
+ /** @description Specify host mask which will be used for all sandbox requests */
+ maskRequestHost?: string
+ }
+ /** @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'][]
+ }
+ /** @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 Disk used in bytes
+ */
+ diskUsed: number
+ /**
+ * Format: int64
+ * @description Total disk space in bytes
+ */
+ diskTotal: number
+ }
+ 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 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']
+ }
+ 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']
+ }
+ 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 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']
+ }
+ 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
+ }
+ /** @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
+ }
+ 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
+ /** @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']
+ 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 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
+ /** @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
+ /**
+ * 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'][]
+ }
+ 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 Alias of the template */
+ alias: string
+ /** @description Identifier of the team */
+ teamID?: string
+ cpuCount?: components['schemas']['CPUCount']
+ memoryMB?: components['schemas']['MemoryMB']
+ }
+ TemplateBuildRequestV2: {
+ /** @description Alias of the template */
+ alias: string
+ /** @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
+ * @enum {string}
+ */
+ NodeStatus: 'ready' | 'draining' | 'connecting' | 'unhealthy'
+ 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
+ /**
+ * @deprecated
+ * @description Identifier of the nomad node
+ */
+ nodeID: string
+ /** @description Identifier of the node */
+ id: string
+ /** @description Service instance identifier of the node */
+ serviceInstanceID: string
+ /** @description Identifier of the cluster */
+ clusterID: string
+ machineInfo: components['schemas']['MachineInfo']
+ status: components['schemas']['NodeStatus']
+ /**
+ * Format: uint32
+ * @description Number of sandboxes running on the node
+ */
+ sandboxCount: number
+ metrics: components['schemas']['NodeMetrics']
+ /**
+ * Format: uint64
+ * @description Number of sandbox create successes
+ */
+ createSuccesses: number
+ /**
+ * Format: uint64
+ * @description Number of sandbox create fails
+ */
+ createFails: number
+ /**
+ * Format: int
+ * @description Number of starting Sandboxes
+ */
+ sandboxStartingCount: number
+ }
+ NodeDetail: {
+ /** @description Identifier of the cluster */
+ clusterID: string
+ /** @description Version of the orchestrator */
+ version: string
+ /** @description Commit of the orchestrator */
+ commit: string
+ /** @description Identifier of the node */
+ id: string
+ /** @description Service instance identifier of the node */
+ serviceInstanceID: string
+ /**
+ * @deprecated
+ * @description Identifier of the nomad node
+ */
+ nodeID: string
+ machineInfo: components['schemas']['MachineInfo']
+ status: components['schemas']['NodeStatus']
+ /** @description List of sandboxes running on the node */
+ sandboxes: components['schemas']['ListedSandbox'][]
+ 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
+ }
+ 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
+ }
+ }
+ responses: {
+ /** @description Bad request */
+ 400: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Error']
+ }
+ }
+ /** @description Authentication error */
+ 401: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Error']
+ }
+ }
+ /** @description Forbidden */
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Error']
+ }
+ }
+ /** @description Not found */
+ 404: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Error']
+ }
+ }
+ /** @description Conflict */
+ 409: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Error']
+ }
+ }
+ /** @description Server error */
+ 500: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['Error']
+ }
+ }
+ }
+ parameters: {
+ templateID: string
+ buildID: string
+ sandboxID: string
+ teamID: string
+ nodeID: string
+ apiKeyID: string
+ accessTokenID: string
+ /** @description Maximum number of items to return per page */
+ paginationLimit: number
+ /** @description Cursor to start the list from */
+ paginationNextToken: string
+ }
+ 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/ui/chart-placeholder.tsx b/src/ui/chart-placeholder.tsx
index 54d4e2bc2..7581b8340 100644
--- a/src/ui/chart-placeholder.tsx
+++ b/src/ui/chart-placeholder.tsx
@@ -1,4 +1,4 @@
-"use client"
+'use client'
import { cn } from '@/lib/utils'
import {
diff --git a/src/ui/time-input.tsx b/src/ui/time-input.tsx
index 7993fcc32..0298ca367 100644
--- a/src/ui/time-input.tsx
+++ b/src/ui/time-input.tsx
@@ -183,85 +183,85 @@ export const TimeInput = memo(function TimeInput({
{!hideTime && (
-
-
setDisplayTime(e.target.value)}
- onBlur={() => onTimeChange(displayTime)}
- placeholder="HH:MM:SS"
- disabled={disabled}
- className={cn(
- 'pr-10 h-10 w-full bg-transparent',
- 'placeholder:prose-label'
- )}
- />
-
-
- {getTimezoneIdentifier()}
-
+
+
setDisplayTime(e.target.value)}
+ onBlur={() => onTimeChange(displayTime)}
+ placeholder="HH:MM:SS"
+ disabled={disabled}
+ className={cn(
+ 'pr-10 h-10 w-full bg-transparent',
+ 'placeholder:prose-label'
+ )}
+ />
+
+
+ {getTimezoneIdentifier()}
+
-
-
-
-
-
-
-
-
-
-
- Hours
- handleTimeChange('hours', value)}
- min={0}
- max={23}
- step={1}
- disabled={disabled}
- inputClassName="h-8 w-11 text-center border-r-0"
- buttonClassName="h-[1rem]"
- />
-
-
- Minutes
- handleTimeChange('minutes', value)}
- min={0}
- max={59}
- step={1}
- disabled={disabled}
- inputClassName="h-8 w-11 text-center border-r-0"
- buttonClassName="h-[1rem]"
- />
-
-
-
Seconds
-
handleTimeChange('seconds', value)}
- min={0}
- max={59}
- step={1}
- disabled={disabled}
- inputClassName="h-8 w-11 text-center"
- buttonClassName="h-[1rem]"
- />
+
+
+
+
+
-
-
+
+
+
+ Hours
+ handleTimeChange('hours', value)}
+ min={0}
+ max={23}
+ step={1}
+ disabled={disabled}
+ inputClassName="h-8 w-11 text-center border-r-0"
+ buttonClassName="h-[1rem]"
+ />
+
+
+ Minutes
+ handleTimeChange('minutes', value)}
+ min={0}
+ max={59}
+ step={1}
+ disabled={disabled}
+ inputClassName="h-8 w-11 text-center border-r-0"
+ buttonClassName="h-[1rem]"
+ />
+
+
+ Seconds
+ handleTimeChange('seconds', value)}
+ min={0}
+ max={59}
+ step={1}
+ disabled={disabled}
+ inputClassName="h-8 w-11 text-center"
+ buttonClassName="h-[1rem]"
+ />
+
+
+
+
)}
)