From e7f2e744d25776c6ceef110db4d4f8030266e0d2 Mon Sep 17 00:00:00 2001 From: Xitee <59659167+Xitee1@users.noreply.github.com> Date: Sat, 11 Jul 2026 20:53:52 +0200 Subject: [PATCH 1/8] =?UTF-8?q?feat!:=20Arcane=20v2=20support=20(v2.3.2)?= =?UTF-8?q?=20=E2=80=94=20endpoints,=20payloads,=20and=20tool=20set=20foll?= =?UTF-8?q?ow=20the=20new=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Refresh OpenAPI spec + generated types from v1.17.0 to v2.3.2 - Remove tools whose endpoints were dropped in v2: dashboard action items, event create, updater single-container update, the three Apprise tools, and swarm service logs (WebSocket-only in v2); add notification delete (180 → 174 tools) - Rebuild notifications on the per-provider model (discord/email/telegram/…) - Vulnerabilities: new scan-result/list paths, ignore payload (pkgName), unignore via ignore-entry ID, v2 field names throughout - Image updates: GET check with imageRef, check-batch with imageRefs, map-shaped batch responses, new summary fields - System: docker/info path + native Docker fields, per-resource prune body with modes (+ buildCache option), image prune mode/dangling - Moved paths: project destroy (body via DELETE), volume backup delete/files, env-scoped template variables + public settings, /deployment snippets - Updater/events/users follow v2 response shapes; auth unwraps {success, data} - Update docs, skill, /arcane:configure, prompts, CI smoke check, tests Co-Authored-By: Claude Fable 5 --- .claude-plugin/marketplace.json | 4 +- .claude-plugin/plugin.json | 4 +- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 34 + CLAUDE.md | 6 +- README.md | 35 +- _docs/arcane_api_docs.json | 2 +- _docs/arcane_api_docs.yaml | 21590 ++++++++++------ commands/configure.md | 8 +- package-lock.json | 4 +- package.json | 2 +- skills/arcane-mcp-server/SKILL.md | 12 +- .../integration/tool-filtering.test.ts | 6 +- src/auth/auth-manager.ts | 12 +- src/client/arcane-client.ts | 4 +- src/prompts/__tests__/prompts.test.ts | 2 +- src/prompts/index.ts | 8 +- src/resources/__tests__/resources.test.ts | 2 +- src/resources/index.ts | 2 +- src/tools/__tests__/dashboard-tools.test.ts | 47 +- src/tools/build-tools.ts | 33 +- src/tools/dashboard-tools.ts | 39 +- src/tools/environment-tools.ts | 47 +- src/tools/event-tools.ts | 49 +- src/tools/image-tools.ts | 53 +- src/tools/image-update-tools.ts | 93 +- src/tools/notification-tools.ts | 215 +- src/tools/project-tools.ts | 9 +- src/tools/settings-tools.ts | 35 +- src/tools/swarm-tools.ts | 29 - src/tools/system-tools.ts | 89 +- src/tools/template-tools.ts | 21 +- src/tools/updater-tools.ts | 80 +- src/tools/user-tools.ts | 36 +- src/tools/volume-tools.ts | 30 +- src/tools/vulnerability-tools.ts | 149 +- src/types/arcane-types.ts | 125 +- src/types/generated/arcane-api.ts | 7748 ++++-- 38 files changed, 19388 insertions(+), 11278 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 8d34533..d8a6855 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -8,8 +8,8 @@ { "name": "arcane-mcp-server", "source": ".", - "description": "Docker infrastructure management with 180+ MCP tools, workflow guidance, and safety guardrails", - "version": "2.1.0", + "description": "Docker infrastructure management with 170+ MCP tools, workflow guidance, and safety guardrails", + "version": "3.0.0", "keywords": ["docker", "containers", "infrastructure", "devops", "compose", "swarm"] } ] diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 347916f..7907588 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "arcane-mcp-server", - "version": "2.1.0", - "description": "Docker infrastructure management with 180+ MCP tools, workflow guidance, and safety guardrails. Connects to the Arcane Docker Management platform.", + "version": "3.0.0", + "description": "Docker infrastructure management with 170+ MCP tools, workflow guidance, and safety guardrails. Connects to the Arcane Docker Management platform.", "author": "RandomSynergy", "license": "MIT", "homepage": "https://github.com/RandomSynergy17/Arcane-MCP-Server", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b856f5a..36c7ad6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: # so we count those instead of the former `server.registerTool(`. TOTAL=$(grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}') echo "Found $TOTAL tool registrations" - if [ "$TOTAL" -lt 180 ]; then echo "FAIL: Expected 180+"; exit 1; fi + if [ "$TOTAL" -lt 174 ]; then echo "FAIL: Expected 174+"; exit 1; fi - name: Audit production dependencies run: npm audit --audit-level=high --omit=dev diff --git a/CHANGELOG.md b/CHANGELOG.md index 88ad03b..6a865d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,40 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.0.0] - 2026-07-11 + +Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec refreshed from v1.17.0). Tool count changes from 180 to **174**. No v1 compatibility shims — installs running Arcane v1.x should stay on `2.x` of this server. + +### Removed (endpoints gone in Arcane v2) +- `arcane_dashboard_get_action_items` — `/dashboard/action-items` no longer exists. +- `arcane_event_create` — `POST /events` no longer exists. +- `arcane_updater_update_container` — `/updater/containers/{id}` was dropped; use `arcane_container_update` instead. +- `arcane_notification_apprise_get` / `arcane_notification_apprise_update` / `arcane_notification_apprise_test` — Apprise config was replaced by the per-provider notification model. +- `arcane_swarm_get_service_logs` — v2 streams all logs over WebSocket only (no REST endpoint). + +### Added +- `arcane_notification_delete_settings` — delete a provider's notification settings (`DELETE /notifications/settings/{provider}`). + +### Changed (breaking, follows Arcane v2 API) +- **Notifications** rebuilt on the provider model (`discord`, `email`, `telegram`, `signal`, `slack`, `ntfy`, `pushover`, `matrix`, `generic`): `get_settings` lists providers (or one via `provider`), `update_settings` takes `provider` + `enabled` + `config`, `test` now requires a `provider`. +- **Vulnerabilities**: scan result moved to `GET .../images/{id}/vulnerabilities` (list moved to `/vulnerabilities/list`); `ignore` is now `POST /vulnerabilities/ignore` and requires `pkgName`; `unignore` takes the ignore-entry ID (shown by `list_ignored`); all displays use the v2 field names (`vulnerabilityId`, `pkgName`, severity summary object). +- **Image updates**: check endpoints return `hasUpdate`/`currentVersion`/`latestVersion`; batch check uses `POST /image-updates/check-batch` with `imageRefs` (was `check-multiple` + `imageIds`); batch/check-all responses are keyed by image reference; summary reports `imagesWithUpdates`/`digestUpdates`/`errorsCount`. +- **Updater**: `run` supports `forceUpdate` and `resourceIds`; result shape follows v2 (`checked`/`items` with resource-level results); `status` now reports in-flight container/project updates; history uses `AutoUpdateRecord` (resource + old/new image version maps). +- **System**: docker info moved to `/system/docker/info` and returns Docker's native (PascalCase) fields; `system prune` sends the v2 per-resource body (`{containers, images, networks, volumes, buildCache}` with `mode`) and gained a `buildCache` option; image prune sends `mode`/`dangling` and reads the wrapped response. +- **Projects**: destroy moved to `DELETE /projects/{id}/destroy` (body `removeVolumes`/`removeFiles`, new `removeFiles` param). +- **Volume backups**: delete and file listing are no longer volume-scoped (`/volumes/backups/{backupId}[/files]`); backups no longer expose a `filename`; file listing returns plain paths. +- **Templates**: global variables moved to `/environments/{id}/templates/variables` (now requires `environmentId`; PUT sends a `{key, value}` list). +- **Users**: `role` was removed from create/update (v2 uses role assignments); tools accept `displayName`/`email`/`password` and display `isGlobalAdmin`. +- **Settings**: environment settings return a key/value list; public settings are environment-scoped now (`environmentId` required). +- **Events**: list filters by `severity` instead of `resourceType`; display uses `title`/`description`/`severity` (v2 dropped `message`). +- **Environments**: deployment snippets moved to `/environments/{id}/deployment` (`dockerRun` field). +- **Builds**: `arcane_build_image` follows the v2 `BuildRequest` (`contextDir` required, `dockerfileInline` for inline content, `tags`/`platforms` arrays, `noCache`); Git-URL builds were dropped by the API. +- **Auth**: login/refresh responses are unwrapped from the `{success, data}` envelope. +- `ArcaneClient.delete()` accepts an optional JSON body (needed for `projects/{id}/destroy`). +- OpenAPI spec (`_docs/arcane_api_docs.{json,yaml}`) and generated types refreshed to v2.3.2. + +--- + ## [2.1.0] - 2026-04-19 ### Added diff --git a/CLAUDE.md b/CLAUDE.md index 20fcbcc..94bf20c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ # Arcane MCP Server -MCP server for Docker management via the Arcane platform. 180 tools, 2 resources, 4 prompts, companion skill, Claude Code plugin. +MCP server for Docker management via the Arcane platform. 174 tools, 2 resources, 4 prompts, companion skill, Claude Code plugin. **Not affiliated with the Arcane project.** @@ -25,7 +25,7 @@ npm run update-api-spec # Refresh OpenAPI spec from live instance - `src/config.ts` — Config from env vars > config file > defaults - `src/constants.ts` — All shared constants (timeouts, limits, versions) -### Tools (180 across 25 modules in `src/tools/`) +### Tools (174 across 25 modules in `src/tools/`) All tools use `server.registerTool()` with: - `title` — human-readable name @@ -41,7 +41,7 @@ All tools use `server.registerTool()` with: 3. Classify annotations: list/get = readOnly, delete/prune = destructive, external calls = openWorld 4. Use `toolHandler()` wrapper — return a plain string, it handles the MCP response envelope 5. Register in `src/tools/index.ts` -6. Verify: `npm run build && grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}'` (expect 180) +6. Verify: `npm run build && grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}'` (expect 174) ### Resources & Prompts diff --git a/README.md b/README.md index 394d782..89de592 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

Manage your entire Docker infrastructure through natural language.
- 180 tools. One MCP server. Zero context switching. + 174 tools. One MCP server. Zero context switching.

@@ -21,7 +21,7 @@ Tool FilteringWhat Can It DoCompanion Skill • - All Tools • + All ToolsInteractive Installer

@@ -35,7 +35,7 @@ Arcane MCP Server is a complete AI-powered Docker management bundle — an **MCP server**, a **Claude Code plugin**, and a **companion skill**, all in one package. -- The **MCP server** gives your AI assistant 180 tools to control your [Arcane](https://github.com/getarcaneapp/arcane) Docker platform — containers, images, stacks, Swarm clusters, security scans, and more. Filter that set down to a preset ([see Tool Filtering](#tool-filtering)) if all 180 is more than your context window can spare. +- The **MCP server** gives your AI assistant 174 tools to control your [Arcane](https://github.com/getarcaneapp/arcane) Docker platform — containers, images, stacks, Swarm clusters, security scans, and more. Filter that set down to a preset ([see Tool Filtering](#tool-filtering)) if all 174 is more than your context window can spare. - The **plugin** wraps everything into a single install with guided configuration — no manual env vars or config files. - The **companion skill** teaches your AI *how* to use those tools — safe deployment workflows, troubleshooting patterns, and guardrails so it doesn't accidentally nuke your volumes. @@ -67,11 +67,11 @@ Every tool carries **safety annotations** so your AI knows which operations are --- -> **🆕 Recent update — v2.1:** Tool filtering is here. All 180 tools in one turn eats your context window, so you can now pick a preset and ship only what you need. [Details below](#tool-filtering). +> **🆕 Recent update — v3.0:** Full **Arcane v2** support (tested against v2.3.2). Endpoints, payloads, and tool set follow the new API — if you are still on Arcane v1.x, stay on server `2.x`. Breaking changes are listed in the [CHANGELOG](CHANGELOG.md). ## Tool Filtering -Exposing all 180 tools to Claude every turn chews through your context window. Pick a **preset** to trim the active tool set — only the tools in that preset appear in `tools/list`: +Exposing all 174 tools to Claude every turn chews through your context window. Pick a **preset** to trim the active tool set — only the tools in that preset appear in `tools/list`: | Preset | Scope | Tools | |---|---|---| @@ -79,7 +79,7 @@ Exposing all 180 tools to Claude every turn chews through your context window. P | `read-only` | every `*_list` / `*_get` / `*_inspect` / `*_stats` across all modules | ~60 | | `minimal` | dashboard + container list / get / counts | 5 | | `deploy` | projects, gitops, templates, registries, environments, build | ~40 | -| `full` *(default if never configured)* | everything | 180 | +| `full` *(default if never configured)* | everything | 174 | | `custom` | your own module + per-tool picks | variable | **Configure interactively** in Claude Code: @@ -232,7 +232,7 @@ rm -rf /tmp/arcane ### What the skill teaches Claude: -**Intent mapping** — When you say "what's broken?", Claude knows to call `arcane_dashboard_get` + `arcane_dashboard_get_action_items` instead of listing every container one by one. +**Intent mapping** — When you say "what's broken?", Claude knows to call `arcane_dashboard_get` and drill into recent events instead of listing every container one by one. **Safety guardrails** — Before running `arcane_volume_prune`, Claude will suggest `arcane_volume_backup_create` first. Before `arcane_updater_run`, it'll do a dry run. Before `arcane_project_destroy`, it confirms twice. @@ -271,7 +271,7 @@ And a Claude Code slash command: --- -## All 180 Tools +## All 174 Tools ### Containers (11) @@ -289,7 +289,7 @@ And a Claude Code slash command: | `arcane_container_delete` | Delete a container | | `arcane_container_get_counts` | Get running/stopped counts | -### Docker Swarm (11) +### Docker Swarm (10) | Tool | Description | |------|-------------| @@ -299,7 +299,6 @@ And a Claude Code slash command: | `arcane_swarm_update_service` | Update service configuration | | `arcane_swarm_delete_service` | Delete a swarm service | | `arcane_swarm_scale_service` | Scale service replicas | -| `arcane_swarm_get_service_logs` | Get service logs | | `arcane_swarm_init_cluster` | Initialize a new swarm cluster | | `arcane_swarm_join_cluster` | Join an existing cluster | | `arcane_swarm_leave_cluster` | Leave the swarm cluster | @@ -355,7 +354,7 @@ And a Claude Code slash command: | `arcane_image_get_update_summary` | Get update summary | | `arcane_image_update_check` | Check update by reference | | `arcane_image_update_check_by_id` | Check update by ID | -| `arcane_image_update_check_multiple` | Batch check | +| `arcane_image_update_check_multiple` | Batch check by image reference | | `arcane_image_update_check_all` | Check all for updates | | `arcane_image_update_get_summary` | Get update summary | | `arcane_build_image` | Build from Dockerfile or Git URL | @@ -396,7 +395,7 @@ And a Claude Code slash command:
-GitOps, Webhooks, Auto-Updater & Dashboard (23 tools) +GitOps, Webhooks, Auto-Updater & Dashboard (21 tools) | Tool | Description | |------|-------------| @@ -418,15 +417,13 @@ And a Claude Code slash command: | `arcane_webhook_update` | Update a webhook | | `arcane_webhook_delete` | Delete a webhook | | `arcane_updater_run` | Run auto-updater (dry run supported) | -| `arcane_updater_update_container` | Update single container | | `arcane_updater_get_status` | Get updater schedule | | `arcane_updater_get_history` | Get update history | | `arcane_dashboard_get` | Get dashboard snapshot | -| `arcane_dashboard_get_action_items` | Get action items |
-Environments, Registries, Auth & More (69 tools) +Environments, Registries, Auth & More (66 tools) | Category | Tools | What it covers | |----------|-------|----------------| @@ -434,8 +431,8 @@ And a Claude Code slash command: | **Container Registries** | 7 | Docker Hub, GHCR, ECR, GCR, ACR. Create, update, delete, test, sync registries | | **Templates** | 8 | Docker Compose templates with variables. Browse, create, download, manage | | **Jobs** | 4 | Scheduled tasks. List jobs, get schedules, run on demand | -| **Notifications** | 6 | Alert configuration via Apprise. Get/set settings, test notifications | -| **Events** | 4 | Activity tracking. List events by environment, create, delete | +| **Notifications** | 4 | Alert configuration per provider (Discord, email, Telegram, Slack, ntfy, …). Get/set/delete settings, test notifications | +| **Events** | 3 | Activity tracking. List events globally or by environment, delete | | **Users** | 5 | User management. List, create, update, delete users | | **Settings** | 8 | Server configuration and API key management | | **Authentication** | 8 | Login, logout, JWT token management, OIDC device flow | @@ -515,14 +512,14 @@ src/ arcane-client.ts # HTTP client (retry, SSL, size limits) auth/ auth-manager.ts # JWT auto-refresh + API key auth - tools/ # 25 modules, 180 tools + tools/ # 25 modules, 174 tools registry.ts # ToolRegistry — captures RegisteredTool handles, applies filter presets.ts # commonly-used / read-only / minimal / deploy / full / custom resources/ # 4 MCP Resources prompts/ # 5 MCP Prompts types/ arcane-types.ts # Shared interfaces (33 types) - generated/ # Auto-generated from OpenAPI v1.17.0 + generated/ # Auto-generated from OpenAPI v2.3.2 utils/ tool-helpers.ts # registerTool wrapper with isError handling config-watcher.ts # debounced fs.watch on ~/.arcane/config.json → hot reload diff --git a/_docs/arcane_api_docs.json b/_docs/arcane_api_docs.json index 50caefe..a6f9894 100644 --- a/_docs/arcane_api_docs.json +++ b/_docs/arcane_api_docs.json @@ -1 +1 @@ -{"components":{"schemas":{"ApiKeyPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ApiKeyPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ApikeyApiKey"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ApiResponseStruct {}DataStruct":{"additionalProperties":false,"type":"object"},"ApikeyApiKey":{"additionalProperties":false,"properties":{"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"description":{"description":"Description of the API key","type":"string"},"expiresAt":{"description":"Expiration date of the API key","format":"date-time","type":"string"},"id":{"description":"Unique identifier of the API key","type":"string"},"isStatic":{"description":"Whether the API key is environment-managed and protected from deletion","type":"boolean"},"keyPrefix":{"description":"Prefix of the API key for identification","type":"string"},"lastUsedAt":{"description":"Last time the API key was used","format":"date-time","type":"string"},"name":{"description":"Name of the API key","type":"string"},"updatedAt":{"description":"Last update timestamp","format":"date-time","type":"string"},"userId":{"description":"ID of the user who owns the API key","type":"string"}},"required":["id","name","keyPrefix","userId","isStatic","createdAt"],"type":"object"},"ApikeyApiKeyCreatedDto":{"additionalProperties":false,"properties":{"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"description":{"description":"Description of the API key","type":"string"},"expiresAt":{"description":"Expiration date of the API key","format":"date-time","type":"string"},"id":{"description":"Unique identifier of the API key","type":"string"},"isStatic":{"description":"Whether the API key is environment-managed and protected from deletion","type":"boolean"},"key":{"description":"The full API key secret (only shown once)","type":"string"},"keyPrefix":{"description":"Prefix of the API key for identification","type":"string"},"lastUsedAt":{"description":"Last time the API key was used","format":"date-time","type":"string"},"name":{"description":"Name of the API key","type":"string"},"updatedAt":{"description":"Last update timestamp","format":"date-time","type":"string"},"userId":{"description":"ID of the user who owns the API key","type":"string"}},"required":["key","id","name","keyPrefix","userId","isStatic","createdAt"],"type":"object"},"ApikeyCreateApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyCreateApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"description":"Optional description of the API key","maxLength":1000,"type":"string"},"expiresAt":{"description":"Optional expiration date for the API key","format":"date-time","type":"string"},"name":{"description":"Name of the API key","examples":["My API Key"],"maxLength":255,"minLength":1,"type":"string"}},"required":["name"],"type":"object"},"ApikeyUpdateApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyUpdateApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"description":"New description for the API key","maxLength":1000,"type":"string"},"expiresAt":{"description":"New expiration date for the API key","format":"date-time","type":"string"},"name":{"description":"New name for the API key","maxLength":255,"type":"string"}},"type":"object"},"AuthLogin":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthLogin.json"],"format":"uri","readOnly":true,"type":"string"},"password":{"description":"Password of the user","minLength":1,"type":"string"},"username":{"description":"Username of the user","examples":["admin"],"maxLength":255,"minLength":1,"type":"string"}},"required":["username","password"],"type":"object"},"AuthLoginResponse":{"additionalProperties":false,"properties":{"expiresAt":{"description":"Expiration time of the access token","format":"date-time","type":"string"},"refreshToken":{"description":"Refresh token for obtaining new access tokens","type":"string"},"token":{"description":"JWT access token","type":"string"},"user":{"$ref":"#/components/schemas/UserUser","description":"Authenticated user information"}},"required":["token","refreshToken","expiresAt","user"],"type":"object"},"AuthOidcAuthUrlRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcAuthUrlRequest.json"],"format":"uri","readOnly":true,"type":"string"},"redirectUri":{"type":"string"}},"required":["redirectUri"],"type":"object"},"AuthOidcAuthUrlResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcAuthUrlResponse.json"],"format":"uri","readOnly":true,"type":"string"},"authUrl":{"type":"string"}},"required":["authUrl"],"type":"object"},"AuthOidcCallbackRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcCallbackRequest.json"],"format":"uri","readOnly":true,"type":"string"},"code":{"type":"string"},"state":{"type":"string"}},"required":["code","state"],"type":"object"},"AuthOidcCallbackResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcCallbackResponse.json"],"format":"uri","readOnly":true,"type":"string"},"expiresAt":{"format":"date-time","type":"string"},"refreshToken":{"type":"string"},"success":{"type":"boolean"},"token":{"type":"string"},"user":{"$ref":"#/components/schemas/UserUser"}},"required":["success","token","refreshToken","expiresAt","user"],"type":"object"},"AuthOidcConfigResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcConfigResponse.json"],"format":"uri","readOnly":true,"type":"string"},"authorizationEndpoint":{"type":"string"},"clientId":{"type":"string"},"deviceAuthorizationEndpoint":{"type":"string"},"issuerUrl":{"type":"string"},"redirectUri":{"type":"string"},"scopes":{"type":"string"},"tokenEndpoint":{"type":"string"},"userinfoEndpoint":{"type":"string"}},"required":["clientId","redirectUri","issuerUrl","authorizationEndpoint","tokenEndpoint","userinfoEndpoint","scopes"],"type":"object"},"AuthOidcDeviceAuthResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceAuthResponse.json"],"format":"uri","readOnly":true,"type":"string"},"deviceCode":{"type":"string"},"expiresIn":{"format":"int64","type":"integer"},"interval":{"format":"int64","type":"integer"},"userCode":{"type":"string"},"verificationUri":{"type":"string"},"verificationUriComplete":{"type":"string"}},"required":["deviceCode","userCode","verificationUri","expiresIn"],"type":"object"},"AuthOidcDeviceTokenRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceTokenRequest.json"],"format":"uri","readOnly":true,"type":"string"},"deviceCode":{"type":"string"}},"required":["deviceCode"],"type":"object"},"AuthOidcDeviceTokenResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceTokenResponse.json"],"format":"uri","readOnly":true,"type":"string"},"expiresAt":{"format":"date-time","type":"string"},"refreshToken":{"type":"string"},"success":{"type":"boolean"},"token":{"type":"string"},"user":{"$ref":"#/components/schemas/UserUser"}},"required":["success","token","refreshToken","expiresAt","user"],"type":"object"},"AuthOidcStatusInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcStatusInfo.json"],"format":"uri","readOnly":true,"type":"string"},"envConfigured":{"type":"boolean"},"envForced":{"type":"boolean"},"mergeAccounts":{"type":"boolean"},"providerLogoUrl":{"type":"string"},"providerName":{"type":"string"}},"required":["envForced","envConfigured","mergeAccounts"],"type":"object"},"AuthPasswordChange":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthPasswordChange.json"],"format":"uri","readOnly":true,"type":"string"},"currentPassword":{"description":"Current password of the user (required for non-OIDC users)","type":"string"},"newPassword":{"description":"New password for the user","minLength":8,"type":"string"}},"required":["newPassword"],"type":"object"},"AuthRefresh":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthRefresh.json"],"format":"uri","readOnly":true,"type":"string"},"refreshToken":{"description":"Refresh token used to obtain a new access token","minLength":1,"type":"string"}},"required":["refreshToken"],"type":"object"},"AuthTokenRefreshResponse":{"additionalProperties":false,"properties":{"expiresAt":{"description":"Expiration time of the new access token","format":"date-time","type":"string"},"refreshToken":{"description":"New refresh token","type":"string"},"token":{"description":"New JWT access token","type":"string"}},"required":["token","refreshToken","expiresAt"],"type":"object"},"AutoUpdateRecord":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"details":{"additionalProperties":{},"type":"object"},"endTime":{"format":"date-time","type":"string"},"error":{"type":"string"},"id":{"type":"string"},"newImageVersions":{"additionalProperties":{},"type":"object"},"oldImageVersions":{"additionalProperties":{},"type":"object"},"resourceId":{"type":"string"},"resourceName":{"type":"string"},"resourceType":{"type":"string"},"startTime":{"format":"date-time","type":"string"},"status":{"type":"string"},"updateApplied":{"type":"boolean"},"updateAvailable":{"type":"boolean"},"updatedAt":{"format":"date-time","type":"string"}},"required":["resourceId","resourceType","resourceName","status","startTime","updateAvailable","updateApplied","id","createdAt"],"type":"object"},"BackupHasPathResponse":{"additionalProperties":false,"properties":{"exists":{"type":"boolean"}},"required":["exists"],"type":"object"},"BaseApiResponseActionItems":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActionItems.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/DashboardActionItems","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseActionResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActionResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerActionResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseAgentPairResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseAgentPairResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EnvironmentAgentPairResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ApikeyApiKey","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseApiKeyCreatedDto":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseApiKeyCreatedDto.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ApikeyApiKeyCreatedDto","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBackupHasPathResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBackupHasPathResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BackupHasPathResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBatchResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBatchResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"additionalProperties":{"$ref":"#/components/schemas/ImageupdateResponse"},"description":"Response data","type":"object"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBranchesResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBranchesResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsBranchesResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBrowseResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBrowseResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsBrowseResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBuildFileContentResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBuildFileContentResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BuildFileContentResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBuildRecord":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBuildRecord.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageBuildRecord","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseConfig":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseConfig.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/JobscheduleConfig","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseConfigSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseConfigSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmConfigSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseContainerRegistry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseContainerRegistry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerregistryContainerRegistry","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseCreateReponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCreateReponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ProjectCreateReponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseCreated":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCreated.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/WebhookCreated","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDefaultTemplatesResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDefaultTemplatesResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateDefaultTemplatesResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDeploymentSnippet":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDeploymentSnippet.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/DeploymentSnippet","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDetailSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetailSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageDetailSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDetails":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetails.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ProjectDetails","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseEnvironment":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironment.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EnvironmentEnvironment","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseEnvironmentVulnerabilitySummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentVulnerabilitySummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityEnvironmentVulnerabilitySummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseEnvironmentWithApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentWithApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EnvironmentWithApiKey","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseEvent":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEvent.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EventEvent","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseFileContentResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseFileContentResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/FileContentResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseGitOpsSync":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseGitOpsSync.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsGitOpsSync","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseGitRepository":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseGitRepository.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsGitRepository","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseIgnoredVulnerability":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseIgnoredVulnerability.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityIgnoredVulnerability","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseImportGitOpsSyncResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseImportGitOpsSyncResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsImportGitOpsSyncResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseInfo.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VersionInfo","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseInterface {}":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseInterface {}.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListAutoUpdateRecord":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListAutoUpdateRecord.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/AutoUpdateRecord"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListConfigSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListConfigSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/SwarmConfigSummary"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListFileEntry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListFileEntry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/VolumeFileEntry"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListSecretSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSecretSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/SwarmSecretSummary"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListSettingDto":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSettingDto.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/SettingsSettingDto"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListString":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListString.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"type":"string"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/WebhookSummary"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListTemplate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListTemplate.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/TemplateTemplate"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListTemplateRegistry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListTemplateRegistry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/TemplateTemplateRegistry"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListVariable":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListVariable.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/EnvVariable"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListVolumeSizeInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListVolumeSizeInfo.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/VolumeSizeInfo"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseLoadResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseLoadResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageLoadResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseLoginResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseLoginResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/AuthLoginResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseMessageResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseMessageResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseNodeSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseNodeSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmNodeSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponsePruneAllResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePruneAllResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SystemPruneAllResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponsePruneReport":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePruneReport.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImagePruneReport","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseRemoteRegistry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRemoteRegistry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateRemoteRegistry","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageupdateResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/UpdaterResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseRuntimeStatus":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRuntimeStatus.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmRuntimeStatus","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseScanResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityScanResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseScanSummariesResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanSummariesResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityScanSummariesResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseScanSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityScanSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseScannerStatus":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScannerStatus.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ScannerStatus","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSecretSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSecretSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSecretSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseServiceCreateResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceCreateResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmServiceCreateResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseServiceInspect":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceInspect.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmServiceInspect","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseServiceUpdateResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceUpdateResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmServiceUpdateResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSnapshot":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSnapshot.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/DashboardSnapshot","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStackDeployResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackDeployResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmStackDeployResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStackInspect":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackInspect.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmStackInspect","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStackRenderConfigResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackRenderConfigResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmStackRenderConfigResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStackSource":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackSource.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmStackSource","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStatus":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStatus.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/UpdaterStatus","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStatusCounts":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStatusCounts.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ProjectStatusCounts","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStruct {}":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStruct {}.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ApiResponseStruct {}DataStruct","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageupdateSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmInfo.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSwarmInfo","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmInitResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmInitResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSwarmInitResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmJoinTokensResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmJoinTokensResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSwarmJoinTokensResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmNodeAgentDeployment":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmNodeAgentDeployment.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmNodeAgentDeployment","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmNodeIdentity":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmNodeIdentity.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmNodeIdentity","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmUnlockKeyResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmUnlockKeyResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSwarmUnlockKeyResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSyncResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSyncResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsSyncResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSyncStatus":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSyncStatus.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsSyncStatus","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTemplate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplate.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateTemplate","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTemplateContent":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplateContent.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateTemplateContent","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTemplateRegistry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplateRegistry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateTemplateRegistry","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTest.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EnvironmentTest","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTokenRefreshResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTokenRefreshResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/AuthTokenRefreshResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseUser":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseUser.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/UserUser","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolume":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolume.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumeVolume","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolumeBackup":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeBackup.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumeBackup","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolumePruneReportData":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumePruneReportData.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumePruneReportData","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolumeUsageCountsData":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeUsageCountsData.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumeUsageCountsData","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolumeUsageResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeUsageResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumeUsageResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseMessageResponse":{"additionalProperties":false,"properties":{"message":{"description":"Response message","type":"string"}},"required":["message"],"type":"object"},"BasePaginatedIgnoredVulnerability":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedIgnoredVulnerability.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Array of items for the current page","items":{"$ref":"#/components/schemas/VulnerabilityIgnoredVulnerability"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse","description":"Pagination metadata"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"BasePaginatedVulnerability":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedVulnerability.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Array of items for the current page","items":{"$ref":"#/components/schemas/VulnerabilityVulnerability"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse","description":"Pagination metadata"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"BasePaginatedVulnerabilityWithImage":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedVulnerabilityWithImage.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Array of items for the current page","items":{"$ref":"#/components/schemas/VulnerabilityVulnerabilityWithImage"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse","description":"Pagination metadata"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"BasePaginationResponse":{"additionalProperties":false,"properties":{"currentPage":{"description":"Current page number (1-indexed)","format":"int64","type":"integer"},"grandTotalItems":{"description":"Total number of items without filters","format":"int64","type":"integer"},"itemsPerPage":{"description":"Number of items per page","format":"int64","type":"integer"},"totalItems":{"description":"Total number of items in the current filtered set","format":"int64","type":"integer"},"totalPages":{"description":"Total number of pages","format":"int64","type":"integer"}},"required":["totalPages","totalItems","currentPage","itemsPerPage"],"type":"object"},"BlkioConfig":{"additionalProperties":false,"properties":{"device_read_bps":{"items":{"$ref":"#/components/schemas/DockerTypesThrottleDevice"},"type":["array","null"]},"device_read_iops":{"items":{"$ref":"#/components/schemas/DockerTypesThrottleDevice"},"type":["array","null"]},"device_write_bps":{"items":{"$ref":"#/components/schemas/DockerTypesThrottleDevice"},"type":["array","null"]},"device_write_iops":{"items":{"$ref":"#/components/schemas/DockerTypesThrottleDevice"},"type":["array","null"]},"weight":{"format":"int32","minimum":0,"type":"integer"},"weight_device":{"items":{"$ref":"#/components/schemas/DockerTypesWeightDevice"},"type":["array","null"]}},"type":"object"},"BuildConfig":{"additionalProperties":false,"properties":{"additional_contexts":{"additionalProperties":{"type":"string"},"type":"object"},"args":{"additionalProperties":{"type":["string","null"]},"type":"object"},"cache_from":{"items":{"type":"string"},"type":["array","null"]},"cache_to":{"items":{"type":"string"},"type":["array","null"]},"context":{"type":"string"},"dockerfile":{"type":"string"},"dockerfile_inline":{"type":"string"},"entitlements":{"items":{"type":"string"},"type":["array","null"]},"extra_hosts":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"},"isolation":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"network":{"type":"string"},"no_cache":{"type":"boolean"},"no_cache_filter":{"items":{"type":"string"},"type":["array","null"]},"platforms":{"items":{"type":"string"},"type":["array","null"]},"privileged":{"type":"boolean"},"provenance":{"type":"string"},"pull":{"type":"boolean"},"sbom":{"type":"string"},"secrets":{"items":{"$ref":"#/components/schemas/DockerTypesServiceSecretConfig"},"type":["array","null"]},"shm_size":{"format":"int64","type":"integer"},"ssh":{"items":{"$ref":"#/components/schemas/DockerTypesSSHKey"},"type":["array","null"]},"tags":{"items":{"type":"string"},"type":["array","null"]},"target":{"type":"string"},"ulimits":{"additionalProperties":{"$ref":"#/components/schemas/UlimitsConfig"},"type":"object"}},"type":"object"},"BuildFileContentResponse":{"additionalProperties":false,"properties":{"content":{"contentEncoding":"base64","type":"string"},"mimeType":{"type":"string"}},"required":["content","mimeType"],"type":"object"},"BuildProjectInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BuildProjectInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"load":{"description":"Load images into Docker","type":"boolean"},"provider":{"description":"Build provider override","type":"string"},"push":{"description":"Push images","type":"boolean"},"services":{"description":"Service names to build","items":{"type":"string"},"type":["array","null"]}},"type":"object"},"CategoryCategory":{"additionalProperties":false,"properties":{"description":{"type":"string"},"icon":{"type":"string"},"id":{"type":"string"},"keywords":{"items":{"type":"string"},"type":["array","null"]},"matchingSettings":{"items":{"$ref":"#/components/schemas/MetaMetadata"},"type":["array","null"]},"relevanceScore":{"format":"int64","type":"integer"},"settings":{"items":{"$ref":"#/components/schemas/MetaMetadata"},"type":["array","null"]},"title":{"type":"string"},"url":{"type":"string"}},"required":["id","title","description","icon","url","keywords","settings"],"type":"object"},"ContainerActionResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerActionResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BaseMessageResponse"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ContainerActionResult":{"additionalProperties":false,"properties":{"errors":{"items":{"type":"string"},"type":["array","null"]},"failed":{"items":{"type":"string"},"type":["array","null"]},"started":{"items":{"type":"string"},"type":["array","null"]},"stopped":{"items":{"type":"string"},"type":["array","null"]},"success":{"type":"boolean"}},"required":["success"],"type":"object"},"ContainerComposeInfo":{"additionalProperties":false,"properties":{"configFiles":{"type":"string"},"projectName":{"type":"string"},"serviceName":{"type":"string"},"workingDir":{"type":"string"}},"required":["projectName","serviceName"],"type":"object"},"ContainerConfig":{"additionalProperties":false,"properties":{"cmd":{"items":{"type":"string"},"type":["array","null"]},"entrypoint":{"items":{"type":"string"},"type":["array","null"]},"env":{"items":{"type":"string"},"type":["array","null"]},"user":{"type":"string"},"workingDir":{"type":"string"}},"type":"object"},"ContainerCreate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCreate.json"],"format":"uri","readOnly":true,"type":"string"},"attachStderr":{"type":"boolean"},"attachStdin":{"type":"boolean"},"attachStdout":{"type":"boolean"},"autoRemove":{"type":"boolean"},"cmd":{"items":{"type":"string"},"type":["array","null"]},"command":{"items":{"type":"string"},"type":["array","null"]},"cpus":{"format":"double","type":"number"},"credentials":{"items":{"$ref":"#/components/schemas/ContainerregistryCredential"},"type":["array","null"]},"domainname":{"type":"string"},"entrypoint":{"items":{"type":"string"},"type":["array","null"]},"env":{"items":{"type":"string"},"type":["array","null"]},"environment":{"items":{"type":"string"},"type":["array","null"]},"exposedPorts":{"additionalProperties":{"$ref":"#/components/schemas/Value"},"type":"object"},"hostConfig":{"$ref":"#/components/schemas/ContainerHostConfigCreate"},"hostname":{"type":"string"},"image":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"memory":{"format":"int64","type":"integer"},"name":{"type":"string"},"networkDisabled":{"type":"boolean"},"networkingConfig":{"$ref":"#/components/schemas/ContainerNetworkingConfigCreate"},"networks":{"items":{"type":"string"},"type":["array","null"]},"openStdin":{"type":"boolean"},"ports":{"additionalProperties":{"type":"string"},"type":"object"},"privileged":{"type":"boolean"},"restartPolicy":{"type":"string"},"stdinOnce":{"type":"boolean"},"tty":{"type":"boolean"},"user":{"type":"string"},"volumes":{"items":{"type":"string"},"type":["array","null"]},"workingDir":{"type":"string"}},"required":["name","image"],"type":"object"},"ContainerCreated":{"additionalProperties":false,"properties":{"created":{"type":"string"},"id":{"type":"string"},"image":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id","name","image","status","created"],"type":"object"},"ContainerCreatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCreatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerCreated"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ContainerDetails":{"additionalProperties":false,"properties":{"composeInfo":{"$ref":"#/components/schemas/ContainerComposeInfo"},"config":{"$ref":"#/components/schemas/ContainerConfig"},"created":{"type":"string"},"hostConfig":{"$ref":"#/components/schemas/ContainerHostConfig"},"id":{"type":"string"},"image":{"type":"string"},"imageId":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mounts":{"items":{"$ref":"#/components/schemas/ContainerMount"},"type":["array","null"]},"name":{"type":"string"},"networkSettings":{"$ref":"#/components/schemas/ContainerNetworkSettings"},"ports":{"items":{"$ref":"#/components/schemas/ContainerPort"},"type":["array","null"]},"state":{"$ref":"#/components/schemas/ContainerState"}},"required":["id","name","image","imageId","created","state","config","hostConfig","networkSettings","ports","mounts"],"type":"object"},"ContainerDetailsResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerDetailsResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerDetails"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ContainerEndpointSettingsCreate":{"additionalProperties":false,"properties":{"aliases":{"items":{"type":"string"},"type":["array","null"]}},"type":"object"},"ContainerHostConfig":{"additionalProperties":false,"properties":{"autoRemove":{"type":"boolean"},"memory":{"format":"int64","type":"integer"},"nanoCpus":{"format":"int64","type":"integer"},"networkMode":{"type":"string"},"privileged":{"type":"boolean"},"restartPolicy":{"type":"string"}},"type":"object"},"ContainerHostConfigCreate":{"additionalProperties":false,"properties":{"autoRemove":{"type":"boolean"},"binds":{"items":{"type":"string"},"type":["array","null"]},"cpuShares":{"format":"int64","type":"integer"},"memory":{"format":"int64","type":"integer"},"memorySwap":{"format":"int64","type":"integer"},"nanoCpus":{"format":"int64","type":"integer"},"networkMode":{"type":"string"},"portBindings":{"additionalProperties":{"items":{"$ref":"#/components/schemas/ContainerPortBindingCreate"},"type":["array","null"]},"type":"object"},"privileged":{"type":"boolean"},"publishAllPorts":{"type":"boolean"},"readonlyRootfs":{"type":"boolean"},"restartPolicy":{"$ref":"#/components/schemas/ContainerRestartPolicyCreate"}},"type":"object"},"ContainerMount":{"additionalProperties":false,"properties":{"destination":{"type":"string"},"driver":{"type":"string"},"mode":{"type":"string"},"name":{"type":"string"},"propagation":{"type":"string"},"rw":{"type":"boolean"},"source":{"type":"string"},"type":{"type":"string"}},"required":["type","destination"],"type":"object"},"ContainerNetworkEndpoint":{"additionalProperties":false,"properties":{"aliases":{"items":{"type":"string"},"type":["array","null"]},"dnsNames":{"items":{"type":"string"},"type":["array","null"]},"driverOpts":{"additionalProperties":{"type":"string"},"type":"object"},"endpointId":{"type":"string"},"gateway":{"type":"string"},"globalIPv6Address":{"type":"string"},"globalIPv6PrefixLen":{"format":"int64","type":"integer"},"gwPriority":{"format":"int64","type":"integer"},"ipAddress":{"type":"string"},"ipPrefixLen":{"format":"int64","type":"integer"},"ipamConfig":{},"ipv6Gateway":{"type":"string"},"links":{"items":{"type":"string"},"type":["array","null"]},"macAddress":{"type":"string"},"networkId":{"type":"string"}},"type":"object"},"ContainerNetworkSettings":{"additionalProperties":false,"properties":{"networks":{"additionalProperties":{"$ref":"#/components/schemas/ContainerNetworkEndpoint"},"type":"object"}},"required":["networks"],"type":"object"},"ContainerNetworkingConfigCreate":{"additionalProperties":false,"properties":{"endpointsConfig":{"additionalProperties":{"$ref":"#/components/schemas/ContainerEndpointSettingsCreate"},"type":"object"}},"type":"object"},"ContainerPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"counts":{"$ref":"#/components/schemas/ContainerStatusCounts"},"data":{"items":{"$ref":"#/components/schemas/ContainerSummary"},"type":["array","null"]},"groups":{"items":{"$ref":"#/components/schemas/ContainerSummaryGroup"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","counts","pagination"],"type":"object"},"ContainerPort":{"additionalProperties":false,"properties":{"ip":{"type":"string"},"privatePort":{"format":"int64","type":"integer"},"publicPort":{"format":"int64","type":"integer"},"type":{"type":"string"}},"required":["privatePort","type"],"type":"object"},"ContainerPortBindingCreate":{"additionalProperties":false,"properties":{"hostIp":{"type":"string"},"hostPort":{"type":"string"}},"type":"object"},"ContainerRegistryPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerRegistryPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ContainerregistryContainerRegistry"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ContainerRestartPolicyCreate":{"additionalProperties":false,"properties":{"maximumRetryCount":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"ContainerState":{"additionalProperties":false,"properties":{"exitCode":{"format":"int64","type":"integer"},"finishedAt":{"type":"string"},"running":{"type":"boolean"},"startedAt":{"type":"string"},"status":{"type":"string"}},"required":["status","running"],"type":"object"},"ContainerStatusCounts":{"additionalProperties":false,"properties":{"runningContainers":{"format":"int64","type":"integer"},"stoppedContainers":{"format":"int64","type":"integer"},"totalContainers":{"format":"int64","type":"integer"}},"required":["runningContainers","stoppedContainers","totalContainers"],"type":"object"},"ContainerStatusCountsResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerStatusCountsResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerStatusCounts"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ContainerSummary":{"additionalProperties":false,"properties":{"command":{"type":"string"},"created":{"format":"int64","type":"integer"},"hostConfig":{"$ref":"#/components/schemas/ContainerHostConfig"},"id":{"type":"string"},"image":{"type":"string"},"imageId":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mounts":{"items":{"$ref":"#/components/schemas/ContainerMount"},"type":["array","null"]},"names":{"items":{"type":"string"},"type":["array","null"]},"networkSettings":{"$ref":"#/components/schemas/ContainerNetworkSettings"},"ports":{"items":{"$ref":"#/components/schemas/ContainerPort"},"type":["array","null"]},"state":{"type":"string"},"status":{"type":"string"},"updateInfo":{"$ref":"#/components/schemas/ImageUpdateInfo"}},"required":["id","names","image","imageId","command","created","ports","labels","state","status","hostConfig","networkSettings","mounts"],"type":"object"},"ContainerSummaryGroup":{"additionalProperties":false,"properties":{"groupName":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/ContainerSummary"},"type":["array","null"]}},"required":["groupName","items"],"type":"object"},"ContainerregistryContainerRegistry":{"additionalProperties":false,"properties":{"awsAccessKeyId":{"type":"string"},"awsRegion":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"insecure":{"type":"boolean"},"registryType":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["id","url","username","insecure","enabled","registryType","createdAt","updatedAt"],"type":"object"},"ContainerregistryCredential":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"token":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["url","username","token","enabled"],"type":"object"},"ContainerregistrySync":{"additionalProperties":false,"properties":{"awsAccessKeyId":{"type":"string"},"awsRegion":{"type":"string"},"awsSecretAccessKey":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"insecure":{"type":"boolean"},"registryType":{"type":"string"},"token":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["id","url","username","token","insecure","enabled","registryType","createdAt","updatedAt"],"type":"object"},"ContainerregistrySyncRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerregistrySyncRequest.json"],"format":"uri","readOnly":true,"type":"string"},"registries":{"items":{"$ref":"#/components/schemas/ContainerregistrySync"},"type":["array","null"]}},"required":["registries"],"type":"object"},"CreateContainerRegistryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/CreateContainerRegistryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"awsAccessKeyId":{"type":"string"},"awsRegion":{"type":"string"},"awsSecretAccessKey":{"type":"string"},"description":{"type":["string","null"]},"enabled":{"type":["boolean","null"]},"insecure":{"type":["boolean","null"]},"registryType":{"type":"string"},"token":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["url","username","token","description","insecure","enabled","registryType","awsAccessKeyId","awsSecretAccessKey","awsRegion"],"type":"object"},"CreateGitRepositoryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/CreateGitRepositoryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"authType":{"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"sshHostKeyVerification":{"type":"string"},"sshKey":{"type":"string"},"token":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["name","url","authType"],"type":"object"},"CredentialSpecConfig":{"additionalProperties":false,"properties":{"config":{"type":"string"},"file":{"type":"string"},"registry":{"type":"string"}},"type":"object"},"DashboardActionItem":{"additionalProperties":false,"properties":{"count":{"format":"int64","type":"integer"},"kind":{"type":"string"},"severity":{"type":"string"}},"required":["kind","count","severity"],"type":"object"},"DashboardActionItems":{"additionalProperties":false,"properties":{"items":{"items":{"$ref":"#/components/schemas/DashboardActionItem"},"type":["array","null"]}},"required":["items"],"type":"object"},"DashboardSnapshot":{"additionalProperties":false,"properties":{"actionItems":{"$ref":"#/components/schemas/DashboardActionItems"},"containers":{"$ref":"#/components/schemas/DashboardSnapshotContainers"},"imageUsageCounts":{"$ref":"#/components/schemas/ImageUsageCounts"},"images":{"$ref":"#/components/schemas/DashboardSnapshotImages"},"settings":{"$ref":"#/components/schemas/DashboardSnapshotSettings"}},"required":["containers","images","imageUsageCounts","actionItems","settings"],"type":"object"},"DashboardSnapshotContainers":{"additionalProperties":false,"properties":{"counts":{"$ref":"#/components/schemas/ContainerStatusCounts"},"data":{"items":{"$ref":"#/components/schemas/ContainerSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"}},"required":["data","counts","pagination"],"type":"object"},"DashboardSnapshotImages":{"additionalProperties":false,"properties":{"data":{"items":{"$ref":"#/components/schemas/ImageSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"}},"required":["data","pagination"],"type":"object"},"DashboardSnapshotSettings":{"additionalProperties":false,"properties":{"dockerPruneMode":{"type":"string"}},"required":["dockerPruneMode"],"type":"object"},"DeployConfig":{"additionalProperties":false,"properties":{"endpoint_mode":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mode":{"type":"string"},"placement":{"$ref":"#/components/schemas/DockerTypesPlacement"},"replicas":{"format":"int64","type":"integer"},"resources":{"$ref":"#/components/schemas/DockerTypesResources"},"restart_policy":{"$ref":"#/components/schemas/RestartPolicy"},"rollback_config":{"$ref":"#/components/schemas/UpdateConfig"},"update_config":{"$ref":"#/components/schemas/UpdateConfig"}},"type":"object"},"DeploymentSnippet":{"additionalProperties":false,"properties":{"dockerCompose":{"description":"Docker compose YAML snippet","type":"string"},"dockerRun":{"description":"Docker run command snippet","type":"string"}},"required":["dockerRun","dockerCompose"],"type":"object"},"DetailSummaryConfigStruct":{"additionalProperties":false,"properties":{"argsEscaped":{"type":"boolean"},"cmd":{"items":{"type":"string"},"type":["array","null"]},"env":{"items":{"type":"string"},"type":["array","null"]},"exposedPorts":{"additionalProperties":{"$ref":"#/components/schemas/Value"},"type":"object"},"volumes":{"additionalProperties":{"$ref":"#/components/schemas/Value"},"type":"object"},"workingDir":{"type":"string"}},"type":"object"},"DetailSummaryDescriptorStruct":{"additionalProperties":false,"properties":{"digest":{"type":"string"},"mediaType":{"type":"string"},"size":{"format":"int64","type":"integer"}},"required":["mediaType","digest","size"],"type":"object"},"DetailSummaryGraphDriverStruct":{"additionalProperties":false,"properties":{"data":{},"name":{"type":"string"}},"required":["data","name"],"type":"object"},"DetailSummaryMetadataStruct":{"additionalProperties":false,"properties":{"lastTagTime":{"type":"string"}},"required":["lastTagTime"],"type":"object"},"DetailSummaryRootFsStruct":{"additionalProperties":false,"properties":{"layers":{"items":{"type":"string"},"type":["array","null"]},"type":{"type":"string"}},"required":["type","layers"],"type":"object"},"DevelopConfig":{"additionalProperties":false,"properties":{"watch":{"items":{"$ref":"#/components/schemas/DockerTypesTrigger"},"type":["array","null"]}},"type":"object"},"DiscreteGenericResource":{"additionalProperties":false,"properties":{"kind":{"type":"string"},"value":{"format":"int64","type":"integer"}},"required":["kind","value"],"type":"object"},"DockerMountBindOptions":{"additionalProperties":false,"properties":{"CreateMountpoint":{"type":"boolean"},"NonRecursive":{"type":"boolean"},"Propagation":{"type":"string"},"ReadOnlyForceRecursive":{"type":"boolean"},"ReadOnlyNonRecursive":{"type":"boolean"}},"type":"object"},"DockerMountClusterOptions":{"additionalProperties":false,"type":"object"},"DockerMountDriver":{"additionalProperties":false,"properties":{"Name":{"type":"string"},"Options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"DockerMountImageOptions":{"additionalProperties":false,"properties":{"Subpath":{"type":"string"}},"type":"object"},"DockerMountMount":{"additionalProperties":false,"properties":{"BindOptions":{"$ref":"#/components/schemas/DockerMountBindOptions"},"ClusterOptions":{"$ref":"#/components/schemas/DockerMountClusterOptions"},"Consistency":{"type":"string"},"ImageOptions":{"$ref":"#/components/schemas/DockerMountImageOptions"},"ReadOnly":{"type":"boolean"},"Source":{"type":"string"},"Target":{"type":"string"},"TmpfsOptions":{"$ref":"#/components/schemas/DockerMountTmpfsOptions"},"Type":{"type":"string"},"VolumeOptions":{"$ref":"#/components/schemas/DockerMountVolumeOptions"}},"type":"object"},"DockerMountTmpfsOptions":{"additionalProperties":false,"properties":{"Mode":{"format":"int32","minimum":0,"type":"integer"},"Options":{"items":{"items":{"type":"string"},"type":["array","null"]},"type":["array","null"]},"SizeBytes":{"format":"int64","type":"integer"}},"type":"object"},"DockerMountVolumeOptions":{"additionalProperties":false,"properties":{"DriverConfig":{"$ref":"#/components/schemas/DockerMountDriver"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"NoCopy":{"type":"boolean"},"Subpath":{"type":"string"}},"type":"object"},"DockerNetworkConfigReference":{"additionalProperties":false,"properties":{"Network":{"type":"string"}},"required":["Network"],"type":"object"},"DockerNetworkEndpointResource":{"additionalProperties":false,"properties":{"EndpointID":{"type":"string"},"IPv4Address":{"type":"string"},"IPv6Address":{"type":"string"},"MacAddress":{"type":"string"},"Name":{"type":"string"}},"required":["Name","EndpointID","MacAddress","IPv4Address","IPv6Address"],"type":"object"},"DockerNetworkPeerInfo":{"additionalProperties":false,"properties":{"IP":{"format":"ip","type":"string"},"Name":{"type":"string"}},"required":["Name","IP"],"type":"object"},"DockerNetworkServiceInfo":{"additionalProperties":false,"properties":{"LocalLBIndex":{"format":"int64","type":"integer"},"Ports":{"items":{"type":"string"},"type":["array","null"]},"Tasks":{"items":{"$ref":"#/components/schemas/DockerNetworkTask"},"type":["array","null"]},"VIP":{"format":"ip","type":"string"}},"required":["VIP","Ports","LocalLBIndex","Tasks"],"type":"object"},"DockerNetworkTask":{"additionalProperties":false,"properties":{"EndpointID":{"type":"string"},"EndpointIP":{"format":"ip","type":"string"},"Info":{"additionalProperties":{"type":"string"},"type":"object"},"Name":{"type":"string"}},"required":["Name","EndpointID","EndpointIP","Info"],"type":"object"},"DockerRegistryIndexInfo":{"additionalProperties":false,"properties":{"Mirrors":{"items":{"type":"string"},"type":["array","null"]},"Name":{"type":"string"},"Official":{"type":"boolean"},"Secure":{"type":"boolean"}},"required":["Name","Mirrors","Secure","Official"],"type":"object"},"DockerRegistryServiceConfig":{"additionalProperties":false,"properties":{"IndexConfigs":{"additionalProperties":{"$ref":"#/components/schemas/DockerRegistryIndexInfo"},"type":"object"},"InsecureRegistryCIDRs":{"items":{"type":"string"},"type":["array","null"]},"Mirrors":{"items":{"type":"string"},"type":["array","null"]}},"required":["InsecureRegistryCIDRs","IndexConfigs","Mirrors"],"type":"object"},"DockerSwarmAppArmorOpts":{"additionalProperties":false,"properties":{"Mode":{"type":"string"}},"type":"object"},"DockerSwarmCAConfig":{"additionalProperties":false,"properties":{"ExternalCAs":{"items":{"$ref":"#/components/schemas/DockerSwarmExternalCA"},"type":["array","null"]},"ForceRotate":{"format":"int64","minimum":0,"type":"integer"},"NodeCertExpiry":{"format":"int64","type":"integer"},"SigningCACert":{"type":"string"},"SigningCAKey":{"type":"string"}},"type":"object"},"DockerSwarmClusterInfo":{"additionalProperties":false,"properties":{"CreatedAt":{"format":"date-time","type":"string"},"DataPathPort":{"format":"int32","minimum":0,"type":"integer"},"DefaultAddrPool":{"items":{"type":"string"},"type":["array","null"]},"ID":{"type":"string"},"RootRotationInProgress":{"type":"boolean"},"Spec":{"$ref":"#/components/schemas/DockerSwarmSpec"},"SubnetSize":{"format":"int32","minimum":0,"type":"integer"},"TLSInfo":{"$ref":"#/components/schemas/DockerSwarmTLSInfo"},"UpdatedAt":{"format":"date-time","type":"string"},"Version":{"$ref":"#/components/schemas/DockerSwarmVersion"}},"required":["ID","Spec","TLSInfo","RootRotationInProgress","DefaultAddrPool","SubnetSize","DataPathPort"],"type":"object"},"DockerSwarmConfigReference":{"additionalProperties":false,"properties":{"ConfigID":{"type":"string"},"ConfigName":{"type":"string"},"File":{"$ref":"#/components/schemas/DockerSwarmConfigReferenceFileTarget"},"Runtime":{"$ref":"#/components/schemas/DockerSwarmConfigReferenceRuntimeTarget"}},"required":["ConfigID","ConfigName"],"type":"object"},"DockerSwarmConfigReferenceFileTarget":{"additionalProperties":false,"properties":{"GID":{"type":"string"},"Mode":{"format":"int32","minimum":0,"type":"integer"},"Name":{"type":"string"},"UID":{"type":"string"}},"required":["Name","UID","GID","Mode"],"type":"object"},"DockerSwarmConfigReferenceRuntimeTarget":{"additionalProperties":false,"type":"object"},"DockerSwarmConfigSpec":{"additionalProperties":false,"properties":{"Data":{"contentEncoding":"base64","type":"string"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Name":{"type":"string"},"Templating":{"$ref":"#/components/schemas/DockerSwarmDriver"}},"required":["Labels"],"type":"object"},"DockerSwarmContainerSpec":{"additionalProperties":false,"properties":{"Args":{"items":{"type":"string"},"type":["array","null"]},"CapabilityAdd":{"items":{"type":"string"},"type":["array","null"]},"CapabilityDrop":{"items":{"type":"string"},"type":["array","null"]},"Command":{"items":{"type":"string"},"type":["array","null"]},"Configs":{"items":{"$ref":"#/components/schemas/DockerSwarmConfigReference"},"type":["array","null"]},"DNSConfig":{"$ref":"#/components/schemas/DockerSwarmDNSConfig"},"Dir":{"type":"string"},"Env":{"items":{"type":"string"},"type":["array","null"]},"Groups":{"items":{"type":"string"},"type":["array","null"]},"Healthcheck":{"$ref":"#/components/schemas/HealthcheckConfig"},"Hostname":{"type":"string"},"Hosts":{"items":{"type":"string"},"type":["array","null"]},"Image":{"type":"string"},"Init":{"type":"boolean"},"Isolation":{"type":"string"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Mounts":{"items":{"$ref":"#/components/schemas/DockerMountMount"},"type":["array","null"]},"OomScoreAdj":{"format":"int64","type":"integer"},"OpenStdin":{"type":"boolean"},"Privileges":{"$ref":"#/components/schemas/DockerSwarmPrivileges"},"ReadOnly":{"type":"boolean"},"Secrets":{"items":{"$ref":"#/components/schemas/DockerSwarmSecretReference"},"type":["array","null"]},"StopGracePeriod":{"format":"int64","type":"integer"},"StopSignal":{"type":"string"},"Sysctls":{"additionalProperties":{"type":"string"},"type":"object"},"TTY":{"type":"boolean"},"Ulimits":{"items":{"$ref":"#/components/schemas/Ulimit"},"type":["array","null"]},"User":{"type":"string"}},"type":"object"},"DockerSwarmCredentialSpec":{"additionalProperties":false,"properties":{"Config":{"type":"string"},"File":{"type":"string"},"Registry":{"type":"string"}},"required":["Config","File","Registry"],"type":"object"},"DockerSwarmDNSConfig":{"additionalProperties":false,"properties":{"Nameservers":{"items":{"format":"ip","type":"string"},"type":["array","null"]},"Options":{"items":{"type":"string"},"type":["array","null"]},"Search":{"items":{"type":"string"},"type":["array","null"]}},"type":"object"},"DockerSwarmDiscreteGenericResource":{"additionalProperties":false,"properties":{"Kind":{"type":"string"},"Value":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmDispatcherConfig":{"additionalProperties":false,"properties":{"HeartbeatPeriod":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmDriver":{"additionalProperties":false,"properties":{"Name":{"type":"string"},"Options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"DockerSwarmEncryptionConfig":{"additionalProperties":false,"properties":{"AutoLockManagers":{"type":"boolean"}},"required":["AutoLockManagers"],"type":"object"},"DockerSwarmEndpoint":{"additionalProperties":false,"properties":{"Ports":{"items":{"$ref":"#/components/schemas/DockerSwarmPortConfig"},"type":["array","null"]},"Spec":{"$ref":"#/components/schemas/DockerSwarmEndpointSpec"},"VirtualIPs":{"items":{"$ref":"#/components/schemas/DockerSwarmEndpointVirtualIP"},"type":["array","null"]}},"type":"object"},"DockerSwarmEndpointSpec":{"additionalProperties":false,"properties":{"Mode":{"type":"string"},"Ports":{"items":{"$ref":"#/components/schemas/DockerSwarmPortConfig"},"type":["array","null"]}},"type":"object"},"DockerSwarmEndpointVirtualIP":{"additionalProperties":false,"properties":{"Addr":{"type":"string"},"NetworkID":{"type":"string"}},"type":"object"},"DockerSwarmExternalCA":{"additionalProperties":false,"properties":{"CACert":{"type":"string"},"Options":{"additionalProperties":{"type":"string"},"type":"object"},"Protocol":{"type":"string"},"URL":{"type":"string"}},"required":["Protocol","URL","CACert"],"type":"object"},"DockerSwarmGenericResource":{"additionalProperties":false,"properties":{"DiscreteResourceSpec":{"$ref":"#/components/schemas/DockerSwarmDiscreteGenericResource"},"NamedResourceSpec":{"$ref":"#/components/schemas/DockerSwarmNamedGenericResource"}},"type":"object"},"DockerSwarmGlobalJob":{"additionalProperties":false,"type":"object"},"DockerSwarmGlobalService":{"additionalProperties":false,"type":"object"},"DockerSwarmInfo":{"additionalProperties":false,"properties":{"Cluster":{"$ref":"#/components/schemas/DockerSwarmClusterInfo"},"ControlAvailable":{"type":"boolean"},"Error":{"type":"string"},"LocalNodeState":{"type":"string"},"Managers":{"format":"int64","type":"integer"},"NodeAddr":{"type":"string"},"NodeID":{"type":"string"},"Nodes":{"format":"int64","type":"integer"},"RemoteManagers":{"items":{"$ref":"#/components/schemas/DockerSwarmPeer"},"type":["array","null"]},"Warnings":{"items":{"type":"string"},"type":["array","null"]}},"required":["NodeID","NodeAddr","LocalNodeState","ControlAvailable","Error","RemoteManagers"],"type":"object"},"DockerSwarmLimit":{"additionalProperties":false,"properties":{"MemoryBytes":{"format":"int64","type":"integer"},"NanoCPUs":{"format":"int64","type":"integer"},"Pids":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmNamedGenericResource":{"additionalProperties":false,"properties":{"Kind":{"type":"string"},"Value":{"type":"string"}},"type":"object"},"DockerSwarmNetworkAttachmentConfig":{"additionalProperties":false,"properties":{"Aliases":{"items":{"type":"string"},"type":["array","null"]},"DriverOpts":{"additionalProperties":{"type":"string"},"type":"object"},"Target":{"type":"string"}},"type":"object"},"DockerSwarmNetworkAttachmentSpec":{"additionalProperties":false,"properties":{"ContainerID":{"type":"string"}},"required":["ContainerID"],"type":"object"},"DockerSwarmOrchestrationConfig":{"additionalProperties":false,"properties":{"TaskHistoryRetentionLimit":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmPeer":{"additionalProperties":false,"properties":{"Addr":{"type":"string"},"NodeID":{"type":"string"}},"required":["NodeID","Addr"],"type":"object"},"DockerSwarmPlacement":{"additionalProperties":false,"properties":{"Constraints":{"items":{"type":"string"},"type":["array","null"]},"MaxReplicas":{"format":"int64","minimum":0,"type":"integer"},"Platforms":{"items":{"$ref":"#/components/schemas/DockerSwarmPlatform"},"type":["array","null"]},"Preferences":{"items":{"$ref":"#/components/schemas/DockerSwarmPlacementPreference"},"type":["array","null"]}},"type":"object"},"DockerSwarmPlacementPreference":{"additionalProperties":false,"properties":{"Spread":{"$ref":"#/components/schemas/DockerSwarmSpreadOver"}},"required":["Spread"],"type":"object"},"DockerSwarmPlatform":{"additionalProperties":false,"properties":{"Architecture":{"type":"string"},"OS":{"type":"string"}},"type":"object"},"DockerSwarmPortConfig":{"additionalProperties":false,"properties":{"Name":{"type":"string"},"Protocol":{"type":"string"},"PublishMode":{"type":"string"},"PublishedPort":{"format":"int32","minimum":0,"type":"integer"},"TargetPort":{"format":"int32","minimum":0,"type":"integer"}},"type":"object"},"DockerSwarmPrivileges":{"additionalProperties":false,"properties":{"AppArmor":{"$ref":"#/components/schemas/DockerSwarmAppArmorOpts"},"CredentialSpec":{"$ref":"#/components/schemas/DockerSwarmCredentialSpec"},"NoNewPrivileges":{"type":"boolean"},"SELinuxContext":{"$ref":"#/components/schemas/DockerSwarmSELinuxContext"},"Seccomp":{"$ref":"#/components/schemas/DockerSwarmSeccompOpts"}},"required":["CredentialSpec","SELinuxContext","NoNewPrivileges"],"type":"object"},"DockerSwarmRaftConfig":{"additionalProperties":false,"properties":{"ElectionTick":{"format":"int64","type":"integer"},"HeartbeatTick":{"format":"int64","type":"integer"},"KeepOldSnapshots":{"format":"int64","minimum":0,"type":"integer"},"LogEntriesForSlowFollowers":{"format":"int64","minimum":0,"type":"integer"},"SnapshotInterval":{"format":"int64","minimum":0,"type":"integer"}},"required":["ElectionTick","HeartbeatTick"],"type":"object"},"DockerSwarmReplicatedJob":{"additionalProperties":false,"properties":{"MaxConcurrent":{"format":"int64","minimum":0,"type":"integer"},"TotalCompletions":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"DockerSwarmReplicatedService":{"additionalProperties":false,"properties":{"Replicas":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"DockerSwarmResourceRequirements":{"additionalProperties":false,"properties":{"Limits":{"$ref":"#/components/schemas/DockerSwarmLimit"},"MemorySwappiness":{"format":"int64","type":["integer","null"]},"Reservations":{"$ref":"#/components/schemas/DockerSwarmResources"},"SwapBytes":{"format":"int64","type":["integer","null"]}},"type":"object"},"DockerSwarmResources":{"additionalProperties":false,"properties":{"GenericResources":{"items":{"$ref":"#/components/schemas/DockerSwarmGenericResource"},"type":["array","null"]},"MemoryBytes":{"format":"int64","type":"integer"},"NanoCPUs":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmRestartPolicy":{"additionalProperties":false,"properties":{"Condition":{"type":"string"},"Delay":{"format":"int64","type":"integer"},"MaxAttempts":{"format":"int64","minimum":0,"type":"integer"},"Window":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmRuntimePrivilege":{"additionalProperties":false,"properties":{"description":{"type":"string"},"name":{"type":"string"},"value":{"items":{"type":"string"},"type":["array","null"]}},"type":"object"},"DockerSwarmRuntimeSpec":{"additionalProperties":false,"properties":{"disabled":{"type":"boolean"},"env":{"items":{"type":"string"},"type":["array","null"]},"name":{"type":"string"},"privileges":{"items":{"$ref":"#/components/schemas/DockerSwarmRuntimePrivilege"},"type":["array","null"]},"remote":{"type":"string"}},"type":"object"},"DockerSwarmSELinuxContext":{"additionalProperties":false,"properties":{"Disable":{"type":"boolean"},"Level":{"type":"string"},"Role":{"type":"string"},"Type":{"type":"string"},"User":{"type":"string"}},"required":["Disable","User","Role","Type","Level"],"type":"object"},"DockerSwarmSeccompOpts":{"additionalProperties":false,"properties":{"Mode":{"type":"string"},"Profile":{"contentEncoding":"base64","type":"string"}},"type":"object"},"DockerSwarmSecretReference":{"additionalProperties":false,"properties":{"File":{"$ref":"#/components/schemas/DockerSwarmSecretReferenceFileTarget"},"SecretID":{"type":"string"},"SecretName":{"type":"string"}},"required":["File","SecretID","SecretName"],"type":"object"},"DockerSwarmSecretReferenceFileTarget":{"additionalProperties":false,"properties":{"GID":{"type":"string"},"Mode":{"format":"int32","minimum":0,"type":"integer"},"Name":{"type":"string"},"UID":{"type":"string"}},"required":["Name","UID","GID","Mode"],"type":"object"},"DockerSwarmSecretSpec":{"additionalProperties":false,"properties":{"Data":{"contentEncoding":"base64","type":"string"},"Driver":{"$ref":"#/components/schemas/DockerSwarmDriver"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Name":{"type":"string"},"Templating":{"$ref":"#/components/schemas/DockerSwarmDriver"}},"required":["Labels"],"type":"object"},"DockerSwarmServiceMode":{"additionalProperties":false,"properties":{"Global":{"$ref":"#/components/schemas/DockerSwarmGlobalService"},"GlobalJob":{"$ref":"#/components/schemas/DockerSwarmGlobalJob"},"Replicated":{"$ref":"#/components/schemas/DockerSwarmReplicatedService"},"ReplicatedJob":{"$ref":"#/components/schemas/DockerSwarmReplicatedJob"}},"type":"object"},"DockerSwarmServiceSpec":{"additionalProperties":false,"properties":{"EndpointSpec":{"$ref":"#/components/schemas/DockerSwarmEndpointSpec"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Mode":{"$ref":"#/components/schemas/DockerSwarmServiceMode"},"Name":{"type":"string"},"RollbackConfig":{"$ref":"#/components/schemas/DockerSwarmUpdateConfig"},"TaskTemplate":{"$ref":"#/components/schemas/DockerSwarmTaskSpec"},"UpdateConfig":{"$ref":"#/components/schemas/DockerSwarmUpdateConfig"}},"required":["Labels"],"type":"object"},"DockerSwarmSpec":{"additionalProperties":false,"properties":{"CAConfig":{"$ref":"#/components/schemas/DockerSwarmCAConfig"},"Dispatcher":{"$ref":"#/components/schemas/DockerSwarmDispatcherConfig"},"EncryptionConfig":{"$ref":"#/components/schemas/DockerSwarmEncryptionConfig"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Name":{"type":"string"},"Orchestration":{"$ref":"#/components/schemas/DockerSwarmOrchestrationConfig"},"Raft":{"$ref":"#/components/schemas/DockerSwarmRaftConfig"},"TaskDefaults":{"$ref":"#/components/schemas/DockerSwarmTaskDefaults"}},"required":["Labels"],"type":"object"},"DockerSwarmSpreadOver":{"additionalProperties":false,"properties":{"SpreadDescriptor":{"type":"string"}},"required":["SpreadDescriptor"],"type":"object"},"DockerSwarmTLSInfo":{"additionalProperties":false,"properties":{"CertIssuerPublicKey":{"contentEncoding":"base64","type":"string"},"CertIssuerSubject":{"contentEncoding":"base64","type":"string"},"TrustRoot":{"type":"string"}},"type":"object"},"DockerSwarmTaskDefaults":{"additionalProperties":false,"properties":{"LogDriver":{"$ref":"#/components/schemas/DockerSwarmDriver"}},"type":"object"},"DockerSwarmTaskSpec":{"additionalProperties":false,"properties":{"ContainerSpec":{"$ref":"#/components/schemas/DockerSwarmContainerSpec"},"ForceUpdate":{"format":"int64","minimum":0,"type":"integer"},"LogDriver":{"$ref":"#/components/schemas/DockerSwarmDriver"},"NetworkAttachmentSpec":{"$ref":"#/components/schemas/DockerSwarmNetworkAttachmentSpec"},"Networks":{"items":{"$ref":"#/components/schemas/DockerSwarmNetworkAttachmentConfig"},"type":["array","null"]},"Placement":{"$ref":"#/components/schemas/DockerSwarmPlacement"},"PluginSpec":{"$ref":"#/components/schemas/DockerSwarmRuntimeSpec"},"Resources":{"$ref":"#/components/schemas/DockerSwarmResourceRequirements"},"RestartPolicy":{"$ref":"#/components/schemas/DockerSwarmRestartPolicy"},"Runtime":{"type":"string"}},"required":["ForceUpdate"],"type":"object"},"DockerSwarmUpdateConfig":{"additionalProperties":false,"properties":{"Delay":{"format":"int64","type":"integer"},"FailureAction":{"type":"string"},"MaxFailureRatio":{"format":"float","type":"number"},"Monitor":{"format":"int64","type":"integer"},"Order":{"type":"string"},"Parallelism":{"format":"int64","minimum":0,"type":"integer"}},"required":["Parallelism","MaxFailureRatio","Order"],"type":"object"},"DockerSwarmUpdateStatus":{"additionalProperties":false,"properties":{"CompletedAt":{"format":"date-time","type":"string"},"Message":{"type":"string"},"StartedAt":{"format":"date-time","type":"string"},"State":{"type":"string"}},"type":"object"},"DockerSwarmVersion":{"additionalProperties":false,"properties":{"Index":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"DockerSystemCommit":{"additionalProperties":false,"properties":{"ID":{"type":"string"}},"required":["ID"],"type":"object"},"DockerSystemContainerdInfo":{"additionalProperties":false,"properties":{"Address":{"type":"string"},"Namespaces":{"$ref":"#/components/schemas/DockerSystemContainerdNamespaces"}},"required":["Namespaces"],"type":"object"},"DockerSystemContainerdNamespaces":{"additionalProperties":false,"properties":{"Containers":{"type":"string"},"Plugins":{"type":"string"}},"required":["Containers","Plugins"],"type":"object"},"DockerSystemDeviceInfo":{"additionalProperties":false,"properties":{"ID":{"type":"string"},"Source":{"type":"string"}},"required":["Source","ID"],"type":"object"},"DockerSystemFirewallInfo":{"additionalProperties":false,"properties":{"Driver":{"type":"string"},"Info":{"items":{"items":{"type":"string"},"maxItems":2,"minItems":2,"type":["array","null"]},"type":["array","null"]}},"required":["Driver"],"type":"object"},"DockerSystemNRIInfo":{"additionalProperties":false,"properties":{"Info":{"items":{"items":{"type":"string"},"maxItems":2,"minItems":2,"type":["array","null"]},"type":["array","null"]}},"type":"object"},"DockerSystemNetworkAddressPool":{"additionalProperties":false,"properties":{"Base":{"type":"string"},"Size":{"format":"int64","type":"integer"}},"required":["Base","Size"],"type":"object"},"DockerSystemPluginsInfo":{"additionalProperties":false,"properties":{"Authorization":{"items":{"type":"string"},"type":["array","null"]},"Log":{"items":{"type":"string"},"type":["array","null"]},"Network":{"items":{"type":"string"},"type":["array","null"]},"Volume":{"items":{"type":"string"},"type":["array","null"]}},"required":["Volume","Network","Authorization","Log"],"type":"object"},"DockerSystemRuntimeWithStatus":{"additionalProperties":false,"properties":{"options":{"additionalProperties":{},"type":"object"},"path":{"type":"string"},"runtimeArgs":{"items":{"type":"string"},"type":["array","null"]},"runtimeType":{"type":"string"},"status":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"DockerTypesDeviceMapping":{"additionalProperties":false,"properties":{"permissions":{"type":"string"},"source":{"type":"string"},"target":{"type":"string"}},"type":"object"},"DockerTypesDeviceRequest":{"additionalProperties":false,"properties":{"capabilities":{"items":{"type":"string"},"type":["array","null"]},"count":{"format":"int64","type":"integer"},"device_ids":{"items":{"type":"string"},"type":["array","null"]},"driver":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"DockerTypesEnvFile":{"additionalProperties":false,"properties":{"format":{"type":"string"},"path":{"type":"string"},"required":{"type":"boolean"}},"type":"object"},"DockerTypesGenericResource":{"additionalProperties":false,"properties":{"discrete_resource_spec":{"$ref":"#/components/schemas/DiscreteGenericResource"}},"type":"object"},"DockerTypesPlacement":{"additionalProperties":false,"properties":{"constraints":{"items":{"type":"string"},"type":["array","null"]},"max_replicas_per_node":{"format":"int64","minimum":0,"type":"integer"},"preferences":{"items":{"$ref":"#/components/schemas/DockerTypesPlacementPreferences"},"type":["array","null"]}},"type":"object"},"DockerTypesPlacementPreferences":{"additionalProperties":false,"properties":{"spread":{"type":"string"}},"type":"object"},"DockerTypesResources":{"additionalProperties":false,"properties":{"limits":{"$ref":"#/components/schemas/Resource"},"reservations":{"$ref":"#/components/schemas/Resource"}},"type":"object"},"DockerTypesSSHKey":{"additionalProperties":false,"properties":{"id":{"type":"string"},"path":{"type":"string"}},"type":"object"},"DockerTypesServiceConfig":{"additionalProperties":false,"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"attach":{"type":"boolean"},"blkio_config":{"$ref":"#/components/schemas/BlkioConfig"},"build":{"$ref":"#/components/schemas/BuildConfig"},"cap_add":{"items":{"type":"string"},"type":["array","null"]},"cap_drop":{"items":{"type":"string"},"type":["array","null"]},"cgroup":{"type":"string"},"cgroup_parent":{"type":"string"},"command":{"items":{"type":"string"},"type":["array","null"]},"configs":{"items":{"$ref":"#/components/schemas/DockerTypesServiceConfigObjConfig"},"type":["array","null"]},"container_name":{"type":"string"},"cpu_count":{"format":"int64","type":"integer"},"cpu_percent":{"format":"float","type":"number"},"cpu_period":{"format":"int64","type":"integer"},"cpu_quota":{"format":"int64","type":"integer"},"cpu_rt_period":{"format":"int64","type":"integer"},"cpu_rt_runtime":{"format":"int64","type":"integer"},"cpu_shares":{"format":"int64","type":"integer"},"cpus":{"format":"float","type":"number"},"cpuset":{"type":"string"},"credential_spec":{"$ref":"#/components/schemas/CredentialSpecConfig"},"depends_on":{"additionalProperties":{"$ref":"#/components/schemas/DockerTypesServiceDependency"},"type":"object"},"deploy":{"$ref":"#/components/schemas/DeployConfig"},"develop":{"$ref":"#/components/schemas/DevelopConfig"},"device_cgroup_rules":{"items":{"type":"string"},"type":["array","null"]},"devices":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceMapping"},"type":["array","null"]},"dns":{"items":{"type":"string"},"type":["array","null"]},"dns_opt":{"items":{"type":"string"},"type":["array","null"]},"dns_search":{"items":{"type":"string"},"type":["array","null"]},"dockerfile":{"type":"string"},"domainname":{"type":"string"},"entrypoint":{"items":{"type":"string"},"type":["array","null"]},"env_file":{"items":{"$ref":"#/components/schemas/DockerTypesEnvFile"},"type":["array","null"]},"environment":{"additionalProperties":{"type":["string","null"]},"type":"object"},"expose":{"items":{"type":"string"},"type":["array","null"]},"extends":{"$ref":"#/components/schemas/ExtendsConfig"},"external_links":{"items":{"type":"string"},"type":["array","null"]},"extra_hosts":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"},"gpus":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceRequest"},"type":["array","null"]},"group_add":{"items":{"type":"string"},"type":["array","null"]},"healthcheck":{"$ref":"#/components/schemas/HealthCheckConfig"},"hostname":{"type":"string"},"image":{"type":"string"},"init":{"type":"boolean"},"ipc":{"type":"string"},"isolation":{"type":"string"},"label_file":{"items":{"type":"string"},"type":["array","null"]},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"links":{"items":{"type":"string"},"type":["array","null"]},"log_driver":{"type":"string"},"log_opt":{"additionalProperties":{"type":"string"},"type":"object"},"logging":{"$ref":"#/components/schemas/LoggingConfig"},"mac_address":{"type":"string"},"mem_limit":{"format":"int64","type":"integer"},"mem_reservation":{"format":"int64","type":"integer"},"mem_swappiness":{"format":"int64","type":"integer"},"memswap_limit":{"format":"int64","type":"integer"},"models":{"additionalProperties":{"$ref":"#/components/schemas/ServiceModelConfig"},"type":"object"},"net":{"type":"string"},"network_mode":{"type":"string"},"networks":{"additionalProperties":{"$ref":"#/components/schemas/ServiceNetworkConfig"},"type":"object"},"oom_kill_disable":{"type":"boolean"},"oom_score_adj":{"format":"int64","type":"integer"},"pid":{"type":"string"},"pids_limit":{"format":"int64","type":"integer"},"platform":{"type":"string"},"ports":{"items":{"$ref":"#/components/schemas/DockerTypesServicePortConfig"},"type":["array","null"]},"post_start":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"pre_stop":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"privileged":{"type":"boolean"},"profiles":{"items":{"type":"string"},"type":["array","null"]},"provider":{"$ref":"#/components/schemas/ServiceProviderConfig"},"pull_policy":{"type":"string"},"read_only":{"type":"boolean"},"restart":{"type":"string"},"runtime":{"type":"string"},"scale":{"format":"int64","type":"integer"},"secrets":{"items":{"$ref":"#/components/schemas/DockerTypesServiceSecretConfig"},"type":["array","null"]},"security_opt":{"items":{"type":"string"},"type":["array","null"]},"shm_size":{"format":"int64","type":"integer"},"stdin_open":{"type":"boolean"},"stop_grace_period":{"format":"int64","type":"integer"},"stop_signal":{"type":"string"},"storage_opt":{"additionalProperties":{"type":"string"},"type":"object"},"sysctls":{"additionalProperties":{"type":"string"},"type":"object"},"tmpfs":{"items":{"type":"string"},"type":["array","null"]},"tty":{"type":"boolean"},"ulimits":{"additionalProperties":{"$ref":"#/components/schemas/UlimitsConfig"},"type":"object"},"use_api_socket":{"type":"boolean"},"user":{"type":"string"},"userns_mode":{"type":"string"},"uts":{"type":"string"},"volume_driver":{"type":"string"},"volumes":{"items":{"$ref":"#/components/schemas/DockerTypesServiceVolumeConfig"},"type":["array","null"]},"volumes_from":{"items":{"type":"string"},"type":["array","null"]},"working_dir":{"type":"string"}},"required":["command","entrypoint"],"type":"object"},"DockerTypesServiceConfigObjConfig":{"additionalProperties":false,"properties":{"gid":{"type":"string"},"mode":{"format":"int64","type":"integer"},"source":{"type":"string"},"target":{"type":"string"},"uid":{"type":"string"}},"type":"object"},"DockerTypesServiceDependency":{"additionalProperties":false,"properties":{"condition":{"type":"string"},"required":{"type":"boolean"},"restart":{"type":"boolean"}},"required":["required"],"type":"object"},"DockerTypesServiceHook":{"additionalProperties":false,"properties":{"command":{"items":{"type":"string"},"type":["array","null"]},"environment":{"additionalProperties":{"type":["string","null"]},"type":"object"},"privileged":{"type":"boolean"},"user":{"type":"string"},"working_dir":{"type":"string"}},"required":["command"],"type":"object"},"DockerTypesServicePortConfig":{"additionalProperties":false,"properties":{"app_protocol":{"type":"string"},"host_ip":{"type":"string"},"mode":{"type":"string"},"name":{"type":"string"},"protocol":{"type":"string"},"published":{"type":"string"},"target":{"format":"int32","minimum":0,"type":"integer"}},"type":"object"},"DockerTypesServiceSecretConfig":{"additionalProperties":false,"properties":{"gid":{"type":"string"},"mode":{"format":"int64","type":"integer"},"source":{"type":"string"},"target":{"type":"string"},"uid":{"type":"string"}},"type":"object"},"DockerTypesServiceVolumeConfig":{"additionalProperties":false,"properties":{"bind":{"$ref":"#/components/schemas/ServiceVolumeBind"},"consistency":{"type":"string"},"image":{"$ref":"#/components/schemas/ServiceVolumeImage"},"read_only":{"type":"boolean"},"source":{"type":"string"},"target":{"type":"string"},"tmpfs":{"$ref":"#/components/schemas/ServiceVolumeTmpfs"},"type":{"type":"string"},"volume":{"$ref":"#/components/schemas/ServiceVolumeVolume"}},"type":"object"},"DockerTypesThrottleDevice":{"additionalProperties":false,"properties":{"Path":{"type":"string"},"Rate":{"format":"int64","type":"integer"}},"required":["Path","Rate"],"type":"object"},"DockerTypesTrigger":{"additionalProperties":false,"properties":{"action":{"type":"string"},"exec":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"ignore":{"items":{"type":"string"},"type":["array","null"]},"include":{"items":{"type":"string"},"type":["array","null"]},"initial_sync":{"type":"boolean"},"path":{"type":"string"},"target":{"type":"string"}},"required":["path","action"],"type":"object"},"DockerTypesWeightDevice":{"additionalProperties":false,"properties":{"Path":{"type":"string"},"Weight":{"format":"int32","minimum":0,"type":"integer"}},"required":["Path","Weight"],"type":"object"},"DockerVolumeUsageData":{"additionalProperties":false,"properties":{"RefCount":{"format":"int64","type":"integer"},"Size":{"format":"int64","type":"integer"}},"required":["RefCount","Size"],"type":"object"},"DockerinfoInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/DockerinfoInfo.json"],"format":"uri","readOnly":true,"type":"string"},"Architecture":{"type":"string"},"CDISpecDirs":{"items":{"type":"string"},"type":["array","null"]},"CPUSet":{"type":"boolean"},"CPUShares":{"type":"boolean"},"CgroupDriver":{"type":"string"},"CgroupVersion":{"type":"string"},"Containerd":{"$ref":"#/components/schemas/DockerSystemContainerdInfo"},"ContainerdCommit":{"$ref":"#/components/schemas/DockerSystemCommit"},"Containers":{"format":"int64","type":"integer"},"ContainersPaused":{"format":"int64","type":"integer"},"ContainersRunning":{"format":"int64","type":"integer"},"ContainersStopped":{"format":"int64","type":"integer"},"CpuCfsPeriod":{"type":"boolean"},"CpuCfsQuota":{"type":"boolean"},"Debug":{"type":"boolean"},"DefaultAddressPools":{"items":{"$ref":"#/components/schemas/DockerSystemNetworkAddressPool"},"type":["array","null"]},"DefaultRuntime":{"type":"string"},"DiscoveredDevices":{"items":{"$ref":"#/components/schemas/DockerSystemDeviceInfo"},"type":["array","null"]},"DockerRootDir":{"type":"string"},"Driver":{"type":"string"},"DriverStatus":{"items":{"items":{"type":"string"},"maxItems":2,"minItems":2,"type":["array","null"]},"type":["array","null"]},"ExperimentalBuild":{"type":"boolean"},"FirewallBackend":{"$ref":"#/components/schemas/DockerSystemFirewallInfo"},"GenericResources":{"items":{"$ref":"#/components/schemas/DockerSwarmGenericResource"},"type":["array","null"]},"HttpProxy":{"type":"string"},"HttpsProxy":{"type":"string"},"ID":{"type":"string"},"IPv4Forwarding":{"type":"boolean"},"Images":{"format":"int64","type":"integer"},"IndexServerAddress":{"type":"string"},"InitBinary":{"type":"string"},"InitCommit":{"$ref":"#/components/schemas/DockerSystemCommit"},"Isolation":{"type":"string"},"KernelVersion":{"type":"string"},"Labels":{"items":{"type":"string"},"type":["array","null"]},"LiveRestoreEnabled":{"type":"boolean"},"LoggingDriver":{"type":"string"},"MemTotal":{"format":"int64","type":"integer"},"MemoryLimit":{"type":"boolean"},"NCPU":{"format":"int64","type":"integer"},"NEventsListener":{"format":"int64","type":"integer"},"NFd":{"format":"int64","type":"integer"},"NGoroutines":{"format":"int64","type":"integer"},"NRI":{"$ref":"#/components/schemas/DockerSystemNRIInfo"},"Name":{"type":"string"},"NoProxy":{"type":"string"},"OSType":{"type":"string"},"OSVersion":{"type":"string"},"OomKillDisable":{"type":"boolean"},"OperatingSystem":{"type":"string"},"PidsLimit":{"type":"boolean"},"Plugins":{"$ref":"#/components/schemas/DockerSystemPluginsInfo"},"ProductLicense":{"type":"string"},"RegistryConfig":{"$ref":"#/components/schemas/DockerRegistryServiceConfig"},"RuncCommit":{"$ref":"#/components/schemas/DockerSystemCommit"},"Runtimes":{"additionalProperties":{"$ref":"#/components/schemas/DockerSystemRuntimeWithStatus"},"type":"object"},"SecurityOptions":{"items":{"type":"string"},"type":["array","null"]},"ServerVersion":{"type":"string"},"SwapLimit":{"type":"boolean"},"Swarm":{"$ref":"#/components/schemas/DockerSwarmInfo"},"SystemStatus":{"items":{"items":{"type":"string"},"maxItems":2,"minItems":2,"type":["array","null"]},"type":["array","null"]},"SystemTime":{"type":"string"},"Warnings":{"items":{"type":"string"},"type":["array","null"]},"apiVersion":{"type":"string"},"arch":{"type":"string"},"buildTime":{"type":"string"},"gitCommit":{"type":"string"},"goVersion":{"type":"string"},"os":{"type":"string"},"success":{"type":"boolean"}},"required":["success","apiVersion","gitCommit","goVersion","os","arch","buildTime","ID","Containers","ContainersRunning","ContainersPaused","ContainersStopped","Images","Driver","DriverStatus","Plugins","MemoryLimit","SwapLimit","CpuCfsPeriod","CpuCfsQuota","CPUShares","CPUSet","PidsLimit","IPv4Forwarding","Debug","NFd","OomKillDisable","NGoroutines","SystemTime","LoggingDriver","CgroupDriver","NEventsListener","KernelVersion","OperatingSystem","OSVersion","OSType","Architecture","IndexServerAddress","RegistryConfig","NCPU","MemTotal","GenericResources","DockerRootDir","HttpProxy","HttpsProxy","NoProxy","Name","Labels","ExperimentalBuild","ServerVersion","Runtimes","DefaultRuntime","Swarm","LiveRestoreEnabled","Isolation","InitBinary","ContainerdCommit","RuncCommit","InitCommit","SecurityOptions","CDISpecDirs","Warnings"],"type":"object"},"EnvSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvSummary.json"],"format":"uri","readOnly":true,"type":"string"},"variables":{"items":{"$ref":"#/components/schemas/EnvVariable"},"type":["array","null"]}},"required":["variables"],"type":"object"},"EnvVariable":{"additionalProperties":false,"properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"],"type":"object"},"EnvironmentAgentPairRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentAgentPairRequest.json"],"format":"uri","readOnly":true,"type":"string"},"rotate":{"type":"boolean"}},"type":"object"},"EnvironmentAgentPairResponse":{"additionalProperties":false,"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"EnvironmentCreate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentCreate.json"],"format":"uri","readOnly":true,"type":"string"},"accessToken":{"type":"string"},"apiUrl":{"type":"string"},"bootstrapToken":{"type":"string"},"enabled":{"type":"boolean"},"isEdge":{"type":"boolean"},"name":{"type":"string"},"useApiKey":{"type":"boolean"}},"required":["apiUrl"],"type":"object"},"EnvironmentEnvironment":{"additionalProperties":false,"properties":{"apiKey":{"type":"string"},"apiUrl":{"type":"string"},"connected":{"type":"boolean"},"connectedAt":{"format":"date-time","type":"string"},"edgeTransport":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"isEdge":{"type":"boolean"},"lastHeartbeat":{"format":"date-time","type":"string"},"lastPollAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id","apiUrl","status","enabled","isEdge"],"type":"object"},"EnvironmentPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/EnvironmentEnvironment"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"EnvironmentTest":{"additionalProperties":false,"properties":{"message":{"type":"string"},"status":{"type":"string"}},"required":["status"],"type":"object"},"EnvironmentTestConnectionRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentTestConnectionRequest.json"],"format":"uri","readOnly":true,"type":"string"},"apiUrl":{"type":"string"}},"type":"object"},"EnvironmentUpdate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentUpdate.json"],"format":"uri","readOnly":true,"type":"string"},"accessToken":{"type":"string"},"apiUrl":{"type":"string"},"bootstrapToken":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"regenerateApiKey":{"type":"boolean"}},"type":"object"},"EnvironmentWithApiKey":{"additionalProperties":false,"properties":{"apiKey":{"description":"API key for pairing (only shown once during creation)","type":"string"},"apiUrl":{"type":"string"},"connected":{"type":"boolean"},"connectedAt":{"format":"date-time","type":"string"},"edgeTransport":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"isEdge":{"type":"boolean"},"lastHeartbeat":{"format":"date-time","type":"string"},"lastPollAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id","apiUrl","status","enabled","isEdge"],"type":"object"},"ErrorDetail":{"additionalProperties":false,"properties":{"location":{"description":"Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'","type":"string"},"message":{"description":"Error message text","type":"string"},"value":{"description":"The value at the given location"}},"type":"object"},"ErrorModel":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ErrorModel.json"],"format":"uri","readOnly":true,"type":"string"},"detail":{"description":"A human-readable explanation specific to this occurrence of the problem.","examples":["Property foo is required but is missing."],"type":"string"},"errors":{"description":"Optional list of individual error details","items":{"$ref":"#/components/schemas/ErrorDetail"},"type":["array","null"]},"instance":{"description":"A URI reference that identifies the specific occurrence of the problem.","examples":["https://example.com/error-log/abc123"],"format":"uri","type":"string"},"status":{"description":"HTTP status code","examples":[400],"format":"int64","type":"integer"},"title":{"description":"A short, human-readable summary of the problem type. This value should not change between occurrences of the error.","examples":["Bad Request"],"type":"string"},"type":{"default":"about:blank","description":"A URI reference to human-readable documentation for the error.","examples":["https://example.com/errors/example"],"format":"uri","type":"string"}},"type":"object"},"EventCreateEvent":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EventCreateEvent.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"type":"string"},"environmentId":{"type":"string"},"metadata":{"additionalProperties":{},"type":"object"},"resourceId":{"type":"string"},"resourceName":{"type":"string"},"resourceType":{"type":"string"},"severity":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"},"userId":{"type":"string"},"username":{"type":"string"}},"required":["type","title"],"type":"object"},"EventEvent":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"environmentId":{"type":"string"},"id":{"type":"string"},"metadata":{"additionalProperties":{},"type":"object"},"resourceId":{"type":"string"},"resourceName":{"type":"string"},"resourceType":{"type":"string"},"severity":{"type":"string"},"timestamp":{"format":"date-time","type":"string"},"title":{"type":"string"},"type":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"type":"string"},"username":{"type":"string"}},"required":["id","type","severity","title","timestamp","createdAt"],"type":"object"},"EventPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EventPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/EventEvent"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ExtendsConfig":{"additionalProperties":false,"properties":{"file":{"type":"string"},"service":{"type":"string"}},"type":"object"},"FileContentResponse":{"additionalProperties":false,"properties":{"content":{"contentEncoding":"base64","type":"string"},"mimeType":{"type":"string"}},"required":["content","mimeType"],"type":"object"},"GetSwarmNodeAgentDeploymentInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GetSwarmNodeAgentDeploymentInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"rotate":{"description":"Rotate the environment token before generating snippets","type":"boolean"}},"type":"object"},"GitOpsSyncPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitOpsSyncPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"counts":{"$ref":"#/components/schemas/GitopsSyncCounts"},"data":{"items":{"$ref":"#/components/schemas/GitopsGitOpsSync"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","counts","pagination"],"type":"object"},"GitRepositoryPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitRepositoryPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/GitopsGitRepository"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"GitopsBranchInfo":{"additionalProperties":false,"properties":{"isDefault":{"type":"boolean"},"name":{"type":"string"}},"required":["name","isDefault"],"type":"object"},"GitopsBranchesResponse":{"additionalProperties":false,"properties":{"branches":{"items":{"$ref":"#/components/schemas/GitopsBranchInfo"},"type":["array","null"]}},"required":["branches"],"type":"object"},"GitopsBrowseResponse":{"additionalProperties":false,"properties":{"files":{"items":{"$ref":"#/components/schemas/GitopsFileTreeNode"},"type":["array","null"]},"path":{"type":"string"}},"required":["path","files"],"type":"object"},"GitopsCreateSyncRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsCreateSyncRequest.json"],"format":"uri","readOnly":true,"type":"string"},"autoSync":{"type":"boolean"},"branch":{"type":"string"},"composePath":{"type":"string"},"maxSyncBinarySize":{"format":"int64","type":"integer"},"maxSyncFiles":{"format":"int64","type":"integer"},"maxSyncTotalSize":{"format":"int64","type":"integer"},"name":{"type":"string"},"projectName":{"type":"string"},"repositoryId":{"type":"string"},"syncDirectory":{"type":"boolean"},"syncInterval":{"format":"int64","type":"integer"}},"required":["name","repositoryId","branch","composePath"],"type":"object"},"GitopsFileTreeNode":{"additionalProperties":false,"properties":{"children":{"items":{"$ref":"#/components/schemas/GitopsFileTreeNode"},"type":["array","null"]},"name":{"type":"string"},"path":{"type":"string"},"size":{"format":"int64","type":"integer"},"type":{"type":"string"}},"required":["name","path","type"],"type":"object"},"GitopsGitOpsSync":{"additionalProperties":false,"properties":{"autoSync":{"type":"boolean"},"branch":{"type":"string"},"composePath":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"environmentId":{"type":"string"},"id":{"type":"string"},"lastSyncAt":{"format":"date-time","type":"string"},"lastSyncCommit":{"type":"string"},"lastSyncError":{"type":"string"},"lastSyncStatus":{"type":"string"},"maxSyncBinarySize":{"format":"int64","type":"integer"},"maxSyncFiles":{"format":"int64","type":"integer"},"maxSyncTotalSize":{"format":"int64","type":"integer"},"name":{"type":"string"},"projectId":{"type":"string"},"projectName":{"type":"string"},"repository":{"$ref":"#/components/schemas/GitopsGitRepository"},"repositoryId":{"type":"string"},"syncDirectory":{"type":"boolean"},"syncInterval":{"format":"int64","type":"integer"},"syncedFiles":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","environmentId","repositoryId","branch","composePath","projectName","autoSync","syncInterval","syncDirectory","maxSyncFiles","maxSyncTotalSize","maxSyncBinarySize","createdAt","updatedAt"],"type":"object"},"GitopsGitRepository":{"additionalProperties":false,"properties":{"authType":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"name":{"type":"string"},"sshHostKeyVerification":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["id","name","url","authType","enabled","createdAt","updatedAt"],"type":"object"},"GitopsImportGitOpsSyncRequest":{"additionalProperties":false,"properties":{"autoSync":{"type":"boolean"},"branch":{"type":"string"},"dockerComposePath":{"type":"string"},"gitRepo":{"type":"string"},"maxSyncBinarySize":{"format":"int64","type":"integer"},"maxSyncFiles":{"format":"int64","type":"integer"},"maxSyncTotalSize":{"format":"int64","type":"integer"},"syncDirectory":{"type":"boolean"},"syncInterval":{"format":"int64","type":"integer"},"syncName":{"type":"string"}},"required":["syncName","gitRepo","branch","dockerComposePath","autoSync","syncInterval"],"type":"object"},"GitopsImportGitOpsSyncResponse":{"additionalProperties":false,"properties":{"errors":{"items":{"type":"string"},"type":["array","null"]},"failedCount":{"format":"int64","type":"integer"},"successCount":{"format":"int64","type":"integer"}},"required":["successCount","failedCount","errors"],"type":"object"},"GitopsRepositorySync":{"additionalProperties":false,"properties":{"authType":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"name":{"type":"string"},"sshHostKeyVerification":{"type":"string"},"sshKey":{"type":"string"},"token":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["id","name","url","authType","enabled","createdAt","updatedAt"],"type":"object"},"GitopsRepositorySyncRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsRepositorySyncRequest.json"],"format":"uri","readOnly":true,"type":"string"},"repositories":{"items":{"$ref":"#/components/schemas/GitopsRepositorySync"},"type":["array","null"]}},"required":["repositories"],"type":"object"},"GitopsSyncCounts":{"additionalProperties":false,"properties":{"activeSyncs":{"format":"int64","type":"integer"},"successfulSyncs":{"format":"int64","type":"integer"},"totalSyncs":{"format":"int64","type":"integer"}},"required":["totalSyncs","activeSyncs","successfulSyncs"],"type":"object"},"GitopsSyncResult":{"additionalProperties":false,"properties":{"error":{"type":"string"},"message":{"type":"string"},"success":{"type":"boolean"},"syncedAt":{"format":"date-time","type":"string"}},"required":["success","message","syncedAt"],"type":"object"},"GitopsSyncStatus":{"additionalProperties":false,"properties":{"autoSync":{"type":"boolean"},"id":{"type":"string"},"lastSyncAt":{"format":"date-time","type":"string"},"lastSyncCommit":{"type":"string"},"lastSyncError":{"type":"string"},"lastSyncStatus":{"type":"string"},"nextSyncAt":{"format":"date-time","type":"string"}},"required":["id","autoSync"],"type":"object"},"GitopsUpdateSyncRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsUpdateSyncRequest.json"],"format":"uri","readOnly":true,"type":"string"},"autoSync":{"type":"boolean"},"branch":{"type":"string"},"composePath":{"type":"string"},"maxSyncBinarySize":{"format":"int64","type":"integer"},"maxSyncFiles":{"format":"int64","type":"integer"},"maxSyncTotalSize":{"format":"int64","type":"integer"},"name":{"type":"string"},"projectName":{"type":"string"},"repositoryId":{"type":"string"},"syncDirectory":{"type":"boolean"},"syncInterval":{"format":"int64","type":"integer"}},"type":"object"},"HealthCheckConfig":{"additionalProperties":false,"properties":{"disable":{"type":"boolean"},"interval":{"format":"int64","type":"integer"},"retries":{"format":"int64","minimum":0,"type":"integer"},"start_interval":{"format":"int64","type":"integer"},"start_period":{"format":"int64","type":"integer"},"test":{"items":{"type":"string"},"type":["array","null"]},"timeout":{"format":"int64","type":"integer"}},"type":"object"},"HealthcheckConfig":{"additionalProperties":false,"properties":{"Interval":{"format":"int64","type":"integer"},"Retries":{"format":"int64","type":"integer"},"StartInterval":{"format":"int64","type":"integer"},"StartPeriod":{"format":"int64","type":"integer"},"Test":{"items":{"type":"string"},"type":["array","null"]},"Timeout":{"format":"int64","type":"integer"}},"type":"object"},"ImageBuildPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageBuildPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ImageBuildRecord"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ImageBuildRecord":{"additionalProperties":false,"properties":{"buildArgs":{"additionalProperties":{"type":"string"},"type":"object"},"cacheFrom":{"items":{"type":"string"},"type":["array","null"]},"cacheTo":{"items":{"type":"string"},"type":["array","null"]},"completedAt":{"format":"date-time","type":"string"},"contextDir":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"digest":{"type":"string"},"dockerfile":{"type":"string"},"durationMs":{"format":"int64","type":"integer"},"entitlements":{"items":{"type":"string"},"type":["array","null"]},"environmentId":{"type":"string"},"errorMessage":{"type":"string"},"extraHosts":{"items":{"type":"string"},"type":["array","null"]},"id":{"type":"string"},"isolation":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"load":{"type":"boolean"},"network":{"type":"string"},"noCache":{"type":"boolean"},"output":{"type":"string"},"outputTruncated":{"type":"boolean"},"platforms":{"items":{"type":"string"},"type":["array","null"]},"privileged":{"type":"boolean"},"provider":{"type":"string"},"pull":{"type":"boolean"},"push":{"type":"boolean"},"shmSize":{"format":"int64","type":"integer"},"status":{"type":"string"},"tags":{"items":{"type":"string"},"type":["array","null"]},"target":{"type":"string"},"ulimits":{"additionalProperties":{"type":"string"},"type":"object"},"userId":{"type":"string"},"username":{"type":"string"}},"required":["id","environmentId","status","contextDir","noCache","pull","privileged","push","load","outputTruncated","createdAt"],"type":"object"},"ImageBuildRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageBuildRequest.json"],"format":"uri","readOnly":true,"type":"string"},"buildArgs":{"additionalProperties":{"type":"string"},"description":"Build arguments","type":"object"},"cacheFrom":{"description":"Build cache sources","items":{"type":"string"},"type":["array","null"]},"cacheTo":{"description":"Build cache targets","items":{"type":"string"},"type":["array","null"]},"contextDir":{"description":"Build context directory or Git URL","minLength":1,"type":"string"},"dockerfile":{"description":"Dockerfile path","type":"string"},"dockerfileInline":{"description":"Inline Dockerfile content","type":"string"},"entitlements":{"description":"Build entitlements","items":{"type":"string"},"type":["array","null"]},"extraHosts":{"description":"Build extra host mappings","items":{"type":"string"},"type":["array","null"]},"isolation":{"description":"Build isolation mode","type":"string"},"labels":{"additionalProperties":{"type":"string"},"description":"Build labels","type":"object"},"load":{"description":"Load image into local Docker","type":"boolean"},"network":{"description":"Build network mode","type":"string"},"noCache":{"description":"Disable build cache","type":"boolean"},"platforms":{"description":"Target platforms","items":{"type":"string"},"type":["array","null"]},"privileged":{"description":"Enable privileged build","type":"boolean"},"provider":{"description":"Build provider override","type":"string"},"pull":{"description":"Always pull referenced base images","type":"boolean"},"push":{"description":"Push image","type":"boolean"},"shmSize":{"description":"Build shared memory size in bytes","format":"int64","type":"integer"},"tags":{"description":"Image tags","items":{"type":"string"},"type":["array","null"]},"target":{"description":"Target stage","type":"string"},"ulimits":{"additionalProperties":{"type":"string"},"description":"Build ulimits","type":"object"}},"required":["contextDir"],"type":"object"},"ImageDetailSummary":{"additionalProperties":false,"properties":{"architecture":{"type":"string"},"author":{"type":"string"},"comment":{"type":"string"},"config":{"$ref":"#/components/schemas/DetailSummaryConfigStruct"},"created":{"type":"string"},"descriptor":{"$ref":"#/components/schemas/DetailSummaryDescriptorStruct"},"graphDriver":{"$ref":"#/components/schemas/DetailSummaryGraphDriverStruct"},"id":{"type":"string"},"metadata":{"$ref":"#/components/schemas/DetailSummaryMetadataStruct"},"os":{"type":"string"},"repoDigests":{"items":{"type":"string"},"type":["array","null"]},"repoTags":{"items":{"type":"string"},"type":["array","null"]},"rootFs":{"$ref":"#/components/schemas/DetailSummaryRootFsStruct"},"size":{"format":"int64","type":"integer"}},"required":["id","repoTags","repoDigests","comment","created","author","config","architecture","os","size","graphDriver","rootFs","metadata","descriptor"],"type":"object"},"ImageLoadResult":{"additionalProperties":false,"properties":{"stream":{"type":"string"}},"required":["stream"],"type":"object"},"ImagePaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImagePaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ImageSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ImagePruneReport":{"additionalProperties":false,"properties":{"imagesDeleted":{"items":{"type":"string"},"type":["array","null"]},"spaceReclaimed":{"format":"int64","type":"integer"}},"required":["imagesDeleted","spaceReclaimed"],"type":"object"},"ImagePullOptions":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImagePullOptions.json"],"format":"uri","readOnly":true,"type":"string"},"auth":{"$ref":"#/components/schemas/ContainerregistryCredential"},"credentials":{"items":{"$ref":"#/components/schemas/ContainerregistryCredential"},"type":["array","null"]},"imageName":{"description":"Name of the image to pull (e.g., nginx)","minLength":1,"type":"string"},"tag":{"description":"Tag of the image to pull (e.g., latest)","type":"string"}},"required":["imageName"],"type":"object"},"ImageSummary":{"additionalProperties":false,"properties":{"created":{"format":"int64","type":"integer"},"id":{"type":"string"},"inUse":{"type":"boolean"},"labels":{"additionalProperties":{},"type":"object"},"repo":{"type":"string"},"repoDigests":{"items":{"type":"string"},"type":["array","null"]},"repoTags":{"items":{"type":"string"},"type":["array","null"]},"size":{"format":"int64","type":"integer"},"tag":{"type":"string"},"updateInfo":{"$ref":"#/components/schemas/ImageUpdateInfo"},"usedBy":{"items":{"$ref":"#/components/schemas/ImageUsedBy"},"type":["array","null"]},"virtualSize":{"format":"int64","type":"integer"},"vulnerabilityScan":{"$ref":"#/components/schemas/VulnerabilityScanSummary"}},"required":["id","repoTags","repoDigests","created","size","virtualSize","labels","inUse","repo","tag"],"type":"object"},"ImageUpdateInfo":{"additionalProperties":false,"properties":{"authMethod":{"type":"string"},"authRegistry":{"type":"string"},"authUsername":{"type":"string"},"checkTime":{"format":"date-time","type":"string"},"currentDigest":{"type":"string"},"currentVersion":{"type":"string"},"error":{"type":"string"},"hasUpdate":{"type":"boolean"},"latestDigest":{"type":"string"},"latestVersion":{"type":"string"},"responseTimeMs":{"format":"int64","type":"integer"},"updateType":{"type":"string"},"usedCredential":{"type":"boolean"}},"required":["hasUpdate","updateType","currentVersion","latestVersion","currentDigest","latestDigest","checkTime","responseTimeMs","error"],"type":"object"},"ImageUsageCounts":{"additionalProperties":false,"properties":{"imagesInuse":{"format":"int64","type":"integer"},"imagesUnused":{"format":"int64","type":"integer"},"totalImageSize":{"format":"int64","type":"integer"},"totalImages":{"format":"int64","type":"integer"}},"required":["imagesInuse","imagesUnused","totalImages","totalImageSize"],"type":"object"},"ImageUsageCountsResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageUsageCountsResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageUsageCounts"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ImageUsedBy":{"additionalProperties":false,"properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}},"required":["type","name"],"type":"object"},"ImageupdateBatchImageUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageupdateBatchImageUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"credentials":{"items":{"$ref":"#/components/schemas/ContainerregistryCredential"},"type":["array","null"]},"imageRefs":{"items":{"type":"string"},"type":["array","null"]}},"required":["imageRefs"],"type":"object"},"ImageupdateCheckAllImagesRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageupdateCheckAllImagesRequest.json"],"format":"uri","readOnly":true,"type":"string"},"credentials":{"items":{"$ref":"#/components/schemas/ContainerregistryCredential"},"type":["array","null"]}},"type":"object"},"ImageupdateResponse":{"additionalProperties":false,"properties":{"authMethod":{"type":"string"},"authRegistry":{"type":"string"},"authUsername":{"type":"string"},"checkTime":{"format":"date-time","type":"string"},"currentDigest":{"type":"string"},"currentVersion":{"type":"string"},"error":{"type":"string"},"hasUpdate":{"type":"boolean"},"latestDigest":{"type":"string"},"latestVersion":{"type":"string"},"responseTimeMs":{"format":"int64","type":"integer"},"updateType":{"type":"string"},"usedCredential":{"type":"boolean"}},"required":["hasUpdate","updateType","currentVersion","checkTime","responseTimeMs"],"type":"object"},"ImageupdateSummary":{"additionalProperties":false,"properties":{"digestUpdates":{"format":"int64","type":"integer"},"errorsCount":{"format":"int64","type":"integer"},"imagesWithUpdates":{"format":"int64","type":"integer"},"totalImages":{"format":"int64","type":"integer"}},"required":["totalImages","imagesWithUpdates","digestUpdates","errorsCount"],"type":"object"},"JobscheduleConfig":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleConfig.json"],"format":"uri","readOnly":true,"type":"string"},"autoHealInterval":{"type":"string"},"autoUpdateInterval":{"type":"string"},"environmentHealthInterval":{"type":"string"},"eventCleanupInterval":{"type":"string"},"gitopsSyncInterval":{"type":"string"},"pollingInterval":{"type":"string"},"scheduledPruneInterval":{"type":"string"},"vulnerabilityScanInterval":{"type":"string"}},"required":["environmentHealthInterval","eventCleanupInterval","autoUpdateInterval","pollingInterval","scheduledPruneInterval","gitopsSyncInterval","vulnerabilityScanInterval","autoHealInterval"],"type":"object"},"JobscheduleJobListResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleJobListResponse.json"],"format":"uri","readOnly":true,"type":"string"},"isAgent":{"type":"boolean"},"jobs":{"items":{"$ref":"#/components/schemas/JobscheduleJobStatus"},"type":["array","null"]}},"required":["jobs","isAgent"],"type":"object"},"JobscheduleJobPrerequisite":{"additionalProperties":false,"properties":{"isMet":{"type":"boolean"},"label":{"type":"string"},"settingKey":{"type":"string"},"settingsUrl":{"type":"string"}},"required":["settingKey","label","isMet"],"type":"object"},"JobscheduleJobRunResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleJobRunResponse.json"],"format":"uri","readOnly":true,"type":"string"},"message":{"type":"string"},"success":{"type":"boolean"}},"required":["success","message"],"type":"object"},"JobscheduleJobStatus":{"additionalProperties":false,"properties":{"canRunManually":{"type":"boolean"},"category":{"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"isContinuous":{"type":"boolean"},"managerOnly":{"type":"boolean"},"name":{"type":"string"},"nextRun":{"format":"date-time","type":"string"},"prerequisites":{"items":{"$ref":"#/components/schemas/JobscheduleJobPrerequisite"},"type":["array","null"]},"schedule":{"type":"string"},"settingsKey":{"type":"string"}},"required":["id","name","description","category","schedule","enabled","managerOnly","isContinuous","canRunManually","prerequisites"],"type":"object"},"JobscheduleUpdate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleUpdate.json"],"format":"uri","readOnly":true,"type":"string"},"autoHealInterval":{"type":"string"},"autoUpdateInterval":{"type":"string"},"environmentHealthInterval":{"type":"string"},"eventCleanupInterval":{"type":"string"},"gitopsSyncInterval":{"type":"string"},"pollingInterval":{"type":"string"},"scheduledPruneInterval":{"type":"string"},"vulnerabilityScanInterval":{"type":"string"}},"type":"object"},"LoggingConfig":{"additionalProperties":false,"properties":{"driver":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"MetaMetadata":{"additionalProperties":false,"properties":{"description":{"type":"string"},"key":{"type":"string"},"keywords":{"items":{"type":"string"},"type":["array","null"]},"label":{"type":"string"},"type":{"type":"string"}},"required":["key","label","type"],"type":"object"},"MetaTemplateMeta":{"additionalProperties":false,"properties":{"author":{"type":"string"},"documentationUrl":{"type":"string"},"envUrl":{"type":"string"},"iconUrl":{"type":"string"},"remoteUrl":{"type":"string"},"tags":{"items":{"type":"string"},"type":["array","null"]},"updatedAt":{"type":"string"},"version":{"type":"string"}},"type":"object"},"NetworkContainerEndpoint":{"additionalProperties":false,"properties":{"endpointId":{"type":"string"},"id":{"type":"string"},"ipv4Address":{"type":"string"},"ipv6Address":{"type":"string"},"macAddress":{"type":"string"},"name":{"type":"string"}},"required":["id","name","endpointId","ipv4Address","ipv6Address","macAddress"],"type":"object"},"NetworkCountsApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCountsApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkUsageCounts"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkCreateOptions":{"additionalProperties":false,"properties":{"attachable":{"description":"Allow manual container attachment","type":"boolean"},"checkDuplicate":{"description":"Check for duplicate network names","type":"boolean"},"driver":{"description":"Network driver (e.g., bridge, overlay)","type":"string"},"enableIPv6":{"description":"Enable IPv6 networking","type":"boolean"},"ingress":{"description":"Enable routing-mesh for swarm cluster","type":"boolean"},"internal":{"description":"Restrict external access to the network","type":"boolean"},"ipam":{"$ref":"#/components/schemas/NetworkIPAM","description":"IP Address Management configuration"},"labels":{"additionalProperties":{"type":"string"},"description":"User-defined labels","type":"object"},"options":{"additionalProperties":{"type":"string"},"description":"Driver-specific options","type":"object"}},"type":"object"},"NetworkCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"name":{"description":"Name of the network","minLength":1,"type":"string"},"options":{"$ref":"#/components/schemas/NetworkCreateOptions","description":"Network creation options"}},"required":["name","options"],"type":"object"},"NetworkCreateResponse":{"additionalProperties":false,"properties":{"id":{"type":"string"},"warning":{"type":"string"}},"required":["id"],"type":"object"},"NetworkCreatedApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCreatedApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkCreateResponse"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkIPAM":{"additionalProperties":false,"properties":{"config":{"items":{"$ref":"#/components/schemas/NetworkIPAMConfig"},"type":["array","null"]},"driver":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"NetworkIPAMConfig":{"additionalProperties":false,"properties":{"auxAddress":{"additionalProperties":{"type":"string"},"type":"object"},"gateway":{"type":"string"},"ipRange":{"type":"string"},"subnet":{"type":"string"}},"type":"object"},"NetworkInspect":{"additionalProperties":false,"properties":{"attachable":{"type":"boolean"},"configFrom":{"$ref":"#/components/schemas/DockerNetworkConfigReference"},"configOnly":{"type":"boolean"},"containers":{"additionalProperties":{"$ref":"#/components/schemas/DockerNetworkEndpointResource"},"type":"object"},"containersList":{"items":{"$ref":"#/components/schemas/NetworkContainerEndpoint"},"type":["array","null"]},"created":{"format":"date-time","type":"string"},"driver":{"type":"string"},"enableIPv4":{"type":"boolean"},"enableIPv6":{"type":"boolean"},"id":{"type":"string"},"ingress":{"type":"boolean"},"internal":{"type":"boolean"},"ipam":{"$ref":"#/components/schemas/NetworkIPAM"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"peers":{"items":{"$ref":"#/components/schemas/DockerNetworkPeerInfo"},"type":["array","null"]},"scope":{"type":"string"},"services":{"additionalProperties":{"$ref":"#/components/schemas/DockerNetworkServiceInfo"},"type":"object"}},"required":["id","name","driver","scope","created","enableIPv4","enableIPv6","ipam","internal","attachable","ingress","configFrom","configOnly","containers","options","labels","containersList"],"type":"object"},"NetworkInspectApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkInspectApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkInspect"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkMessageApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkMessageApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BaseMessageResponse"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"counts":{"$ref":"#/components/schemas/NetworkUsageCounts"},"data":{"items":{"$ref":"#/components/schemas/NetworkSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","counts","pagination"],"type":"object"},"NetworkPruneReport":{"additionalProperties":false,"properties":{"networksDeleted":{"items":{"type":"string"},"type":["array","null"]},"spaceReclaimed":{"format":"int64","minimum":0,"type":"integer"}},"required":["networksDeleted","spaceReclaimed"],"type":"object"},"NetworkPruneResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkPruneResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkPruneReport"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkSummary":{"additionalProperties":false,"properties":{"created":{"format":"date-time","type":"string"},"driver":{"type":"string"},"id":{"type":"string"},"inUse":{"type":"boolean"},"isDefault":{"type":"boolean"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"scope":{"type":"string"}},"required":["id","name","driver","scope","created","options","labels","inUse","isDefault"],"type":"object"},"NetworkTopology":{"additionalProperties":false,"properties":{"edges":{"items":{"$ref":"#/components/schemas/NetworkTopologyEdge"},"type":["array","null"]},"nodes":{"items":{"$ref":"#/components/schemas/NetworkTopologyNode"},"type":["array","null"]}},"required":["nodes","edges"],"type":"object"},"NetworkTopologyApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkTopologyApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkTopology"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkTopologyEdge":{"additionalProperties":false,"properties":{"id":{"type":"string"},"ipv4Address":{"type":"string"},"ipv6Address":{"type":"string"},"source":{"type":"string"},"target":{"type":"string"}},"required":["id","source","target"],"type":"object"},"NetworkTopologyNode":{"additionalProperties":false,"properties":{"id":{"type":"string"},"metadata":{"$ref":"#/components/schemas/NetworkTopologyNodeMetadata"},"name":{"type":"string"},"type":{"type":"string"}},"required":["id","name","type","metadata"],"type":"object"},"NetworkTopologyNodeMetadata":{"additionalProperties":false,"properties":{"driver":{"type":"string"},"image":{"type":"string"},"isDefault":{"type":"boolean"},"scope":{"type":"string"},"status":{"type":"string"}},"type":"object"},"NetworkUsageCounts":{"additionalProperties":false,"properties":{"inuse":{"format":"int64","type":"integer"},"total":{"format":"int64","type":"integer"},"unused":{"format":"int64","type":"integer"}},"required":["inuse","unused","total"],"type":"object"},"NotificationAppriseResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationAppriseResponse.json"],"format":"uri","readOnly":true,"type":"string"},"apiUrl":{"type":"string"},"containerUpdateTag":{"type":"string"},"enabled":{"type":"boolean"},"id":{"format":"int64","minimum":0,"type":"integer"},"imageUpdateTag":{"type":"string"}},"required":["id","apiUrl","enabled","imageUpdateTag","containerUpdateTag"],"type":"object"},"NotificationAppriseUpdate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationAppriseUpdate.json"],"format":"uri","readOnly":true,"type":"string"},"apiUrl":{"type":"string"},"containerUpdateTag":{"type":"string"},"enabled":{"type":"boolean"},"imageUpdateTag":{"type":"string"}},"required":["apiUrl","enabled","imageUpdateTag","containerUpdateTag"],"type":"object"},"NotificationDispatchAutoHeal":{"additionalProperties":false,"properties":{"containerId":{"type":"string"},"containerName":{"type":"string"}},"required":["containerName","containerId"],"type":"object"},"NotificationDispatchBatchImageUpdate":{"additionalProperties":false,"properties":{"updates":{"additionalProperties":{"$ref":"#/components/schemas/ImageupdateResponse"},"type":"object"}},"required":["updates"],"type":"object"},"NotificationDispatchContainerUpdate":{"additionalProperties":false,"properties":{"containerName":{"type":"string"},"imageRef":{"type":"string"},"newDigest":{"type":"string"},"oldDigest":{"type":"string"}},"required":["containerName","imageRef"],"type":"object"},"NotificationDispatchImageUpdate":{"additionalProperties":false,"properties":{"imageRef":{"type":"string"},"updateInfo":{"$ref":"#/components/schemas/ImageupdateResponse"}},"required":["imageRef","updateInfo"],"type":"object"},"NotificationDispatchPruneReport":{"additionalProperties":false,"properties":{"result":{"$ref":"#/components/schemas/SystemPruneAllResult"}},"required":["result"],"type":"object"},"NotificationDispatchRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationDispatchRequest.json"],"format":"uri","readOnly":true,"type":"string"},"autoHeal":{"$ref":"#/components/schemas/NotificationDispatchAutoHeal"},"batchImageUpdate":{"$ref":"#/components/schemas/NotificationDispatchBatchImageUpdate"},"containerUpdate":{"$ref":"#/components/schemas/NotificationDispatchContainerUpdate"},"imageUpdate":{"$ref":"#/components/schemas/NotificationDispatchImageUpdate"},"kind":{"type":"string"},"pruneReport":{"$ref":"#/components/schemas/NotificationDispatchPruneReport"},"vulnerabilityFound":{"$ref":"#/components/schemas/NotificationDispatchVulnerabilityFound"}},"required":["kind"],"type":"object"},"NotificationDispatchVulnerabilityFound":{"additionalProperties":false,"properties":{"cveId":{"type":"string"},"cveLink":{"type":"string"},"fixedVersion":{"type":"string"},"imageName":{"type":"string"},"installedVersion":{"type":"string"},"pkgName":{"type":"string"},"severity":{"type":"string"}},"required":["cveId","cveLink","severity","imageName"],"type":"object"},"NotificationResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationResponse.json"],"format":"uri","readOnly":true,"type":"string"},"config":{"additionalProperties":{},"type":"object"},"enabled":{"type":"boolean"},"id":{"format":"int64","minimum":0,"type":"integer"},"provider":{"type":"string"}},"required":["id","provider","enabled","config"],"type":"object"},"NotificationUpdate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationUpdate.json"],"format":"uri","readOnly":true,"type":"string"},"config":{"additionalProperties":{},"type":"object"},"enabled":{"type":"boolean"},"provider":{"type":"string"}},"required":["provider","enabled","config"],"type":"object"},"PortPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/PortPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/PortPortMapping"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"PortPortMapping":{"additionalProperties":false,"properties":{"containerId":{"type":"string"},"containerName":{"type":"string"},"containerPort":{"format":"int64","type":"integer"},"hostIp":{"type":"string"},"hostPort":{"format":"int64","type":"integer"},"id":{"type":"string"},"isPublished":{"type":"boolean"},"protocol":{"type":"string"}},"required":["id","containerId","containerName","containerPort","protocol","isPublished"],"type":"object"},"ProjectCreateProject":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectCreateProject.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"}},"required":["name","composeContent"],"type":"object"},"ProjectCreateReponse":{"additionalProperties":false,"properties":{"createdAt":{"type":"string"},"dirName":{"type":"string"},"gitOpsManagedBy":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"path":{"type":"string"},"relativePath":{"type":"string"},"runningCount":{"format":"int64","type":"integer"},"serviceCount":{"format":"int64","type":"integer"},"status":{"type":"string"},"statusReason":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","path","status","serviceCount","runningCount","createdAt","updatedAt"],"type":"object"},"ProjectDeployOptions":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectDeployOptions.json"],"format":"uri","readOnly":true,"type":"string"},"forceRecreate":{"type":"boolean"},"pullPolicy":{"type":"string"}},"type":"object"},"ProjectDestroy":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectDestroy.json"],"format":"uri","readOnly":true,"type":"string"},"removeFiles":{"type":"boolean"},"removeVolumes":{"type":"boolean"}},"type":"object"},"ProjectDetails":{"additionalProperties":false,"properties":{"composeContent":{"type":"string"},"createdAt":{"type":"string"},"dirName":{"type":"string"},"directoryFiles":{"items":{"$ref":"#/components/schemas/ProjectIncludeFile"},"type":["array","null"]},"envContent":{"type":"string"},"gitOpsManagedBy":{"type":"string"},"gitRepositoryURL":{"type":"string"},"hasBuildDirective":{"type":"boolean"},"iconUrl":{"type":"string"},"id":{"type":"string"},"includeFiles":{"items":{"$ref":"#/components/schemas/ProjectIncludeFile"},"type":["array","null"]},"lastSyncCommit":{"type":"string"},"name":{"type":"string"},"path":{"type":"string"},"relativePath":{"type":"string"},"runningCount":{"format":"int64","type":"integer"},"runtimeServices":{"items":{"$ref":"#/components/schemas/ProjectRuntimeService"},"type":["array","null"]},"serviceCount":{"format":"int64","type":"integer"},"services":{"items":{"$ref":"#/components/schemas/DockerTypesServiceConfig"},"type":["array","null"]},"status":{"type":"string"},"statusReason":{"type":"string"},"updatedAt":{"type":"string"},"urls":{"items":{"type":"string"},"type":["array","null"]}},"required":["id","name","path","status","serviceCount","runningCount","createdAt","updatedAt"],"type":"object"},"ProjectIncludeFile":{"additionalProperties":false,"properties":{"content":{"type":"string"},"path":{"type":"string"},"relativePath":{"type":"string"}},"required":["path","relativePath","content"],"type":"object"},"ProjectPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ProjectDetails"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ProjectRuntimeService":{"additionalProperties":false,"properties":{"containerId":{"type":"string"},"containerName":{"type":"string"},"health":{"type":"string"},"iconUrl":{"type":"string"},"image":{"type":"string"},"name":{"type":"string"},"ports":{"items":{"type":"string"},"type":["array","null"]},"serviceConfig":{"$ref":"#/components/schemas/ServiceConfig"},"status":{"type":"string"}},"required":["name","image","status"],"type":"object"},"ProjectStatusCounts":{"additionalProperties":false,"properties":{"runningProjects":{"format":"int64","type":"integer"},"stoppedProjects":{"format":"int64","type":"integer"},"totalProjects":{"format":"int64","type":"integer"}},"required":["runningProjects","stoppedProjects","totalProjects"],"type":"object"},"ProjectUpdateIncludeFile":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectUpdateIncludeFile.json"],"format":"uri","readOnly":true,"type":"string"},"content":{"type":"string"},"relativePath":{"type":"string"}},"required":["relativePath","content"],"type":"object"},"ProjectUpdateProject":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectUpdateProject.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"}},"type":"object"},"PruneImagesInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/PruneImagesInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"dangling":{"type":"boolean"},"filters":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"}},"type":"object"},"Resource":{"additionalProperties":false,"properties":{"cpus":{"format":"float","type":"number"},"devices":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceRequest"},"type":["array","null"]},"generic_resources":{"items":{"$ref":"#/components/schemas/DockerTypesGenericResource"},"type":["array","null"]},"memory":{"format":"int64","type":"integer"},"pids":{"format":"int64","type":"integer"}},"type":"object"},"RestartPolicy":{"additionalProperties":false,"properties":{"condition":{"type":"string"},"delay":{"format":"int64","type":"integer"},"max_attempts":{"format":"int64","minimum":0,"type":"integer"},"window":{"format":"int64","type":"integer"}},"type":"object"},"RestoreBackupFilesInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/RestoreBackupFilesInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"paths":{"description":"Paths to restore from backup","items":{"type":"string"},"type":["array","null"]}},"required":["paths"],"type":"object"},"ScannerStatus":{"additionalProperties":false,"properties":{"available":{"type":"boolean"},"version":{"type":"string"}},"required":["available"],"type":"object"},"SearchRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SearchRequest.json"],"format":"uri","readOnly":true,"type":"string"},"query":{"type":"string"}},"required":["query"],"type":"object"},"SearchResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SearchResponse.json"],"format":"uri","readOnly":true,"type":"string"},"count":{"format":"int64","type":"integer"},"query":{"type":"string"},"results":{"items":{"$ref":"#/components/schemas/CategoryCategory"},"type":["array","null"]}},"required":["results","query","count"],"type":"object"},"ServiceConfig":{"additionalProperties":false,"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"attach":{"type":"boolean"},"blkio_config":{"$ref":"#/components/schemas/BlkioConfig"},"build":{"$ref":"#/components/schemas/BuildConfig"},"cap_add":{"items":{"type":"string"},"type":["array","null"]},"cap_drop":{"items":{"type":"string"},"type":["array","null"]},"cgroup":{"type":"string"},"cgroup_parent":{"type":"string"},"command":{"items":{"type":"string"},"type":["array","null"]},"configs":{"items":{"$ref":"#/components/schemas/DockerTypesServiceConfigObjConfig"},"type":["array","null"]},"container_name":{"type":"string"},"cpu_count":{"format":"int64","type":"integer"},"cpu_percent":{"format":"float","type":"number"},"cpu_period":{"format":"int64","type":"integer"},"cpu_quota":{"format":"int64","type":"integer"},"cpu_rt_period":{"format":"int64","type":"integer"},"cpu_rt_runtime":{"format":"int64","type":"integer"},"cpu_shares":{"format":"int64","type":"integer"},"cpus":{"format":"float","type":"number"},"cpuset":{"type":"string"},"credential_spec":{"$ref":"#/components/schemas/CredentialSpecConfig"},"depends_on":{"additionalProperties":{"$ref":"#/components/schemas/DockerTypesServiceDependency"},"type":"object"},"deploy":{"$ref":"#/components/schemas/DeployConfig"},"develop":{"$ref":"#/components/schemas/DevelopConfig"},"device_cgroup_rules":{"items":{"type":"string"},"type":["array","null"]},"devices":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceMapping"},"type":["array","null"]},"dns":{"items":{"type":"string"},"type":["array","null"]},"dns_opt":{"items":{"type":"string"},"type":["array","null"]},"dns_search":{"items":{"type":"string"},"type":["array","null"]},"dockerfile":{"type":"string"},"domainname":{"type":"string"},"entrypoint":{"items":{"type":"string"},"type":["array","null"]},"env_file":{"items":{"$ref":"#/components/schemas/DockerTypesEnvFile"},"type":["array","null"]},"environment":{"additionalProperties":{"type":["string","null"]},"type":"object"},"expose":{"items":{"type":"string"},"type":["array","null"]},"extends":{"$ref":"#/components/schemas/ExtendsConfig"},"external_links":{"items":{"type":"string"},"type":["array","null"]},"extra_hosts":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"},"gpus":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceRequest"},"type":["array","null"]},"group_add":{"items":{"type":"string"},"type":["array","null"]},"healthcheck":{"$ref":"#/components/schemas/HealthCheckConfig"},"hostname":{"type":"string"},"image":{"type":"string"},"init":{"type":"boolean"},"ipc":{"type":"string"},"isolation":{"type":"string"},"label_file":{"items":{"type":"string"},"type":["array","null"]},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"links":{"items":{"type":"string"},"type":["array","null"]},"log_driver":{"type":"string"},"log_opt":{"additionalProperties":{"type":"string"},"type":"object"},"logging":{"$ref":"#/components/schemas/LoggingConfig"},"mac_address":{"type":"string"},"mem_limit":{"format":"int64","type":"integer"},"mem_reservation":{"format":"int64","type":"integer"},"mem_swappiness":{"format":"int64","type":"integer"},"memswap_limit":{"format":"int64","type":"integer"},"models":{"additionalProperties":{"$ref":"#/components/schemas/ServiceModelConfig"},"type":"object"},"net":{"type":"string"},"network_mode":{"type":"string"},"networks":{"additionalProperties":{"$ref":"#/components/schemas/ServiceNetworkConfig"},"type":"object"},"oom_kill_disable":{"type":"boolean"},"oom_score_adj":{"format":"int64","type":"integer"},"pid":{"type":"string"},"pids_limit":{"format":"int64","type":"integer"},"platform":{"type":"string"},"ports":{"items":{"$ref":"#/components/schemas/DockerTypesServicePortConfig"},"type":["array","null"]},"post_start":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"pre_stop":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"privileged":{"type":"boolean"},"profiles":{"items":{"type":"string"},"type":["array","null"]},"provider":{"$ref":"#/components/schemas/ServiceProviderConfig"},"pull_policy":{"type":"string"},"read_only":{"type":"boolean"},"restart":{"type":"string"},"runtime":{"type":"string"},"scale":{"format":"int64","type":"integer"},"secrets":{"items":{"$ref":"#/components/schemas/DockerTypesServiceSecretConfig"},"type":["array","null"]},"security_opt":{"items":{"type":"string"},"type":["array","null"]},"shm_size":{"format":"int64","type":"integer"},"stdin_open":{"type":"boolean"},"stop_grace_period":{"format":"int64","type":"integer"},"stop_signal":{"type":"string"},"storage_opt":{"additionalProperties":{"type":"string"},"type":"object"},"sysctls":{"additionalProperties":{"type":"string"},"type":"object"},"tmpfs":{"items":{"type":"string"},"type":["array","null"]},"tty":{"type":"boolean"},"ulimits":{"additionalProperties":{"$ref":"#/components/schemas/UlimitsConfig"},"type":"object"},"use_api_socket":{"type":"boolean"},"user":{"type":"string"},"userns_mode":{"type":"string"},"uts":{"type":"string"},"volume_driver":{"type":"string"},"volumes":{"items":{"$ref":"#/components/schemas/DockerTypesServiceVolumeConfig"},"type":["array","null"]},"volumes_from":{"items":{"type":"string"},"type":["array","null"]},"working_dir":{"type":"string"}},"required":["command","entrypoint"],"type":"object"},"ServiceModelConfig":{"additionalProperties":false,"properties":{"endpoint_var":{"type":"string"},"model_var":{"type":"string"}},"type":"object"},"ServiceNetworkConfig":{"additionalProperties":false,"properties":{"aliases":{"items":{"type":"string"},"type":["array","null"]},"driver_opts":{"additionalProperties":{"type":"string"},"type":"object"},"gw_priority":{"format":"int64","type":"integer"},"interface_name":{"type":"string"},"ipv4_address":{"type":"string"},"ipv6_address":{"type":"string"},"link_local_ips":{"items":{"type":"string"},"type":["array","null"]},"mac_address":{"type":"string"},"priority":{"format":"int64","type":"integer"}},"type":"object"},"ServiceProviderConfig":{"additionalProperties":false,"properties":{"options":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"},"type":{"type":"string"}},"type":"object"},"ServiceVolumeBind":{"additionalProperties":false,"properties":{"create_host_path":{"type":"boolean"},"propagation":{"type":"string"},"recursive":{"type":"string"},"selinux":{"type":"string"}},"type":"object"},"ServiceVolumeImage":{"additionalProperties":false,"properties":{"subpath":{"type":"string"}},"type":"object"},"ServiceVolumeTmpfs":{"additionalProperties":false,"properties":{"mode":{"format":"int32","minimum":0,"type":"integer"},"size":{"format":"int64","type":"integer"}},"type":"object"},"ServiceVolumeVolume":{"additionalProperties":false,"properties":{"labels":{"additionalProperties":{"type":"string"},"type":"object"},"nocopy":{"type":"boolean"},"subpath":{"type":"string"}},"type":"object"},"SetAutoUpdateInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SetAutoUpdateInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"enabled":{"description":"Whether auto-update is enabled for this container","type":"boolean"}},"required":["enabled"],"type":"object"},"SettingsPublicSetting":{"additionalProperties":false,"properties":{"key":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"required":["key","type","value"],"type":"object"},"SettingsSettingDto":{"additionalProperties":false,"properties":{"isPublic":{"type":"boolean"},"key":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"required":["isPublic","key","type","value"],"type":"object"},"SettingsUpdate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SettingsUpdate.json"],"format":"uri","readOnly":true,"type":"string"},"accentColor":{"type":"string"},"applicationTheme":{"type":"string"},"authLocalEnabled":{"type":"string"},"authOidcConfig":{"type":"string"},"authPasswordPolicy":{"type":"string"},"authSessionTimeout":{"type":"string"},"autoHealEnabled":{"type":"string"},"autoHealExcludedContainers":{"type":"string"},"autoHealInterval":{"type":"string"},"autoHealMaxRestarts":{"type":"string"},"autoHealRestartWindow":{"type":"string"},"autoInjectEnv":{"type":"string"},"autoUpdate":{"type":"string"},"autoUpdateExcludedContainers":{"type":"string"},"autoUpdateInterval":{"type":"string"},"baseServerUrl":{"type":"string"},"buildProvider":{"type":"string"},"buildTimeout":{"type":"string"},"buildsDirectory":{"type":"string"},"defaultDeployPullPolicy":{"type":"string"},"defaultShell":{"type":"string"},"depotProjectId":{"type":"string"},"depotToken":{"type":"string"},"diskUsagePath":{"type":"string"},"dockerApiTimeout":{"type":"string"},"dockerHost":{"type":"string"},"dockerImagePullTimeout":{"type":"string"},"dockerPruneMode":{"type":"string"},"enableGravatar":{"type":"string"},"environmentHealthInterval":{"type":"string"},"followProjectSymlinks":{"type":"string"},"gitOperationTimeout":{"type":"string"},"gitSyncMaxBinarySizeMb":{"type":"string"},"gitSyncMaxFiles":{"type":"string"},"gitSyncMaxTotalSizeMb":{"type":"string"},"httpClientTimeout":{"type":"string"},"keyboardShortcutsEnabled":{"type":"string"},"maxImageUploadSize":{"type":"string"},"mobileNavigationMode":{"type":"string"},"mobileNavigationShowLabels":{"type":"string"},"oidcAdminClaim":{"type":"string"},"oidcAdminValue":{"type":"string"},"oidcAutoRedirectToProvider":{"type":"string"},"oidcClientId":{"type":"string"},"oidcClientSecret":{"type":"string"},"oidcEnabled":{"type":"string"},"oidcIssuerUrl":{"type":"string"},"oidcMergeAccounts":{"type":"string"},"oidcProviderLogoUrl":{"type":"string"},"oidcProviderName":{"type":"string"},"oidcScopes":{"type":"string"},"oidcSkipTlsVerify":{"type":"string"},"oledMode":{"type":"string"},"pollingEnabled":{"type":"string"},"pollingInterval":{"type":"string"},"projectsDirectory":{"type":"string"},"proxyRequestTimeout":{"type":"string"},"registryTimeout":{"type":"string"},"scheduledPruneBuildCache":{"type":"string"},"scheduledPruneContainers":{"type":"string"},"scheduledPruneEnabled":{"type":"string"},"scheduledPruneImages":{"type":"string"},"scheduledPruneInterval":{"type":"string"},"scheduledPruneNetworks":{"type":"string"},"scheduledPruneVolumes":{"type":"string"},"sidebarHoverExpansion":{"type":"string"},"swarmStackSourcesDirectory":{"type":"string"},"trivyConcurrentScanContainers":{"type":"string"},"trivyCpuLimit":{"type":"string"},"trivyImage":{"type":"string"},"trivyMemoryLimitMb":{"type":"string"},"trivyNetwork":{"type":"string"},"trivyPreserveCacheOnVolumePrune":{"type":"string"},"trivyPrivileged":{"type":"string"},"trivyResourceLimitsEnabled":{"type":"string"},"trivyScanTimeout":{"type":"string"},"trivySecurityOpts":{"type":"string"},"vulnerabilityScanEnabled":{"type":"string"},"vulnerabilityScanInterval":{"type":"string"}},"type":"object"},"SwarmConfigCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmConfigCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"spec":{"description":"Config specification"}},"required":["spec"],"type":"object"},"SwarmConfigSummary":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"spec":{"$ref":"#/components/schemas/DockerSwarmConfigSpec"},"updatedAt":{"format":"date-time","type":"string"},"version":{"$ref":"#/components/schemas/DockerSwarmVersion"}},"required":["id","version","createdAt","updatedAt","spec"],"type":"object"},"SwarmConfigUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmConfigUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"spec":{"description":"Updated config specification"},"version":{"format":"int64","minimum":0,"type":"integer"}},"required":["spec"],"type":"object"},"SwarmNodeAgentDeployment":{"additionalProperties":false,"properties":{"agent":{"$ref":"#/components/schemas/SwarmNodeAgentStatus"},"dockerCompose":{"description":"Docker compose YAML snippet","type":"string"},"dockerRun":{"description":"Docker run command snippet","type":"string"},"environmentId":{"type":"string"}},"required":["environmentId","agent","dockerRun","dockerCompose"],"type":"object"},"SwarmNodeAgentStatus":{"additionalProperties":false,"properties":{"connected":{"type":"boolean"},"environmentId":{"type":"string"},"lastHeartbeat":{"format":"date-time","type":"string"},"lastPollAt":{"format":"date-time","type":"string"},"reportedHostname":{"type":"string"},"reportedNodeId":{"type":"string"},"state":{"type":"string"}},"required":["state"],"type":"object"},"SwarmNodeIdentity":{"additionalProperties":false,"properties":{"engineVersion":{"type":"string"},"hostname":{"type":"string"},"role":{"type":"string"},"swarmActive":{"type":"boolean"},"swarmNodeId":{"type":"string"}},"required":["swarmNodeId","hostname","role","engineVersion","swarmActive"],"type":"object"},"SwarmNodeSummary":{"additionalProperties":false,"properties":{"address":{"type":"string"},"agent":{"$ref":"#/components/schemas/SwarmNodeAgentStatus"},"availability":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"engineVersion":{"type":"string"},"hostname":{"type":"string"},"id":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managerStatus":{"type":"string"},"platform":{"type":"string"},"reachability":{"type":"string"},"role":{"type":"string"},"status":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","hostname","role","availability","status","createdAt","updatedAt","agent"],"type":"object"},"SwarmNodeUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmNodeUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"availability":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"role":{"type":"string"},"version":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"SwarmPaginatedResponseNodeSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseNodeSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/SwarmNodeSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"SwarmPaginatedResponseServiceSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseServiceSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/SwarmServiceSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"SwarmPaginatedResponseStackSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseStackSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/SwarmStackSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"SwarmPaginatedResponseTaskSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseTaskSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/SwarmTaskSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"SwarmRuntimeStatus":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"type":"object"},"SwarmSecretCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSecretCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"spec":{"description":"Secret specification"}},"required":["spec"],"type":"object"},"SwarmSecretSummary":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"spec":{"$ref":"#/components/schemas/DockerSwarmSecretSpec"},"updatedAt":{"format":"date-time","type":"string"},"version":{"$ref":"#/components/schemas/DockerSwarmVersion"}},"required":["id","version","createdAt","updatedAt","spec"],"type":"object"},"SwarmSecretUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSecretUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"spec":{"description":"Updated secret specification"},"version":{"format":"int64","minimum":0,"type":"integer"}},"required":["spec"],"type":"object"},"SwarmServiceCreateOptions":{"additionalProperties":false,"properties":{"encodedRegistryAuth":{"type":"string"},"queryRegistry":{"type":"boolean"}},"type":"object"},"SwarmServiceCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"options":{"$ref":"#/components/schemas/SwarmServiceCreateOptions","description":"Additional create options"},"spec":{"description":"Service specification"}},"required":["spec"],"type":"object"},"SwarmServiceCreateResponse":{"additionalProperties":false,"properties":{"id":{"type":"string"},"warnings":{"items":{"type":"string"},"type":["array","null"]}},"required":["id"],"type":"object"},"SwarmServiceInspect":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"endpoint":{"$ref":"#/components/schemas/DockerSwarmEndpoint"},"id":{"type":"string"},"mounts":{"items":{"$ref":"#/components/schemas/SwarmServiceMount"},"type":["array","null"]},"networkDetails":{"additionalProperties":{"$ref":"#/components/schemas/SwarmServiceNetworkDetail"},"type":"object"},"nodes":{"items":{"type":"string"},"type":["array","null"]},"spec":{"$ref":"#/components/schemas/DockerSwarmServiceSpec"},"updateStatus":{"$ref":"#/components/schemas/DockerSwarmUpdateStatus"},"updatedAt":{"format":"date-time","type":"string"},"version":{"$ref":"#/components/schemas/DockerSwarmVersion"}},"required":["id","version","createdAt","updatedAt","spec","endpoint"],"type":"object"},"SwarmServiceMount":{"additionalProperties":false,"properties":{"devicePath":{"type":"string"},"readOnly":{"type":"boolean"},"source":{"type":"string"},"target":{"type":"string"},"type":{"type":"string"},"volumeDriver":{"type":"string"},"volumeOptions":{"additionalProperties":{"type":"string"},"type":"object"}},"required":["type","target"],"type":"object"},"SwarmServiceNetworkConfigDetail":{"additionalProperties":false,"properties":{"driver":{"type":"string"},"enableIPv4":{"type":"boolean"},"enableIPv6":{"type":"boolean"},"ipv4Configs":{"items":{"$ref":"#/components/schemas/SwarmServiceNetworkIPAMConfig"},"type":["array","null"]},"ipv6Configs":{"items":{"$ref":"#/components/schemas/SwarmServiceNetworkIPAMConfig"},"type":["array","null"]},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"scope":{"type":"string"}},"required":["name","driver","scope","enableIPv4","enableIPv6"],"type":"object"},"SwarmServiceNetworkDetail":{"additionalProperties":false,"properties":{"attachable":{"type":"boolean"},"configFrom":{"type":"string"},"configNetwork":{"$ref":"#/components/schemas/SwarmServiceNetworkConfigDetail"},"configOnly":{"type":"boolean"},"driver":{"type":"string"},"enableIPv4":{"type":"boolean"},"enableIPv6":{"type":"boolean"},"id":{"type":"string"},"ingress":{"type":"boolean"},"internal":{"type":"boolean"},"ipamConfigs":{"items":{"$ref":"#/components/schemas/SwarmServiceNetworkIPAMConfig"},"type":["array","null"]},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"scope":{"type":"string"}},"required":["id","name","driver","scope","internal","attachable","ingress","enableIPv4","enableIPv6","configOnly"],"type":"object"},"SwarmServiceNetworkIPAMConfig":{"additionalProperties":false,"properties":{"gateway":{"type":"string"},"ipRange":{"type":"string"},"subnet":{"type":"string"}},"type":"object"},"SwarmServicePort":{"additionalProperties":false,"properties":{"protocol":{"type":"string"},"publishMode":{"type":"string"},"publishedPort":{"format":"int32","minimum":0,"type":"integer"},"targetPort":{"format":"int32","minimum":0,"type":"integer"}},"required":["protocol","targetPort"],"type":"object"},"SwarmServiceScaleRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceScaleRequest.json"],"format":"uri","readOnly":true,"type":"string"},"replicas":{"format":"int64","minimum":0,"type":"integer"}},"required":["replicas"],"type":"object"},"SwarmServiceSummary":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"image":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mode":{"type":"string"},"mounts":{"items":{"$ref":"#/components/schemas/SwarmServiceMount"},"type":["array","null"]},"name":{"type":"string"},"networks":{"items":{"type":"string"},"type":["array","null"]},"nodes":{"items":{"type":"string"},"type":["array","null"]},"ports":{"items":{"$ref":"#/components/schemas/SwarmServicePort"},"type":["array","null"]},"replicas":{"format":"int64","minimum":0,"type":"integer"},"runningReplicas":{"format":"int64","minimum":0,"type":"integer"},"stackName":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","image","mode","replicas","runningReplicas","ports","createdAt","updatedAt","labels","nodes","networks","mounts"],"type":"object"},"SwarmServiceUpdateOptions":{"additionalProperties":false,"properties":{"encodedRegistryAuth":{"type":"string"},"queryRegistry":{"type":"boolean"},"registryAuthFrom":{"type":"string"},"rollback":{"type":"string"}},"type":"object"},"SwarmServiceUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"options":{"$ref":"#/components/schemas/SwarmServiceUpdateOptions"},"spec":{"$ref":"#/components/schemas/DockerSwarmServiceSpec"},"version":{"format":"int64","minimum":0,"type":"integer"}},"required":["version","spec"],"type":"object"},"SwarmServiceUpdateResponse":{"additionalProperties":false,"properties":{"warnings":{"items":{"type":"string"},"type":["array","null"]}},"type":"object"},"SwarmStackDeployRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackDeployRequest.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"},"prune":{"type":"boolean"},"resolveImage":{"type":"string"},"withRegistryAuth":{"type":"boolean"}},"required":["name","composeContent"],"type":"object"},"SwarmStackDeployResponse":{"additionalProperties":false,"properties":{"name":{"type":"string"}},"required":["name"],"type":"object"},"SwarmStackInspect":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"services":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"}},"required":["name","namespace","services","createdAt","updatedAt"],"type":"object"},"SwarmStackRenderConfigRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackRenderConfigRequest.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"}},"required":["name","composeContent"],"type":"object"},"SwarmStackRenderConfigResponse":{"additionalProperties":false,"properties":{"configs":{"items":{"type":"string"},"type":["array","null"]},"name":{"type":"string"},"networks":{"items":{"type":"string"},"type":["array","null"]},"renderedCompose":{"type":"string"},"secrets":{"items":{"type":"string"},"type":["array","null"]},"services":{"items":{"type":"string"},"type":["array","null"]},"volumes":{"items":{"type":"string"},"type":["array","null"]},"warnings":{"items":{"type":"string"},"type":["array","null"]}},"required":["name","renderedCompose","services","networks","volumes","configs","secrets"],"type":"object"},"SwarmStackSource":{"additionalProperties":false,"properties":{"composeContent":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"}},"required":["name","composeContent"],"type":"object"},"SwarmStackSummary":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"services":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","namespace","services","createdAt","updatedAt"],"type":"object"},"SwarmSwarmInfo":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"rootRotationInProgress":{"type":"boolean"},"spec":{"$ref":"#/components/schemas/DockerSwarmSpec"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","createdAt","updatedAt","spec","rootRotationInProgress"],"type":"object"},"SwarmSwarmInitRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmInitRequest.json"],"format":"uri","readOnly":true,"type":"string"},"advertiseAddr":{"type":"string"},"autoLockManagers":{"type":"boolean"},"availability":{"type":"string"},"dataPathAddr":{"type":"string"},"dataPathPort":{"format":"int32","minimum":0,"type":"integer"},"defaultAddrPool":{"items":{"type":"string"},"type":["array","null"]},"forceNewCluster":{"type":"boolean"},"listenAddr":{"type":"string"},"spec":{"$ref":"#/components/schemas/DockerSwarmSpec"},"subnetSize":{"format":"int32","minimum":0,"type":"integer"}},"required":["spec"],"type":"object"},"SwarmSwarmInitResponse":{"additionalProperties":false,"properties":{"nodeId":{"type":"string"}},"required":["nodeId"],"type":"object"},"SwarmSwarmJoinRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmJoinRequest.json"],"format":"uri","readOnly":true,"type":"string"},"advertiseAddr":{"type":"string"},"availability":{"type":"string"},"dataPathAddr":{"type":"string"},"joinToken":{"type":"string"},"listenAddr":{"type":"string"},"remoteAddrs":{"items":{"type":"string"},"type":["array","null"]}},"required":["remoteAddrs","joinToken"],"type":"object"},"SwarmSwarmJoinTokensResponse":{"additionalProperties":false,"properties":{"manager":{"type":"string"},"worker":{"type":"string"}},"required":["worker","manager"],"type":"object"},"SwarmSwarmLeaveRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmLeaveRequest.json"],"format":"uri","readOnly":true,"type":"string"},"force":{"type":"boolean"}},"type":"object"},"SwarmSwarmRotateJoinTokensRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmRotateJoinTokensRequest.json"],"format":"uri","readOnly":true,"type":"string"},"rotateManagerToken":{"type":"boolean"},"rotateWorkerToken":{"type":"boolean"}},"type":"object"},"SwarmSwarmUnlockKeyResponse":{"additionalProperties":false,"properties":{"unlockKey":{"type":"string"}},"required":["unlockKey"],"type":"object"},"SwarmSwarmUnlockRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmUnlockRequest.json"],"format":"uri","readOnly":true,"type":"string"},"key":{"type":"string"}},"required":["key"],"type":"object"},"SwarmSwarmUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"rotateManagerToken":{"type":"boolean"},"rotateManagerUnlockKey":{"type":"boolean"},"rotateWorkerToken":{"type":"boolean"},"spec":{"$ref":"#/components/schemas/DockerSwarmSpec"},"version":{"format":"int64","minimum":0,"type":"integer"}},"required":["spec"],"type":"object"},"SwarmTaskSummary":{"additionalProperties":false,"properties":{"containerId":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"currentState":{"type":"string"},"desiredState":{"type":"string"},"error":{"type":"string"},"id":{"type":"string"},"image":{"type":"string"},"name":{"type":"string"},"nodeId":{"type":"string"},"nodeName":{"type":"string"},"serviceId":{"type":"string"},"serviceName":{"type":"string"},"slot":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","serviceId","serviceName","nodeId","nodeName","desiredState","currentState","createdAt","updatedAt"],"type":"object"},"SystemConvertDockerRunRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SystemConvertDockerRunRequest.json"],"format":"uri","readOnly":true,"type":"string"},"dockerRunCommand":{"type":"string"}},"required":["dockerRunCommand"],"type":"object"},"SystemConvertDockerRunResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SystemConvertDockerRunResponse.json"],"format":"uri","readOnly":true,"type":"string"},"dockerCompose":{"type":"string"},"envVars":{"type":"string"},"serviceName":{"type":"string"},"success":{"type":"boolean"}},"required":["success","dockerCompose","envVars","serviceName"],"type":"object"},"SystemHealthResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SystemHealthResponse.json"],"format":"uri","readOnly":true,"type":"string"},"status":{"type":"string"}},"required":["status"],"type":"object"},"SystemPruneAllRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SystemPruneAllRequest.json"],"format":"uri","readOnly":true,"type":"string"},"buildCache":{"type":"boolean"},"containers":{"type":"boolean"},"dangling":{"type":"boolean"},"images":{"type":"boolean"},"networks":{"type":"boolean"},"volumes":{"type":"boolean"}},"required":["containers","images","volumes","networks","buildCache","dangling"],"type":"object"},"SystemPruneAllResult":{"additionalProperties":false,"properties":{"buildCacheSpaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"containerSpaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"containersPruned":{"items":{"type":"string"},"type":["array","null"]},"errors":{"items":{"type":"string"},"type":["array","null"]},"imageSpaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"imagesDeleted":{"items":{"type":"string"},"type":["array","null"]},"networksDeleted":{"items":{"type":"string"},"type":["array","null"]},"spaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"success":{"type":"boolean"},"volumeSpaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"volumesDeleted":{"items":{"type":"string"},"type":["array","null"]}},"required":["spaceReclaimed","success"],"type":"object"},"TemplateCreateRegistryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateCreateRegistryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"url":{"type":"string"}},"required":["name","url","description","enabled"],"type":"object"},"TemplateCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"content":{"type":"string"},"description":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"}},"required":["name","description","content","envContent"],"type":"object"},"TemplateDefaultTemplatesResponse":{"additionalProperties":false,"properties":{"composeTemplate":{"type":"string"},"envTemplate":{"type":"string"},"swarmStackEnvTemplate":{"type":"string"},"swarmStackTemplate":{"type":"string"}},"required":["composeTemplate","swarmStackTemplate","swarmStackEnvTemplate","envTemplate"],"type":"object"},"TemplatePaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplatePaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/TemplateTemplate"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"TemplateRemoteRegistry":{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"author":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"templates":{"items":{"$ref":"#/components/schemas/TemplateRemoteTemplate"},"type":["array","null"]},"url":{"type":"string"},"version":{"type":"string"}},"required":["version","author","templates","name","description","url"],"type":"object"},"TemplateRemoteTemplate":{"additionalProperties":false,"properties":{"author":{"type":"string"},"compose_url":{"type":"string"},"description":{"type":"string"},"documentation_url":{"type":"string"},"env_url":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"tags":{"items":{"type":"string"},"type":["array","null"]},"version":{"type":"string"}},"required":["version","author","compose_url","env_url","documentation_url","tags","id","name","description"],"type":"object"},"TemplateSaveDefaultTemplatesRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateSaveDefaultTemplatesRequest.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"}},"required":["composeContent","envContent"],"type":"object"},"TemplateTemplate":{"additionalProperties":false,"properties":{"content":{"type":"string"},"description":{"type":"string"},"envContent":{"type":"string"},"id":{"type":"string"},"isCustom":{"type":"boolean"},"isRemote":{"type":"boolean"},"metadata":{"$ref":"#/components/schemas/MetaTemplateMeta"},"name":{"type":"string"},"registry":{"$ref":"#/components/schemas/TemplateTemplateRegistry"},"registryId":{"type":"string"}},"required":["content","isCustom","isRemote","id","name","description"],"type":"object"},"TemplateTemplateContent":{"additionalProperties":false,"properties":{"content":{"type":"string"},"envContent":{"type":"string"},"envVariables":{"items":{"$ref":"#/components/schemas/EnvVariable"},"type":["array","null"]},"services":{"items":{"type":"string"},"type":["array","null"]},"template":{"$ref":"#/components/schemas/TemplateTemplate"}},"required":["template","content","envContent","services","envVariables"],"type":"object"},"TemplateTemplateRegistry":{"additionalProperties":false,"properties":{"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"}},"required":["id","enabled","name","description","url"],"type":"object"},"TemplateUpdateRegistryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateUpdateRegistryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"url":{"type":"string"}},"required":["name","url","description","enabled"],"type":"object"},"TemplateUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"content":{"type":"string"},"description":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"}},"required":["name","description","content","envContent"],"type":"object"},"Ulimit":{"additionalProperties":false,"properties":{"Hard":{"format":"int64","type":"integer"},"Name":{"type":"string"},"Soft":{"format":"int64","type":"integer"}},"required":["Name","Hard","Soft"],"type":"object"},"UlimitsConfig":{"additionalProperties":false,"properties":{"hard":{"format":"int64","type":"integer"},"single":{"format":"int64","type":"integer"},"soft":{"format":"int64","type":"integer"}},"type":"object"},"UpdateConfig":{"additionalProperties":false,"properties":{"delay":{"format":"int64","type":"integer"},"failure_action":{"type":"string"},"max_failure_ratio":{"format":"float","type":"number"},"monitor":{"format":"int64","type":"integer"},"order":{"type":"string"},"parallelism":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"UpdateContainerRegistryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateContainerRegistryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"awsAccessKeyId":{"type":["string","null"]},"awsRegion":{"type":["string","null"]},"awsSecretAccessKey":{"type":["string","null"]},"description":{"type":["string","null"]},"enabled":{"type":["boolean","null"]},"insecure":{"type":["boolean","null"]},"registryType":{"type":["string","null"]},"token":{"type":["string","null"]},"url":{"type":["string","null"]},"username":{"type":["string","null"]}},"required":["url","username","token","description","insecure","enabled","registryType","awsAccessKeyId","awsSecretAccessKey","awsRegion"],"type":"object"},"UpdateGitRepositoryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateGitRepositoryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"authType":{"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"sshHostKeyVerification":{"type":"string"},"sshKey":{"type":"string"},"token":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"type":"object"},"UpdaterOptions":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpdaterOptions.json"],"format":"uri","readOnly":true,"type":"string"},"dryRun":{"type":"boolean"},"forceUpdate":{"type":"boolean"},"resourceIds":{"items":{"type":"string"},"type":["array","null"]},"type":{"type":"string"}},"type":"object"},"UpdaterResourceResult":{"additionalProperties":false,"properties":{"details":{"additionalProperties":{},"type":"object"},"error":{"type":"string"},"newImages":{"additionalProperties":{"type":"string"},"type":"object"},"oldImages":{"additionalProperties":{"type":"string"},"type":"object"},"resourceId":{"type":"string"},"resourceName":{"type":"string"},"resourceType":{"type":"string"},"status":{"type":"string"},"updateApplied":{"type":"boolean"},"updateAvailable":{"type":"boolean"}},"required":["resourceId","resourceType","status"],"type":"object"},"UpdaterResult":{"additionalProperties":false,"properties":{"checked":{"format":"int64","type":"integer"},"duration":{"type":"string"},"endTime":{"type":"string"},"failed":{"format":"int64","type":"integer"},"items":{"items":{"$ref":"#/components/schemas/UpdaterResourceResult"},"type":["array","null"]},"skipped":{"format":"int64","type":"integer"},"startTime":{"type":"string"},"success":{"type":"boolean"},"updated":{"format":"int64","type":"integer"}},"required":["checked","updated","skipped","failed","duration","items"],"type":"object"},"UpdaterStatus":{"additionalProperties":false,"properties":{"containerIds":{"items":{"type":"string"},"type":["array","null"]},"projectIds":{"items":{"type":"string"},"type":["array","null"]},"updatingContainers":{"format":"int64","type":"integer"},"updatingProjects":{"format":"int64","type":"integer"}},"required":["updatingContainers","updatingProjects","containerIds","projectIds"],"type":"object"},"UpgradeCheckResultData":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpgradeCheckResultData.json"],"format":"uri","readOnly":true,"type":"string"},"canUpgrade":{"type":"boolean"},"error":{"type":"boolean"},"message":{"type":"string"}},"required":["canUpgrade","error","message"],"type":"object"},"UserCreateUser":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UserCreateUser.json"],"format":"uri","readOnly":true,"type":"string"},"displayName":{"description":"Display name of the user","examples":["John Doe"],"maxLength":255,"type":"string"},"email":{"description":"Email address of the user","examples":["john@example.com"],"type":"string"},"locale":{"description":"Locale preference of the user","examples":["en-US"],"type":"string"},"password":{"description":"Password of the user","minLength":8,"type":"string"},"roles":{"description":"Roles assigned to the user","examples":[["user"]],"items":{"type":"string"},"type":["array","null"]},"username":{"description":"Username of the user","examples":["johndoe"],"maxLength":255,"minLength":1,"type":"string"}},"required":["username","password"],"type":"object"},"UserPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UserPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/UserUser"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"UserUpdateUser":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UserUpdateUser.json"],"format":"uri","readOnly":true,"type":"string"},"displayName":{"description":"Display name of the user","maxLength":255,"type":"string"},"email":{"description":"Email address of the user","type":"string"},"locale":{"description":"Locale preference of the user","type":"string"},"password":{"description":"New password for the user","minLength":8,"type":"string"},"roles":{"description":"Roles assigned to the user","items":{"type":"string"},"type":["array","null"]},"username":{"description":"Username of the user","maxLength":255,"minLength":1,"type":"string"}},"type":"object"},"UserUser":{"additionalProperties":false,"properties":{"canDelete":{"description":"Whether the user can currently be deleted","type":"boolean"},"createdAt":{"description":"Date and time when the user was created","type":"string"},"displayName":{"description":"Display name of the user","examples":["John Doe"],"type":"string"},"email":{"description":"Email address of the user","examples":["john@example.com"],"type":"string"},"id":{"description":"Unique identifier of the user","examples":["550e8400-e29b-41d4-a716-446655440000"],"type":"string"},"locale":{"description":"Locale preference of the user","examples":["en-US"],"type":"string"},"oidcSubjectId":{"description":"OIDC subject identifier for SSO users","type":"string"},"requiresPasswordChange":{"description":"Whether the user must change their password","type":"boolean"},"roles":{"description":"Roles assigned to the user","examples":[["user","admin"]],"items":{"type":"string"},"type":["array","null"]},"updatedAt":{"description":"Date and time when the user was last updated","type":"string"},"username":{"description":"Username of the user","examples":["johndoe"],"type":"string"}},"required":["id","username","roles","canDelete","requiresPasswordChange"],"type":"object"},"Value":{"additionalProperties":false,"type":"object"},"VersionCheck":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VersionCheck.json"],"format":"uri","readOnly":true,"type":"string"},"currentVersion":{"type":"string"},"newestVersion":{"type":"string"},"releaseUrl":{"type":"string"},"updateAvailable":{"type":"boolean"}},"required":["currentVersion","updateAvailable"],"type":"object"},"VersionInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VersionInfo.json"],"format":"uri","readOnly":true,"type":"string"},"buildTime":{"type":"string"},"currentDigest":{"type":"string"},"currentTag":{"type":"string"},"currentVersion":{"type":"string"},"displayVersion":{"type":"string"},"enabledFeatures":{"items":{"type":"string"},"type":["array","null"]},"goVersion":{"type":"string"},"isSemverVersion":{"type":"boolean"},"newestDigest":{"type":"string"},"newestVersion":{"type":"string"},"releaseUrl":{"type":"string"},"revision":{"type":"string"},"shortRevision":{"type":"string"},"updateAvailable":{"type":"boolean"}},"required":["currentVersion","revision","shortRevision","goVersion","displayVersion","isSemverVersion","updateAvailable"],"type":"object"},"VolumeBackup":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"size":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"},"volumeName":{"type":"string"}},"required":["volumeName","size","createdAt","id"],"type":"object"},"VolumeBackupPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VolumeBackupPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/VolumeBackup"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"},"warnings":{"items":{"type":"string"},"type":["array","null"]}},"required":["success","data","pagination"],"type":"object"},"VolumeCreate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VolumeCreate.json"],"format":"uri","readOnly":true,"type":"string"},"driver":{"description":"Volume driver (e.g., local, nfs)","type":"string"},"driverOpts":{"additionalProperties":{"type":"string"},"description":"Driver-specific options","type":"object"},"labels":{"additionalProperties":{"type":"string"},"description":"User-defined labels","type":"object"},"name":{"description":"Name of the volume","minLength":1,"type":"string"}},"required":["name"],"type":"object"},"VolumeFileEntry":{"additionalProperties":false,"properties":{"isDirectory":{"description":"Whether this entry is a directory","type":"boolean"},"isSymlink":{"description":"Whether this entry is a symbolic link","type":"boolean"},"linkTarget":{"description":"Target of the symbolic link","type":"string"},"modTime":{"description":"Last modification time","format":"date-time","type":"string"},"mode":{"description":"File mode/permissions","type":"string"},"name":{"description":"Name of the file or directory","type":"string"},"path":{"description":"Full path to the file","type":"string"},"size":{"description":"Size of the file in bytes","format":"int64","type":"integer"}},"required":["name","path","isDirectory","size","modTime","mode","isSymlink"],"type":"object"},"VolumePaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VolumePaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"counts":{"$ref":"#/components/schemas/VolumeUsageCountsData"},"data":{"items":{"$ref":"#/components/schemas/VolumeVolume"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","counts","pagination"],"type":"object"},"VolumePruneReportData":{"additionalProperties":false,"properties":{"spaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"volumesDeleted":{"items":{"type":"string"},"type":["array","null"]}},"required":["spaceReclaimed"],"type":"object"},"VolumeSizeInfo":{"additionalProperties":false,"properties":{"name":{"type":"string"},"refCount":{"format":"int64","type":"integer"},"size":{"format":"int64","type":"integer"}},"required":["name","size","refCount"],"type":"object"},"VolumeUsageCountsData":{"additionalProperties":false,"properties":{"inuse":{"format":"int64","type":"integer"},"total":{"format":"int64","type":"integer"},"unused":{"format":"int64","type":"integer"}},"required":["inuse","unused","total"],"type":"object"},"VolumeUsageResponse":{"additionalProperties":false,"properties":{"containers":{"items":{"type":"string"},"type":["array","null"]},"inUse":{"type":"boolean"}},"required":["inUse","containers"],"type":"object"},"VolumeVolume":{"additionalProperties":false,"properties":{"containers":{"items":{"type":"string"},"type":["array","null"]},"createdAt":{"type":"string"},"driver":{"type":"string"},"id":{"type":"string"},"inUse":{"type":"boolean"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mountpoint":{"type":"string"},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"scope":{"type":"string"},"size":{"format":"int64","type":"integer"},"usageData":{"$ref":"#/components/schemas/DockerVolumeUsageData"}},"required":["id","name","driver","mountpoint","scope","options","labels","createdAt","inUse","size","containers"],"type":"object"},"VulnerabilityCVSSInfo":{"additionalProperties":false,"properties":{"v2Score":{"format":"double","type":"number"},"v2Vector":{"type":"string"},"v3Score":{"format":"double","type":"number"},"v3Vector":{"type":"string"}},"type":"object"},"VulnerabilityEnvironmentVulnerabilitySummary":{"additionalProperties":false,"properties":{"scannedImages":{"format":"int64","type":"integer"},"summary":{"$ref":"#/components/schemas/VulnerabilitySeveritySummary"},"totalImages":{"format":"int64","type":"integer"}},"required":["totalImages","scannedImages"],"type":"object"},"VulnerabilityIgnorePayload":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VulnerabilityIgnorePayload.json"],"format":"uri","readOnly":true,"type":"string"},"createdBy":{"examples":["user-123"],"type":"string"},"imageId":{"examples":["sha256:abc123"],"type":"string"},"installedVersion":{"examples":["1.1.1l"],"type":"string"},"pkgName":{"examples":["openssl"],"type":"string"},"reason":{"examples":["False positive - not exploitable"],"type":"string"},"vulnerabilityId":{"examples":["CVE-2023-1234"],"type":"string"}},"required":["imageId","vulnerabilityId","pkgName"],"type":"object"},"VulnerabilityIgnoredVulnerability":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"createdBy":{"type":"string"},"environmentId":{"type":"string"},"id":{"type":"string"},"imageId":{"type":"string"},"installedVersion":{"type":"string"},"pkgName":{"type":"string"},"reason":{"type":"string"},"vulnerabilityId":{"type":"string"}},"required":["id","environmentId","imageId","vulnerabilityId","pkgName","installedVersion","createdBy","createdAt"],"type":"object"},"VulnerabilityScanResult":{"additionalProperties":false,"properties":{"duration":{"format":"int64","type":"integer"},"error":{"type":"string"},"imageId":{"type":"string"},"imageName":{"type":"string"},"scanPhase":{"type":"string"},"scanTime":{"format":"date-time","type":"string"},"scannerVersion":{"type":"string"},"status":{"type":"string"},"summary":{"$ref":"#/components/schemas/VulnerabilitySeveritySummary"},"vulnerabilities":{"items":{"$ref":"#/components/schemas/VulnerabilityVulnerability"},"type":["array","null"]}},"required":["imageId","imageName","scanTime","status"],"type":"object"},"VulnerabilityScanSummariesRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VulnerabilityScanSummariesRequest.json"],"format":"uri","readOnly":true,"type":"string"},"imageIds":{"items":{"type":"string"},"type":["array","null"]}},"required":["imageIds"],"type":"object"},"VulnerabilityScanSummariesResponse":{"additionalProperties":false,"properties":{"summaries":{"additionalProperties":{"$ref":"#/components/schemas/VulnerabilityScanSummary"},"type":"object"}},"required":["summaries"],"type":"object"},"VulnerabilityScanSummary":{"additionalProperties":false,"properties":{"error":{"type":"string"},"imageId":{"type":"string"},"scanPhase":{"type":"string"},"scanTime":{"format":"date-time","type":"string"},"status":{"type":"string"},"summary":{"$ref":"#/components/schemas/VulnerabilitySeveritySummary"}},"required":["imageId","scanTime","status"],"type":"object"},"VulnerabilitySeveritySummary":{"additionalProperties":false,"properties":{"critical":{"format":"int64","type":"integer"},"high":{"format":"int64","type":"integer"},"low":{"format":"int64","type":"integer"},"medium":{"format":"int64","type":"integer"},"total":{"format":"int64","type":"integer"},"unknown":{"format":"int64","type":"integer"}},"required":["critical","high","medium","low","unknown","total"],"type":"object"},"VulnerabilityVulnerability":{"additionalProperties":false,"properties":{"cvss":{"$ref":"#/components/schemas/VulnerabilityCVSSInfo"},"description":{"type":"string"},"fixedVersion":{"type":"string"},"installedVersion":{"type":"string"},"lastModifiedDate":{"format":"date-time","type":"string"},"pkgName":{"type":"string"},"publishedDate":{"format":"date-time","type":"string"},"references":{"items":{"type":"string"},"type":["array","null"]},"severity":{"type":"string"},"title":{"type":"string"},"vulnerabilityId":{"type":"string"}},"required":["vulnerabilityId","pkgName","installedVersion","severity"],"type":"object"},"VulnerabilityVulnerabilityWithImage":{"additionalProperties":false,"properties":{"cvss":{"$ref":"#/components/schemas/VulnerabilityCVSSInfo"},"description":{"type":"string"},"fixedVersion":{"type":"string"},"imageId":{"type":"string"},"imageName":{"type":"string"},"installedVersion":{"type":"string"},"lastModifiedDate":{"format":"date-time","type":"string"},"pkgName":{"type":"string"},"publishedDate":{"format":"date-time","type":"string"},"references":{"items":{"type":"string"},"type":["array","null"]},"severity":{"type":"string"},"title":{"type":"string"},"vulnerabilityId":{"type":"string"}},"required":["imageId","imageName","vulnerabilityId","pkgName","installedVersion","severity"],"type":"object"},"WebhookCreateInput":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/WebhookCreateInput.json"],"format":"uri","readOnly":true,"type":"string"},"actionType":{"description":"Action to run for the selected target type. Supported values depend on targetType.","enum":["update","start","stop","restart","redeploy","up","down","run","sync"],"type":"string"},"name":{"description":"Human-readable name for this webhook","maxLength":255,"minLength":1,"type":"string"},"targetId":{"description":"Container ID, project ID, or GitOps sync ID to target. Leave empty for 'updater' webhooks.","type":"string"},"targetType":{"description":"Resource type this webhook targets: 'container', 'project', 'updater', or 'gitops'","enum":["container","project","updater","gitops"],"type":"string"}},"required":["name","targetType","actionType","targetId"],"type":"object"},"WebhookCreated":{"additionalProperties":false,"properties":{"actionType":{"description":"Action type","type":"string"},"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"id":{"description":"Webhook ID","type":"string"},"name":{"description":"Webhook name","type":"string"},"targetId":{"description":"Target resource ID","type":"string"},"targetType":{"description":"Target type","type":"string"},"token":{"description":"Full webhook token — store this securely, it will not be shown again","type":"string"}},"required":["id","name","token","targetType","actionType","targetId","createdAt"],"type":"object"},"WebhookSummary":{"additionalProperties":false,"properties":{"actionType":{"description":"Action type resolved for this webhook","type":"string"},"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"enabled":{"description":"Whether the webhook is active","type":"boolean"},"environmentId":{"description":"Environment ID","type":"string"},"id":{"description":"Webhook ID","type":"string"},"lastTriggeredAt":{"description":"Timestamp of last successful trigger","format":"date-time","type":"string"},"name":{"description":"Webhook name","type":"string"},"targetId":{"description":"Target resource ID","type":"string"},"targetName":{"description":"Resolved target resource name when available","type":"string"},"targetType":{"description":"Target type: 'container', 'project', 'updater', or 'gitops'","type":"string"},"tokenPrefix":{"description":"Masked token prefix for identification","type":"string"}},"required":["id","name","tokenPrefix","targetType","actionType","targetId","environmentId","enabled","createdAt"],"type":"object"},"WebhookUpdateInput":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/WebhookUpdateInput.json"],"format":"uri","readOnly":true,"type":"string"},"enabled":{"description":"Whether the webhook is active","type":"boolean"}},"required":["enabled"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"description":"API Key authentication","in":"header","name":"X-API-Key","type":"apiKey"},"BearerAuth":{"bearerFormat":"JWT","description":"JWT Bearer token authentication","scheme":"bearer","type":"http"}}},"info":{"description":"Modern Docker Management, Designed for Everyone","title":"Arcane API","version":"v1.17.0"},"openapi":"3.1.0","paths":{"/api-keys":{"get":{"description":"Get a paginated list of API keys","operationId":"list-api-keys","parameters":[{"description":"Search query for filtering by name or description","explode":false,"in":"query","name":"search","schema":{"description":"Search query for filtering by name or description","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List API keys","tags":["API Keys"]},"post":{"description":"Create a new API key for programmatic access","operationId":"create-api-key","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApikeyCreateApiKey"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseApiKeyCreatedDto"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create an API key","tags":["API Keys"]}},"/api-keys/{id}":{"delete":{"description":"Delete an API key by ID","operationId":"delete-api-key","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"description":"API key ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete an API key","tags":["API Keys"]},"get":{"description":"Get details of a specific API key by ID","operationId":"get-api-key","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"description":"API key ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseApiKey"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get an API key","tags":["API Keys"]},"put":{"description":"Update an existing API key's details","operationId":"update-api-key","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"description":"API key ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApikeyUpdateApiKey"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseApiKey"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update an API key","tags":["API Keys"]}},"/app-images/favicon":{"get":{"description":"Get the application favicon image","operationId":"get-favicon","responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get application favicon","tags":["Application Images"]}},"/app-images/logo":{"get":{"description":"Get the application logo image","operationId":"get-logo","parameters":[{"description":"Return full logo instead of icon","explode":false,"in":"query","name":"full","schema":{"default":false,"description":"Return full logo instead of icon","type":"boolean"}},{"description":"Optional accent color override for preview (e.g., 'oklch(0.65 0.2 150)')","explode":false,"in":"query","name":"color","schema":{"description":"Optional accent color override for preview (e.g., 'oklch(0.65 0.2 150)')","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get application logo","tags":["Application Images"]}},"/app-images/logo-email":{"get":{"description":"Get the application logo image in PNG format for emails","operationId":"get-logo-email","responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get application logo for email","tags":["Application Images"]}},"/app-images/profile":{"get":{"description":"Get the default user profile image","operationId":"get-default-profile","responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get default profile image","tags":["Application Images"]}},"/app-images/pwa/{filename}":{"get":{"description":"Get a Progressive Web App icon image","operationId":"get-pwa-icon","parameters":[{"description":"PWA icon filename","in":"path","name":"filename","required":true,"schema":{"description":"PWA icon filename","examples":["icon-192x192.png"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get PWA icon","tags":["Application Images"]}},"/app-version":{"get":{"description":"Get the current application version","operationId":"getAppVersion","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get app version","tags":["Version"]}},"/auth/login":{"post":{"description":"Authenticate a user with username and password","operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthLogin"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseLoginResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Session cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Login","tags":["Auth"]}},"/auth/logout":{"post":{"description":"Clear authentication session","operationId":"logout","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Cleared session cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Logout","tags":["Auth"]}},"/auth/me":{"get":{"description":"Get the currently authenticated user's information","operationId":"get-current-user","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get current user","tags":["Auth"]}},"/auth/password":{"post":{"description":"Change the current user's password","operationId":"change-password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthPasswordChange"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Change password","tags":["Auth"]}},"/auth/refresh":{"post":{"description":"Obtain a new access token using a refresh token","operationId":"refresh-token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRefresh"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTokenRefreshResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Updated session cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Refresh token","tags":["Auth"]}},"/container-registries":{"get":{"description":"Get a paginated list of container registries","operationId":"listContainerRegistries","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerRegistryPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List container registries","tags":["Container Registries"]},"post":{"description":"Create a new container registry","operationId":"createContainerRegistry","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContainerRegistryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseContainerRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a container registry","tags":["Container Registries"]}},"/container-registries/sync":{"post":{"description":"Sync container registries from a remote source","operationId":"syncContainerRegistries","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerregistrySyncRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Sync container registries","tags":["Container Registries"]}},"/container-registries/{id}":{"delete":{"description":"Delete a container registry by ID","operationId":"deleteContainerRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a container registry","tags":["Container Registries"]},"get":{"description":"Get a container registry by ID","operationId":"getContainerRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseContainerRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a container registry","tags":["Container Registries"]},"put":{"description":"Update an existing container registry","operationId":"updateContainerRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContainerRegistryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseContainerRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a container registry","tags":["Container Registries"]}},"/container-registries/{id}/test":{"post":{"description":"Test connectivity and authentication to a container registry","operationId":"testContainerRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Test a container registry","tags":["Container Registries"]}},"/customize/categories":{"get":{"description":"Get all available customization categories with metadata","operationId":"get-customize-categories","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CategoryCategory"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get customization categories","tags":["Customize"]}},"/customize/git-repositories":{"get":{"description":"Get a paginated list of git repositories","operationId":"listGitRepositories","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitRepositoryPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List git repositories","tags":["Customize"]},"post":{"description":"Create a new git repository configuration","operationId":"createGitRepository","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGitRepositoryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitRepository"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a git repository","tags":["Customize"]}},"/customize/git-repositories/{id}":{"delete":{"description":"Delete a git repository configuration by ID","operationId":"deleteGitRepository","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a git repository","tags":["Customize"]},"get":{"description":"Get a git repository by ID","operationId":"getGitRepository","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitRepository"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a git repository","tags":["Customize"]},"put":{"description":"Update an existing git repository configuration","operationId":"updateGitRepository","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGitRepositoryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitRepository"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a git repository","tags":["Customize"]}},"/customize/git-repositories/{id}/branches":{"get":{"description":"Get all branches from a git repository with default branch detection","operationId":"listGitRepositoryBranches","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBranchesResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List repository branches","tags":["Customize"]}},"/customize/git-repositories/{id}/files":{"get":{"description":"Browse files and directories in a git repository","operationId":"browseGitRepositoryFiles","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}},{"description":"Branch to browse","explode":false,"in":"query","name":"branch","schema":{"description":"Branch to browse","type":"string"}},{"description":"Path within repository (optional)","explode":false,"in":"query","name":"path","schema":{"description":"Path within repository (optional)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBrowseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Browse repository files","tags":["Customize"]}},"/customize/git-repositories/{id}/test":{"post":{"description":"Test connectivity and authentication to a git repository","operationId":"testGitRepository","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}},{"description":"Branch to test (optional, uses repository default branch when omitted)","explode":false,"in":"query","name":"branch","schema":{"description":"Branch to test (optional, uses repository default branch when omitted)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Test a git repository","tags":["Customize"]}},"/customize/search":{"post":{"description":"Search customization categories and options by query","operationId":"search-customize","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Search customization options","tags":["Customize"]}},"/environments":{"get":{"description":"Get a paginated list of Docker environments","operationId":"listEnvironments","parameters":[{"description":"Search query for filtering by name or API URL","explode":false,"in":"query","name":"search","schema":{"description":"Search query for filtering by name or API URL","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List environments","tags":["Environments"]},"post":{"description":"Create a new Docker environment","operationId":"createEnvironment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentCreate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironmentWithApiKey"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create an environment","tags":["Environments"]}},"/environments/pair":{"post":{"description":"Agent sends API key to complete environment pairing","operationId":"pairEnvironment","parameters":[{"description":"API key for environment pairing","in":"header","name":"X-API-Key","schema":{"description":"API key for environment pairing","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Pair agent with manager","tags":["Environments"]}},"/environments/{id}":{"delete":{"description":"Delete a Arcane environment","operationId":"deleteEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete an environment","tags":["Environments"]},"get":{"description":"Get a Docker environment by ID","operationId":"getEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironment"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get an environment","tags":["Environments"]},"put":{"description":"Update a Docker environment","operationId":"updateEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentUpdate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironment"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update an environment","tags":["Environments"]}},"/environments/{id}/agent/pair":{"post":{"description":"Generate or rotate the local agent pairing token","operationId":"pairAgent","parameters":[{"description":"Environment ID (must be 0 for local)","in":"path","name":"id","required":true,"schema":{"description":"Environment ID (must be 0 for local)","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentAgentPairRequest"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseAgentPairResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Pair with local agent","tags":["Environments"]}},"/environments/{id}/builds/browse":{"delete":{"description":"Delete a file or directory under the builds workspace root","operationId":"builds-browse-delete","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"File or directory path to delete","explode":false,"in":"query","name":"path","schema":{"description":"File or directory path to delete","type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete build workspace file","tags":["Builds"]},"get":{"description":"List files and directories under the builds workspace root","operationId":"builds-browse","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Directory path to browse","explode":false,"in":"query","name":"path","schema":{"default":"/","description":"Directory path to browse","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListFileEntry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Browse build workspace files","tags":["Builds"]}},"/environments/{id}/builds/browse/content":{"get":{"description":"Read file content under the builds workspace root","operationId":"builds-browse-content","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"File path","explode":false,"in":"query","name":"path","schema":{"description":"File path","type":"string"}},{"description":"Maximum bytes to read (default 1MB)","explode":false,"in":"query","name":"maxBytes","schema":{"default":1048576,"description":"Maximum bytes to read (default 1MB)","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBuildFileContentResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get build workspace file content","tags":["Builds"]}},"/environments/{id}/builds/browse/download":{"get":{"description":"Download a file from the builds workspace root","operationId":"builds-browse-download","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"File path","explode":false,"in":"query","name":"path","schema":{"description":"File path","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{}}},"description":"OK","headers":{"Content-Disposition":{"schema":{"type":"string"}},"Content-Length":{"schema":{"format":"int64","type":"integer"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download build workspace file","tags":["Builds"]}},"/environments/{id}/builds/browse/mkdir":{"post":{"description":"Create a directory under the builds workspace root","operationId":"builds-browse-mkdir","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Directory path to create","explode":false,"in":"query","name":"path","schema":{"description":"Directory path to create","type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create build workspace directory","tags":["Builds"]}},"/environments/{id}/builds/browse/upload":{"post":{"description":"Upload a file into the builds workspace root","operationId":"builds-browse-upload","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Destination path","explode":false,"in":"query","name":"path","schema":{"default":"/","description":"Destination path","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"contentMediaType":"application/octet-stream","description":"File to upload","format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Upload build workspace file","tags":["Builds"]}},"/environments/{id}/containers":{"get":{"description":"Paginated list of containers","operationId":"list-containers","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Limit","format":"int64","type":"integer"}},{"description":"Optional grouping mode (for example: project)","explode":false,"in":"query","name":"groupBy","schema":{"description":"Optional grouping mode (for example: project)","type":"string"}},{"description":"Include internal containers","explode":false,"in":"query","name":"includeInternal","schema":{"default":false,"description":"Include internal containers","type":"boolean"}},{"description":"Filter by update status (has_update, up_to_date, error, unknown)","explode":false,"in":"query","name":"updates","schema":{"description":"Filter by update status (has_update, up_to_date, error, unknown)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List containers","tags":["Containers"]},"post":{"operationId":"create-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerCreate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerCreatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create container","tags":["Containers"]}},"/environments/{id}/containers/counts":{"get":{"operationId":"container-status-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Include internal containers","explode":false,"in":"query","name":"includeInternal","schema":{"default":false,"description":"Include internal containers","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerStatusCountsResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Container status counts","tags":["Containers"]}},"/environments/{id}/containers/{containerId}":{"delete":{"operationId":"delete-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}},{"description":"Force delete running container","explode":false,"in":"query","name":"force","schema":{"default":false,"description":"Force delete running container","type":"boolean"}},{"description":"Remove associated volumes","explode":false,"in":"query","name":"volumes","schema":{"default":false,"description":"Remove associated volumes","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete container","tags":["Containers"]},"get":{"operationId":"get-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerDetailsResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/auto-update":{"put":{"description":"Enable or disable auto-update for a specific container","operationId":"set-container-auto-update","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAutoUpdateInputBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Set container auto-update","tags":["Containers","Updater"]}},"/environments/{id}/containers/{containerId}/redeploy":{"post":{"description":"Pull latest image and recreate container","operationId":"redeploy-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerDetailsResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Redeploy container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/restart":{"post":{"operationId":"restart-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Restart container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/start":{"post":{"operationId":"start-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Start container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/stop":{"post":{"operationId":"stop-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Stop container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/update":{"post":{"description":"Pull the latest image and apply the appropriate update strategy for a specific container","operationId":"update-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID to update","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID to update","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a single container","tags":["Updater","Containers"]}},"/environments/{id}/dashboard":{"get":{"description":"Returns the dashboard first-paint snapshot in a single response","operationId":"get-dashboard","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Debug mode: force an empty action item list","explode":false,"in":"query","name":"debugAllGood","schema":{"default":false,"description":"Debug mode: force an empty action item list","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSnapshot"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get dashboard snapshot","tags":["Dashboard"]}},"/environments/{id}/dashboard/action-items":{"get":{"description":"Returns only dashboard action items that currently need attention","operationId":"get-dashboard-action-items","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Debug mode: force an empty action item list","explode":false,"in":"query","name":"debugAllGood","schema":{"default":false,"description":"Debug mode: force an empty action item list","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseActionItems"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get dashboard action items","tags":["Dashboard"]}},"/environments/{id}/deployment":{"get":{"description":"Get Docker run and compose snippets for environment deployment","operationId":"getDeploymentSnippets","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDeploymentSnippet"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get deployment snippets","tags":["Environments"]}},"/environments/{id}/gitops-syncs":{"get":{"description":"Get a paginated list of GitOps syncs for an environment","operationId":"listGitOpsSyncs","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitOpsSyncPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List GitOps syncs","tags":["GitOps Syncs"]},"post":{"description":"Create a new GitOps sync configuration for an environment","operationId":"createGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitopsCreateSyncRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitOpsSync"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a GitOps sync","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/import":{"post":{"description":"Import multiple GitOps sync configurations from JSON","operationId":"importGitOpsSyncs","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GitopsImportGitOpsSyncRequest"},"type":["array","null"]}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseImportGitOpsSyncResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Import GitOps syncs","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/{syncId}":{"delete":{"description":"Delete a GitOps sync configuration by ID","operationId":"deleteGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a GitOps sync","tags":["GitOps Syncs"]},"get":{"description":"Get a GitOps sync by ID","operationId":"getGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitOpsSync"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a GitOps sync","tags":["GitOps Syncs"]},"put":{"description":"Update an existing GitOps sync configuration","operationId":"updateGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitopsUpdateSyncRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitOpsSync"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a GitOps sync","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/{syncId}/files":{"get":{"description":"Browse files in the synced repository","operationId":"browseGitOpsSyncFiles","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}},{"description":"Path to browse (optional)","explode":false,"in":"query","name":"path","schema":{"description":"Path to browse (optional)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBrowseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Browse GitOps sync files","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/{syncId}/status":{"get":{"description":"Get the current status of a GitOps sync","operationId":"getGitOpsSyncStatus","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSyncStatus"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get GitOps sync status","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/{syncId}/sync":{"post":{"description":"Manually trigger a sync operation","operationId":"performGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSyncResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Perform a GitOps sync","tags":["GitOps Syncs"]}},"/environments/{id}/heartbeat":{"post":{"description":"Update the heartbeat timestamp for an environment","operationId":"updateHeartbeat","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update environment heartbeat","tags":["Environments"]}},"/environments/{id}/image-updates/check":{"get":{"operationId":"check-image-update","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image reference","explode":false,"in":"query","name":"imageRef","schema":{"description":"Image reference","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check image update by reference","tags":["Image Updates"]}},"/environments/{id}/image-updates/check-all":{"post":{"operationId":"check-all-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageupdateCheckAllImagesRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBatchResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check all images","tags":["Image Updates"]}},"/environments/{id}/image-updates/check-batch":{"post":{"operationId":"check-multiple-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageupdateBatchImageUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBatchResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check multiple images","tags":["Image Updates"]}},"/environments/{id}/image-updates/check/{imageId}":{"get":{"operationId":"check-image-update-by-id","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check image update by ID","tags":["Image Updates"]},"post":{"operationId":"check-image-update-by-id-post","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check image update by ID (POST)","tags":["Image Updates"]}},"/environments/{id}/image-updates/summary":{"get":{"operationId":"get-update-summary","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get update summary","tags":["Image Updates"]}},"/environments/{id}/images":{"get":{"description":"Get a paginated list of Docker images","operationId":"list-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by in-use status (true/false)","explode":false,"in":"query","name":"inUse","schema":{"description":"Filter by in-use status (true/false)","type":"string"}},{"description":"Filter by update availability (true/false)","explode":false,"in":"query","name":"updates","schema":{"description":"Filter by update availability (true/false)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagePaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List images","tags":["Images"]}},"/environments/{id}/images/build":{"post":{"description":"Build a Docker image using BuildKit with streaming progress output","operationId":"build-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageBuildRequest"}}},"required":true},"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Build an image","tags":["Images"]}},"/environments/{id}/images/builds":{"get":{"description":"Get a paginated list of image build history for an environment","operationId":"list-image-builds","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"desc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by status","explode":false,"in":"query","name":"status","schema":{"description":"Filter by status","type":"string"}},{"description":"Filter by provider","explode":false,"in":"query","name":"provider","schema":{"description":"Filter by provider","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageBuildPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List image builds","tags":["Images"]}},"/environments/{id}/images/builds/{buildId}":{"get":{"description":"Get a single image build history entry with output","operationId":"get-image-build","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Build ID","in":"path","name":"buildId","required":true,"schema":{"description":"Build ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBuildRecord"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get image build","tags":["Images"]}},"/environments/{id}/images/counts":{"get":{"description":"Get counts of images in use, unused, total, and total size","operationId":"get-image-usage-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageUsageCountsResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get image usage counts","tags":["Images"]}},"/environments/{id}/images/prune":{"post":{"description":"Remove unused Docker images","operationId":"prune-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Only remove dangling images","explode":false,"in":"query","name":"dangling","schema":{"description":"Only remove dangling images","type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PruneImagesInputBody"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponsePruneReport"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Prune unused images","tags":["Images"]}},"/environments/{id}/images/pull":{"post":{"description":"Pull a Docker image from a registry with streaming progress output","operationId":"pull-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagePullOptions"}}},"required":true},"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Pull an image","tags":["Images"]}},"/environments/{id}/images/upload":{"post":{"description":"Upload a Docker image from a tar archive","operationId":"upload-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"contentMediaType":"application/octet-stream","description":"Docker image tar archive","format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseLoadResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Upload an image","tags":["Images"]}},"/environments/{id}/images/vulnerabilities/summaries":{"post":{"description":"Retrieves scan summaries for a list of images (batch)","operationId":"get-image-vulnerability-summaries","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityScanSummariesRequest","description":"Batch scan summary request"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScanSummariesResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get vulnerability scan summaries","tags":["Vulnerabilities"]}},"/environments/{id}/images/{imageId}":{"delete":{"description":"Remove a Docker image by ID","operationId":"remove-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}},{"description":"Force removal","explode":false,"in":"query","name":"force","schema":{"description":"Force removal","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Remove an image","tags":["Images"]},"get":{"description":"Get a Docker image by its ID","operationId":"get-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetailSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get image by ID","tags":["Images"]}},"/environments/{id}/images/{imageId}/vulnerabilities":{"get":{"description":"Retrieves the most recent vulnerability scan result for an image","operationId":"get-image-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScanResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get vulnerability scan result","tags":["Vulnerabilities"]}},"/environments/{id}/images/{imageId}/vulnerabilities/list":{"get":{"description":"Retrieves paginated vulnerabilities for an image","operationId":"list-image-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Sort field","explode":false,"in":"query","name":"sort","schema":{"description":"Sort field","type":"string"}},{"description":"Sort order","explode":false,"in":"query","name":"order","schema":{"description":"Sort order","type":"string"}},{"description":"Start offset","explode":false,"in":"query","name":"start","schema":{"description":"Start offset","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"description":"Limit","format":"int64","type":"integer"}},{"description":"Page number","explode":false,"in":"query","name":"page","schema":{"description":"Page number","format":"int64","type":"integer"}},{"description":"Comma-separated severity filter","explode":false,"in":"query","name":"severity","schema":{"description":"Comma-separated severity filter","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BasePaginatedVulnerability"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List image vulnerabilities","tags":["Vulnerabilities"]}},"/environments/{id}/images/{imageId}/vulnerabilities/scan":{"post":{"description":"Initiates a vulnerability scan for the specified image using Trivy","operationId":"scan-image-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID to scan","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID to scan","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScanResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Scan image for vulnerabilities","tags":["Vulnerabilities"]}},"/environments/{id}/images/{imageId}/vulnerabilities/summary":{"get":{"description":"Retrieves just the summary of vulnerabilities for an image (for list views)","operationId":"get-image-vulnerability-summary","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScanSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get vulnerability scan summary","tags":["Vulnerabilities"]}},"/environments/{id}/job-schedules":{"get":{"description":"Get configured cron schedules for background jobs","operationId":"get-job-schedules","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobscheduleConfig"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get job schedules","tags":["JobSchedules"]},"put":{"description":"Update background job cron schedules and reschedule running jobs","operationId":"update-job-schedules","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobscheduleUpdate","description":"Job schedule update data"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseConfig"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update job schedules","tags":["JobSchedules"]}},"/environments/{id}/jobs":{"get":{"description":"Get status, schedule, and metadata for all background jobs","operationId":"list-jobs","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobscheduleJobListResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List all background jobs","tags":["JobSchedules"]}},"/environments/{id}/jobs/{jobId}/run":{"post":{"description":"Manually trigger a background job to run immediately","operationId":"run-job","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Job ID to run","in":"path","name":"jobId","required":true,"schema":{"description":"Job ID to run","minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobscheduleJobRunResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Run a job now","tags":["JobSchedules"]}},"/environments/{id}/networks":{"get":{"operationId":"list-networks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by in-use status (true/false)","explode":false,"in":"query","name":"inUse","schema":{"description":"Filter by in-use status (true/false)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List networks","tags":["Networks"]},"post":{"operationId":"create-network","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkCreateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkCreatedApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create network","tags":["Networks"]}},"/environments/{id}/networks/counts":{"get":{"operationId":"network-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkCountsApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Network counts","tags":["Networks"]}},"/environments/{id}/networks/prune":{"post":{"operationId":"prune-networks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkPruneResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Prune networks","tags":["Networks"]}},"/environments/{id}/networks/topology":{"get":{"operationId":"get-network-topology","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkTopologyApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get network topology","tags":["Networks"]}},"/environments/{id}/networks/{networkId}":{"delete":{"operationId":"delete-network","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Network ID","in":"path","name":"networkId","required":true,"schema":{"description":"Network ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkMessageApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete network","tags":["Networks"]},"get":{"operationId":"get-network","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Network ID","in":"path","name":"networkId","required":true,"schema":{"description":"Network ID","type":"string"}},{"explode":false,"in":"query","name":"sort","schema":{"default":"name","type":"string"}},{"explode":false,"in":"query","name":"order","schema":{"default":"asc","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkInspectApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get network","tags":["Networks"]}},"/environments/{id}/notifications/apprise":{"get":{"operationId":"get-apprise-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationAppriseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get Apprise settings","tags":["Notifications"]},"post":{"operationId":"create-or-update-apprise-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationAppriseUpdate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationAppriseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create or update Apprise settings","tags":["Notifications"]}},"/environments/{id}/notifications/apprise/test":{"post":{"operationId":"test-apprise-notification","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"explode":false,"in":"query","name":"type","schema":{"default":"simple","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Test Apprise notification","tags":["Notifications"]}},"/environments/{id}/notifications/settings":{"get":{"operationId":"get-all-notification-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get all notification settings","tags":["Notifications"]},"post":{"operationId":"create-or-update-notification-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationUpdate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create or update notification settings","tags":["Notifications"]}},"/environments/{id}/notifications/settings/{provider}":{"delete":{"operationId":"delete-notification-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Provider","in":"path","name":"provider","required":true,"schema":{"description":"Provider","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete notification settings","tags":["Notifications"]},"get":{"operationId":"get-notification-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Provider","in":"path","name":"provider","required":true,"schema":{"description":"Provider","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get notification settings by provider","tags":["Notifications"]}},"/environments/{id}/notifications/test/{provider}":{"post":{"operationId":"test-notification","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Provider","in":"path","name":"provider","required":true,"schema":{"description":"Provider","type":"string"}},{"explode":false,"in":"query","name":"type","schema":{"default":"simple","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Test notification","tags":["Notifications"]}},"/environments/{id}/ports":{"get":{"operationId":"list-ports","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List port mappings","tags":["Ports"]}},"/environments/{id}/projects":{"get":{"description":"Get a paginated list of Docker Compose projects","operationId":"list-projects","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by status (comma-separated: running,stopped,partially running)","explode":false,"in":"query","name":"status","schema":{"description":"Filter by status (comma-separated: running,stopped,partially running)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List projects","tags":["Projects"]},"post":{"description":"Create a new Docker Compose project","operationId":"create-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreateProject"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseCreateReponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a project","tags":["Projects"]}},"/environments/{id}/projects/counts":{"get":{"description":"Get counts of running, stopped, and total projects","operationId":"get-project-status-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStatusCounts"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get project status counts","tags":["Projects"]}},"/environments/{id}/projects/{projectId}":{"get":{"description":"Get a Docker Compose project by ID","operationId":"get-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a project","tags":["Projects"]},"put":{"description":"Update a Docker Compose project configuration","operationId":"update-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdateProject"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/build":{"post":{"description":"Build Docker Compose services with build directives using BuildKit","operationId":"build-project-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildProjectInputBody"}}}},"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Build project images","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/destroy":{"delete":{"description":"Destroy a Docker Compose project and optionally remove files/volumes","operationId":"destroy-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDestroy"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Destroy a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/down":{"post":{"description":"Bring down a Docker Compose project (docker-compose down)","operationId":"down-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Bring down a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/includes":{"put":{"description":"Update an include file within a Docker Compose project","operationId":"update-project-include","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdateIncludeFile"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update project include file","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/pull":{"post":{"description":"Pull all images for a Docker Compose project with streaming progress output","operationId":"pull-project-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Pull project images","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/redeploy":{"post":{"description":"Redeploy a Docker Compose project (down + up)","operationId":"redeploy-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Redeploy a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/restart":{"post":{"description":"Restart all containers in a Docker Compose project","operationId":"restart-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Restart a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/up":{"post":{"description":"Deploy a Docker Compose project (docker-compose up)","operationId":"deploy-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDeployOptions"}}}},"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Deploy a project","tags":["Projects"]}},"/environments/{id}/settings":{"get":{"description":"Get all settings for an environment","operationId":"get-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SettingsPublicSetting"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get settings","tags":["Settings"]},"put":{"description":"Update settings for an environment","operationId":"update-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsUpdate","description":"Settings update data"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListSettingDto"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update settings","tags":["Settings"]}},"/environments/{id}/settings/public":{"get":{"description":"Get all public settings for an environment","operationId":"get-public-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SettingsPublicSetting"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get public settings","tags":["Settings"]}},"/environments/{id}/swarm/configs":{"get":{"operationId":"list-swarm-configs","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListConfigSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm configs","tags":["Swarm"]},"post":{"operationId":"create-swarm-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmConfigCreateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseConfigSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create swarm config","tags":["Swarm"]}},"/environments/{id}/swarm/configs/{configId}":{"delete":{"operationId":"delete-swarm-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Config ID","in":"path","name":"configId","required":true,"schema":{"description":"Config ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm config","tags":["Swarm"]},"get":{"operationId":"get-swarm-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Config ID","in":"path","name":"configId","required":true,"schema":{"description":"Config ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseConfigSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm config","tags":["Swarm"]},"put":{"operationId":"update-swarm-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Config ID","in":"path","name":"configId","required":true,"schema":{"description":"Config ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmConfigUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseConfigSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm config","tags":["Swarm"]}},"/environments/{id}/swarm/info":{"get":{"operationId":"get-swarm-info","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm info","tags":["Swarm"]}},"/environments/{id}/swarm/init":{"post":{"operationId":"init-swarm","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmInitRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmInitResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Initialize swarm","tags":["Swarm"]}},"/environments/{id}/swarm/join":{"post":{"operationId":"join-swarm","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmJoinRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Join swarm","tags":["Swarm"]}},"/environments/{id}/swarm/join-tokens":{"get":{"operationId":"get-swarm-join-tokens","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmJoinTokensResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm join tokens","tags":["Swarm"]}},"/environments/{id}/swarm/join-tokens/rotate":{"post":{"operationId":"rotate-swarm-join-tokens","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmRotateJoinTokensRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Rotate swarm join tokens","tags":["Swarm"]}},"/environments/{id}/swarm/leave":{"post":{"operationId":"leave-swarm","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmLeaveRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Leave swarm","tags":["Swarm"]}},"/environments/{id}/swarm/nodes":{"get":{"operationId":"list-swarm-nodes","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseNodeSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm nodes","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}":{"delete":{"operationId":"delete-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}},{"description":"Force node removal","explode":false,"in":"query","name":"force","schema":{"default":false,"description":"Force node removal","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm node","tags":["Swarm"]},"get":{"operationId":"get-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseNodeSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm node","tags":["Swarm"]},"patch":{"operationId":"update-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmNodeUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm node","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}/agent/deployment":{"post":{"operationId":"get-swarm-node-agent-deployment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSwarmNodeAgentDeploymentInputBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmNodeAgentDeployment"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm node agent deployment snippets","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}/demote":{"post":{"operationId":"demote-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Demote swarm node","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}/promote":{"post":{"operationId":"promote-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Promote swarm node","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}/tasks":{"get":{"operationId":"list-swarm-node-tasks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseTaskSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List tasks for a swarm node","tags":["Swarm"]}},"/environments/{id}/swarm/secrets":{"get":{"operationId":"list-swarm-secrets","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListSecretSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm secrets","tags":["Swarm"]},"post":{"operationId":"create-swarm-secret","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSecretCreateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSecretSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create swarm secret","tags":["Swarm"]}},"/environments/{id}/swarm/secrets/{secretId}":{"delete":{"operationId":"delete-swarm-secret","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Secret ID","in":"path","name":"secretId","required":true,"schema":{"description":"Secret ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm secret","tags":["Swarm"]},"get":{"operationId":"get-swarm-secret","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Secret ID","in":"path","name":"secretId","required":true,"schema":{"description":"Secret ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSecretSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm secret","tags":["Swarm"]},"put":{"operationId":"update-swarm-secret","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Secret ID","in":"path","name":"secretId","required":true,"schema":{"description":"Secret ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSecretUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSecretSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm secret","tags":["Swarm"]}},"/environments/{id}/swarm/services":{"get":{"operationId":"list-swarm-services","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseServiceSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm services","tags":["Swarm"]},"post":{"operationId":"create-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmServiceCreateRequest","description":"Service creation request"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceCreateResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/services/{serviceId}":{"delete":{"operationId":"delete-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm service","tags":["Swarm"]},"get":{"operationId":"get-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceInspect"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm service","tags":["Swarm"]},"put":{"operationId":"update-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmServiceUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceUpdateResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/services/{serviceId}/rollback":{"post":{"operationId":"rollback-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceUpdateResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Rollback a swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/services/{serviceId}/scale":{"post":{"operationId":"scale-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmServiceScaleRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceUpdateResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Scale a swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/services/{serviceId}/tasks":{"get":{"operationId":"list-swarm-service-tasks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseTaskSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List tasks for a swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/spec":{"put":{"operationId":"update-swarm-spec","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm spec","tags":["Swarm"]}},"/environments/{id}/swarm/stacks":{"get":{"operationId":"list-swarm-stacks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseStackSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm stacks","tags":["Swarm"]},"post":{"operationId":"deploy-swarm-stack","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmStackDeployRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStackDeployResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Deploy swarm stack","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/config/render":{"post":{"operationId":"render-swarm-stack-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmStackRenderConfigRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStackRenderConfigResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Render/validate swarm stack config","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/{name}":{"delete":{"operationId":"delete-swarm-stack","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm stack","tags":["Swarm"]},"get":{"operationId":"get-swarm-stack","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStackInspect"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm stack","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/{name}/services":{"get":{"operationId":"list-swarm-stack-services","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseServiceSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm stack services","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/{name}/source":{"get":{"operationId":"get-swarm-stack-source","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStackSource"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm stack source","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/{name}/tasks":{"get":{"operationId":"list-swarm-stack-tasks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseTaskSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm stack tasks","tags":["Swarm"]}},"/environments/{id}/swarm/status":{"get":{"operationId":"get-swarm-status","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseRuntimeStatus"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm status","tags":["Swarm"]}},"/environments/{id}/swarm/tasks":{"get":{"operationId":"list-swarm-tasks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseTaskSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm tasks","tags":["Swarm"]}},"/environments/{id}/swarm/unlock":{"post":{"operationId":"unlock-swarm","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmUnlockRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Unlock swarm","tags":["Swarm"]}},"/environments/{id}/swarm/unlock-key":{"get":{"operationId":"get-swarm-unlock-key","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmUnlockKeyResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm unlock key","tags":["Swarm"]}},"/environments/{id}/sync":{"post":{"description":"Sync container registries and git repositories to a remote environment","operationId":"syncEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Sync environment","tags":["Environments"]}},"/environments/{id}/system/containers/start-all":{"post":{"description":"Start all Docker containers","operationId":"start-all-containers","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseActionResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Start all containers","tags":["System"]}},"/environments/{id}/system/containers/start-stopped":{"post":{"description":"Start all stopped Docker containers","operationId":"start-all-stopped-containers","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseActionResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Start all stopped containers","tags":["System"]}},"/environments/{id}/system/containers/stop-all":{"post":{"description":"Stop all running Docker containers","operationId":"stop-all-containers","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseActionResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Stop all containers","tags":["System"]}},"/environments/{id}/system/convert":{"post":{"description":"Convert a docker run command to docker-compose format","operationId":"convert-docker-run","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemConvertDockerRunRequest","description":"Docker run command"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemConvertDockerRunResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Convert docker run command","tags":["System"]}},"/environments/{id}/system/docker/info":{"get":{"description":"Get Docker daemon version and system information","operationId":"get-docker-info","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerinfoInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get Docker info","tags":["System"]}},"/environments/{id}/system/health":{"head":{"description":"Check if the Docker daemon is responsive","operationId":"system-health","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check system health","tags":["System"]}},"/environments/{id}/system/prune":{"post":{"description":"Remove unused Docker resources (containers, images, volumes, networks)","operationId":"prune-all","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemPruneAllRequest","description":"Prune options"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponsePruneAllResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Prune Docker resources","tags":["System"]}},"/environments/{id}/system/upgrade":{"post":{"description":"Trigger a system upgrade","operationId":"trigger-upgrade","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"Accepted"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Trigger system upgrade","tags":["System"]}},"/environments/{id}/system/upgrade/check":{"get":{"description":"Check if a system upgrade is available","operationId":"check-upgrade","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeCheckResultData"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check for system upgrade","tags":["System"]}},"/environments/{id}/templates/variables":{"get":{"description":"Get global template variables for an environment","operationId":"getGlobalVariables","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListVariable"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get global variables","tags":["Templates"]},"put":{"description":"Update global template variables for an environment","operationId":"updateGlobalVariables","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvSummary"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update global variables","tags":["Templates"]}},"/environments/{id}/test":{"post":{"description":"Test connectivity to a Arcane environment","operationId":"testConnection","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentTestConnectionRequest"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTest"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Test environment connection","tags":["Environments"]}},"/environments/{id}/updater/history":{"get":{"description":"Get the history of update operations","operationId":"get-updater-history","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Number of history entries to return","explode":false,"in":"query","name":"limit","schema":{"default":50,"description":"Number of history entries to return","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListAutoUpdateRecord"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get updater history","tags":["Updater"]}},"/environments/{id}/updater/run":{"post":{"description":"Apply pending container updates","operationId":"run-updater","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdaterOptions","description":"Updater run options"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Run updater","tags":["Updater"]}},"/environments/{id}/updater/status":{"get":{"description":"Get the current status of the updater","operationId":"get-updater-status","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStatus"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get updater status","tags":["Updater"]}},"/environments/{id}/version":{"get":{"description":"Get the version of a remote environment","operationId":"getEnvironmentVersion","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get environment version","tags":["Environments"]}},"/environments/{id}/volumes":{"get":{"description":"Get a paginated list of Docker volumes","operationId":"list-volumes","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by in-use status (true/false)","explode":false,"in":"query","name":"inUse","schema":{"description":"Filter by in-use status (true/false)","type":"string"}},{"description":"Include internal volumes","explode":false,"in":"query","name":"includeInternal","schema":{"default":false,"description":"Include internal volumes","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VolumePaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List volumes","tags":["Volumes"]},"post":{"description":"Create a new Docker volume","operationId":"create-volume","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VolumeCreate","description":"Volume creation data"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolume"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a volume","tags":["Volumes"]}},"/environments/{id}/volumes/backups/{backupId}":{"delete":{"operationId":"delete-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/backups/{backupId}/download":{"get":{"operationId":"download-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/backups/{backupId}/files":{"get":{"operationId":"list-backup-files","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListString"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List files in a volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/backups/{backupId}/has-path":{"get":{"operationId":"backup-has-path","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}},{"description":"Path to check","explode":false,"in":"query","name":"path","schema":{"description":"Path to check","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBackupHasPathResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check if backup contains path","tags":["Volume Backup"]}},"/environments/{id}/volumes/counts":{"get":{"description":"Get counts of volumes in use, unused, and total","operationId":"get-volume-usage-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Include internal volumes","explode":false,"in":"query","name":"includeInternal","schema":{"default":false,"description":"Include internal volumes","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolumeUsageCountsData"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get volume usage counts","tags":["Volumes"]}},"/environments/{id}/volumes/prune":{"post":{"description":"Remove all unused Docker volumes","operationId":"prune-volumes","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolumePruneReportData"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Prune unused volumes","tags":["Volumes"]}},"/environments/{id}/volumes/sizes":{"get":{"description":"Get disk usage sizes for all volumes (slow operation)","operationId":"get-volume-sizes","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListVolumeSizeInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get volume sizes","tags":["Volumes"]}},"/environments/{id}/volumes/{volumeName}":{"delete":{"description":"Remove a Docker volume by name","operationId":"remove-volume","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Force removal","explode":false,"in":"query","name":"force","schema":{"description":"Force removal","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Remove a volume","tags":["Volumes"]},"get":{"description":"Get a Docker volume by its name","operationId":"get-volume","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolume"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get volume by name","tags":["Volumes"]}},"/environments/{id}/volumes/{volumeName}/backups":{"get":{"operationId":"list-volume-backups","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Limit","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VolumeBackupPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List volume backups","tags":["Volume Backup"]},"post":{"operationId":"create-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolumeBackup"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/{volumeName}/backups/upload":{"post":{"operationId":"upload-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"contentMediaType":"application/octet-stream","description":"Backup archive (tar.gz)","format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Upload and restore volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/{volumeName}/backups/{backupId}/restore":{"post":{"operationId":"restore-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Restore volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/{volumeName}/backups/{backupId}/restore-files":{"post":{"operationId":"restore-volume-backup-files","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreBackupFilesInputBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Restore specific files from a volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/{volumeName}/browse":{"delete":{"operationId":"delete-volume-file","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"File or directory path to delete","explode":false,"in":"query","name":"path","schema":{"description":"File or directory path to delete","type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete file or directory in volume","tags":["Volume Browser"]},"get":{"operationId":"browse-volume-directory","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Directory path to browse","explode":false,"in":"query","name":"path","schema":{"default":"/","description":"Directory path to browse","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListFileEntry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List volume directory","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/browse/content":{"get":{"operationId":"get-volume-file-content","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"File path","explode":false,"in":"query","name":"path","schema":{"description":"File path","type":"string"}},{"description":"Maximum bytes to read (default 1MB)","explode":false,"in":"query","name":"maxBytes","schema":{"default":1048576,"description":"Maximum bytes to read (default 1MB)","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseFileContentResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get file content preview","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/browse/download":{"get":{"operationId":"download-volume-file","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"File path","explode":false,"in":"query","name":"path","schema":{"description":"File path","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download file from volume","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/browse/mkdir":{"post":{"operationId":"create-volume-directory","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Directory path to create","explode":false,"in":"query","name":"path","schema":{"description":"Directory path to create","type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create directory in volume","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/browse/upload":{"post":{"operationId":"upload-volume-file","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Destination path","explode":false,"in":"query","name":"path","schema":{"default":"/","description":"Destination path","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"contentMediaType":"application/octet-stream","description":"File to upload","format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Upload file to volume","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/usage":{"get":{"description":"Get containers using a specific volume","operationId":"get-volume-usage","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolumeUsageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get volume usage","tags":["Volumes"]}},"/environments/{id}/vulnerabilities/all":{"get":{"description":"Retrieves paginated vulnerabilities across all scanned images in the environment","operationId":"list-environment-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Sort field","explode":false,"in":"query","name":"sort","schema":{"description":"Sort field","type":"string"}},{"description":"Sort order","explode":false,"in":"query","name":"order","schema":{"description":"Sort order","type":"string"}},{"description":"Start offset","explode":false,"in":"query","name":"start","schema":{"description":"Start offset","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"description":"Limit","format":"int64","type":"integer"}},{"description":"Page number","explode":false,"in":"query","name":"page","schema":{"description":"Page number","format":"int64","type":"integer"}},{"description":"Comma-separated severity filter","explode":false,"in":"query","name":"severity","schema":{"description":"Comma-separated severity filter","type":"string"}},{"description":"Filter by image/repo name (substring)","explode":false,"in":"query","name":"imageName","schema":{"description":"Filter by image/repo name (substring)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BasePaginatedVulnerabilityWithImage"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List environment vulnerabilities","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/ignore":{"post":{"description":"Creates an ignore record for a specific vulnerability","operationId":"ignore-vulnerability","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityIgnorePayload"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseIgnoredVulnerability"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Ignore a vulnerability","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/ignore/{ignoreId}":{"delete":{"description":"Removes an ignore record for a vulnerability","operationId":"unignore-vulnerability","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Ignore record ID","in":"path","name":"ignoreId","required":true,"schema":{"description":"Ignore record ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStruct {}"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Unignore a vulnerability","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/ignored":{"get":{"description":"Retrieves a list of all ignored vulnerabilities for the environment","operationId":"list-ignored-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Sort field","explode":false,"in":"query","name":"sort","schema":{"description":"Sort field","type":"string"}},{"description":"Sort order","explode":false,"in":"query","name":"order","schema":{"description":"Sort order","type":"string"}},{"description":"Start offset","explode":false,"in":"query","name":"start","schema":{"description":"Start offset","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"description":"Limit","format":"int64","type":"integer"}},{"description":"Page number","explode":false,"in":"query","name":"page","schema":{"description":"Page number","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BasePaginatedIgnoredVulnerability"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List ignored vulnerabilities","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/image-options":{"get":{"description":"Retrieves available image filter options for environment vulnerabilities","operationId":"list-environment-vulnerability-image-options","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Comma-separated severity filter","explode":false,"in":"query","name":"severity","schema":{"description":"Comma-separated severity filter","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListString"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List vulnerability image options","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/scanner-status":{"get":{"description":"Check if the vulnerability scanner (Trivy) is available and get its version","operationId":"get-vulnerability-scanner-status","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScannerStatus"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get vulnerability scanner status","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/summary":{"get":{"description":"Retrieves aggregated vulnerability counts across all images in the environment","operationId":"get-environment-vulnerability-summary","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironmentVulnerabilitySummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get environment vulnerability summary","tags":["Vulnerabilities"]}},"/environments/{id}/webhooks":{"get":{"description":"List all webhooks configured for this environment","operationId":"list-webhooks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List webhooks","tags":["Webhooks"]},"post":{"description":"Create a webhook that triggers a container or stack update. The token is only returned once.","operationId":"create-webhook","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseCreated"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create webhook","tags":["Webhooks"]}},"/environments/{id}/webhooks/{webhookId}":{"delete":{"description":"Delete a webhook by ID","operationId":"delete-webhook","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Webhook ID","in":"path","name":"webhookId","required":true,"schema":{"description":"Webhook ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseInterface {}"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete webhook","tags":["Webhooks"]},"patch":{"description":"Update a webhook's enabled state","operationId":"update-webhook","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Webhook ID","in":"path","name":"webhookId","required":true,"schema":{"description":"Webhook ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdateInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseInterface {}"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update webhook","tags":["Webhooks"]}},"/events":{"get":{"description":"Get a paginated list of system events","operationId":"listEvents","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Limit","format":"int64","type":"integer"}},{"description":"Filter by severity","explode":false,"in":"query","name":"severity","schema":{"description":"Filter by severity","type":"string"}},{"description":"Filter by event type","explode":false,"in":"query","name":"type","schema":{"description":"Filter by event type","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List events","tags":["Events"]},"post":{"description":"Create a new system event","operationId":"createEvent","parameters":[{"description":"API key for environment-scoped event forwarding","in":"header","name":"X-API-Key","schema":{"description":"API key for environment-scoped event forwarding","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventCreateEvent"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEvent"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create an event","tags":["Events"]}},"/events/environment/{environmentId}":{"get":{"description":"Get a paginated list of events for a specific environment","operationId":"getEventsByEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"environmentId","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Limit","format":"int64","type":"integer"}},{"description":"Filter by severity","explode":false,"in":"query","name":"severity","schema":{"description":"Filter by severity","type":"string"}},{"description":"Filter by event type","explode":false,"in":"query","name":"type","schema":{"description":"Filter by event type","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get events by environment","tags":["Events"]}},"/events/{eventId}":{"delete":{"description":"Delete a system event by ID","operationId":"deleteEvent","parameters":[{"description":"Event ID","in":"path","name":"eventId","required":true,"schema":{"description":"Event ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete an event","tags":["Events"]}},"/fonts/mono":{"get":{"description":"Get the application monospace font (Geist Mono)","operationId":"get-mono-font","responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get monospace font","tags":["Fonts"]}},"/fonts/sans":{"get":{"description":"Get the application sans-serif font (Geist)","operationId":"get-sans-font","responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get sans-serif font","tags":["Fonts"]}},"/fonts/serif":{"get":{"description":"Get the application serif font (Calistoga)","operationId":"get-serif-font","responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get serif font","tags":["Fonts"]}},"/git-repositories/sync":{"post":{"description":"Sync git repositories from a manager to this agent instance","operationId":"syncGitRepositories","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitopsRepositorySyncRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Sync git repositories","tags":["Git Repositories"]}},"/health":{"get":{"description":"Check if the API is healthy","operationId":"health-check","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemHealthResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Health check","tags":["Health"]},"head":{"description":"Check if the API is healthy (HEAD request)","operationId":"health-check-head","responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Health check (HEAD)","tags":["Health"]}},"/notifications/dispatch":{"post":{"operationId":"dispatch-notification","parameters":[{"description":"Remote environment access token","in":"header","name":"X-API-Key","schema":{"description":"Remote environment access token","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationDispatchRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Dispatch notification from remote agent to manager","tags":["Notifications"]}},"/oidc/callback":{"post":{"description":"Process the OIDC callback and complete authentication","operationId":"handle-oidc-callback","parameters":[{"in":"header","name":"Origin","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Host","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Proto","schema":{"type":"string"}},{"in":"header","name":"Host","schema":{"type":"string"}},{"description":"OIDC state cookie from auth URL request","in":"cookie","name":"oidc_state","schema":{"description":"OIDC state cookie from auth URL request","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcCallbackRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcCallbackResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Session and clear state cookies","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Handle OIDC callback","tags":["OIDC"]}},"/oidc/config":{"get":{"description":"Get the OIDC client configuration","operationId":"get-oidc-config","parameters":[{"in":"header","name":"Origin","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Host","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Proto","schema":{"type":"string"}},{"in":"header","name":"Host","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcConfigResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get OIDC config","tags":["OIDC"]}},"/oidc/device/code":{"post":{"description":"Start the device authorization flow for CLI authentication","operationId":"initiate-oidc-device-auth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcDeviceAuthResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Initiate OIDC device authorization","tags":["OIDC"]}},"/oidc/device/token":{"post":{"description":"Exchange a device code for authentication tokens","operationId":"exchange-oidc-device-token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcDeviceTokenRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcDeviceTokenResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Session token cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Exchange device code for tokens","tags":["OIDC"]}},"/oidc/status":{"get":{"description":"Get the current OIDC configuration status","operationId":"get-oidc-status","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcStatusInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get OIDC status","tags":["OIDC"]}},"/oidc/url":{"post":{"description":"Generate an OIDC authorization URL for login","operationId":"get-oidc-auth-url","parameters":[{"in":"header","name":"Origin","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Host","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Proto","schema":{"type":"string"}},{"in":"header","name":"Host","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcAuthUrlRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcAuthUrlResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"OIDC state cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get OIDC auth URL","tags":["OIDC"]}},"/settings/categories":{"get":{"description":"Get all available settings categories with metadata","operationId":"get-settings-categories","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CategoryCategory"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get settings categories","tags":["Settings"]}},"/settings/search":{"post":{"description":"Search settings categories and individual settings by query","operationId":"search-settings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest","description":"Search query"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Search settings","tags":["Settings"]}},"/swarm/node-identity":{"get":{"operationId":"get-swarm-node-identity","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmNodeIdentity"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get local swarm node identity","tags":["Swarm"]}},"/templates":{"get":{"description":"Get a paginated list of compose templates","operationId":"listTemplatesPaginated","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplatePaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"List templates (paginated)","tags":["Templates"]},"post":{"description":"Create a new compose template","operationId":"createTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a template","tags":["Templates"]}},"/templates/all":{"get":{"description":"Get all compose templates without pagination","operationId":"getAllTemplates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"List all templates","tags":["Templates"]}},"/templates/default":{"get":{"description":"Get the default compose and env templates","operationId":"getDefaultTemplates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDefaultTemplatesResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get default templates","tags":["Templates"]},"post":{"description":"Save the default compose and env templates","operationId":"saveDefaultTemplates","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateSaveDefaultTemplatesRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Save default templates","tags":["Templates"]}},"/templates/fetch":{"get":{"description":"Fetch templates from a remote registry URL","operationId":"fetchTemplateRegistry","parameters":[{"description":"Registry URL","explode":false,"in":"query","name":"url","required":true,"schema":{"description":"Registry URL","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseRemoteRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Fetch remote registry","tags":["Templates"]}},"/templates/registries":{"get":{"description":"Get all template registries","operationId":"getTemplateRegistries","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListTemplateRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List template registries","tags":["Templates"]},"post":{"description":"Create a new template registry","operationId":"createTemplateRegistry","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreateRegistryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplateRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a template registry","tags":["Templates"]}},"/templates/registries/{id}":{"delete":{"description":"Delete a template registry","operationId":"deleteTemplateRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a template registry","tags":["Templates"]},"put":{"description":"Update an existing template registry","operationId":"updateTemplateRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateUpdateRegistryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a template registry","tags":["Templates"]}},"/templates/{id}":{"delete":{"description":"Delete a compose template","operationId":"deleteTemplate","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a template","tags":["Templates"]},"get":{"description":"Get a compose template by ID","operationId":"getTemplate","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get a template","tags":["Templates"]},"put":{"description":"Update an existing compose template","operationId":"updateTemplate","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a template","tags":["Templates"]}},"/templates/{id}/content":{"get":{"description":"Get the compose content for a template with parsed data","operationId":"getTemplateContent","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplateContent"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get template content","tags":["Templates"]}},"/templates/{id}/download":{"post":{"description":"Download a remote template to local storage","operationId":"downloadTemplate","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download a template","tags":["Templates"]}},"/users":{"get":{"description":"Get a paginated list of all users","operationId":"listUsers","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List users","tags":["Users"]},"post":{"description":"Create a new user account","operationId":"createUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateUser"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a user","tags":["Users"]}},"/users/{userId}":{"delete":{"description":"Delete a user by ID","operationId":"deleteUser","parameters":[{"description":"User ID","in":"path","name":"userId","required":true,"schema":{"description":"User ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a user","tags":["Users"]},"get":{"description":"Get a user by ID","operationId":"getUser","parameters":[{"description":"User ID","in":"path","name":"userId","required":true,"schema":{"description":"User ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a user","tags":["Users"]},"put":{"description":"Update an existing user's information","operationId":"updateUser","parameters":[{"description":"User ID","in":"path","name":"userId","required":true,"schema":{"description":"User ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateUser"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a user","tags":["Users"]}},"/version":{"get":{"description":"Get application version information and check for updates","operationId":"getVersion","parameters":[{"description":"Current version to compare against","explode":false,"in":"query","name":"current","schema":{"description":"Current version to compare against","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCheck"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get version information","tags":["Version"]}}},"servers":[{"url":"https://arcane.randomsynergy.xyz:3552/api"}]} \ No newline at end of file +{"components":{"schemas":{"ActivityActivity":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"durationMs":{"format":"int64","type":"integer"},"endedAt":{"format":"date-time","type":"string"},"environmentId":{"type":"string"},"error":{"type":"string"},"id":{"type":"string"},"latestMessage":{"type":"string"},"metadata":{"additionalProperties":{},"type":"object"},"progress":{"format":"int64","type":"integer"},"resourceId":{"type":"string"},"resourceName":{"type":"string"},"resourceType":{"type":"string"},"sourceEnvironmentId":{"type":"string"},"sourceEnvironmentName":{"type":"string"},"startedAt":{"format":"date-time","type":"string"},"startedBy":{"$ref":"#/components/schemas/ActivityStartedBy"},"status":{"type":"string"},"step":{"type":"string"},"type":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","environmentId","type","status","startedAt","createdAt"],"type":"object"},"ActivityClearHistoryResult":{"additionalProperties":false,"properties":{"deleted":{"format":"int64","type":"integer"}},"required":["deleted"],"type":"object"},"ActivityDetail":{"additionalProperties":false,"properties":{"activity":{"$ref":"#/components/schemas/ActivityActivity"},"messages":{"items":{"$ref":"#/components/schemas/ActivityMessage"},"type":["array","null"]}},"required":["activity","messages"],"type":"object"},"ActivityMessage":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"level":{"type":"string"},"message":{"type":"string"},"payload":{"additionalProperties":{},"type":"object"}},"required":["id","activityId","level","message","createdAt"],"type":"object"},"ActivityStartedBy":{"additionalProperties":false,"properties":{"displayName":{"type":"string"},"userId":{"type":"string"},"username":{"type":"string"}},"required":["username"],"type":"object"},"ApiKeyPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ApiKeyPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ApikeyApiKey"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ApiResponseStruct {}DataStruct":{"additionalProperties":false,"type":"object"},"ApikeyApiKey":{"additionalProperties":false,"properties":{"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"description":{"description":"Description of the API key","type":"string"},"expiresAt":{"description":"Expiration date of the API key","format":"date-time","type":"string"},"id":{"description":"Unique identifier of the API key","type":"string"},"isBootstrap":{"description":"Whether the API key is an auto-generated environment bootstrap key (locked from manual edit / delete)","type":"boolean"},"isStatic":{"description":"Whether the API key is environment-managed and protected from deletion","type":"boolean"},"keyPrefix":{"description":"Prefix of the API key for identification","type":"string"},"kind":{"description":"Key kind: 'scoped' keys use their own permission grants, 'personal' keys inherit the owner's role permissions","type":"string"},"lastUsedAt":{"description":"Last time the API key was used","format":"date-time","type":"string"},"name":{"description":"Name of the API key","type":"string"},"permissions":{"description":"Permissions held by this key","items":{"$ref":"#/components/schemas/ApikeyPermissionGrant"},"type":["array","null"]},"updatedAt":{"description":"Last update timestamp","format":"date-time","type":"string"},"userId":{"description":"ID of the user who owns the API key","type":"string"}},"required":["id","name","keyPrefix","kind","isStatic","isBootstrap","createdAt","permissions"],"type":"object"},"ApikeyApiKeyCreatedDto":{"additionalProperties":false,"properties":{"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"description":{"description":"Description of the API key","type":"string"},"expiresAt":{"description":"Expiration date of the API key","format":"date-time","type":"string"},"id":{"description":"Unique identifier of the API key","type":"string"},"isBootstrap":{"description":"Whether the API key is an auto-generated environment bootstrap key (locked from manual edit / delete)","type":"boolean"},"isStatic":{"description":"Whether the API key is environment-managed and protected from deletion","type":"boolean"},"key":{"description":"The full API key secret (only shown once)","type":"string"},"keyPrefix":{"description":"Prefix of the API key for identification","type":"string"},"kind":{"description":"Key kind: 'scoped' keys use their own permission grants, 'personal' keys inherit the owner's role permissions","type":"string"},"lastUsedAt":{"description":"Last time the API key was used","format":"date-time","type":"string"},"name":{"description":"Name of the API key","type":"string"},"permissions":{"description":"Permissions held by this key","items":{"$ref":"#/components/schemas/ApikeyPermissionGrant"},"type":["array","null"]},"updatedAt":{"description":"Last update timestamp","format":"date-time","type":"string"},"userId":{"description":"ID of the user who owns the API key","type":"string"}},"required":["key","id","name","keyPrefix","kind","isStatic","isBootstrap","createdAt","permissions"],"type":"object"},"ApikeyCreateApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyCreateApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"description":"Optional description of the API key","maxLength":1000,"type":"string"},"expiresAt":{"description":"Optional expiration date for the API key","format":"date-time","type":"string"},"name":{"description":"Name of the API key","examples":["My API Key"],"maxLength":255,"minLength":1,"type":"string"},"permissions":{"description":"Permissions granted to this key. Cannot exceed the creator's own permissions.","items":{"$ref":"#/components/schemas/ApikeyPermissionGrant"},"minItems":1,"type":["array","null"]}},"required":["name","permissions"],"type":"object"},"ApikeyCreateUserApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyCreateUserApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"description":"Optional description of the API key","maxLength":1000,"type":"string"},"expiresAt":{"description":"Optional expiration date for the API key","format":"date-time","type":"string"},"name":{"description":"Name of the API key","examples":["My API Key"],"maxLength":255,"minLength":1,"type":"string"}},"required":["name"],"type":"object"},"ApikeyPermissionGrant":{"additionalProperties":false,"properties":{"environmentId":{"description":"Environment ID to scope the grant to; omit for a global grant","type":"string"},"permission":{"description":"Permission string","examples":["containers:list"],"minLength":1,"type":"string"}},"required":["permission"],"type":"object"},"ApikeyUpdateApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyUpdateApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"description":"New description for the API key","maxLength":1000,"type":"string"},"expiresAt":{"description":"New expiration date for the API key","format":"date-time","type":"string"},"name":{"description":"New name for the API key","maxLength":255,"type":"string"},"permissions":{"description":"Replace the key's permission grants. Omit to leave unchanged. Cannot exceed the updater's own permissions.","items":{"$ref":"#/components/schemas/ApikeyPermissionGrant"},"type":["array","null"]}},"type":"object"},"AuthLogin":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthLogin.json"],"format":"uri","readOnly":true,"type":"string"},"password":{"description":"Password of the user","minLength":1,"type":"string"},"username":{"description":"Username of the user","examples":["admin"],"maxLength":255,"minLength":1,"type":"string"}},"required":["username","password"],"type":"object"},"AuthLoginResponse":{"additionalProperties":false,"properties":{"expiresAt":{"description":"Expiration time of the access token","format":"date-time","type":"string"},"refreshToken":{"description":"Refresh token for obtaining new access tokens","type":"string"},"token":{"description":"JWT access token","type":"string"},"user":{"$ref":"#/components/schemas/UserUser","description":"Authenticated user information"}},"required":["token","refreshToken","expiresAt","user"],"type":"object"},"AuthOidcAuthUrlRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcAuthUrlRequest.json"],"format":"uri","readOnly":true,"type":"string"},"mobileRedirectUri":{"type":"string"},"redirectUri":{"type":"string"}},"required":["redirectUri"],"type":"object"},"AuthOidcAuthUrlResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcAuthUrlResponse.json"],"format":"uri","readOnly":true,"type":"string"},"authUrl":{"type":"string"}},"required":["authUrl"],"type":"object"},"AuthOidcCallbackRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcCallbackRequest.json"],"format":"uri","readOnly":true,"type":"string"},"code":{"type":"string"},"mobileRedirectUri":{"type":"string"},"state":{"type":"string"}},"required":["code","state"],"type":"object"},"AuthOidcCallbackResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcCallbackResponse.json"],"format":"uri","readOnly":true,"type":"string"},"expiresAt":{"format":"date-time","type":"string"},"refreshToken":{"type":"string"},"success":{"type":"boolean"},"token":{"type":"string"},"user":{"$ref":"#/components/schemas/UserUser"}},"required":["success","token","refreshToken","expiresAt","user"],"type":"object"},"AuthOidcConfigResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcConfigResponse.json"],"format":"uri","readOnly":true,"type":"string"},"authorizationEndpoint":{"type":"string"},"clientId":{"type":"string"},"deviceAuthorizationEndpoint":{"type":"string"},"issuerUrl":{"type":"string"},"redirectUri":{"type":"string"},"scopes":{"type":"string"},"tokenEndpoint":{"type":"string"},"userinfoEndpoint":{"type":"string"}},"required":["clientId","redirectUri","issuerUrl","authorizationEndpoint","tokenEndpoint","userinfoEndpoint","scopes"],"type":"object"},"AuthOidcDeviceAuthResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceAuthResponse.json"],"format":"uri","readOnly":true,"type":"string"},"deviceCode":{"type":"string"},"expiresIn":{"format":"int64","type":"integer"},"interval":{"format":"int64","type":"integer"},"userCode":{"type":"string"},"verificationUri":{"type":"string"},"verificationUriComplete":{"type":"string"}},"required":["deviceCode","userCode","verificationUri","expiresIn"],"type":"object"},"AuthOidcDeviceTokenRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceTokenRequest.json"],"format":"uri","readOnly":true,"type":"string"},"deviceCode":{"type":"string"}},"required":["deviceCode"],"type":"object"},"AuthOidcDeviceTokenResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceTokenResponse.json"],"format":"uri","readOnly":true,"type":"string"},"expiresAt":{"format":"date-time","type":"string"},"refreshToken":{"type":"string"},"success":{"type":"boolean"},"token":{"type":"string"},"user":{"$ref":"#/components/schemas/UserUser"}},"required":["success","token","refreshToken","expiresAt","user"],"type":"object"},"AuthOidcStatusInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcStatusInfo.json"],"format":"uri","readOnly":true,"type":"string"},"envConfigured":{"type":"boolean"},"envForced":{"type":"boolean"},"mergeAccounts":{"type":"boolean"},"providerLogoUrl":{"type":"string"},"providerName":{"type":"string"}},"required":["envForced","envConfigured","mergeAccounts"],"type":"object"},"AuthPasswordChange":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthPasswordChange.json"],"format":"uri","readOnly":true,"type":"string"},"currentPassword":{"description":"Current password of the user (required for non-OIDC users)","type":"string"},"newPassword":{"description":"New password for the user","minLength":8,"type":"string"}},"required":["newPassword"],"type":"object"},"AuthRefresh":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/AuthRefresh.json"],"format":"uri","readOnly":true,"type":"string"},"refreshToken":{"description":"Refresh token used to obtain a new access token","minLength":1,"type":"string"}},"required":["refreshToken"],"type":"object"},"AuthTokenRefreshResponse":{"additionalProperties":false,"properties":{"expiresAt":{"description":"Expiration time of the new access token","format":"date-time","type":"string"},"refreshToken":{"description":"New refresh token","type":"string"},"token":{"description":"New JWT access token","type":"string"}},"required":["token","refreshToken","expiresAt"],"type":"object"},"AutoUpdateRecord":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"details":{"additionalProperties":{},"type":"object"},"endTime":{"format":"date-time","type":"string"},"error":{"type":"string"},"id":{"type":"string"},"newImageVersions":{"additionalProperties":{},"type":"object"},"oldImageVersions":{"additionalProperties":{},"type":"object"},"resourceId":{"type":"string"},"resourceName":{"type":"string"},"resourceType":{"type":"string"},"startTime":{"format":"date-time","type":"string"},"status":{"type":"string"},"updateApplied":{"type":"boolean"},"updateAvailable":{"type":"boolean"},"updatedAt":{"format":"date-time","type":"string"}},"required":["resourceId","resourceType","resourceName","status","startTime","updateAvailable","updateApplied","id","createdAt"],"type":"object"},"BackupHasPathResponse":{"additionalProperties":false,"properties":{"exists":{"type":"boolean"}},"required":["exists"],"type":"object"},"BaseApiResponseActionResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActionResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerActionResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseActivity":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActivity.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ActivityActivity","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseAgentPairResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseAgentPairResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EnvironmentAgentPairResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ApikeyApiKey","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseApiKeyCreatedDto":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseApiKeyCreatedDto.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ApikeyApiKeyCreatedDto","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseAttestationList":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseAttestationList.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageAttestationList","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBackupHasPathResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBackupHasPathResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BackupHasPathResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBatchResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBatchResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"additionalProperties":{"$ref":"#/components/schemas/ImageupdateResponse"},"description":"Response data","type":"object"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBranchesResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBranchesResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsBranchesResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBrowseResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBrowseResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsBrowseResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBuildFileContentResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBuildFileContentResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BuildFileContentResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseBuildRecord":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBuildRecord.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageBuildRecord","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseClearHistoryResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseClearHistoryResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ActivityClearHistoryResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseCommitResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCommitResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerCommitResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseConfig":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseConfig.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/JobscheduleConfig","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseConfigSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseConfigSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmConfigSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseContainerRegistry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseContainerRegistry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerregistryContainerRegistry","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseCreateReponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCreateReponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ProjectCreateReponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseCreated":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCreated.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/WebhookCreated","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDefaultTemplatesResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDefaultTemplatesResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateDefaultTemplatesResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDeploymentSnippet":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDeploymentSnippet.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/DeploymentSnippet","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDetail":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetail.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ActivityDetail","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDetailSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetailSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageDetailSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDetails":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetails.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ProjectDetails","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseDispatchResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDispatchResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NotificationDispatchResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseEnvironment":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironment.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EnvironmentEnvironment","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseEnvironmentUpdateJob":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentUpdateJob.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EnvironmentUpdateJob","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseEnvironmentVulnerabilitySummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentVulnerabilitySummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityEnvironmentVulnerabilitySummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseEnvironmentWithApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentWithApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EnvironmentWithApiKey","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseFederatedCredential":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseFederatedCredential.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/FederatedFederatedCredential","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseFileContentResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseFileContentResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/FileContentResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseGitOpsSync":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseGitOpsSync.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsGitOpsSync","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseGitRepository":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseGitRepository.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsGitRepository","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseIgnoredVulnerability":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseIgnoredVulnerability.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityIgnoredVulnerability","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseImportGitOpsSyncResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseImportGitOpsSyncResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsImportGitOpsSyncResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseIncludeFile":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseIncludeFile.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ProjectIncludeFile","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseInfo.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VersionInfo","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseInterface {}":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseInterface {}.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListApiKey":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListApiKey.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/ApikeyApiKey"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListAutoUpdateRecord":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListAutoUpdateRecord.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/AutoUpdateRecord"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListConfigSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListConfigSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/SwarmConfigSummary"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListFileEntry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListFileEntry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/VolumeFileEntry"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListHistoryItem":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListHistoryItem.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/ImageHistoryItem"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListRoleAssignment":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListRoleAssignment.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/RoleRoleAssignment"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListSearchResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSearchResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/ImageSearchResult"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListSecretSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSecretSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/SwarmSecretSummary"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListSettingDto":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSettingDto.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/SettingsSettingDto"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListString":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListString.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"type":"string"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/WebhookSummary"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListTemplate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListTemplate.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/TemplateTemplate"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListTemplateRegistry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListTemplateRegistry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/TemplateTemplateRegistry"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListVariable":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListVariable.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/EnvVariable"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseListVolumeSizeInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListVolumeSizeInfo.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Response data","items":{"$ref":"#/components/schemas/VolumeSizeInfo"},"type":["array","null"]},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseLoadResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseLoadResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageLoadResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseLoginResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseLoginResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/AuthLoginResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseMapStringUpdateInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseMapStringUpdateInfo.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"additionalProperties":{"$ref":"#/components/schemas/ImageUpdateInfo"},"description":"Response data","type":"object"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseMessageResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseMessageResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseNodeSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseNodeSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmNodeSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponsePermissionsManifest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePermissionsManifest.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/RolePermissionsManifest","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponsePruneAllResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePruneAllResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SystemPruneAllResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponsePruneReport":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePruneReport.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImagePruneReport","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponsePullUsageResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePullUsageResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerregistryPullUsageResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseRemoteRegistry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRemoteRegistry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateRemoteRegistry","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageupdateResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/UpdaterResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseRole":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRole.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/RoleRole","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseRuntimeStatus":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRuntimeStatus.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmRuntimeStatus","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseScanResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityScanResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseScanSummariesResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanSummariesResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityScanSummariesResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseScanSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VulnerabilityScanSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseScannerStatus":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScannerStatus.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ScannerStatus","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSecretSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSecretSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSecretSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseServiceCreateResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceCreateResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmServiceCreateResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseServiceInspect":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceInspect.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmServiceInspect","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseServiceUpdateResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceUpdateResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmServiceUpdateResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSnapshot":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSnapshot.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/DashboardSnapshot","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStackDeployResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackDeployResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmStackDeployResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStackInspect":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackInspect.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmStackInspect","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStackRenderConfigResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackRenderConfigResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmStackRenderConfigResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStackSource":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackSource.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmStackSource","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStatus":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStatus.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/UpdaterStatus","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStatusCounts":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStatusCounts.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ProjectStatusCounts","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseStruct {}":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStruct {}.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ApiResponseStruct {}DataStruct","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageupdateSummary","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmInfo.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSwarmInfo","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmInitResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmInitResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSwarmInitResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmJoinTokensResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmJoinTokensResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSwarmJoinTokensResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmNodeAgentDeployment":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmNodeAgentDeployment.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmNodeAgentDeployment","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmNodeIdentity":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmNodeIdentity.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmNodeIdentity","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSwarmUnlockKeyResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmUnlockKeyResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/SwarmSwarmUnlockKeyResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSyncResult":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSyncResult.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsSyncResult","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseSyncStatus":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSyncStatus.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/GitopsSyncStatus","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTemplate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplate.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateTemplate","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTemplateContent":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplateContent.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateTemplateContent","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTemplateRegistry":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplateRegistry.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/TemplateTemplateRegistry","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTest.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/EnvironmentTest","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTestResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTestResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NotificationTestResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseTokenRefreshResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTokenRefreshResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/AuthTokenRefreshResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseUser":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseUser.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/UserUser","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolume":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolume.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumeVolume","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolumeBackup":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeBackup.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumeBackup","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolumePruneReportData":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumePruneReportData.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumePruneReportData","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolumeUsageCountsData":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeUsageCountsData.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumeUsageCountsData","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseApiResponseVolumeUsageResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeUsageResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/VolumeUsageResponse","description":"Response data"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data"],"type":"object"},"BaseMessageResponse":{"additionalProperties":false,"properties":{"activityId":{"description":"Background activity ID tracking this action","type":"string"},"message":{"description":"Response message","type":"string"}},"required":["message"],"type":"object"},"BasePaginatedActivity":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedActivity.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Array of items for the current page","items":{"$ref":"#/components/schemas/ActivityActivity"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse","description":"Pagination metadata"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"BasePaginatedFederatedCredential":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedFederatedCredential.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Array of items for the current page","items":{"$ref":"#/components/schemas/FederatedFederatedCredential"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse","description":"Pagination metadata"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"BasePaginatedIgnoredVulnerability":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedIgnoredVulnerability.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Array of items for the current page","items":{"$ref":"#/components/schemas/VulnerabilityIgnoredVulnerability"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse","description":"Pagination metadata"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"BasePaginatedVulnerability":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedVulnerability.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Array of items for the current page","items":{"$ref":"#/components/schemas/VulnerabilityVulnerability"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse","description":"Pagination metadata"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"BasePaginatedVulnerabilityWithImage":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedVulnerabilityWithImage.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"description":"Array of items for the current page","items":{"$ref":"#/components/schemas/VulnerabilityVulnerabilityWithImage"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse","description":"Pagination metadata"},"success":{"description":"Whether the request was successful","type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"BasePaginationResponse":{"additionalProperties":false,"properties":{"currentPage":{"description":"Current page number (1-indexed)","format":"int64","type":"integer"},"grandTotalItems":{"description":"Total number of items without filters","format":"int64","type":"integer"},"itemsPerPage":{"description":"Number of items per page","format":"int64","type":"integer"},"totalItems":{"description":"Total number of items in the current filtered set","format":"int64","type":"integer"},"totalPages":{"description":"Total number of pages","format":"int64","type":"integer"}},"required":["totalPages","totalItems","currentPage","itemsPerPage"],"type":"object"},"BlkioConfig":{"additionalProperties":false,"properties":{"device_read_bps":{"items":{"$ref":"#/components/schemas/DockerTypesThrottleDevice"},"type":["array","null"]},"device_read_iops":{"items":{"$ref":"#/components/schemas/DockerTypesThrottleDevice"},"type":["array","null"]},"device_write_bps":{"items":{"$ref":"#/components/schemas/DockerTypesThrottleDevice"},"type":["array","null"]},"device_write_iops":{"items":{"$ref":"#/components/schemas/DockerTypesThrottleDevice"},"type":["array","null"]},"weight":{"format":"int32","minimum":0,"type":"integer"},"weight_device":{"items":{"$ref":"#/components/schemas/DockerTypesWeightDevice"},"type":["array","null"]}},"type":"object"},"BuildConfig":{"additionalProperties":false,"properties":{"additional_contexts":{"additionalProperties":{"type":"string"},"type":"object"},"args":{"additionalProperties":{"type":["string","null"]},"type":"object"},"cache_from":{"items":{"type":"string"},"type":["array","null"]},"cache_to":{"items":{"type":"string"},"type":["array","null"]},"context":{"type":"string"},"dockerfile":{"type":"string"},"dockerfile_inline":{"type":"string"},"entitlements":{"items":{"type":"string"},"type":["array","null"]},"extra_hosts":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"},"isolation":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"network":{"type":"string"},"no_cache":{"type":"boolean"},"no_cache_filter":{"items":{"type":"string"},"type":["array","null"]},"platforms":{"items":{"type":"string"},"type":["array","null"]},"privileged":{"type":"boolean"},"provenance":{"type":"string"},"pull":{"type":"boolean"},"sbom":{"type":"string"},"secrets":{"items":{"$ref":"#/components/schemas/DockerTypesServiceSecretConfig"},"type":["array","null"]},"shm_size":{"format":"int64","type":"integer"},"ssh":{"items":{"$ref":"#/components/schemas/DockerTypesSSHKey"},"type":["array","null"]},"tags":{"items":{"type":"string"},"type":["array","null"]},"target":{"type":"string"},"ulimits":{"additionalProperties":{"$ref":"#/components/schemas/UlimitsConfig"},"type":"object"}},"type":"object"},"BuildFileContentResponse":{"additionalProperties":false,"properties":{"content":{"contentEncoding":"base64","type":"string"},"mimeType":{"type":"string"}},"required":["content","mimeType"],"type":"object"},"BuildProjectInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/BuildProjectInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"load":{"description":"Load images into Docker","type":"boolean"},"provider":{"description":"Build provider override","type":"string"},"push":{"description":"Push images","type":"boolean"},"services":{"description":"Service names to build","items":{"type":"string"},"type":["array","null"]}},"type":"object"},"CategoryCategory":{"additionalProperties":false,"properties":{"description":{"type":"string"},"icon":{"type":"string"},"id":{"type":"string"},"keywords":{"items":{"type":"string"},"type":["array","null"]},"matchingSettings":{"items":{"$ref":"#/components/schemas/MetaMetadata"},"type":["array","null"]},"relevanceScore":{"format":"int64","type":"integer"},"settings":{"items":{"$ref":"#/components/schemas/MetaMetadata"},"type":["array","null"]},"title":{"type":"string"},"url":{"type":"string"}},"required":["id","title","description","icon","url","keywords","settings"],"type":"object"},"ContainerActionResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerActionResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BaseMessageResponse"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ContainerActionResult":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"errors":{"items":{"type":"string"},"type":["array","null"]},"failed":{"items":{"type":"string"},"type":["array","null"]},"started":{"items":{"type":"string"},"type":["array","null"]},"stopped":{"items":{"type":"string"},"type":["array","null"]},"success":{"type":"boolean"}},"required":["success"],"type":"object"},"ContainerCommitRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCommitRequest.json"],"format":"uri","readOnly":true,"type":"string"},"author":{"description":"Commit author","type":"string"},"changes":{"description":"Dockerfile changes to apply","items":{"type":"string"},"type":["array","null"]},"comment":{"description":"Commit comment","type":"string"},"noPause":{"description":"Do not pause the container during commit","type":"boolean"},"repository":{"description":"Target image repository","type":"string"},"tag":{"description":"Target image tag","type":"string"}},"type":"object"},"ContainerCommitResult":{"additionalProperties":false,"properties":{"id":{"type":"string"}},"required":["id"],"type":"object"},"ContainerComposeInfo":{"additionalProperties":false,"properties":{"configFiles":{"type":"string"},"projectName":{"type":"string"},"serviceName":{"type":"string"},"workingDir":{"type":"string"}},"required":["projectName","serviceName"],"type":"object"},"ContainerConfig":{"additionalProperties":false,"properties":{"cmd":{"items":{"type":"string"},"type":["array","null"]},"entrypoint":{"items":{"type":"string"},"type":["array","null"]},"env":{"items":{"type":"string"},"type":["array","null"]},"healthcheck":{"$ref":"#/components/schemas/ContainerHealthcheck"},"user":{"type":"string"},"workingDir":{"type":"string"}},"type":"object"},"ContainerCreate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCreate.json"],"format":"uri","readOnly":true,"type":"string"},"attachStderr":{"type":"boolean"},"attachStdin":{"type":"boolean"},"attachStdout":{"type":"boolean"},"autoRemove":{"type":"boolean"},"cmd":{"items":{"type":"string"},"type":["array","null"]},"command":{"items":{"type":"string"},"type":["array","null"]},"cpus":{"format":"double","type":"number"},"credentials":{"items":{"$ref":"#/components/schemas/ContainerregistryCredential"},"type":["array","null"]},"domainname":{"type":"string"},"entrypoint":{"items":{"type":"string"},"type":["array","null"]},"env":{"items":{"type":"string"},"type":["array","null"]},"environment":{"items":{"type":"string"},"type":["array","null"]},"exposedPorts":{"additionalProperties":{"$ref":"#/components/schemas/Value"},"type":"object"},"hostConfig":{"$ref":"#/components/schemas/ContainerHostConfigCreate"},"hostname":{"type":"string"},"image":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"memory":{"format":"int64","type":"integer"},"name":{"type":"string"},"networkDisabled":{"type":"boolean"},"networkingConfig":{"$ref":"#/components/schemas/ContainerNetworkingConfigCreate"},"networks":{"items":{"type":"string"},"type":["array","null"]},"openStdin":{"type":"boolean"},"ports":{"additionalProperties":{"type":"string"},"type":"object"},"privileged":{"type":"boolean"},"restartPolicy":{"type":"string"},"stdinOnce":{"type":"boolean"},"tty":{"type":"boolean"},"user":{"type":"string"},"volumes":{"items":{"type":"string"},"type":["array","null"]},"workingDir":{"type":"string"}},"required":["name","image"],"type":"object"},"ContainerCreated":{"additionalProperties":false,"properties":{"created":{"type":"string"},"id":{"type":"string"},"image":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id","name","image","status","created"],"type":"object"},"ContainerCreatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCreatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerCreated"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ContainerDetails":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"composeInfo":{"$ref":"#/components/schemas/ContainerComposeInfo"},"config":{"$ref":"#/components/schemas/ContainerConfig"},"created":{"type":"string"},"hostConfig":{"$ref":"#/components/schemas/ContainerHostConfig"},"iconDarkUrl":{"type":"string"},"iconLightUrl":{"type":"string"},"id":{"type":"string"},"image":{"type":"string"},"imageId":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mounts":{"items":{"$ref":"#/components/schemas/ContainerMount"},"type":["array","null"]},"name":{"type":"string"},"networkSettings":{"$ref":"#/components/schemas/ContainerNetworkSettings"},"ports":{"items":{"$ref":"#/components/schemas/ContainerPort"},"type":["array","null"]},"redeployDisabled":{"type":"boolean"},"state":{"$ref":"#/components/schemas/ContainerState"}},"required":["id","name","image","imageId","created","state","config","hostConfig","networkSettings","ports","mounts"],"type":"object"},"ContainerDetailsResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerDetailsResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerDetails"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ContainerEndpointSettingsCreate":{"additionalProperties":false,"properties":{"aliases":{"items":{"type":"string"},"type":["array","null"]}},"type":"object"},"ContainerHealth":{"additionalProperties":false,"properties":{"failingStreak":{"format":"int64","type":"integer"},"log":{"items":{"$ref":"#/components/schemas/ContainerHealthLogEntry"},"type":["array","null"]},"status":{"type":"string"}},"required":["status","failingStreak"],"type":"object"},"ContainerHealthLogEntry":{"additionalProperties":false,"properties":{"end":{"type":"string"},"exitCode":{"format":"int64","type":"integer"},"output":{"type":"string"},"start":{"type":"string"}},"required":["exitCode"],"type":"object"},"ContainerHealthcheck":{"additionalProperties":false,"properties":{"interval":{"format":"int64","type":"integer"},"retries":{"format":"int64","type":"integer"},"startInterval":{"format":"int64","type":"integer"},"startPeriod":{"format":"int64","type":"integer"},"test":{"items":{"type":"string"},"type":["array","null"]},"timeout":{"format":"int64","type":"integer"}},"type":"object"},"ContainerHostConfig":{"additionalProperties":false,"properties":{"autoRemove":{"type":"boolean"},"memory":{"format":"int64","type":"integer"},"nanoCpus":{"format":"int64","type":"integer"},"networkMode":{"type":"string"},"privileged":{"type":"boolean"},"restartPolicy":{"type":"string"}},"type":"object"},"ContainerHostConfigCreate":{"additionalProperties":false,"properties":{"autoRemove":{"type":"boolean"},"binds":{"items":{"type":"string"},"type":["array","null"]},"cpuShares":{"format":"int64","type":"integer"},"memory":{"format":"int64","type":"integer"},"memorySwap":{"format":"int64","type":"integer"},"nanoCpus":{"format":"int64","type":"integer"},"networkMode":{"type":"string"},"portBindings":{"additionalProperties":{"items":{"$ref":"#/components/schemas/ContainerPortBindingCreate"},"type":["array","null"]},"type":"object"},"privileged":{"type":"boolean"},"publishAllPorts":{"type":"boolean"},"readonlyRootfs":{"type":"boolean"},"restartPolicy":{"$ref":"#/components/schemas/ContainerRestartPolicyCreate"}},"type":"object"},"ContainerMount":{"additionalProperties":false,"properties":{"destination":{"type":"string"},"driver":{"type":"string"},"mode":{"type":"string"},"name":{"type":"string"},"propagation":{"type":"string"},"rw":{"type":"boolean"},"source":{"type":"string"},"type":{"type":"string"}},"required":["type","destination"],"type":"object"},"ContainerNetworkEndpoint":{"additionalProperties":false,"properties":{"aliases":{"items":{"type":"string"},"type":["array","null"]},"dnsNames":{"items":{"type":"string"},"type":["array","null"]},"driverOpts":{"additionalProperties":{"type":"string"},"type":"object"},"endpointId":{"type":"string"},"gateway":{"type":"string"},"globalIPv6Address":{"type":"string"},"globalIPv6PrefixLen":{"format":"int64","type":"integer"},"gwPriority":{"format":"int64","type":"integer"},"ipAddress":{"type":"string"},"ipPrefixLen":{"format":"int64","type":"integer"},"ipamConfig":{},"ipv6Gateway":{"type":"string"},"links":{"items":{"type":"string"},"type":["array","null"]},"macAddress":{"type":"string"},"networkId":{"type":"string"}},"type":"object"},"ContainerNetworkSettings":{"additionalProperties":false,"properties":{"networks":{"additionalProperties":{"$ref":"#/components/schemas/ContainerNetworkEndpoint"},"type":"object"}},"required":["networks"],"type":"object"},"ContainerNetworkingConfigCreate":{"additionalProperties":false,"properties":{"endpointsConfig":{"additionalProperties":{"$ref":"#/components/schemas/ContainerEndpointSettingsCreate"},"type":"object"}},"type":"object"},"ContainerPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"counts":{"$ref":"#/components/schemas/ContainerStatusCounts"},"data":{"items":{"$ref":"#/components/schemas/ContainerSummary"},"type":["array","null"]},"groups":{"items":{"$ref":"#/components/schemas/ContainerSummaryGroup"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","counts","pagination"],"type":"object"},"ContainerPort":{"additionalProperties":false,"properties":{"ip":{"type":"string"},"privatePort":{"format":"int64","type":"integer"},"publicPort":{"format":"int64","type":"integer"},"type":{"type":"string"}},"required":["privatePort","type"],"type":"object"},"ContainerPortBindingCreate":{"additionalProperties":false,"properties":{"hostIp":{"type":"string"},"hostPort":{"type":"string"}},"type":"object"},"ContainerRegistryPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerRegistryPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ContainerregistryContainerRegistry"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ContainerRestartPolicyCreate":{"additionalProperties":false,"properties":{"maximumRetryCount":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"ContainerState":{"additionalProperties":false,"properties":{"exitCode":{"format":"int64","type":"integer"},"finishedAt":{"type":"string"},"health":{"$ref":"#/components/schemas/ContainerHealth"},"running":{"type":"boolean"},"startedAt":{"type":"string"},"status":{"type":"string"}},"required":["status","running"],"type":"object"},"ContainerStatusCounts":{"additionalProperties":false,"properties":{"runningContainers":{"format":"int64","type":"integer"},"stoppedContainers":{"format":"int64","type":"integer"},"totalContainers":{"format":"int64","type":"integer"}},"required":["runningContainers","stoppedContainers","totalContainers"],"type":"object"},"ContainerStatusCountsResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerStatusCountsResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ContainerStatusCounts"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ContainerSummary":{"additionalProperties":false,"properties":{"command":{"type":"string"},"created":{"format":"int64","type":"integer"},"hostConfig":{"$ref":"#/components/schemas/ContainerHostConfig"},"iconDarkUrl":{"type":"string"},"iconLightUrl":{"type":"string"},"id":{"type":"string"},"image":{"type":"string"},"imageId":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mounts":{"items":{"$ref":"#/components/schemas/ContainerMount"},"type":["array","null"]},"names":{"items":{"type":"string"},"type":["array","null"]},"networkSettings":{"$ref":"#/components/schemas/ContainerNetworkSettings"},"ports":{"items":{"$ref":"#/components/schemas/ContainerPort"},"type":["array","null"]},"redeployDisabled":{"type":"boolean"},"state":{"type":"string"},"status":{"type":"string"},"updateInfo":{"$ref":"#/components/schemas/ImageUpdateInfo"}},"required":["id","names","image","imageId","command","created","ports","labels","state","status","hostConfig","networkSettings","mounts"],"type":"object"},"ContainerSummaryGroup":{"additionalProperties":false,"properties":{"groupName":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/ContainerSummary"},"type":["array","null"]}},"required":["groupName","items"],"type":"object"},"ContainerregistryContainerRegistry":{"additionalProperties":false,"properties":{"awsAccessKeyId":{"type":"string"},"awsRegion":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"insecure":{"type":"boolean"},"registryType":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["id","url","username","insecure","enabled","registryType","createdAt","updatedAt"],"type":"object"},"ContainerregistryCredential":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"token":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["url","username","token","enabled"],"type":"object"},"ContainerregistryPullUsage":{"additionalProperties":false,"properties":{"authMethod":{"type":"string"},"authUsername":{"type":"string"},"checkedAt":{"format":"date-time","type":"string"},"displayName":{"type":"string"},"error":{"type":"string"},"limit":{"format":"int64","type":"integer"},"observedPulls":{"format":"int64","type":"integer"},"provider":{"type":"string"},"registry":{"type":"string"},"registryId":{"type":"string"},"remaining":{"format":"int64","type":"integer"},"repository":{"type":"string"},"source":{"type":"string"},"used":{"format":"int64","type":"integer"},"windowSeconds":{"format":"int64","type":"integer"}},"required":["registryId","provider","registry","displayName","observedPulls","authMethod","checkedAt"],"type":"object"},"ContainerregistryPullUsageResponse":{"additionalProperties":false,"properties":{"registries":{"items":{"$ref":"#/components/schemas/ContainerregistryPullUsage"},"type":["array","null"]}},"required":["registries"],"type":"object"},"ContainerregistrySync":{"additionalProperties":false,"properties":{"awsAccessKeyId":{"type":"string"},"awsRegion":{"type":"string"},"awsSecretAccessKey":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"insecure":{"type":"boolean"},"registryType":{"type":"string"},"token":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["id","url","username","token","insecure","enabled","registryType","createdAt","updatedAt"],"type":"object"},"ContainerregistrySyncRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerregistrySyncRequest.json"],"format":"uri","readOnly":true,"type":"string"},"registries":{"items":{"$ref":"#/components/schemas/ContainerregistrySync"},"type":["array","null"]}},"required":["registries"],"type":"object"},"CreateContainerRegistryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/CreateContainerRegistryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"awsAccessKeyId":{"type":"string"},"awsRegion":{"type":"string"},"awsSecretAccessKey":{"type":"string"},"description":{"type":["string","null"]},"enabled":{"type":["boolean","null"]},"insecure":{"type":["boolean","null"]},"registryType":{"type":"string"},"token":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["url","username","token","description","insecure","enabled","registryType","awsAccessKeyId","awsSecretAccessKey","awsRegion"],"type":"object"},"CreateGitRepositoryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/CreateGitRepositoryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"authType":{"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"sshHostKeyVerification":{"type":"string"},"sshKey":{"type":"string"},"token":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["name","url","authType"],"type":"object"},"CreateOidcRoleMappingOutputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/CreateOidcRoleMappingOutputBody.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/RoleOidcRoleMapping"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"CredentialSpecConfig":{"additionalProperties":false,"properties":{"config":{"type":"string"},"file":{"type":"string"},"registry":{"type":"string"}},"type":"object"},"DashboardActionItem":{"additionalProperties":false,"properties":{"count":{"format":"int64","type":"integer"},"kind":{"type":"string"},"severity":{"type":"string"}},"required":["kind","count","severity"],"type":"object"},"DashboardActionItems":{"additionalProperties":false,"properties":{"items":{"items":{"$ref":"#/components/schemas/DashboardActionItem"},"type":["array","null"]}},"required":["items"],"type":"object"},"DashboardSnapshot":{"additionalProperties":false,"properties":{"actionItems":{"$ref":"#/components/schemas/DashboardActionItems"},"containers":{"$ref":"#/components/schemas/DashboardSnapshotContainers"},"imageUsageCounts":{"$ref":"#/components/schemas/ImageUsageCounts"},"images":{"$ref":"#/components/schemas/DashboardSnapshotImages"},"settings":{"$ref":"#/components/schemas/DashboardSnapshotSettings"},"versionInfo":{"$ref":"#/components/schemas/VersionInfo"}},"required":["containers","images","imageUsageCounts","actionItems","settings"],"type":"object"},"DashboardSnapshotContainers":{"additionalProperties":false,"properties":{"counts":{"$ref":"#/components/schemas/ContainerStatusCounts"},"data":{"items":{"$ref":"#/components/schemas/ContainerSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"}},"required":["data","counts","pagination"],"type":"object"},"DashboardSnapshotImages":{"additionalProperties":false,"properties":{"data":{"items":{"$ref":"#/components/schemas/ImageSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"}},"required":["data","pagination"],"type":"object"},"DashboardSnapshotSettings":{"additionalProperties":false,"type":"object"},"DeleteOidcRoleMappingOutputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/DeleteOidcRoleMappingOutputBody.json"],"format":"uri","readOnly":true,"type":"string"},"message":{"type":"string"},"success":{"type":"boolean"}},"required":["success","message"],"type":"object"},"DeployConfig":{"additionalProperties":false,"properties":{"endpoint_mode":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mode":{"type":"string"},"placement":{"$ref":"#/components/schemas/DockerTypesPlacement"},"replicas":{"format":"int64","type":"integer"},"resources":{"$ref":"#/components/schemas/DockerTypesResources"},"restart_policy":{"$ref":"#/components/schemas/RestartPolicy"},"rollback_config":{"$ref":"#/components/schemas/UpdateConfig"},"update_config":{"$ref":"#/components/schemas/UpdateConfig"}},"type":"object"},"DeploymentSnippet":{"additionalProperties":false,"properties":{"dockerCompose":{"description":"Docker compose YAML snippet","type":"string"},"dockerRun":{"description":"Docker run command snippet","type":"string"},"mtls":{"$ref":"#/components/schemas/DeploymentSnippetMTLS","description":"Optional Arcane-generated mTLS deployment assets for edge agents"}},"required":["dockerRun","dockerCompose"],"type":"object"},"DeploymentSnippetFile":{"additionalProperties":false,"properties":{"containerPath":{"description":"Container mount path expected by the mTLS snippet","type":"string"},"content":{"description":"PEM file contents. Omitted for sensitive files such as private keys; use downloadUrl instead.","type":"string"},"downloadUrl":{"description":"Pairing-permission endpoint to download this file when content is withheld","type":"string"},"name":{"description":"Suggested filename","type":"string"},"permissions":{"description":"Suggested file mode","type":"string"},"sensitive":{"description":"True when this file is sensitive and must be fetched via downloadUrl","type":"boolean"}},"required":["name","containerPath","permissions"],"type":"object"},"DeploymentSnippetMTLS":{"additionalProperties":false,"properties":{"dockerCompose":{"description":"Docker compose snippet using Arcane-generated mTLS assets","type":"string"},"dockerRun":{"description":"Docker run snippet using Arcane-generated mTLS assets","type":"string"},"files":{"description":"Generated PEM files to place on the edge host","items":{"$ref":"#/components/schemas/DeploymentSnippetFile"},"type":["array","null"]},"hostDirHint":{"description":"Suggested host directory containing the generated PEM files","type":"string"}},"required":["dockerRun","dockerCompose","files","hostDirHint"],"type":"object"},"DetailSummaryConfigStruct":{"additionalProperties":false,"properties":{"argsEscaped":{"type":"boolean"},"cmd":{"items":{"type":"string"},"type":["array","null"]},"env":{"items":{"type":"string"},"type":["array","null"]},"exposedPorts":{"additionalProperties":{"$ref":"#/components/schemas/Value"},"type":"object"},"volumes":{"additionalProperties":{"$ref":"#/components/schemas/Value"},"type":"object"},"workingDir":{"type":"string"}},"type":"object"},"DetailSummaryDescriptorStruct":{"additionalProperties":false,"properties":{"digest":{"type":"string"},"mediaType":{"type":"string"},"size":{"format":"int64","type":"integer"}},"required":["mediaType","digest","size"],"type":"object"},"DetailSummaryGraphDriverStruct":{"additionalProperties":false,"properties":{"data":{},"name":{"type":"string"}},"required":["data","name"],"type":"object"},"DetailSummaryMetadataStruct":{"additionalProperties":false,"properties":{"lastTagTime":{"type":"string"}},"required":["lastTagTime"],"type":"object"},"DetailSummaryRootFsStruct":{"additionalProperties":false,"properties":{"layers":{"items":{"type":"string"},"type":["array","null"]},"type":{"type":"string"}},"required":["type","layers"],"type":"object"},"DevelopConfig":{"additionalProperties":false,"properties":{"watch":{"items":{"$ref":"#/components/schemas/DockerTypesTrigger"},"type":["array","null"]}},"type":"object"},"DiscreteGenericResource":{"additionalProperties":false,"properties":{"kind":{"type":"string"},"value":{"format":"int64","type":"integer"}},"required":["kind","value"],"type":"object"},"DockerMountBindOptions":{"additionalProperties":false,"properties":{"CreateMountpoint":{"type":"boolean"},"NonRecursive":{"type":"boolean"},"Propagation":{"type":"string"},"ReadOnlyForceRecursive":{"type":"boolean"},"ReadOnlyNonRecursive":{"type":"boolean"}},"type":"object"},"DockerMountClusterOptions":{"additionalProperties":false,"type":"object"},"DockerMountDriver":{"additionalProperties":false,"properties":{"Name":{"type":"string"},"Options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"DockerMountImageOptions":{"additionalProperties":false,"properties":{"Subpath":{"type":"string"}},"type":"object"},"DockerMountMount":{"additionalProperties":false,"properties":{"BindOptions":{"$ref":"#/components/schemas/DockerMountBindOptions"},"ClusterOptions":{"$ref":"#/components/schemas/DockerMountClusterOptions"},"Consistency":{"type":"string"},"ImageOptions":{"$ref":"#/components/schemas/DockerMountImageOptions"},"ReadOnly":{"type":"boolean"},"Source":{"type":"string"},"Target":{"type":"string"},"TmpfsOptions":{"$ref":"#/components/schemas/DockerMountTmpfsOptions"},"Type":{"type":"string"},"VolumeOptions":{"$ref":"#/components/schemas/DockerMountVolumeOptions"}},"type":"object"},"DockerMountTmpfsOptions":{"additionalProperties":false,"properties":{"Mode":{"format":"int32","minimum":0,"type":"integer"},"Options":{"items":{"items":{"type":"string"},"type":["array","null"]},"type":["array","null"]},"SizeBytes":{"format":"int64","type":"integer"}},"type":"object"},"DockerMountVolumeOptions":{"additionalProperties":false,"properties":{"DriverConfig":{"$ref":"#/components/schemas/DockerMountDriver"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"NoCopy":{"type":"boolean"},"Subpath":{"type":"string"}},"type":"object"},"DockerNetworkConfigReference":{"additionalProperties":false,"properties":{"Network":{"type":"string"}},"required":["Network"],"type":"object"},"DockerNetworkEndpointResource":{"additionalProperties":false,"properties":{"EndpointID":{"type":"string"},"IPv4Address":{"type":"string"},"IPv6Address":{"type":"string"},"MacAddress":{"type":"string"},"Name":{"type":"string"}},"required":["Name","EndpointID","MacAddress","IPv4Address","IPv6Address"],"type":"object"},"DockerNetworkPeerInfo":{"additionalProperties":false,"properties":{"IP":{"format":"ip","type":"string"},"Name":{"type":"string"}},"required":["Name","IP"],"type":"object"},"DockerNetworkServiceInfo":{"additionalProperties":false,"properties":{"LocalLBIndex":{"format":"int64","type":"integer"},"Ports":{"items":{"type":"string"},"type":["array","null"]},"Tasks":{"items":{"$ref":"#/components/schemas/DockerNetworkTask"},"type":["array","null"]},"VIP":{"format":"ip","type":"string"}},"required":["VIP","Ports","LocalLBIndex","Tasks"],"type":"object"},"DockerNetworkTask":{"additionalProperties":false,"properties":{"EndpointID":{"type":"string"},"EndpointIP":{"format":"ip","type":"string"},"Info":{"additionalProperties":{"type":"string"},"type":"object"},"Name":{"type":"string"}},"required":["Name","EndpointID","EndpointIP","Info"],"type":"object"},"DockerRegistryIndexInfo":{"additionalProperties":false,"properties":{"Mirrors":{"items":{"type":"string"},"type":["array","null"]},"Name":{"type":"string"},"Official":{"type":"boolean"},"Secure":{"type":"boolean"}},"required":["Name","Mirrors","Secure","Official"],"type":"object"},"DockerRegistryServiceConfig":{"additionalProperties":false,"properties":{"IndexConfigs":{"additionalProperties":{"$ref":"#/components/schemas/DockerRegistryIndexInfo"},"type":"object"},"InsecureRegistryCIDRs":{"items":{"type":"string"},"type":["array","null"]},"Mirrors":{"items":{"type":"string"},"type":["array","null"]}},"required":["InsecureRegistryCIDRs","IndexConfigs","Mirrors"],"type":"object"},"DockerSwarmAppArmorOpts":{"additionalProperties":false,"properties":{"Mode":{"type":"string"}},"type":"object"},"DockerSwarmCAConfig":{"additionalProperties":false,"properties":{"ExternalCAs":{"items":{"$ref":"#/components/schemas/DockerSwarmExternalCA"},"type":["array","null"]},"ForceRotate":{"format":"int64","minimum":0,"type":"integer"},"NodeCertExpiry":{"format":"int64","type":"integer"},"SigningCACert":{"type":"string"},"SigningCAKey":{"type":"string"}},"type":"object"},"DockerSwarmClusterInfo":{"additionalProperties":false,"properties":{"CreatedAt":{"format":"date-time","type":"string"},"DataPathPort":{"format":"int32","minimum":0,"type":"integer"},"DefaultAddrPool":{"items":{"type":"string"},"type":["array","null"]},"ID":{"type":"string"},"RootRotationInProgress":{"type":"boolean"},"Spec":{"$ref":"#/components/schemas/DockerSwarmSpec"},"SubnetSize":{"format":"int32","minimum":0,"type":"integer"},"TLSInfo":{"$ref":"#/components/schemas/DockerSwarmTLSInfo"},"UpdatedAt":{"format":"date-time","type":"string"},"Version":{"$ref":"#/components/schemas/DockerSwarmVersion"}},"required":["ID","Spec","TLSInfo","RootRotationInProgress","DefaultAddrPool","SubnetSize","DataPathPort"],"type":"object"},"DockerSwarmConfigReference":{"additionalProperties":false,"properties":{"ConfigID":{"type":"string"},"ConfigName":{"type":"string"},"File":{"$ref":"#/components/schemas/DockerSwarmConfigReferenceFileTarget"},"Runtime":{"$ref":"#/components/schemas/DockerSwarmConfigReferenceRuntimeTarget"}},"required":["ConfigID","ConfigName"],"type":"object"},"DockerSwarmConfigReferenceFileTarget":{"additionalProperties":false,"properties":{"GID":{"type":"string"},"Mode":{"format":"int32","minimum":0,"type":"integer"},"Name":{"type":"string"},"UID":{"type":"string"}},"required":["Name","UID","GID","Mode"],"type":"object"},"DockerSwarmConfigReferenceRuntimeTarget":{"additionalProperties":false,"type":"object"},"DockerSwarmConfigSpec":{"additionalProperties":false,"properties":{"Data":{"contentEncoding":"base64","type":"string"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Name":{"type":"string"},"Templating":{"$ref":"#/components/schemas/DockerSwarmDriver"}},"required":["Labels"],"type":"object"},"DockerSwarmContainerSpec":{"additionalProperties":false,"properties":{"Args":{"items":{"type":"string"},"type":["array","null"]},"CapabilityAdd":{"items":{"type":"string"},"type":["array","null"]},"CapabilityDrop":{"items":{"type":"string"},"type":["array","null"]},"Command":{"items":{"type":"string"},"type":["array","null"]},"Configs":{"items":{"$ref":"#/components/schemas/DockerSwarmConfigReference"},"type":["array","null"]},"DNSConfig":{"$ref":"#/components/schemas/DockerSwarmDNSConfig"},"Dir":{"type":"string"},"Env":{"items":{"type":"string"},"type":["array","null"]},"Groups":{"items":{"type":"string"},"type":["array","null"]},"Healthcheck":{"$ref":"#/components/schemas/HealthcheckConfig"},"Hostname":{"type":"string"},"Hosts":{"items":{"type":"string"},"type":["array","null"]},"Image":{"type":"string"},"Init":{"type":"boolean"},"Isolation":{"type":"string"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Mounts":{"items":{"$ref":"#/components/schemas/DockerMountMount"},"type":["array","null"]},"OomScoreAdj":{"format":"int64","type":"integer"},"OpenStdin":{"type":"boolean"},"Privileges":{"$ref":"#/components/schemas/DockerSwarmPrivileges"},"ReadOnly":{"type":"boolean"},"Secrets":{"items":{"$ref":"#/components/schemas/DockerSwarmSecretReference"},"type":["array","null"]},"StopGracePeriod":{"format":"int64","type":"integer"},"StopSignal":{"type":"string"},"Sysctls":{"additionalProperties":{"type":"string"},"type":"object"},"TTY":{"type":"boolean"},"Ulimits":{"items":{"$ref":"#/components/schemas/Ulimit"},"type":["array","null"]},"User":{"type":"string"}},"type":"object"},"DockerSwarmCredentialSpec":{"additionalProperties":false,"properties":{"Config":{"type":"string"},"File":{"type":"string"},"Registry":{"type":"string"}},"required":["Config","File","Registry"],"type":"object"},"DockerSwarmDNSConfig":{"additionalProperties":false,"properties":{"Nameservers":{"items":{"format":"ip","type":"string"},"type":["array","null"]},"Options":{"items":{"type":"string"},"type":["array","null"]},"Search":{"items":{"type":"string"},"type":["array","null"]}},"type":"object"},"DockerSwarmDiscreteGenericResource":{"additionalProperties":false,"properties":{"Kind":{"type":"string"},"Value":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmDispatcherConfig":{"additionalProperties":false,"properties":{"HeartbeatPeriod":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmDriver":{"additionalProperties":false,"properties":{"Name":{"type":"string"},"Options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"DockerSwarmEncryptionConfig":{"additionalProperties":false,"properties":{"AutoLockManagers":{"type":"boolean"}},"required":["AutoLockManagers"],"type":"object"},"DockerSwarmEndpoint":{"additionalProperties":false,"properties":{"Ports":{"items":{"$ref":"#/components/schemas/DockerSwarmPortConfig"},"type":["array","null"]},"Spec":{"$ref":"#/components/schemas/DockerSwarmEndpointSpec"},"VirtualIPs":{"items":{"$ref":"#/components/schemas/DockerSwarmEndpointVirtualIP"},"type":["array","null"]}},"type":"object"},"DockerSwarmEndpointSpec":{"additionalProperties":false,"properties":{"Mode":{"type":"string"},"Ports":{"items":{"$ref":"#/components/schemas/DockerSwarmPortConfig"},"type":["array","null"]}},"type":"object"},"DockerSwarmEndpointVirtualIP":{"additionalProperties":false,"properties":{"Addr":{"type":"string"},"NetworkID":{"type":"string"}},"type":"object"},"DockerSwarmExternalCA":{"additionalProperties":false,"properties":{"CACert":{"type":"string"},"Options":{"additionalProperties":{"type":"string"},"type":"object"},"Protocol":{"type":"string"},"URL":{"type":"string"}},"required":["Protocol","URL","CACert"],"type":"object"},"DockerSwarmGenericResource":{"additionalProperties":false,"properties":{"DiscreteResourceSpec":{"$ref":"#/components/schemas/DockerSwarmDiscreteGenericResource"},"NamedResourceSpec":{"$ref":"#/components/schemas/DockerSwarmNamedGenericResource"}},"type":"object"},"DockerSwarmGlobalJob":{"additionalProperties":false,"type":"object"},"DockerSwarmGlobalService":{"additionalProperties":false,"type":"object"},"DockerSwarmInfo":{"additionalProperties":false,"properties":{"Cluster":{"$ref":"#/components/schemas/DockerSwarmClusterInfo"},"ControlAvailable":{"type":"boolean"},"Error":{"type":"string"},"LocalNodeState":{"type":"string"},"Managers":{"format":"int64","type":"integer"},"NodeAddr":{"type":"string"},"NodeID":{"type":"string"},"Nodes":{"format":"int64","type":"integer"},"RemoteManagers":{"items":{"$ref":"#/components/schemas/DockerSwarmPeer"},"type":["array","null"]},"Warnings":{"items":{"type":"string"},"type":["array","null"]}},"required":["NodeID","NodeAddr","LocalNodeState","ControlAvailable","Error","RemoteManagers"],"type":"object"},"DockerSwarmLimit":{"additionalProperties":false,"properties":{"MemoryBytes":{"format":"int64","type":"integer"},"NanoCPUs":{"format":"int64","type":"integer"},"Pids":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmNamedGenericResource":{"additionalProperties":false,"properties":{"Kind":{"type":"string"},"Value":{"type":"string"}},"type":"object"},"DockerSwarmNetworkAttachmentConfig":{"additionalProperties":false,"properties":{"Aliases":{"items":{"type":"string"},"type":["array","null"]},"DriverOpts":{"additionalProperties":{"type":"string"},"type":"object"},"Target":{"type":"string"}},"type":"object"},"DockerSwarmNetworkAttachmentSpec":{"additionalProperties":false,"properties":{"ContainerID":{"type":"string"}},"required":["ContainerID"],"type":"object"},"DockerSwarmOrchestrationConfig":{"additionalProperties":false,"properties":{"TaskHistoryRetentionLimit":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmPeer":{"additionalProperties":false,"properties":{"Addr":{"type":"string"},"NodeID":{"type":"string"}},"required":["NodeID","Addr"],"type":"object"},"DockerSwarmPlacement":{"additionalProperties":false,"properties":{"Constraints":{"items":{"type":"string"},"type":["array","null"]},"MaxReplicas":{"format":"int64","minimum":0,"type":"integer"},"Platforms":{"items":{"$ref":"#/components/schemas/DockerSwarmPlatform"},"type":["array","null"]},"Preferences":{"items":{"$ref":"#/components/schemas/DockerSwarmPlacementPreference"},"type":["array","null"]}},"type":"object"},"DockerSwarmPlacementPreference":{"additionalProperties":false,"properties":{"Spread":{"$ref":"#/components/schemas/DockerSwarmSpreadOver"}},"required":["Spread"],"type":"object"},"DockerSwarmPlatform":{"additionalProperties":false,"properties":{"Architecture":{"type":"string"},"OS":{"type":"string"}},"type":"object"},"DockerSwarmPortConfig":{"additionalProperties":false,"properties":{"Name":{"type":"string"},"Protocol":{"type":"string"},"PublishMode":{"type":"string"},"PublishedPort":{"format":"int32","minimum":0,"type":"integer"},"TargetPort":{"format":"int32","minimum":0,"type":"integer"}},"type":"object"},"DockerSwarmPrivileges":{"additionalProperties":false,"properties":{"AppArmor":{"$ref":"#/components/schemas/DockerSwarmAppArmorOpts"},"CredentialSpec":{"$ref":"#/components/schemas/DockerSwarmCredentialSpec"},"NoNewPrivileges":{"type":"boolean"},"SELinuxContext":{"$ref":"#/components/schemas/DockerSwarmSELinuxContext"},"Seccomp":{"$ref":"#/components/schemas/DockerSwarmSeccompOpts"}},"required":["CredentialSpec","SELinuxContext","NoNewPrivileges"],"type":"object"},"DockerSwarmRaftConfig":{"additionalProperties":false,"properties":{"ElectionTick":{"format":"int64","type":"integer"},"HeartbeatTick":{"format":"int64","type":"integer"},"KeepOldSnapshots":{"format":"int64","minimum":0,"type":"integer"},"LogEntriesForSlowFollowers":{"format":"int64","minimum":0,"type":"integer"},"SnapshotInterval":{"format":"int64","minimum":0,"type":"integer"}},"required":["ElectionTick","HeartbeatTick"],"type":"object"},"DockerSwarmReplicatedJob":{"additionalProperties":false,"properties":{"MaxConcurrent":{"format":"int64","minimum":0,"type":"integer"},"TotalCompletions":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"DockerSwarmReplicatedService":{"additionalProperties":false,"properties":{"Replicas":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"DockerSwarmResourceRequirements":{"additionalProperties":false,"properties":{"Limits":{"$ref":"#/components/schemas/DockerSwarmLimit"},"MemorySwappiness":{"format":"int64","type":["integer","null"]},"Reservations":{"$ref":"#/components/schemas/DockerSwarmResources"},"SwapBytes":{"format":"int64","type":["integer","null"]}},"type":"object"},"DockerSwarmResources":{"additionalProperties":false,"properties":{"GenericResources":{"items":{"$ref":"#/components/schemas/DockerSwarmGenericResource"},"type":["array","null"]},"MemoryBytes":{"format":"int64","type":"integer"},"NanoCPUs":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmRestartPolicy":{"additionalProperties":false,"properties":{"Condition":{"type":"string"},"Delay":{"format":"int64","type":"integer"},"MaxAttempts":{"format":"int64","minimum":0,"type":"integer"},"Window":{"format":"int64","type":"integer"}},"type":"object"},"DockerSwarmRuntimePrivilege":{"additionalProperties":false,"properties":{"description":{"type":"string"},"name":{"type":"string"},"value":{"items":{"type":"string"},"type":["array","null"]}},"type":"object"},"DockerSwarmRuntimeSpec":{"additionalProperties":false,"properties":{"disabled":{"type":"boolean"},"env":{"items":{"type":"string"},"type":["array","null"]},"name":{"type":"string"},"privileges":{"items":{"$ref":"#/components/schemas/DockerSwarmRuntimePrivilege"},"type":["array","null"]},"remote":{"type":"string"}},"type":"object"},"DockerSwarmSELinuxContext":{"additionalProperties":false,"properties":{"Disable":{"type":"boolean"},"Level":{"type":"string"},"Role":{"type":"string"},"Type":{"type":"string"},"User":{"type":"string"}},"required":["Disable","User","Role","Type","Level"],"type":"object"},"DockerSwarmSeccompOpts":{"additionalProperties":false,"properties":{"Mode":{"type":"string"},"Profile":{"contentEncoding":"base64","type":"string"}},"type":"object"},"DockerSwarmSecretReference":{"additionalProperties":false,"properties":{"File":{"$ref":"#/components/schemas/DockerSwarmSecretReferenceFileTarget"},"SecretID":{"type":"string"},"SecretName":{"type":"string"}},"required":["File","SecretID","SecretName"],"type":"object"},"DockerSwarmSecretReferenceFileTarget":{"additionalProperties":false,"properties":{"GID":{"type":"string"},"Mode":{"format":"int32","minimum":0,"type":"integer"},"Name":{"type":"string"},"UID":{"type":"string"}},"required":["Name","UID","GID","Mode"],"type":"object"},"DockerSwarmSecretSpec":{"additionalProperties":false,"properties":{"Data":{"contentEncoding":"base64","type":"string"},"Driver":{"$ref":"#/components/schemas/DockerSwarmDriver"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Name":{"type":"string"},"Templating":{"$ref":"#/components/schemas/DockerSwarmDriver"}},"required":["Labels"],"type":"object"},"DockerSwarmServiceMode":{"additionalProperties":false,"properties":{"Global":{"$ref":"#/components/schemas/DockerSwarmGlobalService"},"GlobalJob":{"$ref":"#/components/schemas/DockerSwarmGlobalJob"},"Replicated":{"$ref":"#/components/schemas/DockerSwarmReplicatedService"},"ReplicatedJob":{"$ref":"#/components/schemas/DockerSwarmReplicatedJob"}},"type":"object"},"DockerSwarmServiceSpec":{"additionalProperties":false,"properties":{"EndpointSpec":{"$ref":"#/components/schemas/DockerSwarmEndpointSpec"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Mode":{"$ref":"#/components/schemas/DockerSwarmServiceMode"},"Name":{"type":"string"},"RollbackConfig":{"$ref":"#/components/schemas/DockerSwarmUpdateConfig"},"TaskTemplate":{"$ref":"#/components/schemas/DockerSwarmTaskSpec"},"UpdateConfig":{"$ref":"#/components/schemas/DockerSwarmUpdateConfig"}},"required":["Labels"],"type":"object"},"DockerSwarmSpec":{"additionalProperties":false,"properties":{"CAConfig":{"$ref":"#/components/schemas/DockerSwarmCAConfig"},"Dispatcher":{"$ref":"#/components/schemas/DockerSwarmDispatcherConfig"},"EncryptionConfig":{"$ref":"#/components/schemas/DockerSwarmEncryptionConfig"},"Labels":{"additionalProperties":{"type":"string"},"type":"object"},"Name":{"type":"string"},"Orchestration":{"$ref":"#/components/schemas/DockerSwarmOrchestrationConfig"},"Raft":{"$ref":"#/components/schemas/DockerSwarmRaftConfig"},"TaskDefaults":{"$ref":"#/components/schemas/DockerSwarmTaskDefaults"}},"required":["Labels"],"type":"object"},"DockerSwarmSpreadOver":{"additionalProperties":false,"properties":{"SpreadDescriptor":{"type":"string"}},"required":["SpreadDescriptor"],"type":"object"},"DockerSwarmTLSInfo":{"additionalProperties":false,"properties":{"CertIssuerPublicKey":{"contentEncoding":"base64","type":"string"},"CertIssuerSubject":{"contentEncoding":"base64","type":"string"},"TrustRoot":{"type":"string"}},"type":"object"},"DockerSwarmTaskDefaults":{"additionalProperties":false,"properties":{"LogDriver":{"$ref":"#/components/schemas/DockerSwarmDriver"}},"type":"object"},"DockerSwarmTaskSpec":{"additionalProperties":false,"properties":{"ContainerSpec":{"$ref":"#/components/schemas/DockerSwarmContainerSpec"},"ForceUpdate":{"format":"int64","minimum":0,"type":"integer"},"LogDriver":{"$ref":"#/components/schemas/DockerSwarmDriver"},"NetworkAttachmentSpec":{"$ref":"#/components/schemas/DockerSwarmNetworkAttachmentSpec"},"Networks":{"items":{"$ref":"#/components/schemas/DockerSwarmNetworkAttachmentConfig"},"type":["array","null"]},"Placement":{"$ref":"#/components/schemas/DockerSwarmPlacement"},"PluginSpec":{"$ref":"#/components/schemas/DockerSwarmRuntimeSpec"},"Resources":{"$ref":"#/components/schemas/DockerSwarmResourceRequirements"},"RestartPolicy":{"$ref":"#/components/schemas/DockerSwarmRestartPolicy"},"Runtime":{"type":"string"}},"required":["ForceUpdate"],"type":"object"},"DockerSwarmUpdateConfig":{"additionalProperties":false,"properties":{"Delay":{"format":"int64","type":"integer"},"FailureAction":{"type":"string"},"MaxFailureRatio":{"format":"float","type":"number"},"Monitor":{"format":"int64","type":"integer"},"Order":{"type":"string"},"Parallelism":{"format":"int64","minimum":0,"type":"integer"}},"required":["Parallelism","MaxFailureRatio","Order"],"type":"object"},"DockerSwarmUpdateStatus":{"additionalProperties":false,"properties":{"CompletedAt":{"format":"date-time","type":"string"},"Message":{"type":"string"},"StartedAt":{"format":"date-time","type":"string"},"State":{"type":"string"}},"type":"object"},"DockerSwarmVersion":{"additionalProperties":false,"properties":{"Index":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"DockerSystemCommit":{"additionalProperties":false,"properties":{"ID":{"type":"string"}},"required":["ID"],"type":"object"},"DockerSystemContainerdInfo":{"additionalProperties":false,"properties":{"Address":{"type":"string"},"Namespaces":{"$ref":"#/components/schemas/DockerSystemContainerdNamespaces"}},"required":["Namespaces"],"type":"object"},"DockerSystemContainerdNamespaces":{"additionalProperties":false,"properties":{"Containers":{"type":"string"},"Plugins":{"type":"string"}},"required":["Containers","Plugins"],"type":"object"},"DockerSystemDeviceInfo":{"additionalProperties":false,"properties":{"ID":{"type":"string"},"Source":{"type":"string"}},"required":["Source","ID"],"type":"object"},"DockerSystemFirewallInfo":{"additionalProperties":false,"properties":{"Driver":{"type":"string"},"Info":{"items":{"items":{"type":"string"},"maxItems":2,"minItems":2,"type":["array","null"]},"type":["array","null"]}},"required":["Driver"],"type":"object"},"DockerSystemNRIInfo":{"additionalProperties":false,"properties":{"Info":{"items":{"items":{"type":"string"},"maxItems":2,"minItems":2,"type":["array","null"]},"type":["array","null"]}},"type":"object"},"DockerSystemNetworkAddressPool":{"additionalProperties":false,"properties":{"Base":{"type":"string"},"Size":{"format":"int64","type":"integer"}},"required":["Base","Size"],"type":"object"},"DockerSystemPluginsInfo":{"additionalProperties":false,"properties":{"Authorization":{"items":{"type":"string"},"type":["array","null"]},"Log":{"items":{"type":"string"},"type":["array","null"]},"Network":{"items":{"type":"string"},"type":["array","null"]},"Volume":{"items":{"type":"string"},"type":["array","null"]}},"required":["Volume","Network","Authorization","Log"],"type":"object"},"DockerSystemRuntimeWithStatus":{"additionalProperties":false,"properties":{"options":{"additionalProperties":{},"type":"object"},"path":{"type":"string"},"runtimeArgs":{"items":{"type":"string"},"type":["array","null"]},"runtimeType":{"type":"string"},"status":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"DockerTypesBuildRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/DockerTypesBuildRequest.json"],"format":"uri","readOnly":true,"type":"string"},"buildArgs":{"additionalProperties":{"type":"string"},"description":"Build arguments","type":"object"},"cacheFrom":{"description":"Build cache sources","items":{"type":"string"},"type":["array","null"]},"cacheTo":{"description":"Build cache targets","items":{"type":"string"},"type":["array","null"]},"contextDir":{"description":"Build context directory or Git URL","minLength":1,"type":"string"},"dockerfile":{"description":"Dockerfile path","type":"string"},"dockerfileInline":{"description":"Inline Dockerfile content","type":"string"},"entitlements":{"description":"Build entitlements","items":{"type":"string"},"type":["array","null"]},"extraHosts":{"description":"Build extra host mappings","items":{"type":"string"},"type":["array","null"]},"isolation":{"description":"Build isolation mode","type":"string"},"labels":{"additionalProperties":{"type":"string"},"description":"Build labels","type":"object"},"load":{"description":"Load image into local Docker","type":"boolean"},"network":{"description":"Build network mode","type":"string"},"noCache":{"description":"Disable build cache","type":"boolean"},"platforms":{"description":"Target platforms","items":{"type":"string"},"type":["array","null"]},"privileged":{"description":"Enable privileged build","type":"boolean"},"provider":{"description":"Build provider override","type":"string"},"pull":{"description":"Always pull referenced base images","type":"boolean"},"push":{"description":"Push image","type":"boolean"},"shmSize":{"description":"Build shared memory size in bytes","format":"int64","type":"integer"},"tags":{"description":"Image tags","items":{"type":"string"},"type":["array","null"]},"target":{"description":"Target stage","type":"string"},"ulimits":{"additionalProperties":{"type":"string"},"description":"Build ulimits","type":"object"}},"required":["contextDir"],"type":"object"},"DockerTypesDeviceMapping":{"additionalProperties":false,"properties":{"permissions":{"type":"string"},"source":{"type":"string"},"target":{"type":"string"}},"type":"object"},"DockerTypesDeviceRequest":{"additionalProperties":false,"properties":{"capabilities":{"items":{"type":"string"},"type":["array","null"]},"count":{"format":"int64","type":"integer"},"device_ids":{"items":{"type":"string"},"type":["array","null"]},"driver":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"DockerTypesEnvFile":{"additionalProperties":false,"properties":{"format":{"type":"string"},"path":{"type":"string"},"required":{"type":"boolean"}},"type":"object"},"DockerTypesGenericResource":{"additionalProperties":false,"properties":{"discrete_resource_spec":{"$ref":"#/components/schemas/DiscreteGenericResource"}},"type":"object"},"DockerTypesPlacement":{"additionalProperties":false,"properties":{"constraints":{"items":{"type":"string"},"type":["array","null"]},"max_replicas_per_node":{"format":"int64","minimum":0,"type":"integer"},"preferences":{"items":{"$ref":"#/components/schemas/DockerTypesPlacementPreferences"},"type":["array","null"]}},"type":"object"},"DockerTypesPlacementPreferences":{"additionalProperties":false,"properties":{"spread":{"type":"string"}},"type":"object"},"DockerTypesResources":{"additionalProperties":false,"properties":{"limits":{"$ref":"#/components/schemas/Resource"},"reservations":{"$ref":"#/components/schemas/Resource"}},"type":"object"},"DockerTypesSSHKey":{"additionalProperties":false,"properties":{"id":{"type":"string"},"path":{"type":"string"}},"type":"object"},"DockerTypesServiceConfig":{"additionalProperties":false,"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"attach":{"type":"boolean"},"blkio_config":{"$ref":"#/components/schemas/BlkioConfig"},"build":{"$ref":"#/components/schemas/BuildConfig"},"cap_add":{"items":{"type":"string"},"type":["array","null"]},"cap_drop":{"items":{"type":"string"},"type":["array","null"]},"cgroup":{"type":"string"},"cgroup_parent":{"type":"string"},"command":{"items":{"type":"string"},"type":["array","null"]},"configs":{"items":{"$ref":"#/components/schemas/DockerTypesServiceConfigObjConfig"},"type":["array","null"]},"container_name":{"type":"string"},"cpu_count":{"format":"int64","type":"integer"},"cpu_percent":{"format":"float","type":"number"},"cpu_period":{"format":"int64","type":"integer"},"cpu_quota":{"format":"int64","type":"integer"},"cpu_rt_period":{"format":"int64","type":"integer"},"cpu_rt_runtime":{"format":"int64","type":"integer"},"cpu_shares":{"format":"int64","type":"integer"},"cpus":{"format":"float","type":"number"},"cpuset":{"type":"string"},"credential_spec":{"$ref":"#/components/schemas/CredentialSpecConfig"},"depends_on":{"additionalProperties":{"$ref":"#/components/schemas/DockerTypesServiceDependency"},"type":"object"},"deploy":{"$ref":"#/components/schemas/DeployConfig"},"develop":{"$ref":"#/components/schemas/DevelopConfig"},"device_cgroup_rules":{"items":{"type":"string"},"type":["array","null"]},"devices":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceMapping"},"type":["array","null"]},"dns":{"items":{"type":"string"},"type":["array","null"]},"dns_opt":{"items":{"type":"string"},"type":["array","null"]},"dns_search":{"items":{"type":"string"},"type":["array","null"]},"dockerfile":{"type":"string"},"domainname":{"type":"string"},"entrypoint":{"items":{"type":"string"},"type":["array","null"]},"env_file":{"items":{"$ref":"#/components/schemas/DockerTypesEnvFile"},"type":["array","null"]},"environment":{"additionalProperties":{"type":["string","null"]},"type":"object"},"expose":{"items":{"type":"string"},"type":["array","null"]},"extends":{"$ref":"#/components/schemas/ExtendsConfig"},"external_links":{"items":{"type":"string"},"type":["array","null"]},"extra_hosts":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"},"gpus":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceRequest"},"type":["array","null"]},"group_add":{"items":{"type":"string"},"type":["array","null"]},"healthcheck":{"$ref":"#/components/schemas/HealthCheckConfig"},"hostname":{"type":"string"},"image":{"type":"string"},"init":{"type":"boolean"},"ipc":{"type":"string"},"isolation":{"type":"string"},"label_file":{"items":{"type":"string"},"type":["array","null"]},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"links":{"items":{"type":"string"},"type":["array","null"]},"log_driver":{"type":"string"},"log_opt":{"additionalProperties":{"type":"string"},"type":"object"},"logging":{"$ref":"#/components/schemas/LoggingConfig"},"mac_address":{"type":"string"},"mem_limit":{"format":"int64","type":"integer"},"mem_reservation":{"format":"int64","type":"integer"},"mem_swappiness":{"format":"int64","type":"integer"},"memswap_limit":{"format":"int64","type":"integer"},"models":{"additionalProperties":{"$ref":"#/components/schemas/ServiceModelConfig"},"type":"object"},"net":{"type":"string"},"network_mode":{"type":"string"},"networks":{"additionalProperties":{"$ref":"#/components/schemas/ServiceNetworkConfig"},"type":"object"},"oom_kill_disable":{"type":"boolean"},"oom_score_adj":{"format":"int64","type":"integer"},"pid":{"type":"string"},"pids_limit":{"format":"int64","type":"integer"},"platform":{"type":"string"},"ports":{"items":{"$ref":"#/components/schemas/DockerTypesServicePortConfig"},"type":["array","null"]},"post_start":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"pre_start":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"pre_stop":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"privileged":{"type":"boolean"},"profiles":{"items":{"type":"string"},"type":["array","null"]},"provider":{"$ref":"#/components/schemas/ServiceProviderConfig"},"pull_policy":{"type":"string"},"read_only":{"type":"boolean"},"restart":{"type":"string"},"runtime":{"type":"string"},"scale":{"format":"int64","type":"integer"},"secrets":{"items":{"$ref":"#/components/schemas/DockerTypesServiceSecretConfig"},"type":["array","null"]},"security_opt":{"items":{"type":"string"},"type":["array","null"]},"shm_size":{"format":"int64","type":"integer"},"stdin_open":{"type":"boolean"},"stop_grace_period":{"format":"int64","type":"integer"},"stop_signal":{"type":"string"},"storage_opt":{"additionalProperties":{"type":"string"},"type":"object"},"sysctls":{"additionalProperties":{"type":"string"},"type":"object"},"tmpfs":{"items":{"type":"string"},"type":["array","null"]},"tty":{"type":"boolean"},"ulimits":{"additionalProperties":{"$ref":"#/components/schemas/UlimitsConfig"},"type":"object"},"use_api_socket":{"type":"boolean"},"user":{"type":"string"},"userns_mode":{"type":"string"},"uts":{"type":"string"},"volume_driver":{"type":"string"},"volumes":{"items":{"$ref":"#/components/schemas/DockerTypesServiceVolumeConfig"},"type":["array","null"]},"volumes_from":{"items":{"type":"string"},"type":["array","null"]},"working_dir":{"type":"string"}},"required":["command","entrypoint"],"type":"object"},"DockerTypesServiceConfigObjConfig":{"additionalProperties":false,"properties":{"gid":{"type":"string"},"mode":{"format":"int64","type":"integer"},"source":{"type":"string"},"target":{"type":"string"},"uid":{"type":"string"}},"type":"object"},"DockerTypesServiceDependency":{"additionalProperties":false,"properties":{"condition":{"type":"string"},"required":{"type":"boolean"},"restart":{"type":"boolean"}},"required":["required"],"type":"object"},"DockerTypesServiceHook":{"additionalProperties":false,"properties":{"command":{"items":{"type":"string"},"type":["array","null"]},"environment":{"additionalProperties":{"type":["string","null"]},"type":"object"},"image":{"type":"string"},"per_replica":{"type":"boolean"},"privileged":{"type":"boolean"},"user":{"type":"string"},"working_dir":{"type":"string"}},"required":["command"],"type":"object"},"DockerTypesServicePortConfig":{"additionalProperties":false,"properties":{"app_protocol":{"type":"string"},"host_ip":{"type":"string"},"mode":{"type":"string"},"name":{"type":"string"},"protocol":{"type":"string"},"published":{"type":"string"},"target":{"format":"int32","minimum":0,"type":"integer"}},"type":"object"},"DockerTypesServiceSecretConfig":{"additionalProperties":false,"properties":{"gid":{"type":"string"},"mode":{"format":"int64","type":"integer"},"source":{"type":"string"},"target":{"type":"string"},"uid":{"type":"string"}},"type":"object"},"DockerTypesServiceVolumeConfig":{"additionalProperties":false,"properties":{"bind":{"$ref":"#/components/schemas/ServiceVolumeBind"},"consistency":{"type":"string"},"image":{"$ref":"#/components/schemas/ServiceVolumeImage"},"read_only":{"type":"boolean"},"source":{"type":"string"},"target":{"type":"string"},"tmpfs":{"$ref":"#/components/schemas/ServiceVolumeTmpfs"},"type":{"type":"string"},"volume":{"$ref":"#/components/schemas/ServiceVolumeVolume"}},"type":"object"},"DockerTypesThrottleDevice":{"additionalProperties":false,"properties":{"Path":{"type":"string"},"Rate":{"format":"int64","type":"integer"}},"required":["Path","Rate"],"type":"object"},"DockerTypesTrigger":{"additionalProperties":false,"properties":{"action":{"type":"string"},"exec":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"ignore":{"items":{"type":"string"},"type":["array","null"]},"include":{"items":{"type":"string"},"type":["array","null"]},"initial_sync":{"type":"boolean"},"path":{"type":"string"},"target":{"type":"string"}},"required":["path","action"],"type":"object"},"DockerTypesWeightDevice":{"additionalProperties":false,"properties":{"Path":{"type":"string"},"Weight":{"format":"int32","minimum":0,"type":"integer"}},"required":["Path","Weight"],"type":"object"},"DockerVolumeUsageData":{"additionalProperties":false,"properties":{"RefCount":{"format":"int64","type":"integer"},"Size":{"format":"int64","type":"integer"}},"required":["RefCount","Size"],"type":"object"},"DockerinfoInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/DockerinfoInfo.json"],"format":"uri","readOnly":true,"type":"string"},"Architecture":{"type":"string"},"CDISpecDirs":{"items":{"type":"string"},"type":["array","null"]},"CPUSet":{"type":"boolean"},"CPUShares":{"type":"boolean"},"CgroupDriver":{"type":"string"},"CgroupVersion":{"type":"string"},"Containerd":{"$ref":"#/components/schemas/DockerSystemContainerdInfo"},"ContainerdCommit":{"$ref":"#/components/schemas/DockerSystemCommit"},"Containers":{"format":"int64","type":"integer"},"ContainersPaused":{"format":"int64","type":"integer"},"ContainersRunning":{"format":"int64","type":"integer"},"ContainersStopped":{"format":"int64","type":"integer"},"CpuCfsPeriod":{"type":"boolean"},"CpuCfsQuota":{"type":"boolean"},"Debug":{"type":"boolean"},"DefaultAddressPools":{"items":{"$ref":"#/components/schemas/DockerSystemNetworkAddressPool"},"type":["array","null"]},"DefaultRuntime":{"type":"string"},"DiscoveredDevices":{"items":{"$ref":"#/components/schemas/DockerSystemDeviceInfo"},"type":["array","null"]},"DockerRootDir":{"type":"string"},"Driver":{"type":"string"},"DriverStatus":{"items":{"items":{"type":"string"},"maxItems":2,"minItems":2,"type":["array","null"]},"type":["array","null"]},"ExperimentalBuild":{"type":"boolean"},"FirewallBackend":{"$ref":"#/components/schemas/DockerSystemFirewallInfo"},"GenericResources":{"items":{"$ref":"#/components/schemas/DockerSwarmGenericResource"},"type":["array","null"]},"HttpProxy":{"type":"string"},"HttpsProxy":{"type":"string"},"ID":{"type":"string"},"IPv4Forwarding":{"type":"boolean"},"Images":{"format":"int64","type":"integer"},"IndexServerAddress":{"type":"string"},"InitBinary":{"type":"string"},"InitCommit":{"$ref":"#/components/schemas/DockerSystemCommit"},"Isolation":{"type":"string"},"KernelVersion":{"type":"string"},"Labels":{"items":{"type":"string"},"type":["array","null"]},"LiveRestoreEnabled":{"type":"boolean"},"LoggingDriver":{"type":"string"},"MemTotal":{"format":"int64","type":"integer"},"MemoryLimit":{"type":"boolean"},"NCPU":{"format":"int64","type":"integer"},"NEventsListener":{"format":"int64","type":"integer"},"NFd":{"format":"int64","type":"integer"},"NGoroutines":{"format":"int64","type":"integer"},"NRI":{"$ref":"#/components/schemas/DockerSystemNRIInfo"},"Name":{"type":"string"},"NoProxy":{"type":"string"},"OSType":{"type":"string"},"OSVersion":{"type":"string"},"OomKillDisable":{"type":"boolean"},"OperatingSystem":{"type":"string"},"PidsLimit":{"type":"boolean"},"Plugins":{"$ref":"#/components/schemas/DockerSystemPluginsInfo"},"ProductLicense":{"type":"string"},"RegistryConfig":{"$ref":"#/components/schemas/DockerRegistryServiceConfig"},"RuncCommit":{"$ref":"#/components/schemas/DockerSystemCommit"},"Runtimes":{"additionalProperties":{"$ref":"#/components/schemas/DockerSystemRuntimeWithStatus"},"type":"object"},"SecurityOptions":{"items":{"type":"string"},"type":["array","null"]},"ServerVersion":{"type":"string"},"SwapLimit":{"type":"boolean"},"Swarm":{"$ref":"#/components/schemas/DockerSwarmInfo"},"SystemStatus":{"items":{"items":{"type":"string"},"maxItems":2,"minItems":2,"type":["array","null"]},"type":["array","null"]},"SystemTime":{"type":"string"},"Warnings":{"items":{"type":"string"},"type":["array","null"]},"apiVersion":{"type":"string"},"arch":{"type":"string"},"buildTime":{"type":"string"},"gitCommit":{"type":"string"},"goVersion":{"type":"string"},"os":{"type":"string"},"success":{"type":"boolean"}},"required":["success","apiVersion","gitCommit","goVersion","os","arch","buildTime","ID","Containers","ContainersRunning","ContainersPaused","ContainersStopped","Images","Driver","DriverStatus","Plugins","MemoryLimit","SwapLimit","CpuCfsPeriod","CpuCfsQuota","CPUShares","CPUSet","PidsLimit","IPv4Forwarding","Debug","NFd","OomKillDisable","NGoroutines","SystemTime","LoggingDriver","CgroupDriver","NEventsListener","KernelVersion","OperatingSystem","OSVersion","OSType","Architecture","IndexServerAddress","RegistryConfig","NCPU","MemTotal","GenericResources","DockerRootDir","HttpProxy","HttpsProxy","NoProxy","Name","Labels","ExperimentalBuild","ServerVersion","Runtimes","DefaultRuntime","Swarm","LiveRestoreEnabled","Isolation","InitBinary","ContainerdCommit","RuncCommit","InitCommit","SecurityOptions","CDISpecDirs","Warnings"],"type":"object"},"EnvSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvSummary.json"],"format":"uri","readOnly":true,"type":"string"},"variables":{"items":{"$ref":"#/components/schemas/EnvVariable"},"type":["array","null"]}},"required":["variables"],"type":"object"},"EnvVariable":{"additionalProperties":false,"properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"],"type":"object"},"EnvironmentAgentPairRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentAgentPairRequest.json"],"format":"uri","readOnly":true,"type":"string"},"rotate":{"type":"boolean"}},"type":"object"},"EnvironmentAgentPairResponse":{"additionalProperties":false,"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"EnvironmentCreate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentCreate.json"],"format":"uri","readOnly":true,"type":"string"},"accessToken":{"type":"string"},"apiUrl":{"type":"string"},"enabled":{"type":"boolean"},"isEdge":{"type":"boolean"},"name":{"type":"string"},"useApiKey":{"type":"boolean"}},"required":["apiUrl"],"type":"object"},"EnvironmentEdgeMTLSCertificate":{"additionalProperties":false,"properties":{"commonName":{"type":"string"},"daysRemaining":{"format":"int64","type":"integer"},"expired":{"type":"boolean"},"expiresAt":{"format":"date-time","type":"string"},"expiringSoon":{"type":"boolean"}},"required":["expired","expiringSoon"],"type":"object"},"EnvironmentEnvironment":{"additionalProperties":false,"properties":{"apiKey":{"type":"string"},"apiUrl":{"type":"string"},"connected":{"type":"boolean"},"connectedAt":{"format":"date-time","type":"string"},"edgeAgentInstance":{"type":"string"},"edgeCapabilities":{"items":{"type":"string"},"type":["array","null"]},"edgeMTLSCertificate":{"$ref":"#/components/schemas/EnvironmentEdgeMTLSCertificate"},"edgeSecurityMode":{"type":"string"},"edgeSessionId":{"type":"string"},"edgeTransport":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"isEdge":{"type":"boolean"},"lastEdgeTransport":{"type":"string"},"lastHeartbeat":{"format":"date-time","type":"string"},"lastPollAt":{"format":"date-time","type":"string"},"lastSeen":{"format":"date-time","type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id","apiUrl","status","enabled","isEdge"],"type":"object"},"EnvironmentPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/EnvironmentEnvironment"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"EnvironmentTest":{"additionalProperties":false,"properties":{"message":{"type":"string"},"status":{"type":"string"}},"required":["status"],"type":"object"},"EnvironmentTestConnectionRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentTestConnectionRequest.json"],"format":"uri","readOnly":true,"type":"string"},"apiUrl":{"type":"string"}},"type":"object"},"EnvironmentUpdate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentUpdate.json"],"format":"uri","readOnly":true,"type":"string"},"accessToken":{"type":"string"},"apiUrl":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"regenerateApiKey":{"type":"boolean"}},"type":"object"},"EnvironmentUpdateJob":{"additionalProperties":false,"properties":{"completedAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"},"error":{"type":"string"},"id":{"type":"string"},"managerDigestAtStart":{"type":"string"},"managerTargetVersion":{"type":"string"},"managerVersionAtStart":{"type":"string"},"results":{"items":{"$ref":"#/components/schemas/EnvironmentUpdateResult"},"type":["array","null"]},"status":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"type":"string"},"username":{"type":"string"}},"required":["status","userId","username","managerVersionAtStart","managerDigestAtStart","managerTargetVersion","id","createdAt"],"type":"object"},"EnvironmentUpdateResult":{"additionalProperties":false,"properties":{"environmentId":{"type":"string"},"environmentName":{"type":"string"},"error":{"type":"string"},"fromVersion":{"type":"string"},"status":{"type":"string"},"toVersion":{"type":"string"}},"required":["environmentId","environmentName","status"],"type":"object"},"EnvironmentWithApiKey":{"additionalProperties":false,"properties":{"apiKey":{"description":"API key for pairing (only shown once during creation)","type":"string"},"apiUrl":{"type":"string"},"connected":{"type":"boolean"},"connectedAt":{"format":"date-time","type":"string"},"edgeAgentInstance":{"type":"string"},"edgeCapabilities":{"items":{"type":"string"},"type":["array","null"]},"edgeMTLSCertificate":{"$ref":"#/components/schemas/EnvironmentEdgeMTLSCertificate"},"edgeSecurityMode":{"type":"string"},"edgeSessionId":{"type":"string"},"edgeTransport":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"isEdge":{"type":"boolean"},"lastEdgeTransport":{"type":"string"},"lastHeartbeat":{"format":"date-time","type":"string"},"lastPollAt":{"format":"date-time","type":"string"},"lastSeen":{"format":"date-time","type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id","apiUrl","status","enabled","isEdge"],"type":"object"},"ErrorDetail":{"additionalProperties":false,"properties":{"location":{"description":"Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'","type":"string"},"message":{"description":"Error message text","type":"string"},"value":{"description":"The value at the given location"}},"type":"object"},"ErrorModel":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ErrorModel.json"],"format":"uri","readOnly":true,"type":"string"},"detail":{"description":"A human-readable explanation specific to this occurrence of the problem.","examples":["Property foo is required but is missing."],"type":"string"},"errors":{"description":"Optional list of individual error details","items":{"$ref":"#/components/schemas/ErrorDetail"},"type":["array","null"]},"instance":{"description":"A URI reference that identifies the specific occurrence of the problem.","examples":["https://example.com/error-log/abc123"],"format":"uri","type":"string"},"status":{"description":"HTTP status code","examples":[400],"format":"int64","type":"integer"},"title":{"description":"A short, human-readable summary of the problem type. This value should not change between occurrences of the error.","examples":["Bad Request"],"type":"string"},"type":{"default":"about:blank","description":"A URI reference to human-readable documentation for the error.","examples":["https://example.com/errors/example"],"format":"uri","type":"string"}},"type":"object"},"EventEvent":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"environmentId":{"type":"string"},"id":{"type":"string"},"metadata":{"additionalProperties":{},"type":"object"},"resourceId":{"type":"string"},"resourceName":{"type":"string"},"resourceType":{"type":"string"},"severity":{"type":"string"},"timestamp":{"format":"date-time","type":"string"},"title":{"type":"string"},"type":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"type":"string"},"username":{"type":"string"}},"required":["id","type","severity","title","timestamp","createdAt"],"type":"object"},"EventPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/EventPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/EventEvent"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ExtendsConfig":{"additionalProperties":false,"properties":{"file":{"type":"string"},"service":{"type":"string"}},"type":"object"},"FederatedCreateFederatedCredential":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/FederatedCreateFederatedCredential.json"],"format":"uri","readOnly":true,"type":"string"},"audiences":{"description":"Allowed external token audiences","items":{"type":"string"},"minItems":1,"type":["array","null"]},"description":{"description":"Optional description","maxLength":1000,"type":"string"},"enabled":{"description":"Whether exchanges are allowed","type":"boolean"},"environmentId":{"description":"Optional environment scope for the role assignment","type":"string"},"expiresAt":{"description":"Optional credential expiration","format":"date-time","type":"string"},"issuerUrl":{"description":"Trusted external OIDC issuer URL","format":"uri","minLength":1,"type":"string"},"matchType":{"description":"Subject match strategy","enum":["exact","glob"],"type":"string"},"name":{"description":"Display name","maxLength":255,"minLength":1,"type":"string"},"roleId":{"description":"Mapped role ID","minLength":1,"type":"string"},"subjectClaim":{"description":"Claim path to match against; defaults to sub","type":"string"},"subjectMatch":{"description":"Exact subject or anchored glob pattern","minLength":1,"type":"string"},"tokenTtlSeconds":{"description":"Issued token lifetime in seconds","format":"int64","maximum":3600,"minimum":60,"type":"integer"}},"required":["name","enabled","issuerUrl","audiences","subjectMatch","roleId"],"type":"object"},"FederatedFederatedCredential":{"additionalProperties":false,"properties":{"audiences":{"description":"Allowed external token audiences","items":{"type":"string"},"type":["array","null"]},"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"description":{"description":"Optional description","type":"string"},"enabled":{"description":"Whether exchanges are allowed","type":"boolean"},"environmentId":{"description":"Optional environment scope for the role assignment","type":"string"},"environmentName":{"description":"Mapped environment name when scoped","type":"string"},"expiresAt":{"description":"Optional credential expiration","format":"date-time","type":"string"},"id":{"description":"Unique identifier of the federated credential","type":"string"},"identityUserId":{"description":"Dedicated service user ID backing issued tokens","type":"string"},"issuerUrl":{"description":"Trusted external OIDC issuer URL","type":"string"},"lastUsedAt":{"description":"Last successful token exchange","format":"date-time","type":"string"},"matchType":{"description":"Subject match strategy","enum":["exact","glob"],"type":"string"},"name":{"description":"Display name","type":"string"},"roleId":{"description":"Mapped role ID","type":"string"},"roleName":{"description":"Mapped role name","type":"string"},"serviceUsername":{"description":"Dedicated service account username","type":"string"},"subjectClaim":{"description":"Claim path to match against","type":"string"},"subjectMatch":{"description":"Exact subject or anchored glob pattern","type":"string"},"tokenTtlSeconds":{"description":"Issued token lifetime in seconds","format":"int64","type":"integer"},"updatedAt":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["id","name","enabled","issuerUrl","audiences","subjectClaim","subjectMatch","matchType","roleId","identityUserId","tokenTtlSeconds","createdAt"],"type":"object"},"FederatedUpdateFederatedCredential":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/FederatedUpdateFederatedCredential.json"],"format":"uri","readOnly":true,"type":"string"},"audiences":{"description":"Allowed external token audiences","items":{"type":"string"},"minItems":1,"type":["array","null"]},"description":{"description":"Optional description","maxLength":1000,"type":"string"},"enabled":{"description":"Whether exchanges are allowed","type":"boolean"},"environmentId":{"description":"Optional environment scope for the role assignment","type":"string"},"expiresAt":{"description":"Optional credential expiration","format":"date-time","type":"string"},"issuerUrl":{"description":"Trusted external OIDC issuer URL","format":"uri","type":"string"},"matchType":{"description":"Subject match strategy","enum":["exact","glob"],"type":"string"},"name":{"description":"Display name","maxLength":255,"type":"string"},"roleId":{"description":"Mapped role ID","minLength":1,"type":"string"},"subjectClaim":{"description":"Claim path to match against","type":"string"},"subjectMatch":{"description":"Exact subject or anchored glob pattern","minLength":1,"type":"string"},"tokenTtlSeconds":{"description":"Issued token lifetime in seconds","format":"int64","maximum":3600,"minimum":60,"type":"integer"}},"type":"object"},"FileContentResponse":{"additionalProperties":false,"properties":{"content":{"contentEncoding":"base64","type":"string"},"mimeType":{"type":"string"}},"required":["content","mimeType"],"type":"object"},"GetSwarmNodeAgentDeploymentInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GetSwarmNodeAgentDeploymentInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"rotate":{"description":"Rotate the environment token before generating snippets","type":"boolean"}},"type":"object"},"GitOpsSyncPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitOpsSyncPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"counts":{"$ref":"#/components/schemas/GitopsSyncCounts"},"data":{"items":{"$ref":"#/components/schemas/GitopsGitOpsSync"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","counts","pagination"],"type":"object"},"GitRepositoryPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitRepositoryPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/GitopsGitRepository"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"GitopsBranchInfo":{"additionalProperties":false,"properties":{"isDefault":{"type":"boolean"},"name":{"type":"string"}},"required":["name","isDefault"],"type":"object"},"GitopsBranchesResponse":{"additionalProperties":false,"properties":{"branches":{"items":{"$ref":"#/components/schemas/GitopsBranchInfo"},"type":["array","null"]}},"required":["branches"],"type":"object"},"GitopsBrowseResponse":{"additionalProperties":false,"properties":{"files":{"items":{"$ref":"#/components/schemas/GitopsFileTreeNode"},"type":["array","null"]},"path":{"type":"string"}},"required":["path","files"],"type":"object"},"GitopsCreateSyncRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsCreateSyncRequest.json"],"format":"uri","readOnly":true,"type":"string"},"autoSync":{"type":"boolean"},"branch":{"type":"string"},"composePath":{"type":"string"},"maxSyncBinarySize":{"format":"int64","type":"integer"},"maxSyncFiles":{"format":"int64","type":"integer"},"maxSyncTotalSize":{"format":"int64","type":"integer"},"name":{"type":"string"},"preDeployEnv":{"type":"string"},"preDeployExtraMounts":{"type":"string"},"preDeployNetworkMode":{"type":"string"},"preDeployRunnerImage":{"type":"string"},"preDeployScriptPath":{"type":"string"},"preDeployTimeoutSec":{"format":"int64","type":"integer"},"projectName":{"type":"string"},"repositoryId":{"type":"string"},"syncDirectory":{"type":"boolean"},"syncInterval":{"format":"int64","type":"integer"},"targetType":{"type":"string"}},"required":["name","repositoryId","branch","composePath"],"type":"object"},"GitopsFileTreeNode":{"additionalProperties":false,"properties":{"children":{"items":{"$ref":"#/components/schemas/GitopsFileTreeNode"},"type":["array","null"]},"name":{"type":"string"},"path":{"type":"string"},"size":{"format":"int64","type":"integer"},"type":{"type":"string"}},"required":["name","path","type"],"type":"object"},"GitopsGitOpsSync":{"additionalProperties":false,"properties":{"autoSync":{"type":"boolean"},"branch":{"type":"string"},"composePath":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"environmentId":{"type":"string"},"id":{"type":"string"},"lastSyncAt":{"format":"date-time","type":"string"},"lastSyncCommit":{"type":"string"},"lastSyncError":{"type":"string"},"lastSyncStatus":{"type":"string"},"maxSyncBinarySize":{"format":"int64","type":"integer"},"maxSyncFiles":{"format":"int64","type":"integer"},"maxSyncTotalSize":{"format":"int64","type":"integer"},"name":{"type":"string"},"preDeployEnv":{"type":"string"},"preDeployExtraMounts":{"type":"string"},"preDeployLastRunAt":{"format":"date-time","type":"string"},"preDeployLastRunOutput":{"type":"string"},"preDeployLastRunStatus":{"type":"string"},"preDeployNetworkMode":{"type":"string"},"preDeployRunnerImage":{"type":"string"},"preDeployScriptPath":{"type":"string"},"preDeployTimeoutSec":{"format":"int64","type":"integer"},"projectId":{"type":"string"},"projectName":{"type":"string"},"repository":{"$ref":"#/components/schemas/GitopsGitRepository"},"repositoryId":{"type":"string"},"syncDirectory":{"type":"boolean"},"syncInterval":{"format":"int64","type":"integer"},"syncedFiles":{"type":"string"},"targetType":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","environmentId","repositoryId","branch","composePath","targetType","projectName","autoSync","syncInterval","syncDirectory","maxSyncFiles","maxSyncTotalSize","maxSyncBinarySize","preDeployTimeoutSec","preDeployNetworkMode","createdAt","updatedAt"],"type":"object"},"GitopsGitRepository":{"additionalProperties":false,"properties":{"authType":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"name":{"type":"string"},"sshHostKeyVerification":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["id","name","url","authType","enabled","createdAt","updatedAt"],"type":"object"},"GitopsImportGitOpsSyncRequest":{"additionalProperties":false,"properties":{"autoSync":{"type":"boolean"},"branch":{"type":"string"},"dockerComposePath":{"type":"string"},"gitRepo":{"type":"string"},"maxSyncBinarySize":{"format":"int64","type":"integer"},"maxSyncFiles":{"format":"int64","type":"integer"},"maxSyncTotalSize":{"format":"int64","type":"integer"},"syncDirectory":{"type":"boolean"},"syncInterval":{"format":"int64","type":"integer"},"syncName":{"type":"string"}},"required":["syncName","gitRepo","branch","dockerComposePath","autoSync","syncInterval"],"type":"object"},"GitopsImportGitOpsSyncResponse":{"additionalProperties":false,"properties":{"errors":{"items":{"type":"string"},"type":["array","null"]},"failedCount":{"format":"int64","type":"integer"},"successCount":{"format":"int64","type":"integer"}},"required":["successCount","failedCount","errors"],"type":"object"},"GitopsRepositorySync":{"additionalProperties":false,"properties":{"authType":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"name":{"type":"string"},"sshHostKeyVerification":{"type":"string"},"sshKey":{"type":"string"},"token":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"required":["id","name","url","authType","enabled","createdAt","updatedAt"],"type":"object"},"GitopsRepositorySyncRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsRepositorySyncRequest.json"],"format":"uri","readOnly":true,"type":"string"},"repositories":{"items":{"$ref":"#/components/schemas/GitopsRepositorySync"},"type":["array","null"]}},"required":["repositories"],"type":"object"},"GitopsSyncCounts":{"additionalProperties":false,"properties":{"activeSyncs":{"format":"int64","type":"integer"},"successfulSyncs":{"format":"int64","type":"integer"},"totalSyncs":{"format":"int64","type":"integer"}},"required":["totalSyncs","activeSyncs","successfulSyncs"],"type":"object"},"GitopsSyncResult":{"additionalProperties":false,"properties":{"error":{"type":"string"},"message":{"type":"string"},"success":{"type":"boolean"},"syncedAt":{"format":"date-time","type":"string"}},"required":["success","message","syncedAt"],"type":"object"},"GitopsSyncStatus":{"additionalProperties":false,"properties":{"autoSync":{"type":"boolean"},"id":{"type":"string"},"lastSyncAt":{"format":"date-time","type":"string"},"lastSyncCommit":{"type":"string"},"lastSyncError":{"type":"string"},"lastSyncStatus":{"type":"string"},"nextSyncAt":{"format":"date-time","type":"string"}},"required":["id","autoSync"],"type":"object"},"GitopsUpdateSyncRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsUpdateSyncRequest.json"],"format":"uri","readOnly":true,"type":"string"},"autoSync":{"type":"boolean"},"branch":{"type":"string"},"composePath":{"type":"string"},"maxSyncBinarySize":{"format":"int64","type":"integer"},"maxSyncFiles":{"format":"int64","type":"integer"},"maxSyncTotalSize":{"format":"int64","type":"integer"},"name":{"type":"string"},"preDeployEnv":{"type":"string"},"preDeployExtraMounts":{"type":"string"},"preDeployNetworkMode":{"type":"string"},"preDeployRunnerImage":{"type":"string"},"preDeployScriptPath":{"type":"string"},"preDeployTimeoutSec":{"format":"int64","type":"integer"},"projectName":{"type":"string"},"repositoryId":{"type":"string"},"syncDirectory":{"type":"boolean"},"syncInterval":{"format":"int64","type":"integer"},"targetType":{"type":"string"}},"type":"object"},"HealthCheckConfig":{"additionalProperties":false,"properties":{"disable":{"type":"boolean"},"interval":{"format":"int64","type":"integer"},"retries":{"format":"int64","minimum":0,"type":"integer"},"start_interval":{"format":"int64","type":"integer"},"start_period":{"format":"int64","type":"integer"},"test":{"items":{"type":"string"},"type":["array","null"]},"timeout":{"format":"int64","type":"integer"}},"type":"object"},"HealthcheckConfig":{"additionalProperties":false,"properties":{"Interval":{"format":"int64","type":"integer"},"Retries":{"format":"int64","type":"integer"},"StartInterval":{"format":"int64","type":"integer"},"StartPeriod":{"format":"int64","type":"integer"},"Test":{"items":{"type":"string"},"type":["array","null"]},"Timeout":{"format":"int64","type":"integer"}},"type":"object"},"ImageAttestation":{"additionalProperties":false,"properties":{"artifactType":{"type":"string"},"digest":{"type":"string"},"mediaType":{"type":"string"},"platform":{"type":"string"},"predicateType":{"type":"string"},"size":{"format":"int64","type":"integer"},"statement":{},"statementType":{"type":"string"},"subject":{"items":{"$ref":"#/components/schemas/ImageAttestationSubject"},"type":["array","null"]}},"required":["digest","mediaType","predicateType","subject","size"],"type":"object"},"ImageAttestationList":{"additionalProperties":false,"properties":{"attestations":{"items":{"$ref":"#/components/schemas/ImageAttestation"},"type":["array","null"]},"imageRef":{"type":"string"},"platform":{"type":"string"},"subjectDigest":{"type":"string"}},"required":["imageRef","subjectDigest","attestations"],"type":"object"},"ImageAttestationSubject":{"additionalProperties":false,"properties":{"digest":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"}},"required":["name","digest"],"type":"object"},"ImageBuildPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageBuildPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ImageBuildRecord"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ImageBuildRecord":{"additionalProperties":false,"properties":{"buildArgs":{"additionalProperties":{"type":"string"},"type":"object"},"cacheFrom":{"items":{"type":"string"},"type":["array","null"]},"cacheTo":{"items":{"type":"string"},"type":["array","null"]},"completedAt":{"format":"date-time","type":"string"},"contextDir":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"digest":{"type":"string"},"dockerfile":{"type":"string"},"durationMs":{"format":"int64","type":"integer"},"entitlements":{"items":{"type":"string"},"type":["array","null"]},"environmentId":{"type":"string"},"errorMessage":{"type":"string"},"extraHosts":{"items":{"type":"string"},"type":["array","null"]},"id":{"type":"string"},"isolation":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"load":{"type":"boolean"},"network":{"type":"string"},"noCache":{"type":"boolean"},"output":{"type":"string"},"outputTruncated":{"type":"boolean"},"platforms":{"items":{"type":"string"},"type":["array","null"]},"privileged":{"type":"boolean"},"provider":{"type":"string"},"pull":{"type":"boolean"},"push":{"type":"boolean"},"shmSize":{"format":"int64","type":"integer"},"status":{"type":"string"},"tags":{"items":{"type":"string"},"type":["array","null"]},"target":{"type":"string"},"ulimits":{"additionalProperties":{"type":"string"},"type":"object"},"userId":{"type":"string"},"username":{"type":"string"}},"required":["id","environmentId","status","contextDir","noCache","pull","privileged","push","load","outputTruncated","createdAt"],"type":"object"},"ImageDetailSummary":{"additionalProperties":false,"properties":{"architecture":{"type":"string"},"author":{"type":"string"},"comment":{"type":"string"},"config":{"$ref":"#/components/schemas/DetailSummaryConfigStruct"},"created":{"type":"string"},"descriptor":{"$ref":"#/components/schemas/DetailSummaryDescriptorStruct"},"graphDriver":{"$ref":"#/components/schemas/DetailSummaryGraphDriverStruct"},"id":{"type":"string"},"metadata":{"$ref":"#/components/schemas/DetailSummaryMetadataStruct"},"os":{"type":"string"},"repoDigests":{"items":{"type":"string"},"type":["array","null"]},"repoTags":{"items":{"type":"string"},"type":["array","null"]},"rootFs":{"$ref":"#/components/schemas/DetailSummaryRootFsStruct"},"size":{"format":"int64","type":"integer"}},"required":["id","repoTags","repoDigests","comment","created","author","config","architecture","os","size","graphDriver","rootFs","metadata","descriptor"],"type":"object"},"ImageHistoryItem":{"additionalProperties":false,"properties":{"comment":{"type":"string"},"created":{"format":"int64","type":"integer"},"createdBy":{"type":"string"},"id":{"type":"string"},"size":{"format":"int64","type":"integer"},"tags":{"items":{"type":"string"},"type":["array","null"]}},"required":["id","created","createdBy","tags","size","comment"],"type":"object"},"ImageLoadResult":{"additionalProperties":false,"properties":{"stream":{"type":"string"}},"required":["stream"],"type":"object"},"ImagePaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImagePaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ImageSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ImagePruneReport":{"additionalProperties":false,"properties":{"imagesDeleted":{"items":{"type":"string"},"type":["array","null"]},"spaceReclaimed":{"format":"int64","type":"integer"}},"required":["imagesDeleted","spaceReclaimed"],"type":"object"},"ImagePullOptions":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImagePullOptions.json"],"format":"uri","readOnly":true,"type":"string"},"auth":{"$ref":"#/components/schemas/ContainerregistryCredential"},"credentials":{"items":{"$ref":"#/components/schemas/ContainerregistryCredential"},"type":["array","null"]},"imageName":{"description":"Name of the image to pull (e.g., nginx)","minLength":1,"type":"string"},"tag":{"description":"Tag of the image to pull (e.g., latest)","type":"string"}},"required":["imageName"],"type":"object"},"ImageSearchResult":{"additionalProperties":false,"properties":{"automated":{"type":"boolean"},"description":{"type":"string"},"name":{"type":"string"},"official":{"type":"boolean"},"starCount":{"format":"int64","type":"integer"}},"required":["name","description","starCount","official","automated"],"type":"object"},"ImageSummary":{"additionalProperties":false,"properties":{"created":{"format":"int64","type":"integer"},"id":{"type":"string"},"inUse":{"type":"boolean"},"labels":{"additionalProperties":{},"type":"object"},"repo":{"type":"string"},"repoDigests":{"items":{"type":"string"},"type":["array","null"]},"repoTags":{"items":{"type":"string"},"type":["array","null"]},"size":{"format":"int64","type":"integer"},"tag":{"type":"string"},"updateInfo":{"$ref":"#/components/schemas/ImageUpdateInfo"},"usedBy":{"items":{"$ref":"#/components/schemas/ImageUsedBy"},"type":["array","null"]},"virtualSize":{"format":"int64","type":"integer"},"vulnerabilityScan":{"$ref":"#/components/schemas/VulnerabilityScanSummary"}},"required":["id","repoTags","repoDigests","created","size","virtualSize","labels","inUse","repo","tag"],"type":"object"},"ImageTagRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageTagRequest.json"],"format":"uri","readOnly":true,"type":"string"},"repository":{"description":"Target repository name","type":"string"},"tag":{"description":"Target tag","type":"string"}},"required":["repository"],"type":"object"},"ImageUpdateInfo":{"additionalProperties":false,"properties":{"authMethod":{"type":"string"},"authRegistry":{"type":"string"},"authUsername":{"type":"string"},"checkTime":{"format":"date-time","type":"string"},"currentDigest":{"type":"string"},"currentVersion":{"type":"string"},"error":{"type":"string"},"hasUpdate":{"type":"boolean"},"latestDigest":{"type":"string"},"latestVersion":{"type":"string"},"responseTimeMs":{"format":"int64","type":"integer"},"updateType":{"type":"string"},"usedCredential":{"type":"boolean"}},"required":["hasUpdate","updateType","currentVersion","latestVersion","currentDigest","latestDigest","checkTime","responseTimeMs","error"],"type":"object"},"ImageUsageCounts":{"additionalProperties":false,"properties":{"imagesInuse":{"format":"int64","type":"integer"},"imagesUnused":{"format":"int64","type":"integer"},"totalImageSize":{"format":"int64","type":"integer"},"totalImages":{"format":"int64","type":"integer"}},"required":["imagesInuse","imagesUnused","totalImages","totalImageSize"],"type":"object"},"ImageUsageCountsResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageUsageCountsResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/ImageUsageCounts"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"ImageUsedBy":{"additionalProperties":false,"properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}},"required":["type","name"],"type":"object"},"ImageupdateBatchImageUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageupdateBatchImageUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"credentials":{"items":{"$ref":"#/components/schemas/ContainerregistryCredential"},"type":["array","null"]},"imageRefs":{"items":{"type":"string"},"type":["array","null"]}},"required":["imageRefs"],"type":"object"},"ImageupdateCheckAllImagesRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ImageupdateCheckAllImagesRequest.json"],"format":"uri","readOnly":true,"type":"string"},"credentials":{"items":{"$ref":"#/components/schemas/ContainerregistryCredential"},"type":["array","null"]}},"type":"object"},"ImageupdateResponse":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"authMethod":{"type":"string"},"authRegistry":{"type":"string"},"authUsername":{"type":"string"},"checkTime":{"format":"date-time","type":"string"},"currentDigest":{"type":"string"},"currentVersion":{"type":"string"},"error":{"type":"string"},"hasUpdate":{"type":"boolean"},"latestDigest":{"type":"string"},"latestVersion":{"type":"string"},"responseTimeMs":{"format":"int64","type":"integer"},"updateType":{"type":"string"},"usedCredential":{"type":"boolean"}},"required":["hasUpdate","updateType","currentVersion","checkTime","responseTimeMs"],"type":"object"},"ImageupdateSummary":{"additionalProperties":false,"properties":{"digestUpdates":{"format":"int64","type":"integer"},"errorsCount":{"format":"int64","type":"integer"},"imagesWithUpdates":{"format":"int64","type":"integer"},"totalImages":{"format":"int64","type":"integer"}},"required":["totalImages","imagesWithUpdates","digestUpdates","errorsCount"],"type":"object"},"JobscheduleConfig":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleConfig.json"],"format":"uri","readOnly":true,"type":"string"},"autoHealInterval":{"type":"string"},"autoUpdateInterval":{"type":"string"},"dockerClientRefreshInterval":{"type":"string"},"environmentHealthInterval":{"type":"string"},"eventCleanupInterval":{"type":"string"},"expiredSessionsCleanupInterval":{"type":"string"},"pollingInterval":{"type":"string"},"scheduledPruneInterval":{"type":"string"},"vulnerabilityScanInterval":{"type":"string"}},"required":["environmentHealthInterval","eventCleanupInterval","expiredSessionsCleanupInterval","autoUpdateInterval","dockerClientRefreshInterval","pollingInterval","scheduledPruneInterval","vulnerabilityScanInterval","autoHealInterval"],"type":"object"},"JobscheduleJobListResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleJobListResponse.json"],"format":"uri","readOnly":true,"type":"string"},"isAgent":{"type":"boolean"},"jobs":{"items":{"$ref":"#/components/schemas/JobscheduleJobStatus"},"type":["array","null"]}},"required":["jobs","isAgent"],"type":"object"},"JobscheduleJobPrerequisite":{"additionalProperties":false,"properties":{"isMet":{"type":"boolean"},"label":{"type":"string"},"settingKey":{"type":"string"},"settingsUrl":{"type":"string"}},"required":["settingKey","label","isMet"],"type":"object"},"JobscheduleJobRunResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleJobRunResponse.json"],"format":"uri","readOnly":true,"type":"string"},"message":{"type":"string"},"success":{"type":"boolean"}},"required":["success","message"],"type":"object"},"JobscheduleJobStatus":{"additionalProperties":false,"properties":{"canRunManually":{"type":"boolean"},"category":{"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"isContinuous":{"type":"boolean"},"managerOnly":{"type":"boolean"},"name":{"type":"string"},"nextRun":{"format":"date-time","type":"string"},"prerequisites":{"items":{"$ref":"#/components/schemas/JobscheduleJobPrerequisite"},"type":["array","null"]},"schedule":{"type":"string"},"settingsKey":{"type":"string"}},"required":["id","name","description","category","schedule","enabled","managerOnly","isContinuous","canRunManually","prerequisites"],"type":"object"},"JobscheduleUpdate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleUpdate.json"],"format":"uri","readOnly":true,"type":"string"},"autoHealInterval":{"type":"string"},"autoUpdateInterval":{"type":"string"},"dockerClientRefreshInterval":{"type":"string"},"environmentHealthInterval":{"type":"string"},"eventCleanupInterval":{"type":"string"},"expiredSessionsCleanupInterval":{"type":"string"},"pollingInterval":{"type":"string"},"scheduledPruneInterval":{"type":"string"},"vulnerabilityScanInterval":{"type":"string"}},"type":"object"},"ListOidcRoleMappingsOutputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ListOidcRoleMappingsOutputBody.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/RoleOidcRoleMapping"},"type":["array","null"]},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"LoggingConfig":{"additionalProperties":false,"properties":{"driver":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"MetaMetadata":{"additionalProperties":false,"properties":{"description":{"type":"string"},"key":{"type":"string"},"keywords":{"items":{"type":"string"},"type":["array","null"]},"label":{"type":"string"},"type":{"type":"string"}},"required":["key","label","type"],"type":"object"},"MetaTemplateMeta":{"additionalProperties":false,"properties":{"author":{"type":"string"},"documentationUrl":{"type":"string"},"envUrl":{"type":"string"},"iconUrl":{"type":"string"},"remoteUrl":{"type":"string"},"tags":{"items":{"type":"string"},"type":["array","null"]},"updatedAt":{"type":"string"},"version":{"type":"string"}},"type":"object"},"NetworkContainerEndpoint":{"additionalProperties":false,"properties":{"endpointId":{"type":"string"},"id":{"type":"string"},"ipv4Address":{"type":"string"},"ipv6Address":{"type":"string"},"macAddress":{"type":"string"},"name":{"type":"string"}},"required":["id","name","endpointId","ipv4Address","ipv6Address","macAddress"],"type":"object"},"NetworkCountsApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCountsApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkUsageCounts"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkCreateOptions":{"additionalProperties":false,"properties":{"attachable":{"description":"Allow manual container attachment","type":"boolean"},"checkDuplicate":{"description":"Check for duplicate network names","type":"boolean"},"driver":{"description":"Network driver (e.g., bridge, overlay)","type":"string"},"enableIPv6":{"description":"Enable IPv6 networking","type":"boolean"},"ingress":{"description":"Enable routing-mesh for swarm cluster","type":"boolean"},"internal":{"description":"Restrict external access to the network","type":"boolean"},"ipam":{"$ref":"#/components/schemas/NetworkIPAM","description":"IP Address Management configuration"},"labels":{"additionalProperties":{"type":"string"},"description":"User-defined labels","type":"object"},"options":{"additionalProperties":{"type":"string"},"description":"Driver-specific options","type":"object"}},"type":"object"},"NetworkCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"name":{"description":"Name of the network","minLength":1,"type":"string"},"options":{"$ref":"#/components/schemas/NetworkCreateOptions","description":"Network creation options"}},"required":["name","options"],"type":"object"},"NetworkCreateResponse":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"id":{"type":"string"},"warning":{"type":"string"}},"required":["id"],"type":"object"},"NetworkCreatedApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCreatedApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkCreateResponse"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkIPAM":{"additionalProperties":false,"properties":{"config":{"items":{"$ref":"#/components/schemas/NetworkIPAMConfig"},"type":["array","null"]},"driver":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"NetworkIPAMConfig":{"additionalProperties":false,"properties":{"auxAddress":{"additionalProperties":{"type":"string"},"type":"object"},"gateway":{"type":"string"},"ipRange":{"type":"string"},"subnet":{"type":"string"}},"type":"object"},"NetworkInspect":{"additionalProperties":false,"properties":{"attachable":{"type":"boolean"},"configFrom":{"$ref":"#/components/schemas/DockerNetworkConfigReference"},"configOnly":{"type":"boolean"},"containers":{"additionalProperties":{"$ref":"#/components/schemas/DockerNetworkEndpointResource"},"type":"object"},"containersList":{"items":{"$ref":"#/components/schemas/NetworkContainerEndpoint"},"type":["array","null"]},"created":{"format":"date-time","type":"string"},"driver":{"type":"string"},"enableIPv4":{"type":"boolean"},"enableIPv6":{"type":"boolean"},"id":{"type":"string"},"ingress":{"type":"boolean"},"internal":{"type":"boolean"},"ipam":{"$ref":"#/components/schemas/NetworkIPAM"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"peers":{"items":{"$ref":"#/components/schemas/DockerNetworkPeerInfo"},"type":["array","null"]},"scope":{"type":"string"},"services":{"additionalProperties":{"$ref":"#/components/schemas/DockerNetworkServiceInfo"},"type":"object"}},"required":["id","name","driver","scope","created","enableIPv4","enableIPv6","ipam","internal","attachable","ingress","configFrom","configOnly","containers","options","labels","containersList"],"type":"object"},"NetworkInspectApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkInspectApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkInspect"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkMessageApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkMessageApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/BaseMessageResponse"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"counts":{"$ref":"#/components/schemas/NetworkUsageCounts"},"data":{"items":{"$ref":"#/components/schemas/NetworkSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","counts","pagination"],"type":"object"},"NetworkPruneReport":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"networksDeleted":{"items":{"type":"string"},"type":["array","null"]},"spaceReclaimed":{"format":"int64","minimum":0,"type":"integer"}},"required":["networksDeleted","spaceReclaimed"],"type":"object"},"NetworkPruneResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkPruneResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkPruneReport"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkSummary":{"additionalProperties":false,"properties":{"created":{"format":"date-time","type":"string"},"driver":{"type":"string"},"id":{"type":"string"},"inUse":{"type":"boolean"},"isDefault":{"type":"boolean"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"scope":{"type":"string"}},"required":["id","name","driver","scope","created","options","labels","inUse","isDefault"],"type":"object"},"NetworkTopology":{"additionalProperties":false,"properties":{"edges":{"items":{"$ref":"#/components/schemas/NetworkTopologyEdge"},"type":["array","null"]},"nodes":{"items":{"$ref":"#/components/schemas/NetworkTopologyNode"},"type":["array","null"]}},"required":["nodes","edges"],"type":"object"},"NetworkTopologyApiResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkTopologyApiResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/NetworkTopology"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"NetworkTopologyEdge":{"additionalProperties":false,"properties":{"id":{"type":"string"},"ipv4Address":{"type":"string"},"ipv6Address":{"type":"string"},"source":{"type":"string"},"target":{"type":"string"}},"required":["id","source","target"],"type":"object"},"NetworkTopologyNode":{"additionalProperties":false,"properties":{"id":{"type":"string"},"metadata":{"$ref":"#/components/schemas/NetworkTopologyNodeMetadata"},"name":{"type":"string"},"type":{"type":"string"}},"required":["id","name","type","metadata"],"type":"object"},"NetworkTopologyNodeMetadata":{"additionalProperties":false,"properties":{"driver":{"type":"string"},"image":{"type":"string"},"isDefault":{"type":"boolean"},"scope":{"type":"string"},"status":{"type":"string"}},"type":"object"},"NetworkUsageCounts":{"additionalProperties":false,"properties":{"inuse":{"format":"int64","type":"integer"},"total":{"format":"int64","type":"integer"},"unused":{"format":"int64","type":"integer"}},"required":["inuse","unused","total"],"type":"object"},"NotificationDispatchAutoHeal":{"additionalProperties":false,"properties":{"containerId":{"type":"string"},"containerName":{"type":"string"}},"required":["containerName","containerId"],"type":"object"},"NotificationDispatchBatchImageUpdate":{"additionalProperties":false,"properties":{"updates":{"additionalProperties":{"$ref":"#/components/schemas/ImageupdateResponse"},"type":"object"}},"required":["updates"],"type":"object"},"NotificationDispatchContainerUpdate":{"additionalProperties":false,"properties":{"containerName":{"type":"string"},"imageRef":{"type":"string"},"newDigest":{"type":"string"},"oldDigest":{"type":"string"}},"required":["containerName","imageRef"],"type":"object"},"NotificationDispatchImageUpdate":{"additionalProperties":false,"properties":{"imageRef":{"type":"string"},"updateInfo":{"$ref":"#/components/schemas/ImageupdateResponse"}},"required":["imageRef","updateInfo"],"type":"object"},"NotificationDispatchPruneReport":{"additionalProperties":false,"properties":{"result":{"$ref":"#/components/schemas/SystemPruneAllResult"}},"required":["result"],"type":"object"},"NotificationDispatchRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationDispatchRequest.json"],"format":"uri","readOnly":true,"type":"string"},"autoHeal":{"$ref":"#/components/schemas/NotificationDispatchAutoHeal"},"batchImageUpdate":{"$ref":"#/components/schemas/NotificationDispatchBatchImageUpdate"},"containerUpdate":{"$ref":"#/components/schemas/NotificationDispatchContainerUpdate"},"imageUpdate":{"$ref":"#/components/schemas/NotificationDispatchImageUpdate"},"kind":{"type":"string"},"pruneReport":{"$ref":"#/components/schemas/NotificationDispatchPruneReport"},"vulnerabilityFound":{"$ref":"#/components/schemas/NotificationDispatchVulnerabilityFound"}},"required":["kind"],"type":"object"},"NotificationDispatchResponse":{"additionalProperties":false,"properties":{"delivered":{"format":"int64","type":"integer"},"message":{"type":"string"}},"required":["message","delivered"],"type":"object"},"NotificationDispatchVulnerabilityFound":{"additionalProperties":false,"properties":{"cveId":{"type":"string"},"cveLink":{"type":"string"},"fixedVersion":{"type":"string"},"imageName":{"type":"string"},"installedVersion":{"type":"string"},"pkgName":{"type":"string"},"severity":{"type":"string"}},"required":["cveId","cveLink","severity","imageName"],"type":"object"},"NotificationResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationResponse.json"],"format":"uri","readOnly":true,"type":"string"},"config":{"additionalProperties":{},"type":"object"},"enabled":{"type":"boolean"},"id":{"format":"int64","minimum":0,"type":"integer"},"provider":{"type":"string"}},"required":["id","provider","enabled","config"],"type":"object"},"NotificationTestResponse":{"additionalProperties":false,"properties":{"message":{"type":"string"},"warning":{"type":"string"}},"required":["message"],"type":"object"},"NotificationUpdate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationUpdate.json"],"format":"uri","readOnly":true,"type":"string"},"config":{"additionalProperties":{},"type":"object"},"enabled":{"type":"boolean"},"provider":{"type":"string"}},"required":["provider","enabled","config"],"type":"object"},"PortPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/PortPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/PortPortMapping"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"PortPortMapping":{"additionalProperties":false,"properties":{"containerId":{"type":"string"},"containerName":{"type":"string"},"containerPort":{"format":"int64","type":"integer"},"hostIp":{"type":"string"},"hostPort":{"format":"int64","type":"integer"},"id":{"type":"string"},"isPublished":{"type":"boolean"},"protocol":{"type":"string"}},"required":["id","containerId","containerName","containerPort","protocol","isPublished"],"type":"object"},"ProjectCreateProject":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectCreateProject.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"},"projectFiles":{"items":{"$ref":"#/components/schemas/ProjectProjectFileDraft"},"maxItems":500,"type":["array","null"]}},"required":["name","composeContent"],"type":"object"},"ProjectCreateReponse":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"archivedAt":{"format":"date-time","type":"string"},"createdAt":{"type":"string"},"dirName":{"type":"string"},"gitOpsManagedBy":{"type":"string"},"id":{"type":"string"},"isArchived":{"type":"boolean"},"name":{"type":"string"},"path":{"type":"string"},"relativePath":{"type":"string"},"runningCount":{"format":"int64","type":"integer"},"serviceCount":{"format":"int64","type":"integer"},"status":{"type":"string"},"statusReason":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","path","status","serviceCount","runningCount","isArchived","createdAt","updatedAt"],"type":"object"},"ProjectDeployOptions":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectDeployOptions.json"],"format":"uri","readOnly":true,"type":"string"},"forceRecreate":{"type":"boolean"},"pullPolicy":{"type":"string"},"removeOrphans":{"type":"boolean"}},"type":"object"},"ProjectDestroy":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectDestroy.json"],"format":"uri","readOnly":true,"type":"string"},"removeFiles":{"type":"boolean"},"removeVolumes":{"type":"boolean"}},"type":"object"},"ProjectDetails":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"archivedAt":{"format":"date-time","type":"string"},"composeContent":{"type":"string"},"composeFileName":{"type":"string"},"createdAt":{"type":"string"},"dirName":{"type":"string"},"directoryFiles":{"items":{"$ref":"#/components/schemas/ProjectIncludeFile"},"type":["array","null"]},"envContent":{"type":"string"},"fileTreeRevision":{"type":"string"},"gitOpsManagedBy":{"type":"string"},"gitRepositoryURL":{"type":"string"},"hasBuildDirective":{"type":"boolean"},"iconDarkUrl":{"type":"string"},"iconLightUrl":{"type":"string"},"id":{"type":"string"},"includeFiles":{"items":{"$ref":"#/components/schemas/ProjectIncludeFile"},"type":["array","null"]},"isArchived":{"type":"boolean"},"isDiscovered":{"type":"boolean"},"lastSyncCommit":{"type":"string"},"name":{"type":"string"},"path":{"type":"string"},"projectFiles":{"items":{"$ref":"#/components/schemas/ProjectProjectFile"},"type":["array","null"]},"redeployDisabled":{"type":"boolean"},"relativePath":{"type":"string"},"runningCount":{"format":"int64","type":"integer"},"runtimeServices":{"items":{"$ref":"#/components/schemas/ProjectRuntimeService"},"type":["array","null"]},"serviceCount":{"format":"int64","type":"integer"},"services":{"items":{"$ref":"#/components/schemas/DockerTypesServiceConfig"},"type":["array","null"]},"status":{"type":"string"},"statusReason":{"type":"string"},"updateInfo":{"$ref":"#/components/schemas/ProjectUpdateInfo"},"updatedAt":{"type":"string"},"urls":{"items":{"type":"string"},"type":["array","null"]}},"required":["id","name","path","status","serviceCount","runningCount","isArchived","createdAt","updatedAt"],"type":"object"},"ProjectIncludeFile":{"additionalProperties":false,"properties":{"content":{"type":"string"},"path":{"type":"string"},"relativePath":{"type":"string"}},"required":["path","relativePath"],"type":"object"},"ProjectPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/ProjectDetails"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"ProjectProjectFile":{"additionalProperties":false,"properties":{"content":{"type":"string"},"isDirectory":{"type":"boolean"},"modTime":{"format":"date-time","type":"string"},"name":{"type":"string"},"path":{"type":"string"},"protected":{"type":"boolean"},"relativePath":{"type":"string"},"size":{"format":"int64","type":"integer"}},"required":["path","relativePath","name","isDirectory","size","modTime"],"type":"object"},"ProjectProjectFileChange":{"additionalProperties":false,"properties":{"content":{"type":"string"},"newName":{"type":"string"},"newParentPath":{"type":"string"},"operation":{"enum":["create_file","create_folder","update_file","rename","move","delete"],"type":"string"},"recursive":{"type":"boolean"},"relativePath":{"type":"string"}},"required":["operation","relativePath"],"type":"object"},"ProjectProjectFileDraft":{"additionalProperties":false,"properties":{"content":{"type":"string"},"isDirectory":{"type":"boolean"},"relativePath":{"type":"string"}},"required":["relativePath","isDirectory"],"type":"object"},"ProjectRuntimeService":{"additionalProperties":false,"properties":{"containerId":{"type":"string"},"containerName":{"type":"string"},"health":{"type":"string"},"iconDarkUrl":{"type":"string"},"iconLightUrl":{"type":"string"},"image":{"type":"string"},"name":{"type":"string"},"ports":{"items":{"type":"string"},"type":["array","null"]},"redeployDisabled":{"type":"boolean"},"serviceConfig":{"$ref":"#/components/schemas/ServiceConfig"},"status":{"type":"string"}},"required":["name","image","status"],"type":"object"},"ProjectStatusCounts":{"additionalProperties":false,"properties":{"archivedProjects":{"format":"int64","type":"integer"},"runningProjects":{"format":"int64","type":"integer"},"stoppedProjects":{"format":"int64","type":"integer"},"totalProjects":{"format":"int64","type":"integer"}},"required":["runningProjects","stoppedProjects","totalProjects","archivedProjects"],"type":"object"},"ProjectUpdateIncludeFile":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectUpdateIncludeFile.json"],"format":"uri","readOnly":true,"type":"string"},"content":{"type":"string"},"relativePath":{"type":"string"}},"required":["relativePath","content"],"type":"object"},"ProjectUpdateInfo":{"additionalProperties":false,"properties":{"checkedImageCount":{"format":"int64","type":"integer"},"errorCount":{"format":"int64","type":"integer"},"errorMessage":{"type":"string"},"hasUpdate":{"type":"boolean"},"imageCount":{"format":"int64","type":"integer"},"imageRefs":{"items":{"type":"string"},"type":["array","null"]},"imagesWithUpdates":{"format":"int64","type":"integer"},"lastCheckedAt":{"format":"date-time","type":"string"},"status":{"type":"string"},"updatedImageRefs":{"items":{"type":"string"},"type":["array","null"]}},"required":["status","hasUpdate","imageCount","checkedImageCount","imagesWithUpdates","errorCount"],"type":"object"},"ProjectUpdateProject":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectUpdateProject.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"},"fileChanges":{"items":{"$ref":"#/components/schemas/ProjectProjectFileChange"},"maxItems":500,"type":["array","null"]},"fileTreeRevision":{"type":"string"},"name":{"type":"string"}},"type":"object"},"PruneImagesInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/PruneImagesInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"dangling":{"type":"boolean"},"filters":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"},"mode":{"type":"string"},"until":{"type":"string"}},"type":"object"},"Resource":{"additionalProperties":false,"properties":{"cpus":{"format":"float","type":"number"},"devices":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceRequest"},"type":["array","null"]},"generic_resources":{"items":{"$ref":"#/components/schemas/DockerTypesGenericResource"},"type":["array","null"]},"memory":{"format":"int64","type":"integer"},"pids":{"format":"int64","type":"integer"}},"type":"object"},"RestartPolicy":{"additionalProperties":false,"properties":{"condition":{"type":"string"},"delay":{"format":"int64","type":"integer"},"max_attempts":{"format":"int64","minimum":0,"type":"integer"},"window":{"format":"int64","type":"integer"}},"type":"object"},"RestoreBackupFilesInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/RestoreBackupFilesInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"paths":{"description":"Paths to restore from backup","items":{"type":"string"},"type":["array","null"]}},"required":["paths"],"type":"object"},"RoleAccessSurface":{"additionalProperties":false,"properties":{"accessMode":{"description":"How reachability is evaluated","enum":["permissions","any-child"],"type":"string"},"children":{"description":"Child surface IDs used by aggregate landing surfaces","items":{"type":"string"},"type":["array","null"]},"fallbackOrder":{"description":"Positive ordering hint for route fallback selection","format":"int64","type":"integer"},"id":{"description":"Stable surface identifier","examples":["settings.category.webhooks"],"type":"string"},"kind":{"description":"Surface type","enum":["route","settings-category","customize-category","landing"],"type":"string"},"label":{"description":"Human-readable surface label","examples":["Webhooks"],"type":"string"},"matchMode":{"description":"How permissions are combined when accessMode is permissions","enum":["any-of","all-of"],"type":"string"},"permissions":{"description":"Permissions used by permission-based surfaces","items":{"type":"string"},"type":["array","null"]},"scopeMode":{"description":"Which effective permission scope is considered","enum":["global-only","selected-env-plus-global","any-effective-scope"],"type":"string"},"url":{"description":"Route URL or prefix represented by this surface","examples":["/settings/webhooks"],"type":"string"}},"required":["id","kind","label","accessMode","matchMode","scopeMode"],"type":"object"},"RoleCreateOidcRoleMapping":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/RoleCreateOidcRoleMapping.json"],"format":"uri","readOnly":true,"type":"string"},"claimValue":{"description":"OIDC claim value to match","minLength":1,"type":"string"},"environmentId":{"description":"Environment ID to scope the assignment to; omit for a global assignment","type":"string"},"roleId":{"description":"Role to grant","minLength":1,"type":"string"}},"required":["claimValue","roleId"],"type":"object"},"RoleCreateRole":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/RoleCreateRole.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"description":"Optional human description","maxLength":500,"type":"string"},"name":{"description":"Display name of the role","examples":["Deploy Bot"],"maxLength":100,"minLength":1,"type":"string"},"permissions":{"description":"Permission strings granted by this role","items":{"type":"string"},"minItems":1,"type":["array","null"]}},"required":["name","permissions"],"type":"object"},"RoleOidcRoleMapping":{"additionalProperties":false,"properties":{"claimValue":{"description":"OIDC claim value that triggers this mapping","examples":["docker-admins"],"type":"string"},"createdAt":{"format":"date-time","type":"string"},"environmentId":{"description":"Environment ID to scope the assignment to; omit for a global assignment","type":"string"},"id":{"description":"Unique identifier of the mapping","type":"string"},"roleId":{"description":"Role to assign when the claim matches","type":"string"},"source":{"description":"How this mapping was created. 'manual' rows are UI/API-managed and freely editable; 'env' rows are declared via OIDC_ROLE_MAPPINGS and are read-only at runtime.","enum":["manual","env"],"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","claimValue","roleId","source","createdAt"],"type":"object"},"RolePaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/RolePaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/RoleRole"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"RolePermissionAction":{"additionalProperties":false,"properties":{"description":{"description":"Optional longer description","type":"string"},"key":{"description":"Action verb","examples":["start"],"type":"string"},"label":{"description":"Human-readable label","examples":["Start"],"type":"string"},"permission":{"description":"Fully-qualified permission string used in role definitions","examples":["containers:start"],"type":"string"},"requires":{"description":"Permissions that should be auto-selected when this permission is chosen in the UI","items":{"type":"string"},"type":["array","null"]}},"required":["key","permission","label"],"type":"object"},"RolePermissionPreset":{"additionalProperties":false,"properties":{"description":{"description":"Optional longer description for the preset","type":"string"},"key":{"description":"Stable preset key","examples":["editor"],"type":"string"},"label":{"description":"Human-readable preset label","examples":["All permissions (non-admin)"],"type":"string"},"permissions":{"description":"Permissions included when the preset is selected","items":{"type":"string"},"type":["array","null"]}},"required":["key","label","permissions"],"type":"object"},"RolePermissionResource":{"additionalProperties":false,"properties":{"actions":{"description":"Actions available on this resource","items":{"$ref":"#/components/schemas/RolePermissionAction"},"type":["array","null"]},"key":{"description":"Stable resource key","examples":["containers"],"type":"string"},"label":{"description":"Human-readable label","examples":["Containers"],"type":"string"},"scope":{"description":"'global' for org-level perms; 'env' for per-environment perms","enum":["global","env"],"type":"string"}},"required":["key","label","scope","actions"],"type":"object"},"RolePermissionsManifest":{"additionalProperties":false,"properties":{"accessSurfaces":{"description":"Backend-owned route, landing, and category access metadata for frontend UX gating","items":{"$ref":"#/components/schemas/RoleAccessSurface"},"type":["array","null"]},"presets":{"description":"Optional preset permission bundles for bulk selection in the UI","items":{"$ref":"#/components/schemas/RolePermissionPreset"},"type":["array","null"]},"resources":{"description":"Resource groups, in display order","items":{"$ref":"#/components/schemas/RolePermissionResource"},"type":["array","null"]}},"required":["resources"],"type":"object"},"RoleRole":{"additionalProperties":false,"properties":{"assignedUserCount":{"description":"How many users currently hold an assignment to this role","format":"int64","type":"integer"},"builtIn":{"description":"True for built-in roles (Admin/Editor/Deployer/Viewer); built-ins cannot be edited or deleted","type":"boolean"},"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"description":{"description":"Optional human description","type":"string"},"id":{"description":"Unique identifier of the role","examples":["role_admin"],"type":"string"},"name":{"description":"Display name of the role","examples":["Admin"],"type":"string"},"permissions":{"description":"Permission strings granted by this role","examples":[["containers:start","projects:deploy"]],"items":{"type":"string"},"type":["array","null"]},"updatedAt":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["id","name","permissions","builtIn","assignedUserCount","createdAt"],"type":"object"},"RoleRoleAssignment":{"additionalProperties":false,"properties":{"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"environmentId":{"description":"Environment ID this assignment is scoped to; omit for a global assignment","type":"string"},"id":{"description":"Unique identifier of the assignment","type":"string"},"roleId":{"description":"ID of the granted role","type":"string"},"source":{"description":"How the assignment was created","enum":["manual","oidc"],"type":"string"},"userId":{"description":"ID of the user holding this assignment","type":"string"}},"required":["id","userId","roleId","source","createdAt"],"type":"object"},"RoleSetUserAssignments":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/RoleSetUserAssignments.json"],"format":"uri","readOnly":true,"type":"string"},"assignments":{"description":"Desired manual role assignments for the user","items":{"$ref":"#/components/schemas/RoleUserAssignmentInput"},"type":["array","null"]}},"required":["assignments"],"type":"object"},"RoleUpdateOidcRoleMapping":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/RoleUpdateOidcRoleMapping.json"],"format":"uri","readOnly":true,"type":"string"},"claimValue":{"minLength":1,"type":"string"},"environmentId":{"type":"string"},"roleId":{"minLength":1,"type":"string"}},"required":["claimValue","roleId"],"type":"object"},"RoleUpdateRole":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/RoleUpdateRole.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"description":"Optional human description","maxLength":500,"type":"string"},"name":{"description":"Display name of the role","maxLength":100,"minLength":1,"type":"string"},"permissions":{"description":"Permission strings granted by this role","items":{"type":"string"},"minItems":1,"type":["array","null"]}},"required":["name","permissions"],"type":"object"},"RoleUserAssignmentInput":{"additionalProperties":false,"properties":{"environmentId":{"description":"Environment ID to scope the assignment to; omit for a global assignment","type":"string"},"roleId":{"description":"ID of the role to grant","type":"string"}},"required":["roleId"],"type":"object"},"ScannerStatus":{"additionalProperties":false,"properties":{"available":{"type":"boolean"},"version":{"type":"string"}},"required":["available"],"type":"object"},"SearchRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SearchRequest.json"],"format":"uri","readOnly":true,"type":"string"},"query":{"type":"string"}},"required":["query"],"type":"object"},"SearchResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SearchResponse.json"],"format":"uri","readOnly":true,"type":"string"},"count":{"format":"int64","type":"integer"},"query":{"type":"string"},"results":{"items":{"$ref":"#/components/schemas/CategoryCategory"},"type":["array","null"]}},"required":["results","query","count"],"type":"object"},"ServiceConfig":{"additionalProperties":false,"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"attach":{"type":"boolean"},"blkio_config":{"$ref":"#/components/schemas/BlkioConfig"},"build":{"$ref":"#/components/schemas/BuildConfig"},"cap_add":{"items":{"type":"string"},"type":["array","null"]},"cap_drop":{"items":{"type":"string"},"type":["array","null"]},"cgroup":{"type":"string"},"cgroup_parent":{"type":"string"},"command":{"items":{"type":"string"},"type":["array","null"]},"configs":{"items":{"$ref":"#/components/schemas/DockerTypesServiceConfigObjConfig"},"type":["array","null"]},"container_name":{"type":"string"},"cpu_count":{"format":"int64","type":"integer"},"cpu_percent":{"format":"float","type":"number"},"cpu_period":{"format":"int64","type":"integer"},"cpu_quota":{"format":"int64","type":"integer"},"cpu_rt_period":{"format":"int64","type":"integer"},"cpu_rt_runtime":{"format":"int64","type":"integer"},"cpu_shares":{"format":"int64","type":"integer"},"cpus":{"format":"float","type":"number"},"cpuset":{"type":"string"},"credential_spec":{"$ref":"#/components/schemas/CredentialSpecConfig"},"depends_on":{"additionalProperties":{"$ref":"#/components/schemas/DockerTypesServiceDependency"},"type":"object"},"deploy":{"$ref":"#/components/schemas/DeployConfig"},"develop":{"$ref":"#/components/schemas/DevelopConfig"},"device_cgroup_rules":{"items":{"type":"string"},"type":["array","null"]},"devices":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceMapping"},"type":["array","null"]},"dns":{"items":{"type":"string"},"type":["array","null"]},"dns_opt":{"items":{"type":"string"},"type":["array","null"]},"dns_search":{"items":{"type":"string"},"type":["array","null"]},"dockerfile":{"type":"string"},"domainname":{"type":"string"},"entrypoint":{"items":{"type":"string"},"type":["array","null"]},"env_file":{"items":{"$ref":"#/components/schemas/DockerTypesEnvFile"},"type":["array","null"]},"environment":{"additionalProperties":{"type":["string","null"]},"type":"object"},"expose":{"items":{"type":"string"},"type":["array","null"]},"extends":{"$ref":"#/components/schemas/ExtendsConfig"},"external_links":{"items":{"type":"string"},"type":["array","null"]},"extra_hosts":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"},"gpus":{"items":{"$ref":"#/components/schemas/DockerTypesDeviceRequest"},"type":["array","null"]},"group_add":{"items":{"type":"string"},"type":["array","null"]},"healthcheck":{"$ref":"#/components/schemas/HealthCheckConfig"},"hostname":{"type":"string"},"image":{"type":"string"},"init":{"type":"boolean"},"ipc":{"type":"string"},"isolation":{"type":"string"},"label_file":{"items":{"type":"string"},"type":["array","null"]},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"links":{"items":{"type":"string"},"type":["array","null"]},"log_driver":{"type":"string"},"log_opt":{"additionalProperties":{"type":"string"},"type":"object"},"logging":{"$ref":"#/components/schemas/LoggingConfig"},"mac_address":{"type":"string"},"mem_limit":{"format":"int64","type":"integer"},"mem_reservation":{"format":"int64","type":"integer"},"mem_swappiness":{"format":"int64","type":"integer"},"memswap_limit":{"format":"int64","type":"integer"},"models":{"additionalProperties":{"$ref":"#/components/schemas/ServiceModelConfig"},"type":"object"},"net":{"type":"string"},"network_mode":{"type":"string"},"networks":{"additionalProperties":{"$ref":"#/components/schemas/ServiceNetworkConfig"},"type":"object"},"oom_kill_disable":{"type":"boolean"},"oom_score_adj":{"format":"int64","type":"integer"},"pid":{"type":"string"},"pids_limit":{"format":"int64","type":"integer"},"platform":{"type":"string"},"ports":{"items":{"$ref":"#/components/schemas/DockerTypesServicePortConfig"},"type":["array","null"]},"post_start":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"pre_start":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"pre_stop":{"items":{"$ref":"#/components/schemas/DockerTypesServiceHook"},"type":["array","null"]},"privileged":{"type":"boolean"},"profiles":{"items":{"type":"string"},"type":["array","null"]},"provider":{"$ref":"#/components/schemas/ServiceProviderConfig"},"pull_policy":{"type":"string"},"read_only":{"type":"boolean"},"restart":{"type":"string"},"runtime":{"type":"string"},"scale":{"format":"int64","type":"integer"},"secrets":{"items":{"$ref":"#/components/schemas/DockerTypesServiceSecretConfig"},"type":["array","null"]},"security_opt":{"items":{"type":"string"},"type":["array","null"]},"shm_size":{"format":"int64","type":"integer"},"stdin_open":{"type":"boolean"},"stop_grace_period":{"format":"int64","type":"integer"},"stop_signal":{"type":"string"},"storage_opt":{"additionalProperties":{"type":"string"},"type":"object"},"sysctls":{"additionalProperties":{"type":"string"},"type":"object"},"tmpfs":{"items":{"type":"string"},"type":["array","null"]},"tty":{"type":"boolean"},"ulimits":{"additionalProperties":{"$ref":"#/components/schemas/UlimitsConfig"},"type":"object"},"use_api_socket":{"type":"boolean"},"user":{"type":"string"},"userns_mode":{"type":"string"},"uts":{"type":"string"},"volume_driver":{"type":"string"},"volumes":{"items":{"$ref":"#/components/schemas/DockerTypesServiceVolumeConfig"},"type":["array","null"]},"volumes_from":{"items":{"type":"string"},"type":["array","null"]},"working_dir":{"type":"string"}},"required":["command","entrypoint"],"type":"object"},"ServiceModelConfig":{"additionalProperties":false,"properties":{"endpoint_var":{"type":"string"},"model_var":{"type":"string"}},"type":"object"},"ServiceNetworkConfig":{"additionalProperties":false,"properties":{"aliases":{"items":{"type":"string"},"type":["array","null"]},"driver_opts":{"additionalProperties":{"type":"string"},"type":"object"},"gw_priority":{"format":"int64","type":"integer"},"interface_name":{"type":"string"},"ipv4_address":{"type":"string"},"ipv6_address":{"type":"string"},"link_local_ips":{"items":{"type":"string"},"type":["array","null"]},"mac_address":{"type":"string"},"priority":{"format":"int64","type":"integer"}},"type":"object"},"ServiceProviderConfig":{"additionalProperties":false,"properties":{"options":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"type":"object"},"type":{"type":"string"}},"type":"object"},"ServiceVolumeBind":{"additionalProperties":false,"properties":{"create_host_path":{"type":"boolean"},"propagation":{"type":"string"},"recursive":{"type":"string"},"selinux":{"type":"string"}},"type":"object"},"ServiceVolumeImage":{"additionalProperties":false,"properties":{"subpath":{"type":"string"}},"type":"object"},"ServiceVolumeTmpfs":{"additionalProperties":false,"properties":{"mode":{"format":"int32","minimum":0,"type":"integer"},"size":{"format":"int64","type":"integer"}},"type":"object"},"ServiceVolumeVolume":{"additionalProperties":false,"properties":{"labels":{"additionalProperties":{"type":"string"},"type":"object"},"nocopy":{"type":"boolean"},"subpath":{"type":"string"}},"type":"object"},"SetAutoUpdateInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SetAutoUpdateInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"enabled":{"description":"Whether auto-update is enabled for this container","type":"boolean"}},"required":["enabled"],"type":"object"},"SettingsPublicSetting":{"additionalProperties":false,"properties":{"key":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"required":["key","type","value"],"type":"object"},"SettingsSettingDto":{"additionalProperties":false,"properties":{"isPublic":{"type":"boolean"},"key":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"required":["isPublic","key","type","value"],"type":"object"},"SettingsUpdate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SettingsUpdate.json"],"format":"uri","readOnly":true,"type":"string"},"accentColor":{"type":"string"},"activityHistoryMaxEntries":{"type":"string"},"activityHistoryRetentionDays":{"type":"string"},"animationsEnabled":{"type":"string"},"applicationTheme":{"type":"string"},"authLocalEnabled":{"type":"string"},"authPasswordPolicy":{"type":"string"},"authSessionTimeout":{"type":"string"},"autoHealEnabled":{"type":"string"},"autoHealExcludedContainers":{"type":"string"},"autoHealInterval":{"type":"string"},"autoHealMaxRestarts":{"type":"string"},"autoHealRestartWindow":{"type":"string"},"autoInjectEnv":{"type":"string"},"autoUpdate":{"type":"string"},"autoUpdateExcludedContainers":{"type":"string"},"autoUpdateInterval":{"type":"string"},"avatarMaxUploadSizeMb":{"type":"string"},"baseServerUrl":{"type":"string"},"buildProvider":{"type":"string"},"buildTimeout":{"type":"string"},"buildsDirectory":{"type":"string"},"defaultDeployPullPolicy":{"type":"string"},"defaultShell":{"type":"string"},"depotProjectId":{"type":"string"},"depotToken":{"type":"string"},"diskUsagePath":{"type":"string"},"dockerApiTimeout":{"type":"string"},"dockerClientRefreshInterval":{"type":"string"},"dockerHost":{"type":"string"},"dockerImagePullTimeout":{"type":"string"},"enableGravatar":{"type":"string"},"environmentHealthInterval":{"type":"string"},"followProjectSymlinks":{"type":"string"},"gitOperationTimeout":{"type":"string"},"gitSyncMaxBinarySizeMb":{"type":"string"},"gitSyncMaxFiles":{"type":"string"},"gitSyncMaxTotalSizeMb":{"type":"string"},"glassEffectsEnabled":{"type":"string"},"httpClientTimeout":{"type":"string"},"iconCatalog":{"type":"string"},"keyboardShortcutsEnabled":{"type":"string"},"lifecycleDefaultRunnerImage":{"type":"string"},"lifecycleEnabled":{"type":"string"},"lifecycleMaxTimeoutSec":{"type":"string"},"maxImageUploadSize":{"type":"string"},"mobileNavigationMode":{"type":"string"},"mobileNavigationShowLabels":{"type":"string"},"oidcAutoRedirectToProvider":{"type":"string"},"oidcClientId":{"type":"string"},"oidcClientSecret":{"type":"string"},"oidcEnabled":{"type":"string"},"oidcGroupsClaim":{"type":"string"},"oidcIssuerUrl":{"type":"string"},"oidcMergeAccounts":{"type":"string"},"oidcProviderLogoUrl":{"type":"string"},"oidcProviderName":{"type":"string"},"oidcScopes":{"type":"string"},"oidcSkipTlsVerify":{"type":"string"},"oledMode":{"type":"string"},"pollingEnabled":{"type":"string"},"pollingInterval":{"type":"string"},"projectsDirectory":{"type":"string"},"proxyRequestTimeout":{"type":"string"},"pruneBuildCacheMode":{"type":"string"},"pruneBuildCacheUntil":{"type":"string"},"pruneContainerMode":{"type":"string"},"pruneContainerUntil":{"type":"string"},"pruneImageMode":{"type":"string"},"pruneImageUntil":{"type":"string"},"pruneNetworkMode":{"type":"string"},"pruneNetworkUntil":{"type":"string"},"pruneVolumeMode":{"type":"string"},"registryTimeout":{"type":"string"},"scheduledPruneEnabled":{"type":"string"},"scheduledPruneInterval":{"type":"string"},"sidebarHoverExpansion":{"type":"string"},"swarmStackSourcesDirectory":{"type":"string"},"templatesDirectory":{"type":"string"},"trivyConcurrentScanContainers":{"type":"string"},"trivyCpuLimit":{"type":"string"},"trivyIgnoreUnfixed":{"type":"string"},"trivyImage":{"type":"string"},"trivyMemoryLimitMb":{"type":"string"},"trivyNetwork":{"type":"string"},"trivyPreserveCacheOnVolumePrune":{"type":"string"},"trivyPrivileged":{"type":"string"},"trivyResourceLimitsEnabled":{"type":"string"},"trivyScanTimeout":{"type":"string"},"trivySecurityOpts":{"type":"string"},"trivyServerEnabled":{"type":"string"},"trivyServerToken":{"type":"string"},"trivyServerUrl":{"type":"string"},"volumeBrowserHelperIdleTimeout":{"type":"string"},"vulnerabilityScanEnabled":{"type":"string"},"vulnerabilityScanInterval":{"type":"string"}},"type":"object"},"SwarmConfigCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmConfigCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"spec":{"description":"Config specification"}},"required":["spec"],"type":"object"},"SwarmConfigSummary":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"spec":{"$ref":"#/components/schemas/DockerSwarmConfigSpec"},"updatedAt":{"format":"date-time","type":"string"},"version":{"$ref":"#/components/schemas/DockerSwarmVersion"}},"required":["id","version","createdAt","updatedAt","spec"],"type":"object"},"SwarmConfigUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmConfigUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"spec":{"description":"Updated config specification"},"version":{"format":"int64","minimum":0,"type":"integer"}},"required":["spec"],"type":"object"},"SwarmNodeAgentDeployment":{"additionalProperties":false,"properties":{"agent":{"$ref":"#/components/schemas/SwarmNodeAgentStatus"},"dockerCompose":{"description":"Docker compose YAML snippet","type":"string"},"dockerRun":{"description":"Docker run command snippet","type":"string"},"environmentId":{"type":"string"},"mtls":{"$ref":"#/components/schemas/DeploymentSnippetMTLS","description":"Optional Arcane-generated mTLS deployment assets for edge agents"}},"required":["environmentId","agent","dockerRun","dockerCompose"],"type":"object"},"SwarmNodeAgentStatus":{"additionalProperties":false,"properties":{"connected":{"type":"boolean"},"environmentId":{"type":"string"},"lastHeartbeat":{"format":"date-time","type":"string"},"lastPollAt":{"format":"date-time","type":"string"},"reportedHostname":{"type":"string"},"reportedNodeId":{"type":"string"},"state":{"type":"string"}},"required":["state"],"type":"object"},"SwarmNodeIdentity":{"additionalProperties":false,"properties":{"engineVersion":{"type":"string"},"hostname":{"type":"string"},"role":{"type":"string"},"swarmActive":{"type":"boolean"},"swarmNodeId":{"type":"string"}},"required":["swarmNodeId","hostname","role","engineVersion","swarmActive"],"type":"object"},"SwarmNodeSummary":{"additionalProperties":false,"properties":{"address":{"type":"string"},"agent":{"$ref":"#/components/schemas/SwarmNodeAgentStatus"},"availability":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"engineVersion":{"type":"string"},"hostname":{"type":"string"},"id":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managerStatus":{"type":"string"},"platform":{"type":"string"},"reachability":{"type":"string"},"role":{"type":"string"},"status":{"type":"string"},"systemLabels":{"additionalProperties":{"type":"string"},"type":"object"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","hostname","role","availability","status","createdAt","updatedAt","agent"],"type":"object"},"SwarmNodeUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmNodeUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"availability":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"role":{"type":"string"},"version":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"SwarmPaginatedResponseNodeSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseNodeSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/SwarmNodeSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"SwarmPaginatedResponseServiceSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseServiceSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/SwarmServiceSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"SwarmPaginatedResponseStackSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseStackSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/SwarmStackSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"SwarmPaginatedResponseTaskSummary":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseTaskSummary.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/SwarmTaskSummary"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"SwarmRuntimeStatus":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"type":"object"},"SwarmSecretCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSecretCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"spec":{"description":"Secret specification"}},"required":["spec"],"type":"object"},"SwarmSecretSummary":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"spec":{"$ref":"#/components/schemas/DockerSwarmSecretSpec"},"updatedAt":{"format":"date-time","type":"string"},"version":{"$ref":"#/components/schemas/DockerSwarmVersion"}},"required":["id","version","createdAt","updatedAt","spec"],"type":"object"},"SwarmSecretUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSecretUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"spec":{"description":"Updated secret specification"},"version":{"format":"int64","minimum":0,"type":"integer"}},"required":["spec"],"type":"object"},"SwarmServiceCreateOptions":{"additionalProperties":false,"properties":{"encodedRegistryAuth":{"type":"string"},"queryRegistry":{"type":"boolean"}},"type":"object"},"SwarmServiceCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"options":{"$ref":"#/components/schemas/SwarmServiceCreateOptions","description":"Additional create options"},"spec":{"description":"Service specification"}},"required":["spec"],"type":"object"},"SwarmServiceCreateResponse":{"additionalProperties":false,"properties":{"id":{"type":"string"},"warnings":{"items":{"type":"string"},"type":["array","null"]}},"required":["id"],"type":"object"},"SwarmServiceInspect":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"endpoint":{"$ref":"#/components/schemas/DockerSwarmEndpoint"},"id":{"type":"string"},"mounts":{"items":{"$ref":"#/components/schemas/SwarmServiceMount"},"type":["array","null"]},"networkDetails":{"additionalProperties":{"$ref":"#/components/schemas/SwarmServiceNetworkDetail"},"type":"object"},"nodes":{"items":{"type":"string"},"type":["array","null"]},"spec":{"$ref":"#/components/schemas/DockerSwarmServiceSpec"},"updateStatus":{"$ref":"#/components/schemas/DockerSwarmUpdateStatus"},"updatedAt":{"format":"date-time","type":"string"},"version":{"$ref":"#/components/schemas/DockerSwarmVersion"}},"required":["id","version","createdAt","updatedAt","spec","endpoint"],"type":"object"},"SwarmServiceMount":{"additionalProperties":false,"properties":{"devicePath":{"type":"string"},"readOnly":{"type":"boolean"},"source":{"type":"string"},"target":{"type":"string"},"type":{"type":"string"},"volumeDriver":{"type":"string"},"volumeOptions":{"additionalProperties":{"type":"string"},"type":"object"}},"required":["type","target"],"type":"object"},"SwarmServiceNetworkConfigDetail":{"additionalProperties":false,"properties":{"driver":{"type":"string"},"enableIPv4":{"type":"boolean"},"enableIPv6":{"type":"boolean"},"ipv4Configs":{"items":{"$ref":"#/components/schemas/SwarmServiceNetworkIPAMConfig"},"type":["array","null"]},"ipv6Configs":{"items":{"$ref":"#/components/schemas/SwarmServiceNetworkIPAMConfig"},"type":["array","null"]},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"scope":{"type":"string"}},"required":["name","driver","scope","enableIPv4","enableIPv6"],"type":"object"},"SwarmServiceNetworkDetail":{"additionalProperties":false,"properties":{"attachable":{"type":"boolean"},"configFrom":{"type":"string"},"configNetwork":{"$ref":"#/components/schemas/SwarmServiceNetworkConfigDetail"},"configOnly":{"type":"boolean"},"driver":{"type":"string"},"enableIPv4":{"type":"boolean"},"enableIPv6":{"type":"boolean"},"id":{"type":"string"},"ingress":{"type":"boolean"},"internal":{"type":"boolean"},"ipamConfigs":{"items":{"$ref":"#/components/schemas/SwarmServiceNetworkIPAMConfig"},"type":["array","null"]},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"scope":{"type":"string"}},"required":["id","name","driver","scope","internal","attachable","ingress","enableIPv4","enableIPv6","configOnly"],"type":"object"},"SwarmServiceNetworkIPAMConfig":{"additionalProperties":false,"properties":{"gateway":{"type":"string"},"ipRange":{"type":"string"},"subnet":{"type":"string"}},"type":"object"},"SwarmServicePort":{"additionalProperties":false,"properties":{"protocol":{"type":"string"},"publishMode":{"type":"string"},"publishedPort":{"format":"int32","minimum":0,"type":"integer"},"targetPort":{"format":"int32","minimum":0,"type":"integer"}},"required":["protocol","targetPort"],"type":"object"},"SwarmServiceScaleRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceScaleRequest.json"],"format":"uri","readOnly":true,"type":"string"},"replicas":{"format":"int64","minimum":0,"type":"integer"}},"required":["replicas"],"type":"object"},"SwarmServiceSummary":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"image":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mode":{"type":"string"},"mounts":{"items":{"$ref":"#/components/schemas/SwarmServiceMount"},"type":["array","null"]},"name":{"type":"string"},"networks":{"items":{"type":"string"},"type":["array","null"]},"nodes":{"items":{"type":"string"},"type":["array","null"]},"ports":{"items":{"$ref":"#/components/schemas/SwarmServicePort"},"type":["array","null"]},"replicas":{"format":"int64","minimum":0,"type":"integer"},"runningReplicas":{"format":"int64","minimum":0,"type":"integer"},"stackName":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","image","mode","replicas","runningReplicas","ports","createdAt","updatedAt","labels","nodes","networks","mounts"],"type":"object"},"SwarmServiceUpdateOptions":{"additionalProperties":false,"properties":{"encodedRegistryAuth":{"type":"string"},"queryRegistry":{"type":"boolean"},"registryAuthFrom":{"type":"string"},"rollback":{"type":"string"}},"type":"object"},"SwarmServiceUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"options":{"$ref":"#/components/schemas/SwarmServiceUpdateOptions"},"spec":{"$ref":"#/components/schemas/DockerSwarmServiceSpec"},"version":{"format":"int64","minimum":0,"type":"integer"}},"required":["version","spec"],"type":"object"},"SwarmServiceUpdateResponse":{"additionalProperties":false,"properties":{"warnings":{"items":{"type":"string"},"type":["array","null"]}},"type":"object"},"SwarmStackDeployRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackDeployRequest.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"},"files":{"items":{"$ref":"#/components/schemas/SwarmSyncFile"},"type":["array","null"]},"name":{"type":"string"},"prune":{"type":"boolean"},"resolveImage":{"type":"string"},"withRegistryAuth":{"type":"boolean"},"workingDir":{"type":"string"}},"required":["name","composeContent"],"type":"object"},"SwarmStackDeployResponse":{"additionalProperties":false,"properties":{"name":{"type":"string"}},"required":["name"],"type":"object"},"SwarmStackInspect":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"services":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"}},"required":["name","namespace","services","createdAt","updatedAt"],"type":"object"},"SwarmStackRenderConfigRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackRenderConfigRequest.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"}},"required":["name","composeContent"],"type":"object"},"SwarmStackRenderConfigResponse":{"additionalProperties":false,"properties":{"configs":{"items":{"type":"string"},"type":["array","null"]},"name":{"type":"string"},"networks":{"items":{"type":"string"},"type":["array","null"]},"renderedCompose":{"type":"string"},"secrets":{"items":{"type":"string"},"type":["array","null"]},"services":{"items":{"type":"string"},"type":["array","null"]},"volumes":{"items":{"type":"string"},"type":["array","null"]},"warnings":{"items":{"type":"string"},"type":["array","null"]}},"required":["name","renderedCompose","services","networks","volumes","configs","secrets"],"type":"object"},"SwarmStackSource":{"additionalProperties":false,"properties":{"composeContent":{"type":"string"},"envContent":{"type":"string"},"files":{"items":{"$ref":"#/components/schemas/SwarmSyncFile"},"type":["array","null"]},"name":{"type":"string"}},"required":["name","composeContent"],"type":"object"},"SwarmStackSourceUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackSourceUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"},"files":{"items":{"$ref":"#/components/schemas/SwarmSyncFile"},"type":["array","null"]}},"required":["composeContent"],"type":"object"},"SwarmStackSummary":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"services":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","namespace","services","createdAt","updatedAt"],"type":"object"},"SwarmSwarmInfo":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"rootRotationInProgress":{"type":"boolean"},"spec":{"$ref":"#/components/schemas/DockerSwarmSpec"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","createdAt","updatedAt","spec","rootRotationInProgress"],"type":"object"},"SwarmSwarmInitRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmInitRequest.json"],"format":"uri","readOnly":true,"type":"string"},"advertiseAddr":{"type":"string"},"autoLockManagers":{"type":"boolean"},"availability":{"type":"string"},"dataPathAddr":{"type":"string"},"dataPathPort":{"format":"int32","minimum":0,"type":"integer"},"defaultAddrPool":{"items":{"type":"string"},"type":["array","null"]},"forceNewCluster":{"type":"boolean"},"listenAddr":{"type":"string"},"spec":{"description":"Swarm specification"},"subnetSize":{"format":"int32","minimum":0,"type":"integer"}},"required":["spec"],"type":"object"},"SwarmSwarmInitResponse":{"additionalProperties":false,"properties":{"nodeId":{"type":"string"}},"required":["nodeId"],"type":"object"},"SwarmSwarmJoinRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmJoinRequest.json"],"format":"uri","readOnly":true,"type":"string"},"advertiseAddr":{"type":"string"},"availability":{"type":"string"},"dataPathAddr":{"type":"string"},"joinToken":{"type":"string"},"listenAddr":{"type":"string"},"remoteAddrs":{"items":{"type":"string"},"type":["array","null"]}},"required":["remoteAddrs","joinToken"],"type":"object"},"SwarmSwarmJoinTokensResponse":{"additionalProperties":false,"properties":{"manager":{"type":"string"},"worker":{"type":"string"}},"required":["worker","manager"],"type":"object"},"SwarmSwarmLeaveRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmLeaveRequest.json"],"format":"uri","readOnly":true,"type":"string"},"force":{"type":"boolean"}},"type":"object"},"SwarmSwarmRotateJoinTokensRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmRotateJoinTokensRequest.json"],"format":"uri","readOnly":true,"type":"string"},"rotateManagerToken":{"type":"boolean"},"rotateWorkerToken":{"type":"boolean"}},"type":"object"},"SwarmSwarmUnlockKeyResponse":{"additionalProperties":false,"properties":{"unlockKey":{"type":"string"}},"required":["unlockKey"],"type":"object"},"SwarmSwarmUnlockRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmUnlockRequest.json"],"format":"uri","readOnly":true,"type":"string"},"key":{"type":"string"}},"required":["key"],"type":"object"},"SwarmSwarmUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"rotateManagerToken":{"type":"boolean"},"rotateManagerUnlockKey":{"type":"boolean"},"rotateWorkerToken":{"type":"boolean"},"spec":{"description":"Updated swarm specification"},"version":{"format":"int64","minimum":0,"type":"integer"}},"required":["spec"],"type":"object"},"SwarmSyncFile":{"additionalProperties":false,"properties":{"content":{"contentEncoding":"base64","type":"string"},"relativePath":{"type":"string"}},"required":["relativePath","content"],"type":"object"},"SwarmTaskSummary":{"additionalProperties":false,"properties":{"containerId":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"currentState":{"type":"string"},"desiredState":{"type":"string"},"error":{"type":"string"},"id":{"type":"string"},"image":{"type":"string"},"name":{"type":"string"},"nodeId":{"type":"string"},"nodeName":{"type":"string"},"serviceId":{"type":"string"},"serviceName":{"type":"string"},"slot":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","serviceId","serviceName","nodeId","nodeName","desiredState","currentState","createdAt","updatedAt"],"type":"object"},"SystemConvertDockerRunRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SystemConvertDockerRunRequest.json"],"format":"uri","readOnly":true,"type":"string"},"dockerRunCommand":{"type":"string"}},"required":["dockerRunCommand"],"type":"object"},"SystemConvertDockerRunResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SystemConvertDockerRunResponse.json"],"format":"uri","readOnly":true,"type":"string"},"dockerCompose":{"type":"string"},"envVars":{"type":"string"},"serviceName":{"type":"string"},"success":{"type":"boolean"}},"required":["success","dockerCompose","envVars","serviceName"],"type":"object"},"SystemDiagnostics":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SystemDiagnostics.json"],"format":"uri","readOnly":true,"type":"string"},"gc":{"$ref":"#/components/schemas/SystemGCInfo"},"memory":{"$ref":"#/components/schemas/SystemMemoryInfo"},"runtime":{"$ref":"#/components/schemas/SystemRuntimeInfo"},"timestamp":{"format":"date-time","type":"string"},"websocket":{"$ref":"#/components/schemas/SystemWebSocketDiagnostics"}},"required":["timestamp","runtime","memory","gc","websocket"],"type":"object"},"SystemGCInfo":{"additionalProperties":false,"properties":{"lastGc":{"format":"date-time","type":"string"},"numGc":{"format":"int64","type":"integer"},"pauseTotalNs":{"format":"int64","type":"integer"},"recentPausesNs":{"items":{"format":"int64","type":"integer"},"type":["array","null"]}},"required":["lastGc","numGc","pauseTotalNs","recentPausesNs"],"type":"object"},"SystemHealthResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SystemHealthResponse.json"],"format":"uri","readOnly":true,"type":"string"},"status":{"type":"string"}},"required":["status"],"type":"object"},"SystemLogEntry":{"additionalProperties":false,"properties":{"attrs":{"additionalProperties":{},"type":"object"},"level":{"type":"string"},"message":{"type":"string"},"time":{"format":"date-time","type":"string"}},"required":["time","level","message"],"type":"object"},"SystemMemoryInfo":{"additionalProperties":false,"properties":{"alloc":{"format":"int64","minimum":0,"type":"integer"},"gcCpuFraction":{"format":"double","type":"number"},"heapAlloc":{"format":"int64","minimum":0,"type":"integer"},"heapIdle":{"format":"int64","minimum":0,"type":"integer"},"heapInuse":{"format":"int64","minimum":0,"type":"integer"},"heapObjects":{"format":"int64","minimum":0,"type":"integer"},"heapReleased":{"format":"int64","minimum":0,"type":"integer"},"heapSys":{"format":"int64","minimum":0,"type":"integer"},"mcacheInuse":{"format":"int64","minimum":0,"type":"integer"},"mspanInuse":{"format":"int64","minimum":0,"type":"integer"},"nextGc":{"format":"int64","minimum":0,"type":"integer"},"numForcedGc":{"format":"int32","minimum":0,"type":"integer"},"numGc":{"format":"int32","minimum":0,"type":"integer"},"stackInuse":{"format":"int64","minimum":0,"type":"integer"},"stackSys":{"format":"int64","minimum":0,"type":"integer"},"sys":{"format":"int64","minimum":0,"type":"integer"},"totalAlloc":{"format":"int64","minimum":0,"type":"integer"}},"required":["alloc","totalAlloc","sys","heapAlloc","heapSys","heapInuse","heapIdle","heapReleased","heapObjects","stackInuse","stackSys","mspanInuse","mcacheInuse","nextGc","numGc","numForcedGc","gcCpuFraction"],"type":"object"},"SystemPruneAllRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/SystemPruneAllRequest.json"],"format":"uri","readOnly":true,"type":"string"},"buildCache":{"$ref":"#/components/schemas/SystemPruneBuildCacheOptions"},"containers":{"$ref":"#/components/schemas/SystemPruneContainersOptions"},"images":{"$ref":"#/components/schemas/SystemPruneImagesOptions"},"networks":{"$ref":"#/components/schemas/SystemPruneNetworksOptions"},"volumes":{"$ref":"#/components/schemas/SystemPruneVolumesOptions"}},"type":"object"},"SystemPruneAllResult":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"buildCacheSpaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"containerSpaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"containersPruned":{"items":{"type":"string"},"type":["array","null"]},"errors":{"items":{"type":"string"},"type":["array","null"]},"imageSpaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"imagesDeleted":{"items":{"type":"string"},"type":["array","null"]},"networksDeleted":{"items":{"type":"string"},"type":["array","null"]},"spaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"success":{"type":"boolean"},"volumeSpaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"volumesDeleted":{"items":{"type":"string"},"type":["array","null"]}},"required":["spaceReclaimed","success"],"type":"object"},"SystemPruneBuildCacheOptions":{"additionalProperties":false,"properties":{"mode":{"type":"string"},"until":{"type":"string"}},"required":["mode"],"type":"object"},"SystemPruneContainersOptions":{"additionalProperties":false,"properties":{"mode":{"type":"string"},"until":{"type":"string"}},"required":["mode"],"type":"object"},"SystemPruneImagesOptions":{"additionalProperties":false,"properties":{"mode":{"type":"string"},"until":{"type":"string"}},"required":["mode"],"type":"object"},"SystemPruneNetworksOptions":{"additionalProperties":false,"properties":{"mode":{"type":"string"},"until":{"type":"string"}},"required":["mode"],"type":"object"},"SystemPruneVolumesOptions":{"additionalProperties":false,"properties":{"mode":{"type":"string"}},"required":["mode"],"type":"object"},"SystemRuntimeInfo":{"additionalProperties":false,"properties":{"arch":{"type":"string"},"goVersion":{"type":"string"},"gomaxprocs":{"format":"int64","type":"integer"},"goroutines":{"format":"int64","type":"integer"},"numCgoCall":{"format":"int64","type":"integer"},"numCpu":{"format":"int64","type":"integer"},"os":{"type":"string"},"uptimeSeconds":{"format":"int64","type":"integer"},"wsWorkerGoroutines":{"format":"int64","type":"integer"}},"required":["goroutines","wsWorkerGoroutines","gomaxprocs","numCpu","goVersion","os","arch","numCgoCall","uptimeSeconds"],"type":"object"},"SystemWebSocketConnectionInfo":{"additionalProperties":false,"properties":{"clientIp":{"type":"string"},"envId":{"type":"string"},"id":{"type":"string"},"kind":{"type":"string"},"resourceId":{"type":"string"},"startedAt":{"format":"date-time","type":"string"},"userAgent":{"type":"string"},"userId":{"type":"string"}},"required":["id","kind","startedAt"],"type":"object"},"SystemWebSocketDiagnostics":{"additionalProperties":false,"properties":{"connections":{"items":{"$ref":"#/components/schemas/SystemWebSocketConnectionInfo"},"type":["array","null"]},"snapshot":{"$ref":"#/components/schemas/SystemWebSocketMetricsSnapshot"}},"required":["snapshot","connections"],"type":"object"},"SystemWebSocketMetricsSnapshot":{"additionalProperties":false,"properties":{"containerExec":{"format":"int64","type":"integer"},"containerLogsActive":{"format":"int64","type":"integer"},"containerStats":{"format":"int64","type":"integer"},"projectLogsActive":{"format":"int64","type":"integer"},"serviceLogsActive":{"format":"int64","type":"integer"},"systemStats":{"format":"int64","type":"integer"}},"required":["projectLogsActive","containerLogsActive","containerStats","containerExec","systemStats","serviceLogsActive"],"type":"object"},"TemplateCreateRegistryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateCreateRegistryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"url":{"type":"string"}},"required":["name","url","description","enabled"],"type":"object"},"TemplateCreateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateCreateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"content":{"type":"string"},"description":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"}},"required":["name","description","content","envContent"],"type":"object"},"TemplateDefaultTemplatesResponse":{"additionalProperties":false,"properties":{"composeTemplate":{"type":"string"},"envTemplate":{"type":"string"},"swarmStackEnvTemplate":{"type":"string"},"swarmStackTemplate":{"type":"string"}},"required":["composeTemplate","swarmStackTemplate","swarmStackEnvTemplate","envTemplate"],"type":"object"},"TemplatePaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplatePaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/TemplateTemplate"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"TemplateRemoteRegistry":{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"author":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"templates":{"items":{"$ref":"#/components/schemas/TemplateRemoteTemplate"},"type":["array","null"]},"url":{"type":"string"},"version":{"type":"string"}},"required":["version","author","templates","name","description","url"],"type":"object"},"TemplateRemoteTemplate":{"additionalProperties":false,"properties":{"author":{"type":"string"},"compose_url":{"type":"string"},"description":{"type":"string"},"documentation_url":{"type":"string"},"env_url":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"tags":{"items":{"type":"string"},"type":["array","null"]},"version":{"type":"string"}},"required":["version","author","compose_url","env_url","documentation_url","tags","id","name","description"],"type":"object"},"TemplateSaveDefaultTemplatesRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateSaveDefaultTemplatesRequest.json"],"format":"uri","readOnly":true,"type":"string"},"composeContent":{"type":"string"},"envContent":{"type":"string"}},"required":["composeContent","envContent"],"type":"object"},"TemplateTemplate":{"additionalProperties":false,"properties":{"content":{"type":"string"},"description":{"type":"string"},"envContent":{"type":"string"},"id":{"type":"string"},"isCustom":{"type":"boolean"},"isRemote":{"type":"boolean"},"metadata":{"$ref":"#/components/schemas/MetaTemplateMeta"},"name":{"type":"string"},"registry":{"$ref":"#/components/schemas/TemplateTemplateRegistry"},"registryId":{"type":"string"}},"required":["content","isCustom","isRemote","id","name","description"],"type":"object"},"TemplateTemplateContent":{"additionalProperties":false,"properties":{"content":{"type":"string"},"envContent":{"type":"string"},"envVariables":{"items":{"$ref":"#/components/schemas/EnvVariable"},"type":["array","null"]},"services":{"items":{"type":"string"},"type":["array","null"]},"template":{"$ref":"#/components/schemas/TemplateTemplate"}},"required":["template","content","envContent","services","envVariables"],"type":"object"},"TemplateTemplateRegistry":{"additionalProperties":false,"properties":{"description":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"lastFetchError":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"}},"required":["id","enabled","name","description","url"],"type":"object"},"TemplateUpdateRegistryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateUpdateRegistryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"url":{"type":"string"}},"required":["name","url","description","enabled"],"type":"object"},"TemplateUpdateRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateUpdateRequest.json"],"format":"uri","readOnly":true,"type":"string"},"content":{"type":"string"},"description":{"type":"string"},"envContent":{"type":"string"},"name":{"type":"string"}},"required":["name","description","content","envContent"],"type":"object"},"Ulimit":{"additionalProperties":false,"properties":{"Hard":{"format":"int64","type":"integer"},"Name":{"type":"string"},"Soft":{"format":"int64","type":"integer"}},"required":["Name","Hard","Soft"],"type":"object"},"UlimitsConfig":{"additionalProperties":false,"properties":{"hard":{"format":"int64","type":"integer"},"single":{"format":"int64","type":"integer"},"soft":{"format":"int64","type":"integer"}},"type":"object"},"UpdateConfig":{"additionalProperties":false,"properties":{"delay":{"format":"int64","type":"integer"},"failure_action":{"type":"string"},"max_failure_ratio":{"format":"float","type":"number"},"monitor":{"format":"int64","type":"integer"},"order":{"type":"string"},"parallelism":{"format":"int64","minimum":0,"type":"integer"}},"type":"object"},"UpdateContainerRegistryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateContainerRegistryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"awsAccessKeyId":{"type":["string","null"]},"awsRegion":{"type":["string","null"]},"awsSecretAccessKey":{"type":["string","null"]},"description":{"type":["string","null"]},"enabled":{"type":["boolean","null"]},"insecure":{"type":["boolean","null"]},"registryType":{"type":["string","null"]},"token":{"type":["string","null"]},"url":{"type":["string","null"]},"username":{"type":["string","null"]}},"required":["url","username","token","description","insecure","enabled","registryType","awsAccessKeyId","awsSecretAccessKey","awsRegion"],"type":"object"},"UpdateGitRepositoryRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateGitRepositoryRequest.json"],"format":"uri","readOnly":true,"type":"string"},"authType":{"type":"string"},"description":{"type":"string"},"enabled":{"type":"boolean"},"name":{"type":"string"},"sshHostKeyVerification":{"type":"string"},"sshKey":{"type":"string"},"token":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"}},"type":"object"},"UpdateMyProfileInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateMyProfileInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"displayName":{"type":"string"},"email":{"type":"string"},"fontSize":{"format":"int64","maximum":20,"minimum":12,"type":"integer"},"locale":{"type":"string"}},"type":"object"},"UpdateOidcRoleMappingOutputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateOidcRoleMappingOutputBody.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"$ref":"#/components/schemas/RoleOidcRoleMapping"},"success":{"type":"boolean"}},"required":["success","data"],"type":"object"},"UpdateProjectServicesInputBody":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateProjectServicesInputBody.json"],"format":"uri","readOnly":true,"type":"string"},"services":{"description":"Service names to update; empty updates all services","items":{"type":"string"},"type":["array","null"]}},"type":"object"},"UpdaterOptions":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpdaterOptions.json"],"format":"uri","readOnly":true,"type":"string"},"dryRun":{"type":"boolean"},"forceUpdate":{"type":"boolean"},"resourceIds":{"items":{"type":"string"},"type":["array","null"]},"type":{"type":"string"}},"type":"object"},"UpdaterResourceResult":{"additionalProperties":false,"properties":{"details":{"additionalProperties":{},"type":"object"},"error":{"type":"string"},"newImages":{"additionalProperties":{"type":"string"},"type":"object"},"oldImages":{"additionalProperties":{"type":"string"},"type":"object"},"resourceId":{"type":"string"},"resourceName":{"type":"string"},"resourceType":{"type":"string"},"status":{"type":"string"},"updateApplied":{"type":"boolean"},"updateAvailable":{"type":"boolean"}},"required":["resourceId","resourceType","status"],"type":"object"},"UpdaterResult":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"checked":{"format":"int64","type":"integer"},"duration":{"type":"string"},"endTime":{"type":"string"},"failed":{"format":"int64","type":"integer"},"items":{"items":{"$ref":"#/components/schemas/UpdaterResourceResult"},"type":["array","null"]},"restarted":{"format":"int64","type":"integer"},"skipped":{"format":"int64","type":"integer"},"startTime":{"type":"string"},"success":{"type":"boolean"},"updated":{"format":"int64","type":"integer"}},"required":["checked","updated","skipped","failed","duration","items"],"type":"object"},"UpdaterStatus":{"additionalProperties":false,"properties":{"containerIds":{"items":{"type":"string"},"type":["array","null"]},"projectIds":{"items":{"type":"string"},"type":["array","null"]},"updatingContainers":{"format":"int64","type":"integer"},"updatingProjects":{"format":"int64","type":"integer"}},"required":["updatingContainers","updatingProjects","containerIds","projectIds"],"type":"object"},"UpgradeCheckResultData":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UpgradeCheckResultData.json"],"format":"uri","readOnly":true,"type":"string"},"canUpgrade":{"type":"boolean"},"error":{"type":"boolean"},"message":{"type":"string"}},"required":["canUpgrade","error","message"],"type":"object"},"UserCreateUser":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UserCreateUser.json"],"format":"uri","readOnly":true,"type":"string"},"displayName":{"description":"Display name of the user","examples":["John Doe"],"maxLength":255,"type":"string"},"email":{"description":"Email address of the user","examples":["john@example.com"],"type":"string"},"locale":{"description":"Locale preference of the user","examples":["en-US"],"type":"string"},"password":{"description":"Password of the user","minLength":8,"type":"string"},"username":{"description":"Username of the user","examples":["johndoe"],"maxLength":255,"minLength":1,"type":"string"}},"required":["username","password"],"type":"object"},"UserPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UserPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/UserUser"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","pagination"],"type":"object"},"UserRoleAssignmentSummary":{"additionalProperties":false,"properties":{"environmentId":{"description":"Environment ID this assignment is scoped to; omit for a global assignment","type":"string"},"roleId":{"description":"Role ID granted by this assignment","type":"string"},"source":{"description":"How the assignment was created","enum":["manual","oidc"],"type":"string"}},"required":["roleId","source"],"type":"object"},"UserUpdateUser":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/UserUpdateUser.json"],"format":"uri","readOnly":true,"type":"string"},"displayName":{"description":"Display name of the user","maxLength":255,"type":"string"},"email":{"description":"Email address of the user","type":"string"},"locale":{"description":"Locale preference of the user","type":"string"},"password":{"description":"New password for the user","minLength":8,"type":"string"},"username":{"description":"Username of the user","maxLength":255,"minLength":1,"type":"string"}},"type":"object"},"UserUser":{"additionalProperties":false,"properties":{"avatarUrl":{"description":"URL to the user's custom avatar image; omitted when using the default profile picture","type":"string"},"canDelete":{"description":"Whether the user can currently be deleted","type":"boolean"},"createdAt":{"description":"Date and time when the user was created","type":"string"},"displayName":{"description":"Display name of the user","examples":["John Doe"],"type":"string"},"email":{"description":"Email address of the user","examples":["john@example.com"],"type":"string"},"fontSize":{"description":"Preferred root UI font size in px","examples":[14],"format":"int64","maximum":20,"minimum":12,"type":"integer"},"id":{"description":"Unique identifier of the user","examples":["550e8400-e29b-41d4-a716-446655440000"],"type":"string"},"isGlobalAdmin":{"description":"Whether the user effectively holds global administrator access","type":"boolean"},"locale":{"description":"Locale preference of the user","examples":["en-US"],"type":"string"},"oidcSubjectId":{"description":"OIDC subject identifier for SSO users","type":"string"},"permissionsByEnv":{"additionalProperties":{"items":{"type":"string"},"type":["array","null"]},"description":"Permissions the user effectively holds, keyed by environment ID. The 'global' key holds permissions that apply across every environment (and to org-level endpoints).","type":"object"},"requiresPasswordChange":{"description":"Whether the user must change their password","type":"boolean"},"roleAssignments":{"description":"Role assignments held by the user","items":{"$ref":"#/components/schemas/UserRoleAssignmentSummary"},"type":["array","null"]},"updatedAt":{"description":"Date and time when the user was last updated","type":"string"},"username":{"description":"Username of the user","examples":["johndoe"],"type":"string"}},"required":["id","username","roleAssignments","permissionsByEnv","isGlobalAdmin","canDelete","requiresPasswordChange"],"type":"object"},"Value":{"additionalProperties":false,"type":"object"},"VersionCheck":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VersionCheck.json"],"format":"uri","readOnly":true,"type":"string"},"currentVersion":{"type":"string"},"newestVersion":{"type":"string"},"releaseUrl":{"type":"string"},"updateAvailable":{"type":"boolean"}},"required":["currentVersion","updateAvailable"],"type":"object"},"VersionInfo":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VersionInfo.json"],"format":"uri","readOnly":true,"type":"string"},"buildTime":{"type":"string"},"currentDigest":{"type":"string"},"currentTag":{"type":"string"},"currentVersion":{"type":"string"},"displayVersion":{"type":"string"},"enabledFeatures":{"items":{"type":"string"},"type":["array","null"]},"goVersion":{"type":"string"},"isSemverVersion":{"type":"boolean"},"newestDigest":{"type":"string"},"newestVersion":{"type":"string"},"nodeVersion":{"type":"string"},"releaseNotes":{"type":"string"},"releaseUrl":{"type":"string"},"releasedAt":{"type":"string"},"revision":{"type":"string"},"shortRevision":{"type":"string"},"svelteKitVersion":{"type":"string"},"updateAvailable":{"type":"boolean"}},"required":["currentVersion","revision","shortRevision","goVersion","nodeVersion","svelteKitVersion","displayVersion","isSemverVersion","updateAvailable"],"type":"object"},"VolumeBackup":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"size":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"},"volumeName":{"type":"string"}},"required":["volumeName","size","createdAt","id"],"type":"object"},"VolumeBackupPaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VolumeBackupPaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/VolumeBackup"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"},"warnings":{"items":{"type":"string"},"type":["array","null"]}},"required":["success","data","pagination"],"type":"object"},"VolumeCreate":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VolumeCreate.json"],"format":"uri","readOnly":true,"type":"string"},"driver":{"description":"Volume driver (e.g., local, nfs)","type":"string"},"driverOpts":{"additionalProperties":{"type":"string"},"description":"Driver-specific options","type":"object"},"labels":{"additionalProperties":{"type":"string"},"description":"User-defined labels","type":"object"},"name":{"description":"Name of the volume","minLength":1,"type":"string"}},"required":["name"],"type":"object"},"VolumeFileEntry":{"additionalProperties":false,"properties":{"isDirectory":{"description":"Whether this entry is a directory","type":"boolean"},"isSymlink":{"description":"Whether this entry is a symbolic link","type":"boolean"},"linkTarget":{"description":"Target of the symbolic link","type":"string"},"modTime":{"description":"Last modification time","format":"date-time","type":"string"},"mode":{"description":"File mode/permissions","type":"string"},"name":{"description":"Name of the file or directory","type":"string"},"path":{"description":"Full path to the file","type":"string"},"size":{"description":"Size of the file in bytes","format":"int64","type":"integer"}},"required":["name","path","isDirectory","size","modTime","mode","isSymlink"],"type":"object"},"VolumePaginatedResponse":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VolumePaginatedResponse.json"],"format":"uri","readOnly":true,"type":"string"},"counts":{"$ref":"#/components/schemas/VolumeUsageCountsData"},"data":{"items":{"$ref":"#/components/schemas/VolumeVolume"},"type":["array","null"]},"pagination":{"$ref":"#/components/schemas/BasePaginationResponse"},"success":{"type":"boolean"}},"required":["success","data","counts","pagination"],"type":"object"},"VolumePruneReportData":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"spaceReclaimed":{"format":"int64","minimum":0,"type":"integer"},"volumesDeleted":{"items":{"type":"string"},"type":["array","null"]}},"required":["spaceReclaimed"],"type":"object"},"VolumeSizeInfo":{"additionalProperties":false,"properties":{"name":{"type":"string"},"refCount":{"format":"int64","type":"integer"},"size":{"format":"int64","type":"integer"}},"required":["name","size","refCount"],"type":"object"},"VolumeUsageCountsData":{"additionalProperties":false,"properties":{"inuse":{"format":"int64","type":"integer"},"total":{"format":"int64","type":"integer"},"unused":{"format":"int64","type":"integer"}},"required":["inuse","unused","total"],"type":"object"},"VolumeUsageResponse":{"additionalProperties":false,"properties":{"containers":{"items":{"type":"string"},"type":["array","null"]},"inUse":{"type":"boolean"}},"required":["inUse","containers"],"type":"object"},"VolumeVolume":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"containers":{"items":{"type":"string"},"type":["array","null"]},"createdAt":{"type":"string"},"driver":{"type":"string"},"id":{"type":"string"},"inUse":{"type":"boolean"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"mountpoint":{"type":"string"},"name":{"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"scope":{"type":"string"},"size":{"format":"int64","type":"integer"},"usageData":{"$ref":"#/components/schemas/DockerVolumeUsageData"}},"required":["id","name","driver","mountpoint","scope","options","labels","createdAt","inUse","size","containers"],"type":"object"},"VulnerabilityCVSSInfo":{"additionalProperties":false,"properties":{"v2Score":{"format":"double","type":"number"},"v2Vector":{"type":"string"},"v3Score":{"format":"double","type":"number"},"v3Vector":{"type":"string"}},"type":"object"},"VulnerabilityEnvironmentVulnerabilitySummary":{"additionalProperties":false,"properties":{"scannedImages":{"format":"int64","type":"integer"},"summary":{"$ref":"#/components/schemas/VulnerabilitySeveritySummary"},"totalImages":{"format":"int64","type":"integer"}},"required":["totalImages","scannedImages"],"type":"object"},"VulnerabilityIgnorePayload":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VulnerabilityIgnorePayload.json"],"format":"uri","readOnly":true,"type":"string"},"createdBy":{"examples":["user-123"],"type":"string"},"imageId":{"examples":["sha256:abc123"],"type":"string"},"installedVersion":{"examples":["1.1.1l"],"type":"string"},"pkgName":{"examples":["openssl"],"type":"string"},"reason":{"examples":["False positive - not exploitable"],"type":"string"},"vulnerabilityId":{"examples":["CVE-2023-1234"],"type":"string"}},"required":["imageId","vulnerabilityId","pkgName"],"type":"object"},"VulnerabilityIgnoredVulnerability":{"additionalProperties":false,"properties":{"createdAt":{"format":"date-time","type":"string"},"createdBy":{"type":"string"},"environmentId":{"type":"string"},"id":{"type":"string"},"imageId":{"type":"string"},"installedVersion":{"type":"string"},"pkgName":{"type":"string"},"reason":{"type":"string"},"vulnerabilityId":{"type":"string"}},"required":["id","environmentId","imageId","vulnerabilityId","pkgName","installedVersion","createdBy","createdAt"],"type":"object"},"VulnerabilityScanResult":{"additionalProperties":false,"properties":{"activityId":{"type":"string"},"duration":{"format":"int64","type":"integer"},"error":{"type":"string"},"imageId":{"type":"string"},"imageName":{"type":"string"},"scanPhase":{"type":"string"},"scanTime":{"format":"date-time","type":"string"},"scannerVersion":{"type":"string"},"status":{"type":"string"},"summary":{"$ref":"#/components/schemas/VulnerabilitySeveritySummary"},"vulnerabilities":{"items":{"$ref":"#/components/schemas/VulnerabilityVulnerability"},"type":["array","null"]}},"required":["imageId","imageName","scanTime","status"],"type":"object"},"VulnerabilityScanSummariesRequest":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/VulnerabilityScanSummariesRequest.json"],"format":"uri","readOnly":true,"type":"string"},"imageIds":{"items":{"type":"string"},"type":["array","null"]}},"required":["imageIds"],"type":"object"},"VulnerabilityScanSummariesResponse":{"additionalProperties":false,"properties":{"summaries":{"additionalProperties":{"$ref":"#/components/schemas/VulnerabilityScanSummary"},"type":"object"}},"required":["summaries"],"type":"object"},"VulnerabilityScanSummary":{"additionalProperties":false,"properties":{"error":{"type":"string"},"imageId":{"type":"string"},"scanPhase":{"type":"string"},"scanTime":{"format":"date-time","type":"string"},"status":{"type":"string"},"summary":{"$ref":"#/components/schemas/VulnerabilitySeveritySummary"}},"required":["imageId","scanTime","status"],"type":"object"},"VulnerabilitySeveritySummary":{"additionalProperties":false,"properties":{"critical":{"format":"int64","type":"integer"},"high":{"format":"int64","type":"integer"},"low":{"format":"int64","type":"integer"},"medium":{"format":"int64","type":"integer"},"total":{"format":"int64","type":"integer"},"unknown":{"format":"int64","type":"integer"}},"required":["critical","high","medium","low","unknown","total"],"type":"object"},"VulnerabilityVulnerability":{"additionalProperties":false,"properties":{"cvss":{"$ref":"#/components/schemas/VulnerabilityCVSSInfo"},"description":{"type":"string"},"fixedVersion":{"type":"string"},"installedVersion":{"type":"string"},"lastModifiedDate":{"format":"date-time","type":"string"},"pkgName":{"type":"string"},"publishedDate":{"format":"date-time","type":"string"},"references":{"items":{"type":"string"},"type":["array","null"]},"severity":{"type":"string"},"title":{"type":"string"},"vulnerabilityId":{"type":"string"}},"required":["vulnerabilityId","pkgName","installedVersion","severity"],"type":"object"},"VulnerabilityVulnerabilityWithImage":{"additionalProperties":false,"properties":{"cvss":{"$ref":"#/components/schemas/VulnerabilityCVSSInfo"},"description":{"type":"string"},"fixedVersion":{"type":"string"},"imageId":{"type":"string"},"imageName":{"type":"string"},"installedVersion":{"type":"string"},"lastModifiedDate":{"format":"date-time","type":"string"},"pkgName":{"type":"string"},"publishedDate":{"format":"date-time","type":"string"},"references":{"items":{"type":"string"},"type":["array","null"]},"severity":{"type":"string"},"title":{"type":"string"},"vulnerabilityId":{"type":"string"}},"required":["imageId","imageName","vulnerabilityId","pkgName","installedVersion","severity"],"type":"object"},"WebhookCreateInput":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/WebhookCreateInput.json"],"format":"uri","readOnly":true,"type":"string"},"actionType":{"description":"Action to run for the selected target type. Supported values depend on targetType.","enum":["update","start","stop","restart","redeploy","up","down","run","sync"],"type":"string"},"name":{"description":"Human-readable name for this webhook","maxLength":255,"minLength":1,"type":"string"},"targetId":{"description":"Container ID, project ID, or GitOps sync ID to target. Leave empty for 'updater' webhooks.","type":"string"},"targetType":{"description":"Resource type this webhook targets: 'container', 'project', 'updater', or 'gitops'","enum":["container","project","updater","gitops"],"type":"string"}},"required":["name","targetType","actionType","targetId"],"type":"object"},"WebhookCreated":{"additionalProperties":false,"properties":{"actionType":{"description":"Action type","type":"string"},"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"id":{"description":"Webhook ID","type":"string"},"name":{"description":"Webhook name","type":"string"},"targetId":{"description":"Target resource ID","type":"string"},"targetType":{"description":"Target type","type":"string"},"token":{"description":"Full webhook token — store this securely, it will not be shown again","type":"string"}},"required":["id","name","token","targetType","actionType","targetId","createdAt"],"type":"object"},"WebhookSummary":{"additionalProperties":false,"properties":{"actionType":{"description":"Action type resolved for this webhook","type":"string"},"createdAt":{"description":"Creation timestamp","format":"date-time","type":"string"},"enabled":{"description":"Whether the webhook is active","type":"boolean"},"environmentId":{"description":"Environment ID","type":"string"},"id":{"description":"Webhook ID","type":"string"},"lastTriggeredAt":{"description":"Timestamp of last successful trigger","format":"date-time","type":"string"},"name":{"description":"Webhook name","type":"string"},"targetId":{"description":"Target resource ID","type":"string"},"targetName":{"description":"Resolved target resource name when available","type":"string"},"targetType":{"description":"Target type: 'container', 'project', 'updater', or 'gitops'","type":"string"},"tokenPrefix":{"description":"Masked token prefix for identification","type":"string"}},"required":["id","name","tokenPrefix","targetType","actionType","targetId","environmentId","enabled","createdAt"],"type":"object"},"WebhookUpdateInput":{"additionalProperties":false,"properties":{"$schema":{"description":"A URL to the JSON Schema for this object.","examples":["https://arcane.randomsynergy.xyz:3552/api/schemas/WebhookUpdateInput.json"],"format":"uri","readOnly":true,"type":"string"},"enabled":{"description":"Whether the webhook is active","type":"boolean"}},"required":["enabled"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"description":"API Key authentication","in":"header","name":"X-API-Key","type":"apiKey"},"BearerAuth":{"bearerFormat":"JWT","description":"JWT Bearer token authentication","scheme":"bearer","type":"http"}}},"info":{"description":"Modern Docker Management, Designed for Everyone","title":"Arcane API","version":"v2.3.2"},"openapi":"3.1.0","paths":{"/activities/stream":{"get":{"description":"Stream background activity updates for the local environment and all enabled remote environments as JSON lines","operationId":"stream-all-activities","parameters":[{"description":"Snapshot limit per environment","explode":false,"in":"query","name":"limit","schema":{"default":50,"description":"Snapshot limit per environment","format":"int64","type":"integer"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Stream background activities across all environments","tags":["Activities"]}},"/api-keys":{"get":{"description":"Get a paginated list of API keys","operationId":"list-api-keys","parameters":[{"description":"Search query for filtering by name or description","explode":false,"in":"query","name":"search","schema":{"description":"Search query for filtering by name or description","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List API keys","tags":["API Keys"]},"post":{"description":"Create a new API key for programmatic access","operationId":"create-api-key","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApikeyCreateApiKey"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseApiKeyCreatedDto"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create an API key","tags":["API Keys"]}},"/api-keys/{id}":{"delete":{"description":"Delete an API key by ID","operationId":"delete-api-key","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"description":"API key ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete an API key","tags":["API Keys"]},"get":{"description":"Get details of a specific API key by ID","operationId":"get-api-key","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"description":"API key ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseApiKey"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get an API key","tags":["API Keys"]},"put":{"description":"Update an existing API key's details","operationId":"update-api-key","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"description":"API key ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApikeyUpdateApiKey"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseApiKey"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update an API key","tags":["API Keys"]}},"/app-images/favicon":{"get":{"description":"Get the application favicon image","operationId":"get-favicon","responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}},"X-Content-Type-Options":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get application favicon","tags":["Application Images"]}},"/app-images/logo":{"get":{"description":"Get the application logo image","operationId":"get-logo","parameters":[{"description":"Return full logo instead of icon","explode":false,"in":"query","name":"full","schema":{"default":false,"description":"Return full logo instead of icon","type":"boolean"}},{"description":"Optional accent color override for preview (e.g., 'oklch(0.65 0.2 150)')","explode":false,"in":"query","name":"color","schema":{"description":"Optional accent color override for preview (e.g., 'oklch(0.65 0.2 150)')","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}},"X-Content-Type-Options":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get application logo","tags":["Application Images"]}},"/app-images/logo-email":{"get":{"description":"Get the application logo image in PNG format for emails","operationId":"get-logo-email","responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}},"X-Content-Type-Options":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get application logo for email","tags":["Application Images"]}},"/app-images/profile":{"get":{"description":"Get the default user profile image","operationId":"get-default-profile","responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}},"X-Content-Type-Options":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get default profile image","tags":["Application Images"]}},"/app-images/pwa/{filename}":{"get":{"description":"Get a Progressive Web App icon image","operationId":"get-pwa-icon","parameters":[{"description":"PWA icon filename","in":"path","name":"filename","required":true,"schema":{"description":"PWA icon filename","examples":["icon-192x192.png"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}},"X-Content-Type-Options":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get PWA icon","tags":["Application Images"]}},"/app-version":{"get":{"description":"Get the current application version","operationId":"getAppVersion","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get app version","tags":["Version"]}},"/auth/login":{"post":{"description":"Authenticate a user with username and password","operationId":"login","parameters":[{"in":"header","name":"User-Agent","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthLogin"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseLoginResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Session cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Login","tags":["Auth"]}},"/auth/logout":{"post":{"description":"Clear authentication session","operationId":"logout","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Cleared session cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Logout","tags":["Auth"]}},"/auth/me":{"get":{"description":"Get the currently authenticated user's information","operationId":"get-current-user","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get current user","tags":["Auth"]}},"/auth/me/api-keys":{"get":{"description":"List API keys owned by the current user","operationId":"list-my-api-keys","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListApiKey"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List my API keys","tags":["API Keys"]},"post":{"description":"Create a new personal API key owned by the current user. Personal keys inherit the owner's role permissions.","operationId":"create-my-api-key","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApikeyCreateUserApiKey"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseApiKeyCreatedDto"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]}],"summary":"Create my API key","tags":["API Keys"]}},"/auth/me/api-keys/{id}":{"delete":{"description":"Delete one of the current user's own API keys","operationId":"delete-my-api-key","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"description":"API key ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]}],"summary":"Delete my API key","tags":["API Keys"]}},"/auth/me/avatar":{"delete":{"description":"Remove the current user's custom profile picture, reverting to the default avatar.","operationId":"delete-my-avatar","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete own avatar","tags":["Auth"]},"post":{"description":"Upload a custom profile picture (PNG, JPEG or WebP). Replaces any existing avatar.","operationId":"upload-my-avatar","requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"contentMediaType":"application/octet-stream","format":"binary","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Upload own avatar","tags":["Auth"]}},"/auth/me/profile":{"put":{"description":"Update the current user's display name and email. Forbidden for OIDC-managed accounts.","operationId":"update-my-profile","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMyProfileInputBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update own profile","tags":["Auth"]}},"/auth/password":{"post":{"description":"Change the current user's password","operationId":"change-password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthPasswordChange"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Change password","tags":["Auth"]}},"/auth/refresh":{"post":{"description":"Obtain a new access token using a refresh token","operationId":"refresh-token","parameters":[{"in":"header","name":"User-Agent","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRefresh"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTokenRefreshResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Updated session cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Refresh token","tags":["Auth"]}},"/auth/sessions/logout-all":{"post":{"description":"Revoke every session for the current user except the one making this request","operationId":"logout-all-other-sessions","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Logout all other sessions","tags":["Auth"]}},"/container-registries":{"get":{"description":"Get a paginated list of container registries","operationId":"listContainerRegistries","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerRegistryPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List container registries","tags":["Container Registries"]},"post":{"description":"Create a new container registry","operationId":"createContainerRegistry","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContainerRegistryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseContainerRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a container registry","tags":["Container Registries"]}},"/container-registries/pull-usage":{"get":{"description":"Get configured registry pull usage and rate limit visibility","operationId":"getContainerRegistryPullUsage","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponsePullUsageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get container registry pull usage","tags":["Container Registries"]}},"/container-registries/sync":{"post":{"description":"Sync container registries from a remote source","operationId":"syncContainerRegistries","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerregistrySyncRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Sync container registries","tags":["Container Registries"]}},"/container-registries/{id}":{"delete":{"description":"Delete a container registry by ID","operationId":"deleteContainerRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a container registry","tags":["Container Registries"]},"get":{"description":"Get a container registry by ID","operationId":"getContainerRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseContainerRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a container registry","tags":["Container Registries"]},"put":{"description":"Update an existing container registry","operationId":"updateContainerRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContainerRegistryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseContainerRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a container registry","tags":["Container Registries"]}},"/container-registries/{id}/test":{"post":{"description":"Test connectivity and authentication to a container registry","operationId":"testContainerRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Test a container registry","tags":["Container Registries"]}},"/customize/categories":{"get":{"description":"Get all available customization categories with metadata","operationId":"get-customize-categories","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CategoryCategory"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get customization categories","tags":["Customize"]}},"/customize/git-repositories":{"get":{"description":"Get a paginated list of git repositories","operationId":"listGitRepositories","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitRepositoryPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List git repositories","tags":["Customize"]},"post":{"description":"Create a new git repository configuration","operationId":"createGitRepository","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGitRepositoryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitRepository"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a git repository","tags":["Customize"]}},"/customize/git-repositories/{id}":{"delete":{"description":"Delete a git repository configuration by ID","operationId":"deleteGitRepository","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a git repository","tags":["Customize"]},"get":{"description":"Get a git repository by ID","operationId":"getGitRepository","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitRepository"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a git repository","tags":["Customize"]},"put":{"description":"Update an existing git repository configuration","operationId":"updateGitRepository","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGitRepositoryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitRepository"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a git repository","tags":["Customize"]}},"/customize/git-repositories/{id}/branches":{"get":{"description":"Get all branches from a git repository with default branch detection","operationId":"listGitRepositoryBranches","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBranchesResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List repository branches","tags":["Customize"]}},"/customize/git-repositories/{id}/files":{"get":{"description":"Browse files and directories in a git repository","operationId":"browseGitRepositoryFiles","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}},{"description":"Branch to browse","explode":false,"in":"query","name":"branch","schema":{"description":"Branch to browse","type":"string"}},{"description":"Path within repository (optional)","explode":false,"in":"query","name":"path","schema":{"description":"Path within repository (optional)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBrowseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Browse repository files","tags":["Customize"]}},"/customize/git-repositories/{id}/test":{"post":{"description":"Test connectivity and authentication to a git repository","operationId":"testGitRepository","parameters":[{"description":"Repository ID","in":"path","name":"id","required":true,"schema":{"description":"Repository ID","type":"string"}},{"description":"Branch to test (optional, uses repository default branch when omitted)","explode":false,"in":"query","name":"branch","schema":{"description":"Branch to test (optional, uses repository default branch when omitted)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Test a git repository","tags":["Customize"]}},"/customize/search":{"post":{"description":"Search customization categories and options by query","operationId":"search-customize","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Search customization options","tags":["Customize"]}},"/dashboard/stream":{"get":{"description":"Stream dashboard snapshot updates for the local environment and all enabled remote environments as JSON lines","operationId":"stream-all-dashboards","parameters":[{"description":"Debug mode: force an empty action item list","explode":false,"in":"query","name":"debugAllGood","schema":{"default":false,"description":"Debug mode: force an empty action item list","type":"boolean"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Stream dashboard snapshots across all environments","tags":["Dashboard"]}},"/diagnostics":{"get":{"description":"Returns Go runtime, memory, garbage-collector, and WebSocket connection statistics.","operationId":"get-diagnostics","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemDiagnostics"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get runtime diagnostics","tags":["Diagnostics"]}},"/diagnostics/logs":{"get":{"description":"Returns the most recent buffered backend log entries (oldest first).","operationId":"get-diagnostics-logs","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SystemLogEntry"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get recent backend logs","tags":["Diagnostics"]}},"/edge-mtls/ca":{"get":{"description":"Download the Arcane-managed certificate authority used for generated edge mTLS client certificates","operationId":"downloadEdgeMTLSCA","responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download Arcane-generated edge mTLS CA","tags":["Environments"]}},"/environments":{"get":{"description":"Get a paginated list of Docker environments","operationId":"listEnvironments","parameters":[{"description":"Search query for filtering by name or API URL","explode":false,"in":"query","name":"search","schema":{"description":"Search query for filtering by name or API URL","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}},{"description":"Filter by environment type (comma-separated: http,edge,websocket,grpc,polling)","explode":false,"in":"query","name":"type","schema":{"description":"Filter by environment type (comma-separated: http,edge,websocket,grpc,polling)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List environments","tags":["Environments"]},"post":{"description":"Create a new Docker environment","operationId":"createEnvironment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentCreate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironmentWithApiKey"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create an environment","tags":["Environments"]}},"/environments/pair":{"post":{"description":"Agent sends API key to complete environment pairing","operationId":"pairEnvironment","parameters":[{"description":"API key for environment pairing","in":"header","name":"X-API-Key","schema":{"description":"API key for environment pairing","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Pair agent with manager","tags":["Environments"]}},"/environments/{id}":{"delete":{"description":"Delete a Arcane environment","operationId":"deleteEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete an environment","tags":["Environments"]},"get":{"description":"Get a Docker environment by ID","operationId":"getEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironment"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get an environment","tags":["Environments"]},"put":{"description":"Update a Docker environment","operationId":"updateEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentUpdate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironment"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update an environment","tags":["Environments"]}},"/environments/{id}/activities":{"get":{"description":"Get current and recent background activities for an environment","operationId":"list-activities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"desc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"default":50,"description":"Limit","format":"int64","type":"integer"}},{"description":"Filter by activity status","explode":false,"in":"query","name":"status","schema":{"description":"Filter by activity status","type":"string"}},{"description":"Filter by activity type","explode":false,"in":"query","name":"type","schema":{"description":"Filter by activity type","type":"string"}},{"description":"Filter by resource type","explode":false,"in":"query","name":"resourceType","schema":{"description":"Filter by resource type","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BasePaginatedActivity"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List background activities","tags":["Activities"]}},"/environments/{id}/activities/history":{"delete":{"description":"Delete completed background activity history for an environment","operationId":"clear-activity-history","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseClearHistoryResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Clear background activity history","tags":["Activities"]}},"/environments/{id}/activities/{activityId}":{"get":{"description":"Get a background activity with its recent output messages","operationId":"get-activity","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Activity ID","in":"path","name":"activityId","required":true,"schema":{"description":"Activity ID","type":"string"}},{"description":"Maximum messages to return","explode":false,"in":"query","name":"limit","schema":{"default":500,"description":"Maximum messages to return","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetail"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get background activity","tags":["Activities"]}},"/environments/{id}/activities/{activityId}/cancel":{"post":{"description":"Request cancellation of a running or queued background activity","operationId":"cancel-activity","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Activity ID","in":"path","name":"activityId","required":true,"schema":{"description":"Activity ID","type":"string"}},{"description":"Display name to attribute the cancellation to (used when proxying to a remote environment)","explode":false,"in":"query","name":"requestedBy","schema":{"description":"Display name to attribute the cancellation to (used when proxying to a remote environment)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseActivity"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Cancel a background activity","tags":["Activities"]}},"/environments/{id}/agent/pair":{"post":{"description":"Generate or rotate the local agent pairing token","operationId":"pairAgent","parameters":[{"description":"Environment ID (must be 0 for local)","in":"path","name":"id","required":true,"schema":{"description":"Environment ID (must be 0 for local)","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentAgentPairRequest"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseAgentPairResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Pair with local agent","tags":["Environments"]}},"/environments/{id}/builds/browse":{"delete":{"description":"Delete a file or directory under the builds workspace root","operationId":"builds-browse-delete","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"File or directory path to delete","explode":false,"in":"query","name":"path","schema":{"description":"File or directory path to delete","type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete build workspace file","tags":["Builds"]},"get":{"description":"List files and directories under the builds workspace root","operationId":"builds-browse","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Directory path to browse","explode":false,"in":"query","name":"path","schema":{"default":"/","description":"Directory path to browse","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListFileEntry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Browse build workspace files","tags":["Builds"]}},"/environments/{id}/builds/browse/content":{"get":{"description":"Read file content under the builds workspace root","operationId":"builds-browse-content","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"File path","explode":false,"in":"query","name":"path","schema":{"description":"File path","type":"string"}},{"description":"Maximum bytes to read (default 1MB)","explode":false,"in":"query","name":"maxBytes","schema":{"default":1048576,"description":"Maximum bytes to read (default 1MB)","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBuildFileContentResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get build workspace file content","tags":["Builds"]}},"/environments/{id}/builds/browse/download":{"get":{"description":"Download a file from the builds workspace root","operationId":"builds-browse-download","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"File path","explode":false,"in":"query","name":"path","schema":{"description":"File path","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{}}},"description":"OK","headers":{"Content-Disposition":{"schema":{"type":"string"}},"Content-Length":{"schema":{"format":"int64","type":"integer"}},"Content-Type":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download build workspace file","tags":["Builds"]}},"/environments/{id}/builds/browse/mkdir":{"post":{"description":"Create a directory under the builds workspace root","operationId":"builds-browse-mkdir","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Directory path to create","explode":false,"in":"query","name":"path","schema":{"description":"Directory path to create","type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create build workspace directory","tags":["Builds"]}},"/environments/{id}/builds/browse/upload":{"post":{"description":"Upload a file into the builds workspace root","operationId":"builds-browse-upload","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Destination path","explode":false,"in":"query","name":"path","schema":{"default":"/","description":"Destination path","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"contentMediaType":"application/octet-stream","description":"File to upload","format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Upload build workspace file","tags":["Builds"]}},"/environments/{id}/containers":{"get":{"description":"Paginated list of containers","operationId":"list-containers","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Limit","format":"int64","type":"integer"}},{"description":"Optional grouping mode (for example: project)","explode":false,"in":"query","name":"groupBy","schema":{"description":"Optional grouping mode (for example: project)","type":"string"}},{"description":"Include internal containers","explode":false,"in":"query","name":"includeInternal","schema":{"default":false,"description":"Include internal containers","type":"boolean"}},{"description":"Filter by update status (has_update, up_to_date, error, unknown)","explode":false,"in":"query","name":"updates","schema":{"description":"Filter by update status (has_update, up_to_date, error, unknown)","type":"string"}},{"description":"Filter standalone containers only (true/false)","explode":false,"in":"query","name":"standalone","schema":{"description":"Filter standalone containers only (true/false)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List containers","tags":["Containers"]},"post":{"operationId":"create-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerCreate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerCreatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create container","tags":["Containers"]}},"/environments/{id}/containers/counts":{"get":{"operationId":"container-status-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Include internal containers","explode":false,"in":"query","name":"includeInternal","schema":{"default":false,"description":"Include internal containers","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerStatusCountsResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Container status counts","tags":["Containers"]}},"/environments/{id}/containers/{containerId}":{"delete":{"operationId":"delete-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}},{"description":"Force delete running container","explode":false,"in":"query","name":"force","schema":{"default":false,"description":"Force delete running container","type":"boolean"}},{"description":"Remove associated volumes","explode":false,"in":"query","name":"volumes","schema":{"default":false,"description":"Remove associated volumes","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete container","tags":["Containers"]},"get":{"operationId":"get-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerDetailsResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/auto-update":{"put":{"description":"Enable or disable auto-update for a specific container","operationId":"set-container-auto-update","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAutoUpdateInputBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Set container auto-update","tags":["Containers","Updater"]}},"/environments/{id}/containers/{containerId}/commit":{"post":{"description":"Create an image from a container","operationId":"commit-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerCommitRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseCommitResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Commit container","tags":["Containers","Images"]}},"/environments/{id}/containers/{containerId}/kill":{"post":{"description":"Send a signal to the container's main process (default SIGKILL)","operationId":"kill-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}},{"description":"Signal to send (for example SIGTERM, SIGKILL). Defaults to SIGKILL.","explode":false,"in":"query","name":"signal","schema":{"description":"Signal to send (for example SIGTERM, SIGKILL). Defaults to SIGKILL.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Kill container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/pause":{"post":{"operationId":"pause-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Pause container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/redeploy":{"post":{"description":"Pull latest image and recreate container","operationId":"redeploy-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerDetailsResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Redeploy container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/restart":{"post":{"operationId":"restart-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Restart container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/start":{"post":{"operationId":"start-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Start container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/stop":{"post":{"operationId":"stop-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Stop container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/unpause":{"post":{"operationId":"unpause-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerActionResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Unpause container","tags":["Containers"]}},"/environments/{id}/containers/{containerId}/update":{"post":{"description":"Pull the latest image and apply the appropriate update strategy for a specific container","operationId":"update-container","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Container ID to update","in":"path","name":"containerId","required":true,"schema":{"description":"Container ID to update","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a single container","tags":["Updater","Containers"]}},"/environments/{id}/dashboard":{"get":{"description":"Returns the dashboard first-paint snapshot in a single response","operationId":"get-dashboard","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Debug mode: force an empty action item list","explode":false,"in":"query","name":"debugAllGood","schema":{"default":false,"description":"Debug mode: force an empty action item list","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSnapshot"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get dashboard snapshot","tags":["Dashboard"]}},"/environments/{id}/deployment":{"get":{"description":"Get Docker run and compose snippets for environment deployment","operationId":"getDeploymentSnippets","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDeploymentSnippet"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get deployment snippets","tags":["Environments"]}},"/environments/{id}/deployment/mtls/bundle":{"get":{"description":"Download the generated mTLS client certificate bundle for an edge environment","operationId":"downloadEnvironmentMTLSBundle","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download environment mTLS bundle","tags":["Environments"]}},"/environments/{id}/deployment/mtls/{fileName}":{"get":{"description":"Download an individual generated mTLS client certificate asset for an edge environment","operationId":"downloadEnvironmentMTLSFile","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"mTLS asset filename","in":"path","name":"fileName","required":true,"schema":{"description":"mTLS asset filename","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download environment mTLS asset","tags":["Environments"]}},"/environments/{id}/gitops-syncs":{"get":{"description":"Get a paginated list of GitOps syncs for an environment","operationId":"listGitOpsSyncs","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitOpsSyncPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List GitOps syncs","tags":["GitOps Syncs"]},"post":{"description":"Create a new GitOps sync configuration for an environment","operationId":"createGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitopsCreateSyncRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitOpsSync"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a GitOps sync","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/import":{"post":{"description":"Import multiple GitOps sync configurations from JSON","operationId":"importGitOpsSyncs","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GitopsImportGitOpsSyncRequest"},"type":["array","null"]}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseImportGitOpsSyncResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Import GitOps syncs","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/{syncId}":{"delete":{"description":"Delete a GitOps sync configuration by ID","operationId":"deleteGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a GitOps sync","tags":["GitOps Syncs"]},"get":{"description":"Get a GitOps sync by ID","operationId":"getGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitOpsSync"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a GitOps sync","tags":["GitOps Syncs"]},"put":{"description":"Update an existing GitOps sync configuration","operationId":"updateGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitopsUpdateSyncRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseGitOpsSync"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a GitOps sync","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/{syncId}/files":{"get":{"description":"Browse files in the synced repository","operationId":"browseGitOpsSyncFiles","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}},{"description":"Path to browse (optional)","explode":false,"in":"query","name":"path","schema":{"description":"Path to browse (optional)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBrowseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Browse GitOps sync files","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/{syncId}/status":{"get":{"description":"Get the current status of a GitOps sync","operationId":"getGitOpsSyncStatus","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSyncStatus"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get GitOps sync status","tags":["GitOps Syncs"]}},"/environments/{id}/gitops-syncs/{syncId}/sync":{"post":{"description":"Manually trigger a sync operation","operationId":"performGitOpsSync","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Sync ID","in":"path","name":"syncId","required":true,"schema":{"description":"Sync ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSyncResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Perform a GitOps sync","tags":["GitOps Syncs"]}},"/environments/{id}/heartbeat":{"post":{"description":"Update the heartbeat timestamp for an environment","operationId":"updateHeartbeat","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update environment heartbeat","tags":["Environments"]}},"/environments/{id}/image-updates/by-refs":{"get":{"operationId":"get-update-info-by-refs","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Comma-separated image references","explode":false,"in":"query","name":"imageRefs","schema":{"description":"Comma-separated image references","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMapStringUpdateInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get persisted update info for image references","tags":["Image Updates"]}},"/environments/{id}/image-updates/check":{"get":{"operationId":"check-image-update","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image reference","explode":false,"in":"query","name":"imageRef","schema":{"description":"Image reference","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check image update by reference","tags":["Image Updates"]}},"/environments/{id}/image-updates/check-all":{"post":{"operationId":"check-all-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageupdateCheckAllImagesRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBatchResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check all images","tags":["Image Updates"]}},"/environments/{id}/image-updates/check-batch":{"post":{"operationId":"check-multiple-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageupdateBatchImageUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBatchResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check multiple images","tags":["Image Updates"]}},"/environments/{id}/image-updates/check/{imageId}":{"get":{"operationId":"check-image-update-by-id","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check image update by ID","tags":["Image Updates"]},"post":{"operationId":"check-image-update-by-id-post","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check image update by ID (POST)","tags":["Image Updates"]}},"/environments/{id}/image-updates/summary":{"get":{"operationId":"get-update-summary","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get update summary","tags":["Image Updates"]}},"/environments/{id}/images":{"get":{"description":"Get a paginated list of Docker images","operationId":"list-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by in-use status (true/false)","explode":false,"in":"query","name":"inUse","schema":{"description":"Filter by in-use status (true/false)","type":"string"}},{"description":"Filter by update availability (true/false)","explode":false,"in":"query","name":"updates","schema":{"description":"Filter by update availability (true/false)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagePaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List images","tags":["Images"]}},"/environments/{id}/images/build":{"post":{"description":"Build a Docker image using BuildKit with streaming progress output","operationId":"build-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerTypesBuildRequest"}}},"required":true},"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Build an image","tags":["Images"]}},"/environments/{id}/images/builds":{"get":{"description":"Get a paginated list of image build history for an environment","operationId":"list-image-builds","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"desc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by status","explode":false,"in":"query","name":"status","schema":{"description":"Filter by status","type":"string"}},{"description":"Filter by provider","explode":false,"in":"query","name":"provider","schema":{"description":"Filter by provider","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageBuildPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List image builds","tags":["Images"]}},"/environments/{id}/images/builds/{buildId}":{"get":{"description":"Get a single image build history entry with output","operationId":"get-image-build","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Build ID","in":"path","name":"buildId","required":true,"schema":{"description":"Build ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBuildRecord"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get image build","tags":["Images"]}},"/environments/{id}/images/counts":{"get":{"description":"Get counts of images in use, unused, total, and total size","operationId":"get-image-usage-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageUsageCountsResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get image usage counts","tags":["Images"]}},"/environments/{id}/images/prune":{"post":{"description":"Remove unused Docker images","operationId":"prune-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Only remove dangling images","explode":false,"in":"query","name":"dangling","schema":{"description":"Only remove dangling images","type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PruneImagesInputBody"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponsePruneReport"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Prune unused images","tags":["Images"]}},"/environments/{id}/images/pull":{"post":{"description":"Pull a Docker image from a registry with streaming progress output","operationId":"pull-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagePullOptions"}}},"required":true},"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Pull an image","tags":["Images"]}},"/environments/{id}/images/search":{"get":{"description":"Search Docker Hub images","operationId":"search-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search term","explode":false,"in":"query","name":"term","schema":{"description":"Search term","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListSearchResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Search images","tags":["Images"]}},"/environments/{id}/images/upload":{"post":{"description":"Upload a Docker image from a tar archive","operationId":"upload-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"contentMediaType":"application/octet-stream","description":"Docker image tar archive","format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseLoadResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Upload an image","tags":["Images"]}},"/environments/{id}/images/vulnerabilities/summaries":{"post":{"description":"Retrieves scan summaries for a list of images (batch)","operationId":"get-image-vulnerability-summaries","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityScanSummariesRequest","description":"Batch scan summary request"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScanSummariesResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get vulnerability scan summaries","tags":["Vulnerabilities"]}},"/environments/{id}/images/{imageId}":{"delete":{"description":"Remove a Docker image by ID","operationId":"remove-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}},{"description":"Force removal","explode":false,"in":"query","name":"force","schema":{"description":"Force removal","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Remove an image","tags":["Images"]},"get":{"description":"Get a Docker image by its ID","operationId":"get-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetailSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get image by ID","tags":["Images"]}},"/environments/{id}/images/{imageId}/vulnerabilities":{"get":{"description":"Retrieves the most recent vulnerability scan result for an image","operationId":"get-image-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScanResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get vulnerability scan result","tags":["Vulnerabilities"]}},"/environments/{id}/images/{imageId}/vulnerabilities/list":{"get":{"description":"Retrieves paginated vulnerabilities for an image","operationId":"list-image-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Sort field","explode":false,"in":"query","name":"sort","schema":{"description":"Sort field","type":"string"}},{"description":"Sort order","explode":false,"in":"query","name":"order","schema":{"description":"Sort order","type":"string"}},{"description":"Start offset","explode":false,"in":"query","name":"start","schema":{"description":"Start offset","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"description":"Limit","format":"int64","type":"integer"}},{"description":"Comma-separated severity filter","explode":false,"in":"query","name":"severity","schema":{"description":"Comma-separated severity filter","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BasePaginatedVulnerability"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List image vulnerabilities","tags":["Vulnerabilities"]}},"/environments/{id}/images/{imageId}/vulnerabilities/scan":{"post":{"description":"Initiates a vulnerability scan for the specified image using Trivy","operationId":"scan-image-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID to scan","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID to scan","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScanResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Scan image for vulnerabilities","tags":["Vulnerabilities"]}},"/environments/{id}/images/{imageId}/vulnerabilities/summary":{"get":{"description":"Retrieves just the summary of vulnerabilities for an image (for list views)","operationId":"get-image-vulnerability-summary","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID","in":"path","name":"imageId","required":true,"schema":{"description":"Image ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScanSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get vulnerability scan summary","tags":["Vulnerabilities"]}},"/environments/{id}/images/{name}/attestations":{"get":{"description":"Get in-toto attestation statements attached to a Docker image","operationId":"get-image-attestations","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID or image reference","in":"path","name":"name","required":true,"schema":{"description":"Image ID or image reference","type":"string"}},{"description":"OCI platform selector, for example linux/amd64","explode":false,"in":"query","name":"platform","schema":{"description":"OCI platform selector, for example linux/amd64","type":"string"}},{"description":"Exact in-toto predicate type URI to include","explode":false,"in":"query","name":"predicateType","schema":{"description":"Exact in-toto predicate type URI to include","type":"string"}},{"description":"Include verbatim statement JSON bodies","explode":false,"in":"query","name":"statement","schema":{"default":false,"description":"Include verbatim statement JSON bodies","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseAttestationList"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get image attestations","tags":["Images"]}},"/environments/{id}/images/{name}/export":{"get":{"description":"Download a Docker image as a tar archive","operationId":"export-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID or image reference","in":"path","name":"name","required":true,"schema":{"description":"Image ID or image reference","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Export image","tags":["Images"]}},"/environments/{id}/images/{name}/history":{"get":{"description":"Get Docker image layer history","operationId":"get-image-history","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID or image reference","in":"path","name":"name","required":true,"schema":{"description":"Image ID or image reference","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListHistoryItem"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get image history","tags":["Images"]}},"/environments/{id}/images/{name}/tag":{"post":{"description":"Add a repository tag to an image","operationId":"tag-image","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Image ID or image reference","in":"path","name":"name","required":true,"schema":{"description":"Image ID or image reference","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageTagRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Tag image","tags":["Images"]}},"/environments/{id}/job-schedules":{"get":{"description":"Get configured cron schedules for background jobs","operationId":"get-job-schedules","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobscheduleConfig"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get job schedules","tags":["JobSchedules"]},"put":{"description":"Update background job cron schedules and reschedule running jobs","operationId":"update-job-schedules","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobscheduleUpdate","description":"Job schedule update data"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseConfig"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update job schedules","tags":["JobSchedules"]}},"/environments/{id}/jobs":{"get":{"description":"Get status, schedule, and metadata for all background jobs","operationId":"list-jobs","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobscheduleJobListResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List all background jobs","tags":["JobSchedules"]}},"/environments/{id}/jobs/{jobId}/run":{"post":{"description":"Manually trigger a background job to run immediately","operationId":"run-job","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Job ID to run","in":"path","name":"jobId","required":true,"schema":{"description":"Job ID to run","minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobscheduleJobRunResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Run a job now","tags":["JobSchedules"]}},"/environments/{id}/networks":{"get":{"operationId":"list-networks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by in-use status (true/false)","explode":false,"in":"query","name":"inUse","schema":{"description":"Filter by in-use status (true/false)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List networks","tags":["Networks"]},"post":{"operationId":"create-network","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkCreateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkCreatedApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create network","tags":["Networks"]}},"/environments/{id}/networks/counts":{"get":{"operationId":"network-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkCountsApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Network counts","tags":["Networks"]}},"/environments/{id}/networks/prune":{"post":{"operationId":"prune-networks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkPruneResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Prune networks","tags":["Networks"]}},"/environments/{id}/networks/topology":{"get":{"operationId":"get-network-topology","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkTopologyApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get network topology","tags":["Networks"]}},"/environments/{id}/networks/{networkId}":{"delete":{"operationId":"delete-network","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Network ID","in":"path","name":"networkId","required":true,"schema":{"description":"Network ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkMessageApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete network","tags":["Networks"]},"get":{"operationId":"get-network","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Network ID","in":"path","name":"networkId","required":true,"schema":{"description":"Network ID","type":"string"}},{"explode":false,"in":"query","name":"sort","schema":{"default":"name","type":"string"}},{"explode":false,"in":"query","name":"order","schema":{"default":"asc","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkInspectApiResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get network","tags":["Networks"]}},"/environments/{id}/notifications/settings":{"get":{"operationId":"get-all-notification-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get all notification settings","tags":["Notifications"]},"post":{"operationId":"create-or-update-notification-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationUpdate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create or update notification settings","tags":["Notifications"]}},"/environments/{id}/notifications/settings/{provider}":{"delete":{"operationId":"delete-notification-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Provider","in":"path","name":"provider","required":true,"schema":{"description":"Provider","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete notification settings","tags":["Notifications"]},"get":{"operationId":"get-notification-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Provider","in":"path","name":"provider","required":true,"schema":{"description":"Provider","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get notification settings by provider","tags":["Notifications"]}},"/environments/{id}/notifications/test/{provider}":{"post":{"operationId":"test-notification","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Provider","in":"path","name":"provider","required":true,"schema":{"description":"Provider","type":"string"}},{"explode":false,"in":"query","name":"type","schema":{"default":"simple","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTestResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Test notification","tags":["Notifications"]}},"/environments/{id}/ports":{"get":{"operationId":"list-ports","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List port mappings","tags":["Ports"]}},"/environments/{id}/projects":{"get":{"description":"Get a paginated list of Docker Compose projects","operationId":"list-projects","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by status (comma-separated: running,stopped,partially running)","explode":false,"in":"query","name":"status","schema":{"description":"Filter by status (comma-separated: running,stopped,partially running)","type":"string"}},{"description":"Filter by update status (has_update, up_to_date, error, unknown)","explode":false,"in":"query","name":"updates","schema":{"description":"Filter by update status (has_update, up_to_date, error, unknown)","type":"string"}},{"description":"Archived filter: 'true' (only archived), 'all' (include archived). Default excludes archived.","explode":false,"in":"query","name":"archived","schema":{"description":"Archived filter: 'true' (only archived), 'all' (include archived). Default excludes archived.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List projects","tags":["Projects"]},"post":{"description":"Create a new Docker Compose project","operationId":"create-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreateProject"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseCreateReponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a project","tags":["Projects"]}},"/environments/{id}/projects/counts":{"get":{"description":"Get counts of running, stopped, and total projects","operationId":"get-project-status-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStatusCounts"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get project status counts","tags":["Projects"]}},"/environments/{id}/projects/{projectId}":{"get":{"description":"Get a Docker Compose project by ID","operationId":"get-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a project","tags":["Projects"]},"put":{"description":"Update a Docker Compose project configuration","operationId":"update-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdateProject"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/archive":{"post":{"description":"Archive a stopped Docker Compose project","operationId":"archive-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Archive a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/build":{"post":{"description":"Build Docker Compose services with build directives using BuildKit","operationId":"build-project-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildProjectInputBody"}}}},"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Build project images","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/compose":{"get":{"description":"Get compose content, includes, and service configs for a project","operationId":"get-project-compose","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get project compose details","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/destroy":{"delete":{"description":"Destroy a Docker Compose project and optionally remove files/volumes","operationId":"destroy-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDestroy"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Destroy a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/down":{"post":{"description":"Bring down a Docker Compose project (docker-compose down)","operationId":"down-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Bring down a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/file":{"get":{"description":"Get the contents of a single project-related file by relative path","operationId":"get-project-file","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}},{"description":"Path to the file relative to the project","explode":false,"in":"query","name":"relativePath","schema":{"description":"Path to the file relative to the project","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseIncludeFile"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a project file","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/files":{"get":{"description":"Get directory files for a project","operationId":"get-project-files","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get project files","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/includes":{"put":{"description":"Update an include file within a Docker Compose project","operationId":"update-project-include","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdateIncludeFile"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update project include file","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/pull":{"post":{"description":"Pull all images for a Docker Compose project with streaming progress output","operationId":"pull-project-images","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Pull project images","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/redeploy":{"post":{"description":"Redeploy a Docker Compose project (down + up)","operationId":"redeploy-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDeployOptions"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Redeploy a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/restart":{"post":{"description":"Restart all containers in a Docker Compose project","operationId":"restart-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Restart a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/runtime":{"get":{"description":"Get runtime service state for a project","operationId":"get-project-runtime","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get project runtime","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/unarchive":{"post":{"description":"Unarchive a Docker Compose project","operationId":"unarchive-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Unarchive a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/up":{"post":{"description":"Deploy a Docker Compose project (docker-compose up)","operationId":"deploy-project","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDeployOptions"}}}},"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Deploy a project","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/update-services":{"post":{"description":"Pull latest images and recreate the given services (all services when none are specified)","operationId":"update-project-services","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectServicesInputBody"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update project services","tags":["Projects"]}},"/environments/{id}/projects/{projectId}/updates":{"get":{"description":"Get image update summary for a project","operationId":"get-project-updates","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Project ID","in":"path","name":"projectId","required":true,"schema":{"description":"Project ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDetails"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get project updates","tags":["Projects"]}},"/environments/{id}/settings":{"get":{"description":"Get all settings for an environment","operationId":"get-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SettingsPublicSetting"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get settings","tags":["Settings"]},"put":{"description":"Update settings for an environment","operationId":"update-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsUpdate","description":"Settings update data"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListSettingDto"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update settings","tags":["Settings"]}},"/environments/{id}/settings/public":{"get":{"description":"Get all public settings for an environment","operationId":"get-public-settings","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SettingsPublicSetting"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get public settings","tags":["Settings"]}},"/environments/{id}/swarm/configs":{"get":{"operationId":"list-swarm-configs","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListConfigSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm configs","tags":["Swarm"]},"post":{"operationId":"create-swarm-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmConfigCreateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseConfigSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create swarm config","tags":["Swarm"]}},"/environments/{id}/swarm/configs/{configId}":{"delete":{"operationId":"delete-swarm-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Config ID","in":"path","name":"configId","required":true,"schema":{"description":"Config ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm config","tags":["Swarm"]},"get":{"operationId":"get-swarm-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Config ID","in":"path","name":"configId","required":true,"schema":{"description":"Config ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseConfigSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm config","tags":["Swarm"]},"put":{"operationId":"update-swarm-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Config ID","in":"path","name":"configId","required":true,"schema":{"description":"Config ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmConfigUpdateRequest"}}},"required":true},"responses":{"204":{"description":"No Content"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm config","tags":["Swarm"]}},"/environments/{id}/swarm/info":{"get":{"operationId":"get-swarm-info","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm info","tags":["Swarm"]}},"/environments/{id}/swarm/init":{"post":{"operationId":"init-swarm","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmInitRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmInitResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Initialize swarm","tags":["Swarm"]}},"/environments/{id}/swarm/join":{"post":{"operationId":"join-swarm","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmJoinRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Join swarm","tags":["Swarm"]}},"/environments/{id}/swarm/join-tokens":{"get":{"operationId":"get-swarm-join-tokens","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmJoinTokensResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm join tokens","tags":["Swarm"]}},"/environments/{id}/swarm/join-tokens/rotate":{"post":{"operationId":"rotate-swarm-join-tokens","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmRotateJoinTokensRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Rotate swarm join tokens","tags":["Swarm"]}},"/environments/{id}/swarm/leave":{"post":{"operationId":"leave-swarm","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmLeaveRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Leave swarm","tags":["Swarm"]}},"/environments/{id}/swarm/nodes":{"get":{"operationId":"list-swarm-nodes","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseNodeSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm nodes","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}":{"delete":{"operationId":"delete-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}},{"description":"Force node removal","explode":false,"in":"query","name":"force","schema":{"default":false,"description":"Force node removal","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm node","tags":["Swarm"]},"get":{"operationId":"get-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseNodeSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm node","tags":["Swarm"]},"patch":{"operationId":"update-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmNodeUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm node","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}/agent/deployment":{"post":{"operationId":"get-swarm-node-agent-deployment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSwarmNodeAgentDeploymentInputBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmNodeAgentDeployment"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm node agent deployment snippets","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}/demote":{"post":{"operationId":"demote-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Demote swarm node","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}/promote":{"post":{"operationId":"promote-swarm-node","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Promote swarm node","tags":["Swarm"]}},"/environments/{id}/swarm/nodes/{nodeId}/tasks":{"get":{"operationId":"list-swarm-node-tasks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Node ID","in":"path","name":"nodeId","required":true,"schema":{"description":"Node ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseTaskSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List tasks for a swarm node","tags":["Swarm"]}},"/environments/{id}/swarm/secrets":{"get":{"operationId":"list-swarm-secrets","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListSecretSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm secrets","tags":["Swarm"]},"post":{"operationId":"create-swarm-secret","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSecretCreateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSecretSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create swarm secret","tags":["Swarm"]}},"/environments/{id}/swarm/secrets/{secretId}":{"delete":{"operationId":"delete-swarm-secret","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Secret ID","in":"path","name":"secretId","required":true,"schema":{"description":"Secret ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm secret","tags":["Swarm"]},"get":{"operationId":"get-swarm-secret","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Secret ID","in":"path","name":"secretId","required":true,"schema":{"description":"Secret ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSecretSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm secret","tags":["Swarm"]},"put":{"operationId":"update-swarm-secret","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Secret ID","in":"path","name":"secretId","required":true,"schema":{"description":"Secret ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSecretUpdateRequest"}}},"required":true},"responses":{"204":{"description":"No Content"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm secret","tags":["Swarm"]}},"/environments/{id}/swarm/services":{"get":{"operationId":"list-swarm-services","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseServiceSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm services","tags":["Swarm"]},"post":{"operationId":"create-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmServiceCreateRequest","description":"Service creation request"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceCreateResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/services/{serviceId}":{"delete":{"operationId":"delete-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm service","tags":["Swarm"]},"get":{"operationId":"get-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceInspect"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm service","tags":["Swarm"]},"put":{"operationId":"update-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmServiceUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceUpdateResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/services/{serviceId}/rollback":{"post":{"operationId":"rollback-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceUpdateResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Rollback a swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/services/{serviceId}/scale":{"post":{"operationId":"scale-swarm-service","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmServiceScaleRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseServiceUpdateResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Scale a swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/services/{serviceId}/tasks":{"get":{"operationId":"list-swarm-service-tasks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Service ID","in":"path","name":"serviceId","required":true,"schema":{"description":"Service ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseTaskSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List tasks for a swarm service","tags":["Swarm"]}},"/environments/{id}/swarm/spec":{"put":{"operationId":"update-swarm-spec","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm spec","tags":["Swarm"]}},"/environments/{id}/swarm/stacks":{"get":{"operationId":"list-swarm-stacks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseStackSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm stacks","tags":["Swarm"]},"post":{"operationId":"deploy-swarm-stack","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmStackDeployRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStackDeployResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Deploy swarm stack","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/config/render":{"post":{"operationId":"render-swarm-stack-config","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmStackRenderConfigRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStackRenderConfigResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Render/validate swarm stack config","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/{name}":{"delete":{"operationId":"delete-swarm-stack","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete swarm stack","tags":["Swarm"]},"get":{"operationId":"get-swarm-stack","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStackInspect"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm stack","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/{name}/services":{"get":{"operationId":"list-swarm-stack-services","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseServiceSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm stack services","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/{name}/source":{"get":{"operationId":"get-swarm-stack-source","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStackSource"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm stack source","tags":["Swarm"]},"put":{"operationId":"update-swarm-stack-source","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmStackSourceUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStackSource"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update swarm stack source","tags":["Swarm"]}},"/environments/{id}/swarm/stacks/{name}/tasks":{"get":{"operationId":"list-swarm-stack-tasks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Stack name","in":"path","name":"name","required":true,"schema":{"description":"Stack name","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseTaskSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm stack tasks","tags":["Swarm"]}},"/environments/{id}/swarm/status":{"get":{"operationId":"get-swarm-status","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseRuntimeStatus"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm status","tags":["Swarm"]}},"/environments/{id}/swarm/tasks":{"get":{"operationId":"list-swarm-tasks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmPaginatedResponseTaskSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List swarm tasks","tags":["Swarm"]}},"/environments/{id}/swarm/unlock":{"post":{"operationId":"unlock-swarm","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwarmSwarmUnlockRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Unlock swarm","tags":["Swarm"]}},"/environments/{id}/swarm/unlock-key":{"get":{"operationId":"get-swarm-unlock-key","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmUnlockKeyResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get swarm unlock key","tags":["Swarm"]}},"/environments/{id}/sync":{"post":{"description":"Sync container registries and git repositories to a remote environment","operationId":"syncEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Sync environment","tags":["Environments"]}},"/environments/{id}/system/containers/start-all":{"post":{"description":"Start all Docker containers","operationId":"start-all-containers","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseActionResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Start all containers","tags":["System"]}},"/environments/{id}/system/containers/start-stopped":{"post":{"description":"Start all stopped Docker containers","operationId":"start-all-stopped-containers","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseActionResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Start all stopped containers","tags":["System"]}},"/environments/{id}/system/containers/stop-all":{"post":{"description":"Stop all running Docker containers","operationId":"stop-all-containers","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseActionResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Stop all containers","tags":["System"]}},"/environments/{id}/system/convert":{"post":{"description":"Convert a docker run command to docker-compose format","operationId":"convert-docker-run","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemConvertDockerRunRequest","description":"Docker run command"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemConvertDockerRunResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Convert docker run command","tags":["System"]}},"/environments/{id}/system/docker/info":{"get":{"description":"Get Docker daemon version and system information","operationId":"get-docker-info","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerinfoInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get Docker info","tags":["System"]}},"/environments/{id}/system/health":{"head":{"description":"Check if the Docker daemon is responsive","operationId":"system-health","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check system health","tags":["System"]}},"/environments/{id}/system/prune":{"post":{"description":"Remove unused Docker resources (containers, images, volumes, networks)","operationId":"prune-all","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemPruneAllRequest","description":"Prune options"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponsePruneAllResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Prune Docker resources","tags":["System"]}},"/environments/{id}/system/upgrade":{"post":{"description":"Trigger a system upgrade","operationId":"trigger-upgrade","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"Accepted"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Trigger system upgrade","tags":["System"]}},"/environments/{id}/system/upgrade/all":{"post":{"description":"Upgrade every Arcane environment, starting with the manager","operationId":"trigger-update-all","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironmentUpdateJob"}}},"description":"Accepted"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update all environments","tags":["System"]}},"/environments/{id}/system/upgrade/all/status":{"get":{"description":"Get the status of the latest update-all-environments job","operationId":"update-all-status","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironmentUpdateJob"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get update-all status","tags":["System"]}},"/environments/{id}/system/upgrade/check":{"get":{"description":"Check if a system upgrade is available","operationId":"check-upgrade","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeCheckResultData"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check for system upgrade","tags":["System"]}},"/environments/{id}/templates/variables":{"get":{"description":"Get global template variables for an environment","operationId":"getGlobalVariables","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListVariable"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get global variables","tags":["Templates"]},"put":{"description":"Update global template variables for an environment","operationId":"updateGlobalVariables","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvSummary"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update global variables","tags":["Templates"]}},"/environments/{id}/test":{"post":{"description":"Test connectivity to a Arcane environment","operationId":"testConnection","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentTestConnectionRequest"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTest"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Test environment connection","tags":["Environments"]}},"/environments/{id}/updater/history":{"get":{"description":"Get the history of update operations","operationId":"get-updater-history","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Number of history entries to return","explode":false,"in":"query","name":"limit","schema":{"default":50,"description":"Number of history entries to return","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListAutoUpdateRecord"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get updater history","tags":["Updater"]}},"/environments/{id}/updater/run":{"post":{"description":"Apply pending container updates","operationId":"run-updater","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdaterOptions","description":"Updater run options"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseResult"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Run updater","tags":["Updater"]}},"/environments/{id}/updater/status":{"get":{"description":"Get the current status of the updater","operationId":"get-updater-status","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStatus"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get updater status","tags":["Updater"]}},"/environments/{id}/version":{"get":{"description":"Get the version of a remote environment","operationId":"getEnvironmentVersion","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get environment version","tags":["Environments"]}},"/environments/{id}/volumes":{"get":{"description":"Get a paginated list of Docker volumes","operationId":"list-volumes","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}},{"description":"Filter by in-use status (true/false)","explode":false,"in":"query","name":"inUse","schema":{"description":"Filter by in-use status (true/false)","type":"string"}},{"description":"Include internal volumes","explode":false,"in":"query","name":"includeInternal","schema":{"default":false,"description":"Include internal volumes","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VolumePaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List volumes","tags":["Volumes"]},"post":{"description":"Create a new Docker volume","operationId":"create-volume","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VolumeCreate","description":"Volume creation data"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolume"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a volume","tags":["Volumes"]}},"/environments/{id}/volumes/backups/{backupId}":{"delete":{"operationId":"delete-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/backups/{backupId}/download":{"get":{"operationId":"download-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/backups/{backupId}/files":{"get":{"operationId":"list-backup-files","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListString"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List files in a volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/backups/{backupId}/has-path":{"get":{"operationId":"backup-has-path","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}},{"description":"Path to check","explode":false,"in":"query","name":"path","schema":{"description":"Path to check","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseBackupHasPathResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Check if backup contains path","tags":["Volume Backup"]}},"/environments/{id}/volumes/counts":{"get":{"description":"Get counts of volumes in use, unused, and total","operationId":"get-volume-usage-counts","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Include internal volumes","explode":false,"in":"query","name":"includeInternal","schema":{"default":false,"description":"Include internal volumes","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolumeUsageCountsData"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get volume usage counts","tags":["Volumes"]}},"/environments/{id}/volumes/prune":{"post":{"description":"Remove all unused Docker volumes","operationId":"prune-volumes","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolumePruneReportData"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Prune unused volumes","tags":["Volumes"]}},"/environments/{id}/volumes/sizes":{"get":{"description":"Get disk usage sizes for all volumes (slow operation)","operationId":"get-volume-sizes","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListVolumeSizeInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get volume sizes","tags":["Volumes"]}},"/environments/{id}/volumes/{volumeName}":{"delete":{"description":"Remove a Docker volume by name","operationId":"remove-volume","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Force removal","explode":false,"in":"query","name":"force","schema":{"description":"Force removal","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Remove a volume","tags":["Volumes"]},"get":{"description":"Get a Docker volume by its name","operationId":"get-volume","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolume"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get volume by name","tags":["Volumes"]}},"/environments/{id}/volumes/{volumeName}/backups":{"get":{"operationId":"list-volume-backups","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Limit","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VolumeBackupPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List volume backups","tags":["Volume Backup"]},"post":{"operationId":"create-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolumeBackup"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/{volumeName}/backups/upload":{"post":{"operationId":"upload-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"contentMediaType":"application/octet-stream","description":"Backup archive (tar.gz)","format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Upload and restore volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/{volumeName}/backups/{backupId}/restore":{"post":{"operationId":"restore-volume-backup","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Restore volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/{volumeName}/backups/{backupId}/restore-files":{"post":{"operationId":"restore-volume-backup-files","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Backup ID","in":"path","name":"backupId","required":true,"schema":{"description":"Backup ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreBackupFilesInputBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Restore specific files from a volume backup","tags":["Volume Backup"]}},"/environments/{id}/volumes/{volumeName}/browse":{"delete":{"operationId":"delete-volume-file","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"File or directory path to delete","explode":false,"in":"query","name":"path","schema":{"description":"File or directory path to delete","type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete file or directory in volume","tags":["Volume Browser"]},"get":{"operationId":"browse-volume-directory","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Directory path to browse","explode":false,"in":"query","name":"path","schema":{"default":"/","description":"Directory path to browse","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListFileEntry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List volume directory","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/browse/content":{"get":{"operationId":"get-volume-file-content","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"File path","explode":false,"in":"query","name":"path","schema":{"description":"File path","type":"string"}},{"description":"Maximum bytes to read (default 1MB)","explode":false,"in":"query","name":"maxBytes","schema":{"default":1048576,"description":"Maximum bytes to read (default 1MB)","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseFileContentResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get file content preview","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/browse/download":{"get":{"operationId":"download-volume-file","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"File path","explode":false,"in":"query","name":"path","schema":{"description":"File path","type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download file from volume","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/browse/mkdir":{"post":{"operationId":"create-volume-directory","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Directory path to create","explode":false,"in":"query","name":"path","schema":{"description":"Directory path to create","type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create directory in volume","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/browse/upload":{"post":{"operationId":"upload-volume-file","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}},{"description":"Destination path","explode":false,"in":"query","name":"path","schema":{"default":"/","description":"Destination path","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"contentMediaType":"application/octet-stream","description":"File to upload","format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"204":{"description":"No Content","headers":{"Data":{"schema":{"$ref":"#/components/schemas/BaseMessageResponse","description":"Response data"}},"Success":{"schema":{"description":"Whether the request was successful","type":"boolean"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Upload file to volume","tags":["Volume Browser"]}},"/environments/{id}/volumes/{volumeName}/usage":{"get":{"description":"Get containers using a specific volume","operationId":"get-volume-usage","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Volume name","in":"path","name":"volumeName","required":true,"schema":{"description":"Volume name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseVolumeUsageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get volume usage","tags":["Volumes"]}},"/environments/{id}/vulnerabilities/all":{"get":{"description":"Retrieves paginated vulnerabilities across all scanned images in the environment","operationId":"list-environment-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Sort field","explode":false,"in":"query","name":"sort","schema":{"description":"Sort field","type":"string"}},{"description":"Sort order","explode":false,"in":"query","name":"order","schema":{"description":"Sort order","type":"string"}},{"description":"Start offset","explode":false,"in":"query","name":"start","schema":{"description":"Start offset","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"description":"Limit","format":"int64","type":"integer"}},{"description":"Comma-separated severity filter","explode":false,"in":"query","name":"severity","schema":{"description":"Comma-separated severity filter","type":"string"}},{"description":"Filter by image/repo name (substring)","explode":false,"in":"query","name":"imageName","schema":{"description":"Filter by image/repo name (substring)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BasePaginatedVulnerabilityWithImage"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List environment vulnerabilities","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/ignore":{"post":{"description":"Creates an ignore record for a specific vulnerability","operationId":"ignore-vulnerability","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityIgnorePayload"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseIgnoredVulnerability"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Ignore a vulnerability","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/ignore/{ignoreId}":{"delete":{"description":"Removes an ignore record for a vulnerability","operationId":"unignore-vulnerability","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Ignore record ID","in":"path","name":"ignoreId","required":true,"schema":{"description":"Ignore record ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseStruct {}"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Unignore a vulnerability","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/ignored":{"get":{"description":"Retrieves a list of all ignored vulnerabilities for the environment","operationId":"list-ignored-vulnerabilities","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Sort field","explode":false,"in":"query","name":"sort","schema":{"description":"Sort field","type":"string"}},{"description":"Sort order","explode":false,"in":"query","name":"order","schema":{"description":"Sort order","type":"string"}},{"description":"Start offset","explode":false,"in":"query","name":"start","schema":{"description":"Start offset","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"description":"Limit","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BasePaginatedIgnoredVulnerability"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List ignored vulnerabilities","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/image-options":{"get":{"description":"Retrieves available image filter options for environment vulnerabilities","operationId":"list-environment-vulnerability-image-options","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Comma-separated severity filter","explode":false,"in":"query","name":"severity","schema":{"description":"Comma-separated severity filter","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListString"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List vulnerability image options","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/scanner-status":{"get":{"description":"Check if the vulnerability scanner (Trivy) is available and get its version","operationId":"get-vulnerability-scanner-status","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseScannerStatus"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get vulnerability scanner status","tags":["Vulnerabilities"]}},"/environments/{id}/vulnerabilities/summary":{"get":{"description":"Retrieves aggregated vulnerability counts across all images in the environment","operationId":"get-environment-vulnerability-summary","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseEnvironmentVulnerabilitySummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get environment vulnerability summary","tags":["Vulnerabilities"]}},"/environments/{id}/webhooks":{"get":{"description":"List all webhooks configured for this environment","operationId":"list-webhooks","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListSummary"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List webhooks","tags":["Webhooks"]},"post":{"description":"Create a webhook that triggers a container or stack update. The token is only returned once.","operationId":"create-webhook","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseCreated"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create webhook","tags":["Webhooks"]}},"/environments/{id}/webhooks/{webhookId}":{"delete":{"description":"Delete a webhook by ID","operationId":"delete-webhook","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Webhook ID","in":"path","name":"webhookId","required":true,"schema":{"description":"Webhook ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseInterface {}"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete webhook","tags":["Webhooks"]},"patch":{"description":"Update a webhook's enabled state","operationId":"update-webhook","parameters":[{"description":"Environment ID","in":"path","name":"id","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Webhook ID","in":"path","name":"webhookId","required":true,"schema":{"description":"Webhook ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdateInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseInterface {}"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update webhook","tags":["Webhooks"]}},"/events":{"get":{"description":"Get a paginated list of system events","operationId":"listEvents","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Limit","format":"int64","type":"integer"}},{"description":"Filter by severity","explode":false,"in":"query","name":"severity","schema":{"description":"Filter by severity","type":"string"}},{"description":"Filter by event type","explode":false,"in":"query","name":"type","schema":{"description":"Filter by event type","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List events","tags":["Events"]}},"/events/environment/{environmentId}":{"get":{"description":"Get a paginated list of events for a specific environment","operationId":"getEventsByEnvironment","parameters":[{"description":"Environment ID","in":"path","name":"environmentId","required":true,"schema":{"description":"Environment ID","type":"string"}},{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Limit","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Limit","format":"int64","type":"integer"}},{"description":"Filter by severity","explode":false,"in":"query","name":"severity","schema":{"description":"Filter by severity","type":"string"}},{"description":"Filter by event type","explode":false,"in":"query","name":"type","schema":{"description":"Filter by event type","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get events by environment","tags":["Events"]}},"/events/{eventId}":{"delete":{"description":"Delete a system event by ID","operationId":"deleteEvent","parameters":[{"description":"Event ID","in":"path","name":"eventId","required":true,"schema":{"description":"Event ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete an event","tags":["Events"]}},"/federated-credentials":{"get":{"description":"Get a paginated list of workload identity federation trust rules","operationId":"list-federated-credentials","parameters":[{"description":"Search query for filtering by name, issuer, or subject","explode":false,"in":"query","name":"search","schema":{"description":"Search query for filtering by name, issuer, or subject","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Number of items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Number of items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BasePaginatedFederatedCredential"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List federated credentials","tags":["Federated Credentials"]},"post":{"description":"Create a workload identity federation trust rule","operationId":"create-federated-credential","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FederatedCreateFederatedCredential"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseFederatedCredential"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a federated credential","tags":["Federated Credentials"]}},"/federated-credentials/{id}":{"delete":{"description":"Delete a workload identity federation trust rule and its service user","operationId":"delete-federated-credential","parameters":[{"description":"Federated credential ID","in":"path","name":"id","required":true,"schema":{"description":"Federated credential ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a federated credential","tags":["Federated Credentials"]},"get":{"description":"Get details of a workload identity federation trust rule","operationId":"get-federated-credential","parameters":[{"description":"Federated credential ID","in":"path","name":"id","required":true,"schema":{"description":"Federated credential ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseFederatedCredential"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a federated credential","tags":["Federated Credentials"]},"put":{"description":"Update a workload identity federation trust rule","operationId":"update-federated-credential","parameters":[{"description":"Federated credential ID","in":"path","name":"id","required":true,"schema":{"description":"Federated credential ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FederatedUpdateFederatedCredential"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseFederatedCredential"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a federated credential","tags":["Federated Credentials"]}},"/git-repositories/sync":{"post":{"description":"Sync git repositories from a manager to this agent instance","operationId":"syncGitRepositories","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitopsRepositorySyncRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Sync git repositories","tags":["Git Repositories"]}},"/health":{"get":{"description":"Check if the API is healthy","operationId":"health-check","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemHealthResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Health check","tags":["Health"]},"head":{"description":"Check if the API is healthy (HEAD request)","operationId":"health-check-head","responses":{"200":{"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Health check (HEAD)","tags":["Health"]}},"/notifications/dispatch":{"post":{"operationId":"dispatch-notification","parameters":[{"description":"Remote environment access token","in":"header","name":"X-API-Key","schema":{"description":"Remote environment access token","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationDispatchRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDispatchResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Dispatch notification from remote agent to manager","tags":["Notifications"]}},"/oidc/callback":{"post":{"description":"Process the OIDC callback and complete authentication","operationId":"handle-oidc-callback","parameters":[{"in":"header","name":"Origin","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Host","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Proto","schema":{"type":"string"}},{"in":"header","name":"Host","schema":{"type":"string"}},{"in":"header","name":"User-Agent","schema":{"type":"string"}},{"description":"OIDC state cookie from auth URL request","in":"cookie","name":"oidc_state","schema":{"description":"OIDC state cookie from auth URL request","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcCallbackRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcCallbackResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Session and clear state cookies","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Handle OIDC callback","tags":["OIDC"]}},"/oidc/config":{"get":{"description":"Get the OIDC client configuration","operationId":"get-oidc-config","parameters":[{"in":"header","name":"Origin","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Host","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Proto","schema":{"type":"string"}},{"in":"header","name":"Host","schema":{"type":"string"}},{"in":"header","name":"User-Agent","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcConfigResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get OIDC config","tags":["OIDC"]}},"/oidc/device/code":{"post":{"description":"Start the device authorization flow for CLI authentication","operationId":"initiate-oidc-device-auth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcDeviceAuthResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Initiate OIDC device authorization","tags":["OIDC"]}},"/oidc/device/token":{"post":{"description":"Exchange a device code for authentication tokens","operationId":"exchange-oidc-device-token","parameters":[{"in":"header","name":"User-Agent","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcDeviceTokenRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcDeviceTokenResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"Session token cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Exchange device code for tokens","tags":["OIDC"]}},"/oidc/role-mappings":{"get":{"description":"Returns every mapping. On each OIDC login the user's group claim is matched against ClaimValue and matching rows become source='oidc' role assignments.","operationId":"list-oidc-role-mappings","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListOidcRoleMappingsOutputBody"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List OIDC group → role mappings","tags":["OIDC"]},"post":{"operationId":"create-oidc-role-mapping","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleCreateOidcRoleMapping"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOidcRoleMappingOutputBody"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create an OIDC role mapping","tags":["OIDC"]}},"/oidc/role-mappings/{id}":{"delete":{"operationId":"delete-oidc-role-mapping","parameters":[{"description":"Mapping ID","in":"path","name":"id","required":true,"schema":{"description":"Mapping ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteOidcRoleMappingOutputBody"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete an OIDC role mapping","tags":["OIDC"]},"put":{"operationId":"update-oidc-role-mapping","parameters":[{"description":"Mapping ID","in":"path","name":"id","required":true,"schema":{"description":"Mapping ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleUpdateOidcRoleMapping"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOidcRoleMappingOutputBody"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update an OIDC role mapping","tags":["OIDC"]}},"/oidc/status":{"get":{"description":"Get the current OIDC configuration status","operationId":"get-oidc-status","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcStatusInfo"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get OIDC status","tags":["OIDC"]}},"/oidc/url":{"post":{"description":"Generate an OIDC authorization URL for login","operationId":"get-oidc-auth-url","parameters":[{"in":"header","name":"Origin","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Host","schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-Proto","schema":{"type":"string"}},{"in":"header","name":"Host","schema":{"type":"string"}},{"in":"header","name":"User-Agent","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcAuthUrlRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOidcAuthUrlResponse"}}},"description":"OK","headers":{"Set-Cookie":{"schema":{"description":"OIDC state cookie","type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get OIDC auth URL","tags":["OIDC"]}},"/roles":{"get":{"description":"Get a paginated list of roles (built-in + custom)","operationId":"list-roles","parameters":[{"description":"Search by role name or description","explode":false,"in":"query","name":"search","schema":{"description":"Search by role name or description","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction (asc or desc)","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction (asc or desc)","type":"string"}},{"description":"Start index for pagination","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index for pagination","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolePaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List roles","tags":["Roles"]},"post":{"description":"Built-in roles cannot be created via this endpoint; only custom roles are accepted. Reserved for global admins.","operationId":"create-role","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleCreateRole"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseRole"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a custom role","tags":["Roles"]}},"/roles/available-permissions":{"get":{"description":"Returns every permission the server recognizes, grouped by resource. Used by permission-picking UIs.","operationId":"get-permissions-manifest","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponsePermissionsManifest"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get the permission manifest","tags":["Roles"]}},"/roles/{id}":{"delete":{"description":"Built-in roles are protected; deleting cascades all user assignments. Reserved for global admins.","operationId":"delete-role","parameters":[{"description":"Role ID","in":"path","name":"id","required":true,"schema":{"description":"Role ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a custom role","tags":["Roles"]},"get":{"operationId":"get-role","parameters":[{"description":"Role ID","in":"path","name":"id","required":true,"schema":{"description":"Role ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseRole"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a role","tags":["Roles"]},"put":{"description":"Built-in roles are read-only and return 403 on update. Reserved for global admins.","operationId":"update-role","parameters":[{"description":"Role ID","in":"path","name":"id","required":true,"schema":{"description":"Role ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleUpdateRole"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseRole"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a custom role","tags":["Roles"]}},"/settings/categories":{"get":{"description":"Get all available settings categories with metadata","operationId":"get-settings-categories","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CategoryCategory"},"type":["array","null"]}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get settings categories","tags":["Settings"]}},"/settings/search":{"post":{"description":"Search settings categories and individual settings by query","operationId":"search-settings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest","description":"Search query"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Search settings","tags":["Settings"]}},"/swarm/node-identity":{"get":{"operationId":"get-swarm-node-identity","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseSwarmNodeIdentity"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get local swarm node identity","tags":["Swarm"]}},"/templates":{"get":{"description":"Get a paginated list of compose templates","operationId":"listTemplatesPaginated","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}},{"description":"Filter by template type (comma-separated: false,true)","explode":false,"in":"query","name":"type","schema":{"description":"Filter by template type (comma-separated: false,true)","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplatePaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"List templates (paginated)","tags":["Templates"]},"post":{"description":"Create a new compose template","operationId":"createTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a template","tags":["Templates"]}},"/templates/all":{"get":{"description":"Get all compose templates without pagination","operationId":"getAllTemplates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"List all templates","tags":["Templates"]}},"/templates/default":{"get":{"description":"Get the default compose and env templates","operationId":"getDefaultTemplates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseDefaultTemplatesResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get default templates","tags":["Templates"]},"post":{"description":"Save the default compose and env templates","operationId":"saveDefaultTemplates","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateSaveDefaultTemplatesRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Save default templates","tags":["Templates"]}},"/templates/fetch":{"get":{"description":"Fetch templates from a remote registry URL","operationId":"fetchTemplateRegistry","parameters":[{"description":"Registry URL","explode":false,"in":"query","name":"url","required":true,"schema":{"description":"Registry URL","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseRemoteRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Fetch remote registry","tags":["Templates"]}},"/templates/registries":{"get":{"description":"Get all template registries","operationId":"getTemplateRegistries","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListTemplateRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List template registries","tags":["Templates"]},"post":{"description":"Create a new template registry","operationId":"createTemplateRegistry","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreateRegistryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplateRegistry"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a template registry","tags":["Templates"]}},"/templates/registries/{id}":{"delete":{"description":"Delete a template registry","operationId":"deleteTemplateRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a template registry","tags":["Templates"]},"put":{"description":"Update an existing template registry","operationId":"updateTemplateRegistry","parameters":[{"description":"Registry ID","in":"path","name":"id","required":true,"schema":{"description":"Registry ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateUpdateRegistryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a template registry","tags":["Templates"]}},"/templates/{id}":{"delete":{"description":"Delete a compose template","operationId":"deleteTemplate","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a template","tags":["Templates"]},"get":{"description":"Get a compose template by ID","operationId":"getTemplate","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get a template","tags":["Templates"]},"put":{"description":"Update an existing compose template","operationId":"updateTemplate","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a template","tags":["Templates"]}},"/templates/{id}/content":{"get":{"description":"Get the compose content for a template with parsed data","operationId":"getTemplateContent","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplateContent"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"summary":"Get template content","tags":["Templates"]}},"/templates/{id}/download":{"post":{"description":"Download a remote template to local storage","operationId":"downloadTemplate","parameters":[{"description":"Template ID","in":"path","name":"id","required":true,"schema":{"description":"Template ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseTemplate"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Download a template","tags":["Templates"]}},"/users":{"get":{"description":"Get a paginated list of all users","operationId":"listUsers","parameters":[{"description":"Search query","explode":false,"in":"query","name":"search","schema":{"description":"Search query","type":"string"}},{"description":"Column to sort by","explode":false,"in":"query","name":"sort","schema":{"description":"Column to sort by","type":"string"}},{"description":"Sort direction","explode":false,"in":"query","name":"order","schema":{"default":"asc","description":"Sort direction","type":"string"}},{"description":"Start index","explode":false,"in":"query","name":"start","schema":{"default":0,"description":"Start index","format":"int64","type":"integer"}},{"description":"Items per page","explode":false,"in":"query","name":"limit","schema":{"default":20,"description":"Items per page","format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPaginatedResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List users","tags":["Users"]},"post":{"description":"Create a new user account","operationId":"createUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateUser"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Create a user","tags":["Users"]}},"/users/{userId}":{"delete":{"description":"Delete a user by ID","operationId":"deleteUser","parameters":[{"description":"User ID","in":"path","name":"userId","required":true,"schema":{"description":"User ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseMessageResponse"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Delete a user","tags":["Users"]},"get":{"description":"Get a user by ID","operationId":"getUser","parameters":[{"description":"User ID","in":"path","name":"userId","required":true,"schema":{"description":"User ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Get a user","tags":["Users"]},"put":{"description":"Update an existing user's information","operationId":"updateUser","parameters":[{"description":"User ID","in":"path","name":"userId","required":true,"schema":{"description":"User ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateUser"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseUser"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Update a user","tags":["Users"]}},"/users/{userId}/avatar":{"get":{"description":"Get the custom profile picture for a user","operationId":"getUserAvatar","parameters":[{"description":"User ID","in":"path","name":"userId","required":true,"schema":{"description":"User ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"contentEncoding":"base64","type":"string"}}},"description":"OK","headers":{"Cache-Control":{"schema":{"type":"string"}},"Content-Type":{"schema":{"type":"string"}},"X-Content-Type-Options":{"schema":{"type":"string"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get user avatar","tags":["Users"]}},"/users/{userId}/role-assignments":{"get":{"description":"Reserved for global admins.","operationId":"list-user-role-assignments","parameters":[{"description":"User ID","in":"path","name":"userId","required":true,"schema":{"description":"User ID","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListRoleAssignment"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"List a user's role assignments","tags":["Roles"]},"put":{"description":"Replaces every source='manual' assignment for the user. source='oidc' assignments are not touched. Reserved for global admins; enforces the last-admin guard.","operationId":"set-user-role-assignments","parameters":[{"description":"User ID","in":"path","name":"userId","required":true,"schema":{"description":"User ID","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleSetUserAssignments"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseApiResponseListRoleAssignment"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"summary":"Replace a user's manual role assignments","tags":["Roles"]}},"/version":{"get":{"description":"Get application version information and check for updates","operationId":"getVersion","parameters":[{"description":"Current version to compare against","explode":false,"in":"query","name":"current","schema":{"description":"Current version to compare against","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCheck"}}},"description":"OK"},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Error"}},"security":[],"summary":"Get version information","tags":["Version"]}}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"servers":[{"url":"https://arcane.randomsynergy.xyz:3552/api"}]} \ No newline at end of file diff --git a/_docs/arcane_api_docs.yaml b/_docs/arcane_api_docs.yaml index 62ae35a..3aff199 100644 --- a/_docs/arcane_api_docs.yaml +++ b/_docs/arcane_api_docs.yaml @@ -1,29 +1,147 @@ components: schemas: + ActivityActivity: + additionalProperties: false + properties: + createdAt: + format: date-time + type: string + durationMs: + format: int64 + type: integer + endedAt: + format: date-time + type: string + environmentId: + type: string + error: + type: string + id: + type: string + latestMessage: + type: string + metadata: + additionalProperties: {} + type: object + progress: + format: int64 + type: integer + resourceId: + type: string + resourceName: + type: string + resourceType: + type: string + sourceEnvironmentId: + type: string + sourceEnvironmentName: + type: string + startedAt: + format: date-time + type: string + startedBy: + $ref: "#/components/schemas/ActivityStartedBy" + status: + type: string + step: + type: string + type: + type: string + updatedAt: + format: date-time + type: string + required: + - id + - environmentId + - type + - status + - startedAt + - createdAt + type: object + ActivityClearHistoryResult: + additionalProperties: false + properties: + deleted: + format: int64 + type: integer + required: + - deleted + type: object + ActivityDetail: + additionalProperties: false + properties: + activity: + $ref: "#/components/schemas/ActivityActivity" + messages: + items: + $ref: "#/components/schemas/ActivityMessage" + type: + - array + - "null" + required: + - activity + - messages + type: object + ActivityMessage: + additionalProperties: false + properties: + activityId: + type: string + createdAt: + format: date-time + type: string + id: + type: string + level: + type: string + message: + type: string + payload: + additionalProperties: {} + type: object + required: + - id + - activityId + - level + - message + - createdAt + type: object + ActivityStartedBy: + additionalProperties: false + properties: + displayName: + type: string + userId: + type: string + username: + type: string + required: + - username + type: object ApiKeyPaginatedResponse: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ApiKeyPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ApiKeyPaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/ApikeyApiKey' + $ref: "#/components/schemas/ApikeyApiKey" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object ApiResponseStruct {}DataStruct: additionalProperties: false @@ -45,13 +163,18 @@ components: id: description: Unique identifier of the API key type: string + isBootstrap: + description: Whether the API key is an auto-generated environment bootstrap key (locked from manual edit / delete) + type: boolean isStatic: - description: Whether the API key is environment-managed and protected from - deletion + description: Whether the API key is environment-managed and protected from deletion type: boolean keyPrefix: description: Prefix of the API key for identification type: string + kind: + description: "Key kind: 'scoped' keys use their own permission grants, 'personal' keys inherit the owner's role permissions" + type: string lastUsedAt: description: Last time the API key was used format: date-time @@ -59,6 +182,13 @@ components: name: description: Name of the API key type: string + permissions: + description: Permissions held by this key + items: + $ref: "#/components/schemas/ApikeyPermissionGrant" + type: + - array + - "null" updatedAt: description: Last update timestamp format: date-time @@ -67,12 +197,14 @@ components: description: ID of the user who owns the API key type: string required: - - id - - name - - keyPrefix - - userId - - isStatic - - createdAt + - id + - name + - keyPrefix + - kind + - isStatic + - isBootstrap + - createdAt + - permissions type: object ApikeyApiKeyCreatedDto: additionalProperties: false @@ -91,9 +223,11 @@ components: id: description: Unique identifier of the API key type: string + isBootstrap: + description: Whether the API key is an auto-generated environment bootstrap key (locked from manual edit / delete) + type: boolean isStatic: - description: Whether the API key is environment-managed and protected from - deletion + description: Whether the API key is environment-managed and protected from deletion type: boolean key: description: The full API key secret (only shown once) @@ -101,6 +235,9 @@ components: keyPrefix: description: Prefix of the API key for identification type: string + kind: + description: "Key kind: 'scoped' keys use their own permission grants, 'personal' keys inherit the owner's role permissions" + type: string lastUsedAt: description: Last time the API key was used format: date-time @@ -108,6 +245,13 @@ components: name: description: Name of the API key type: string + permissions: + description: Permissions held by this key + items: + $ref: "#/components/schemas/ApikeyPermissionGrant" + type: + - array + - "null" updatedAt: description: Last update timestamp format: date-time @@ -116,13 +260,15 @@ components: description: ID of the user who owns the API key type: string required: - - key - - id - - name - - keyPrefix - - userId - - isStatic - - createdAt + - key + - id + - name + - keyPrefix + - kind + - isStatic + - isBootstrap + - createdAt + - permissions type: object ApikeyCreateApiKey: additionalProperties: false @@ -130,7 +276,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyCreateApiKey.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyCreateApiKey.json format: uri readOnly: true type: string @@ -145,12 +291,64 @@ components: name: description: Name of the API key examples: - - My API Key + - My API Key maxLength: 255 minLength: 1 type: string + permissions: + description: Permissions granted to this key. Cannot exceed the creator's own permissions. + items: + $ref: "#/components/schemas/ApikeyPermissionGrant" + minItems: 1 + type: + - array + - "null" + required: + - name + - permissions + type: object + ApikeyCreateUserApiKey: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyCreateUserApiKey.json + format: uri + readOnly: true + type: string + description: + description: Optional description of the API key + maxLength: 1000 + type: string + expiresAt: + description: Optional expiration date for the API key + format: date-time + type: string + name: + description: Name of the API key + examples: + - My API Key + maxLength: 255 + minLength: 1 + type: string + required: + - name + type: object + ApikeyPermissionGrant: + additionalProperties: false + properties: + environmentId: + description: Environment ID to scope the grant to; omit for a global grant + type: string + permission: + description: Permission string + examples: + - containers:list + minLength: 1 + type: string required: - - name + - permission type: object ApikeyUpdateApiKey: additionalProperties: false @@ -158,7 +356,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyUpdateApiKey.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyUpdateApiKey.json format: uri readOnly: true type: string @@ -174,6 +372,13 @@ components: description: New name for the API key maxLength: 255 type: string + permissions: + description: Replace the key's permission grants. Omit to leave unchanged. Cannot exceed the updater's own permissions. + items: + $ref: "#/components/schemas/ApikeyPermissionGrant" + type: + - array + - "null" type: object AuthLogin: additionalProperties: false @@ -181,7 +386,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthLogin.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthLogin.json format: uri readOnly: true type: string @@ -192,13 +397,13 @@ components: username: description: Username of the user examples: - - admin + - admin maxLength: 255 minLength: 1 type: string required: - - username - - password + - username + - password type: object AuthLoginResponse: additionalProperties: false @@ -214,13 +419,13 @@ components: description: JWT access token type: string user: - $ref: '#/components/schemas/UserUser' + $ref: "#/components/schemas/UserUser" description: Authenticated user information required: - - token - - refreshToken - - expiresAt - - user + - token + - refreshToken + - expiresAt + - user type: object AuthOidcAuthUrlRequest: additionalProperties: false @@ -228,14 +433,16 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcAuthUrlRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcAuthUrlRequest.json format: uri readOnly: true type: string + mobileRedirectUri: + type: string redirectUri: type: string required: - - redirectUri + - redirectUri type: object AuthOidcAuthUrlResponse: additionalProperties: false @@ -243,14 +450,14 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcAuthUrlResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcAuthUrlResponse.json format: uri readOnly: true type: string authUrl: type: string required: - - authUrl + - authUrl type: object AuthOidcCallbackRequest: additionalProperties: false @@ -258,17 +465,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcCallbackRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcCallbackRequest.json format: uri readOnly: true type: string code: type: string + mobileRedirectUri: + type: string state: type: string required: - - code - - state + - code + - state type: object AuthOidcCallbackResponse: additionalProperties: false @@ -276,7 +485,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcCallbackResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcCallbackResponse.json format: uri readOnly: true type: string @@ -290,13 +499,13 @@ components: token: type: string user: - $ref: '#/components/schemas/UserUser' + $ref: "#/components/schemas/UserUser" required: - - success - - token - - refreshToken - - expiresAt - - user + - success + - token + - refreshToken + - expiresAt + - user type: object AuthOidcConfigResponse: additionalProperties: false @@ -304,7 +513,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcConfigResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcConfigResponse.json format: uri readOnly: true type: string @@ -325,13 +534,13 @@ components: userinfoEndpoint: type: string required: - - clientId - - redirectUri - - issuerUrl - - authorizationEndpoint - - tokenEndpoint - - userinfoEndpoint - - scopes + - clientId + - redirectUri + - issuerUrl + - authorizationEndpoint + - tokenEndpoint + - userinfoEndpoint + - scopes type: object AuthOidcDeviceAuthResponse: additionalProperties: false @@ -339,7 +548,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceAuthResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceAuthResponse.json format: uri readOnly: true type: string @@ -358,10 +567,10 @@ components: verificationUriComplete: type: string required: - - deviceCode - - userCode - - verificationUri - - expiresIn + - deviceCode + - userCode + - verificationUri + - expiresIn type: object AuthOidcDeviceTokenRequest: additionalProperties: false @@ -369,14 +578,14 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceTokenRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceTokenRequest.json format: uri readOnly: true type: string deviceCode: type: string required: - - deviceCode + - deviceCode type: object AuthOidcDeviceTokenResponse: additionalProperties: false @@ -384,7 +593,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceTokenResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcDeviceTokenResponse.json format: uri readOnly: true type: string @@ -398,13 +607,13 @@ components: token: type: string user: - $ref: '#/components/schemas/UserUser' + $ref: "#/components/schemas/UserUser" required: - - success - - token - - refreshToken - - expiresAt - - user + - success + - token + - refreshToken + - expiresAt + - user type: object AuthOidcStatusInfo: additionalProperties: false @@ -412,7 +621,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcStatusInfo.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcStatusInfo.json format: uri readOnly: true type: string @@ -427,9 +636,9 @@ components: providerName: type: string required: - - envForced - - envConfigured - - mergeAccounts + - envForced + - envConfigured + - mergeAccounts type: object AuthPasswordChange: additionalProperties: false @@ -437,7 +646,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthPasswordChange.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthPasswordChange.json format: uri readOnly: true type: string @@ -449,7 +658,7 @@ components: minLength: 8 type: string required: - - newPassword + - newPassword type: object AuthRefresh: additionalProperties: false @@ -457,7 +666,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthRefresh.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/AuthRefresh.json format: uri readOnly: true type: string @@ -466,7 +675,7 @@ components: minLength: 1 type: string required: - - refreshToken + - refreshToken type: object AuthTokenRefreshResponse: additionalProperties: false @@ -482,9 +691,9 @@ components: description: New JWT access token type: string required: - - token - - refreshToken - - expiresAt + - token + - refreshToken + - expiresAt type: object AutoUpdateRecord: additionalProperties: false @@ -527,15 +736,15 @@ components: format: date-time type: string required: - - resourceId - - resourceType - - resourceName - - status - - startTime - - updateAvailable - - updateApplied - - id - - createdAt + - resourceId + - resourceType + - resourceName + - status + - startTime + - updateAvailable + - updateApplied + - id + - createdAt type: object BackupHasPathResponse: additionalProperties: false @@ -543,47 +752,47 @@ components: exists: type: boolean required: - - exists + - exists type: object - BaseApiResponseActionItems: + BaseApiResponseActionResult: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActionItems.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActionResult.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/DashboardActionItems' + $ref: "#/components/schemas/ContainerActionResult" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseActionResult: + BaseApiResponseActivity: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActionResult.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActivity.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ContainerActionResult' + $ref: "#/components/schemas/ActivityActivity" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseAgentPairResponse: additionalProperties: false @@ -591,19 +800,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseAgentPairResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseAgentPairResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/EnvironmentAgentPairResponse' + $ref: "#/components/schemas/EnvironmentAgentPairResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseApiKey: additionalProperties: false @@ -611,19 +820,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseApiKey.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseApiKey.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ApikeyApiKey' + $ref: "#/components/schemas/ApikeyApiKey" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseApiKeyCreatedDto: additionalProperties: false @@ -631,19 +840,39 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseApiKeyCreatedDto.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseApiKeyCreatedDto.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/ApikeyApiKeyCreatedDto" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseAttestationList: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseAttestationList.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ApikeyApiKeyCreatedDto' + $ref: "#/components/schemas/ImageAttestationList" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseBackupHasPathResponse: additionalProperties: false @@ -651,19 +880,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBackupHasPathResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBackupHasPathResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/BackupHasPathResponse' + $ref: "#/components/schemas/BackupHasPathResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseBatchResponse: additionalProperties: false @@ -671,21 +900,21 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBatchResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBatchResponse.json format: uri readOnly: true type: string data: additionalProperties: - $ref: '#/components/schemas/ImageupdateResponse' + $ref: "#/components/schemas/ImageupdateResponse" description: Response data type: object success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseBranchesResponse: additionalProperties: false @@ -693,19 +922,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBranchesResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBranchesResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/GitopsBranchesResponse' + $ref: "#/components/schemas/GitopsBranchesResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseBrowseResponse: additionalProperties: false @@ -713,19 +942,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBrowseResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBrowseResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/GitopsBrowseResponse' + $ref: "#/components/schemas/GitopsBrowseResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseBuildFileContentResponse: additionalProperties: false @@ -733,19 +962,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBuildFileContentResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBuildFileContentResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/BuildFileContentResponse' + $ref: "#/components/schemas/BuildFileContentResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseBuildRecord: additionalProperties: false @@ -753,803 +982,1080 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBuildRecord.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseBuildRecord.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ImageBuildRecord' + $ref: "#/components/schemas/ImageBuildRecord" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseConfig: + BaseApiResponseClearHistoryResult: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseConfig.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseClearHistoryResult.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/JobscheduleConfig' + $ref: "#/components/schemas/ActivityClearHistoryResult" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseConfigSummary: + BaseApiResponseCommitResult: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseConfigSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCommitResult.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmConfigSummary' + $ref: "#/components/schemas/ContainerCommitResult" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseContainerRegistry: + BaseApiResponseConfig: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseContainerRegistry.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseConfig.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ContainerregistryContainerRegistry' + $ref: "#/components/schemas/JobscheduleConfig" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseCreateReponse: + BaseApiResponseConfigSummary: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCreateReponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseConfigSummary.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ProjectCreateReponse' + $ref: "#/components/schemas/SwarmConfigSummary" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseCreated: + BaseApiResponseContainerRegistry: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCreated.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseContainerRegistry.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/WebhookCreated' + $ref: "#/components/schemas/ContainerregistryContainerRegistry" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseDefaultTemplatesResponse: + BaseApiResponseCreateReponse: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDefaultTemplatesResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCreateReponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/TemplateDefaultTemplatesResponse' + $ref: "#/components/schemas/ProjectCreateReponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseDeploymentSnippet: + BaseApiResponseCreated: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDeploymentSnippet.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCreated.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/DeploymentSnippet' + $ref: "#/components/schemas/WebhookCreated" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseDetailSummary: + BaseApiResponseDefaultTemplatesResponse: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetailSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDefaultTemplatesResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ImageDetailSummary' + $ref: "#/components/schemas/TemplateDefaultTemplatesResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseDetails: + BaseApiResponseDeploymentSnippet: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetails.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDeploymentSnippet.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ProjectDetails' + $ref: "#/components/schemas/DeploymentSnippet" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseEnvironment: + BaseApiResponseDetail: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironment.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetail.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/EnvironmentEnvironment' + $ref: "#/components/schemas/ActivityDetail" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseEnvironmentVulnerabilitySummary: + BaseApiResponseDetailSummary: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentVulnerabilitySummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetailSummary.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VulnerabilityEnvironmentVulnerabilitySummary' + $ref: "#/components/schemas/ImageDetailSummary" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseEnvironmentWithApiKey: + BaseApiResponseDetails: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentWithApiKey.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetails.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/EnvironmentWithApiKey' + $ref: "#/components/schemas/ProjectDetails" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseEvent: + BaseApiResponseDispatchResponse: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEvent.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDispatchResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/EventEvent' + $ref: "#/components/schemas/NotificationDispatchResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseFileContentResponse: + BaseApiResponseEnvironment: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseFileContentResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironment.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/FileContentResponse' + $ref: "#/components/schemas/EnvironmentEnvironment" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseGitOpsSync: + BaseApiResponseEnvironmentUpdateJob: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseGitOpsSync.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentUpdateJob.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/GitopsGitOpsSync' + $ref: "#/components/schemas/EnvironmentUpdateJob" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseGitRepository: + BaseApiResponseEnvironmentVulnerabilitySummary: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseGitRepository.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentVulnerabilitySummary.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/GitopsGitRepository' + $ref: "#/components/schemas/VulnerabilityEnvironmentVulnerabilitySummary" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseIgnoredVulnerability: + BaseApiResponseEnvironmentWithApiKey: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseIgnoredVulnerability.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentWithApiKey.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VulnerabilityIgnoredVulnerability' + $ref: "#/components/schemas/EnvironmentWithApiKey" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseImportGitOpsSyncResponse: + BaseApiResponseFederatedCredential: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseImportGitOpsSyncResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseFederatedCredential.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/GitopsImportGitOpsSyncResponse' + $ref: "#/components/schemas/FederatedFederatedCredential" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseInfo: + BaseApiResponseFileContentResponse: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseInfo.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseFileContentResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VersionInfo' + $ref: "#/components/schemas/FileContentResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseInterface {}: + BaseApiResponseGitOpsSync: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseInterface - {}.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseGitOpsSync.json format: uri readOnly: true type: string data: + $ref: "#/components/schemas/GitopsGitOpsSync" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListAutoUpdateRecord: + BaseApiResponseGitRepository: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListAutoUpdateRecord.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseGitRepository.json format: uri readOnly: true type: string data: + $ref: "#/components/schemas/GitopsGitRepository" description: Response data - items: - $ref: '#/components/schemas/AutoUpdateRecord' - type: - - array - - 'null' success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListConfigSummary: + BaseApiResponseIgnoredVulnerability: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListConfigSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseIgnoredVulnerability.json format: uri readOnly: true type: string data: + $ref: "#/components/schemas/VulnerabilityIgnoredVulnerability" description: Response data - items: - $ref: '#/components/schemas/SwarmConfigSummary' - type: - - array - - 'null' success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListFileEntry: + BaseApiResponseImportGitOpsSyncResponse: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListFileEntry.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseImportGitOpsSyncResponse.json format: uri readOnly: true type: string data: + $ref: "#/components/schemas/GitopsImportGitOpsSyncResponse" description: Response data - items: - $ref: '#/components/schemas/VolumeFileEntry' - type: - - array - - 'null' success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListSecretSummary: + BaseApiResponseIncludeFile: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSecretSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseIncludeFile.json format: uri readOnly: true type: string data: + $ref: "#/components/schemas/ProjectIncludeFile" description: Response data - items: - $ref: '#/components/schemas/SwarmSecretSummary' - type: - - array - - 'null' success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListSettingDto: + BaseApiResponseInfo: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSettingDto.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseInfo.json format: uri readOnly: true type: string data: + $ref: "#/components/schemas/VersionInfo" description: Response data - items: - $ref: '#/components/schemas/SettingsSettingDto' - type: - - array - - 'null' success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListString: + BaseApiResponseInterface {}: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListString.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseInterface {}.json format: uri readOnly: true type: string data: description: Response data - items: - type: string - type: - - array - - 'null' success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListSummary: + BaseApiResponseListApiKey: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListApiKey.json format: uri readOnly: true type: string data: description: Response data items: - $ref: '#/components/schemas/WebhookSummary' + $ref: "#/components/schemas/ApikeyApiKey" type: - - array - - 'null' + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListTemplate: + BaseApiResponseListAutoUpdateRecord: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListTemplate.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListAutoUpdateRecord.json format: uri readOnly: true type: string data: description: Response data items: - $ref: '#/components/schemas/TemplateTemplate' + $ref: "#/components/schemas/AutoUpdateRecord" type: - - array - - 'null' + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListTemplateRegistry: + BaseApiResponseListConfigSummary: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListTemplateRegistry.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListConfigSummary.json format: uri readOnly: true type: string data: description: Response data items: - $ref: '#/components/schemas/TemplateTemplateRegistry' + $ref: "#/components/schemas/SwarmConfigSummary" type: - - array - - 'null' + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListVariable: + BaseApiResponseListFileEntry: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListVariable.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListFileEntry.json format: uri readOnly: true type: string data: description: Response data items: - $ref: '#/components/schemas/EnvVariable' + $ref: "#/components/schemas/VolumeFileEntry" type: - - array - - 'null' + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseListVolumeSizeInfo: + BaseApiResponseListHistoryItem: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListVolumeSizeInfo.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListHistoryItem.json format: uri readOnly: true type: string data: description: Response data items: - $ref: '#/components/schemas/VolumeSizeInfo' + $ref: "#/components/schemas/ImageHistoryItem" type: - - array - - 'null' + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseLoadResult: + BaseApiResponseListRoleAssignment: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseLoadResult.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListRoleAssignment.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ImageLoadResult' description: Response data + items: + $ref: "#/components/schemas/RoleRoleAssignment" + type: + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseLoginResponse: + BaseApiResponseListSearchResult: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseLoginResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSearchResult.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/AuthLoginResponse' description: Response data + items: + $ref: "#/components/schemas/ImageSearchResult" + type: + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseMessageResponse: + BaseApiResponseListSecretSummary: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseMessageResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSecretSummary.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/BaseMessageResponse' description: Response data + items: + $ref: "#/components/schemas/SwarmSecretSummary" + type: + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponseNodeSummary: + BaseApiResponseListSettingDto: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseNodeSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSettingDto.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmNodeSummary' description: Response data + items: + $ref: "#/components/schemas/SettingsSettingDto" + type: + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponsePruneAllResult: + BaseApiResponseListString: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePruneAllResult.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListString.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SystemPruneAllResult' description: Response data + items: + type: string + type: + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object - BaseApiResponsePruneReport: + BaseApiResponseListSummary: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePruneReport.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSummary.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ImagePruneReport' description: Response data + items: + $ref: "#/components/schemas/WebhookSummary" + type: + - array + - "null" success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data + type: object + BaseApiResponseListTemplate: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListTemplate.json + format: uri + readOnly: true + type: string + data: + description: Response data + items: + $ref: "#/components/schemas/TemplateTemplate" + type: + - array + - "null" + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseListTemplateRegistry: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListTemplateRegistry.json + format: uri + readOnly: true + type: string + data: + description: Response data + items: + $ref: "#/components/schemas/TemplateTemplateRegistry" + type: + - array + - "null" + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseListVariable: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListVariable.json + format: uri + readOnly: true + type: string + data: + description: Response data + items: + $ref: "#/components/schemas/EnvVariable" + type: + - array + - "null" + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseListVolumeSizeInfo: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListVolumeSizeInfo.json + format: uri + readOnly: true + type: string + data: + description: Response data + items: + $ref: "#/components/schemas/VolumeSizeInfo" + type: + - array + - "null" + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseLoadResult: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseLoadResult.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/ImageLoadResult" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseLoginResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseLoginResponse.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/AuthLoginResponse" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseMapStringUpdateInfo: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseMapStringUpdateInfo.json + format: uri + readOnly: true + type: string + data: + additionalProperties: + $ref: "#/components/schemas/ImageUpdateInfo" + description: Response data + type: object + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseMessageResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseMessageResponse.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/BaseMessageResponse" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseNodeSummary: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseNodeSummary.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/SwarmNodeSummary" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponsePermissionsManifest: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePermissionsManifest.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/RolePermissionsManifest" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponsePruneAllResult: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePruneAllResult.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/SystemPruneAllResult" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponsePruneReport: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePruneReport.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/ImagePruneReport" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponsePullUsageResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePullUsageResponse.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/ContainerregistryPullUsageResponse" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data type: object BaseApiResponseRemoteRegistry: additionalProperties: false @@ -1557,19 +2063,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRemoteRegistry.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRemoteRegistry.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/TemplateRemoteRegistry' + $ref: "#/components/schemas/TemplateRemoteRegistry" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseResponse: additionalProperties: false @@ -1577,19 +2083,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ImageupdateResponse' + $ref: "#/components/schemas/ImageupdateResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseResult: additionalProperties: false @@ -1597,19 +2103,39 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseResult.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseResult.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/UpdaterResult" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseRole: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRole.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/UpdaterResult' + $ref: "#/components/schemas/RoleRole" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseRuntimeStatus: additionalProperties: false @@ -1617,19 +2143,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRuntimeStatus.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRuntimeStatus.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmRuntimeStatus' + $ref: "#/components/schemas/SwarmRuntimeStatus" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseScanResult: additionalProperties: false @@ -1637,19 +2163,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanResult.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanResult.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VulnerabilityScanResult' + $ref: "#/components/schemas/VulnerabilityScanResult" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseScanSummariesResponse: additionalProperties: false @@ -1657,19 +2183,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanSummariesResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanSummariesResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VulnerabilityScanSummariesResponse' + $ref: "#/components/schemas/VulnerabilityScanSummariesResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseScanSummary: additionalProperties: false @@ -1677,19 +2203,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanSummary.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VulnerabilityScanSummary' + $ref: "#/components/schemas/VulnerabilityScanSummary" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseScannerStatus: additionalProperties: false @@ -1697,19 +2223,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScannerStatus.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScannerStatus.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ScannerStatus' + $ref: "#/components/schemas/ScannerStatus" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSecretSummary: additionalProperties: false @@ -1717,19 +2243,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSecretSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSecretSummary.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmSecretSummary' + $ref: "#/components/schemas/SwarmSecretSummary" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseServiceCreateResponse: additionalProperties: false @@ -1737,19 +2263,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceCreateResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceCreateResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmServiceCreateResponse' + $ref: "#/components/schemas/SwarmServiceCreateResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseServiceInspect: additionalProperties: false @@ -1757,19 +2283,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceInspect.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceInspect.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmServiceInspect' + $ref: "#/components/schemas/SwarmServiceInspect" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseServiceUpdateResponse: additionalProperties: false @@ -1777,19 +2303,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceUpdateResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseServiceUpdateResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmServiceUpdateResponse' + $ref: "#/components/schemas/SwarmServiceUpdateResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSnapshot: additionalProperties: false @@ -1797,19 +2323,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSnapshot.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSnapshot.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/DashboardSnapshot' + $ref: "#/components/schemas/DashboardSnapshot" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseStackDeployResponse: additionalProperties: false @@ -1817,19 +2343,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackDeployResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackDeployResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmStackDeployResponse' + $ref: "#/components/schemas/SwarmStackDeployResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseStackInspect: additionalProperties: false @@ -1837,19 +2363,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackInspect.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackInspect.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmStackInspect' + $ref: "#/components/schemas/SwarmStackInspect" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseStackRenderConfigResponse: additionalProperties: false @@ -1857,19 +2383,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackRenderConfigResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackRenderConfigResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmStackRenderConfigResponse' + $ref: "#/components/schemas/SwarmStackRenderConfigResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseStackSource: additionalProperties: false @@ -1877,19 +2403,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackSource.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStackSource.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmStackSource' + $ref: "#/components/schemas/SwarmStackSource" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseStatus: additionalProperties: false @@ -1897,19 +2423,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStatus.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStatus.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/UpdaterStatus' + $ref: "#/components/schemas/UpdaterStatus" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseStatusCounts: additionalProperties: false @@ -1917,19 +2443,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStatusCounts.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStatusCounts.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ProjectStatusCounts' + $ref: "#/components/schemas/ProjectStatusCounts" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseStruct {}: additionalProperties: false @@ -1937,20 +2463,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStruct - {}.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseStruct {}.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ApiResponseStruct {}DataStruct' + $ref: "#/components/schemas/ApiResponseStruct {}DataStruct" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSummary: additionalProperties: false @@ -1958,19 +2483,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSummary.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ImageupdateSummary' + $ref: "#/components/schemas/ImageupdateSummary" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSwarmInfo: additionalProperties: false @@ -1978,19 +2503,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmInfo.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmInfo.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmSwarmInfo' + $ref: "#/components/schemas/SwarmSwarmInfo" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSwarmInitResponse: additionalProperties: false @@ -1998,19 +2523,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmInitResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmInitResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmSwarmInitResponse' + $ref: "#/components/schemas/SwarmSwarmInitResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSwarmJoinTokensResponse: additionalProperties: false @@ -2018,19 +2543,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmJoinTokensResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmJoinTokensResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmSwarmJoinTokensResponse' + $ref: "#/components/schemas/SwarmSwarmJoinTokensResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSwarmNodeAgentDeployment: additionalProperties: false @@ -2038,19 +2563,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmNodeAgentDeployment.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmNodeAgentDeployment.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmNodeAgentDeployment' + $ref: "#/components/schemas/SwarmNodeAgentDeployment" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSwarmNodeIdentity: additionalProperties: false @@ -2058,19 +2583,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmNodeIdentity.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmNodeIdentity.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmNodeIdentity' + $ref: "#/components/schemas/SwarmNodeIdentity" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSwarmUnlockKeyResponse: additionalProperties: false @@ -2078,19 +2603,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmUnlockKeyResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSwarmUnlockKeyResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/SwarmSwarmUnlockKeyResponse' + $ref: "#/components/schemas/SwarmSwarmUnlockKeyResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSyncResult: additionalProperties: false @@ -2098,19 +2623,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSyncResult.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSyncResult.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/GitopsSyncResult' + $ref: "#/components/schemas/GitopsSyncResult" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseSyncStatus: additionalProperties: false @@ -2118,19 +2643,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSyncStatus.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseSyncStatus.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/GitopsSyncStatus' + $ref: "#/components/schemas/GitopsSyncStatus" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseTemplate: additionalProperties: false @@ -2138,19 +2663,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplate.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplate.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/TemplateTemplate' + $ref: "#/components/schemas/TemplateTemplate" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseTemplateContent: additionalProperties: false @@ -2158,19 +2683,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplateContent.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplateContent.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/TemplateTemplateContent' + $ref: "#/components/schemas/TemplateTemplateContent" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseTemplateRegistry: additionalProperties: false @@ -2178,19 +2703,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplateRegistry.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTemplateRegistry.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/TemplateTemplateRegistry' + $ref: "#/components/schemas/TemplateTemplateRegistry" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseTest: additionalProperties: false @@ -2198,19 +2723,39 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTest.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/EnvironmentTest" + description: Response data + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + type: object + BaseApiResponseTestResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTestResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/EnvironmentTest' + $ref: "#/components/schemas/NotificationTestResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseTokenRefreshResponse: additionalProperties: false @@ -2218,19 +2763,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTokenRefreshResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTokenRefreshResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/AuthTokenRefreshResponse' + $ref: "#/components/schemas/AuthTokenRefreshResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseUser: additionalProperties: false @@ -2238,19 +2783,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseUser.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseUser.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/UserUser' + $ref: "#/components/schemas/UserUser" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseVolume: additionalProperties: false @@ -2258,19 +2803,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolume.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolume.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VolumeVolume' + $ref: "#/components/schemas/VolumeVolume" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseVolumeBackup: additionalProperties: false @@ -2278,19 +2823,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeBackup.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeBackup.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VolumeBackup' + $ref: "#/components/schemas/VolumeBackup" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseVolumePruneReportData: additionalProperties: false @@ -2298,19 +2843,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumePruneReportData.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumePruneReportData.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VolumePruneReportData' + $ref: "#/components/schemas/VolumePruneReportData" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseVolumeUsageCountsData: additionalProperties: false @@ -2318,19 +2863,19 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeUsageCountsData.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeUsageCountsData.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VolumeUsageCountsData' + $ref: "#/components/schemas/VolumeUsageCountsData" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseApiResponseVolumeUsageResponse: additionalProperties: false @@ -2338,112 +2883,171 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeUsageResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseVolumeUsageResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/VolumeUsageResponse' + $ref: "#/components/schemas/VolumeUsageResponse" description: Response data success: description: Whether the request was successful type: boolean required: - - success - - data + - success + - data type: object BaseMessageResponse: additionalProperties: false properties: + activityId: + description: Background activity ID tracking this action + type: string message: description: Response message type: string required: - - message + - message type: object - BasePaginatedIgnoredVulnerability: + BasePaginatedActivity: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedIgnoredVulnerability.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedActivity.json format: uri readOnly: true type: string data: description: Array of items for the current page items: - $ref: '#/components/schemas/VulnerabilityIgnoredVulnerability' + $ref: "#/components/schemas/ActivityActivity" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" description: Pagination metadata success: description: Whether the request was successful type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object - BasePaginatedVulnerability: + BasePaginatedFederatedCredential: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedVulnerability.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedFederatedCredential.json format: uri readOnly: true type: string data: description: Array of items for the current page items: - $ref: '#/components/schemas/VulnerabilityVulnerability' + $ref: "#/components/schemas/FederatedFederatedCredential" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" description: Pagination metadata success: description: Whether the request was successful type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object - BasePaginatedVulnerabilityWithImage: + BasePaginatedIgnoredVulnerability: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedVulnerabilityWithImage.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedIgnoredVulnerability.json format: uri readOnly: true type: string data: description: Array of items for the current page items: - $ref: '#/components/schemas/VulnerabilityVulnerabilityWithImage' + $ref: "#/components/schemas/VulnerabilityIgnoredVulnerability" type: - - array - - 'null' + - array + - "null" + pagination: + $ref: "#/components/schemas/BasePaginationResponse" + description: Pagination metadata + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + - pagination + type: object + BasePaginatedVulnerability: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedVulnerability.json + format: uri + readOnly: true + type: string + data: + description: Array of items for the current page + items: + $ref: "#/components/schemas/VulnerabilityVulnerability" + type: + - array + - "null" + pagination: + $ref: "#/components/schemas/BasePaginationResponse" + description: Pagination metadata + success: + description: Whether the request was successful + type: boolean + required: + - success + - data + - pagination + type: object + BasePaginatedVulnerabilityWithImage: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedVulnerabilityWithImage.json + format: uri + readOnly: true + type: string + data: + description: Array of items for the current page + items: + $ref: "#/components/schemas/VulnerabilityVulnerabilityWithImage" + type: + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" description: Pagination metadata success: description: Whether the request was successful type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object BasePaginationResponse: additionalProperties: false @@ -2469,48 +3073,48 @@ components: format: int64 type: integer required: - - totalPages - - totalItems - - currentPage - - itemsPerPage + - totalPages + - totalItems + - currentPage + - itemsPerPage type: object BlkioConfig: additionalProperties: false properties: device_read_bps: items: - $ref: '#/components/schemas/DockerTypesThrottleDevice' + $ref: "#/components/schemas/DockerTypesThrottleDevice" type: - - array - - 'null' + - array + - "null" device_read_iops: items: - $ref: '#/components/schemas/DockerTypesThrottleDevice' + $ref: "#/components/schemas/DockerTypesThrottleDevice" type: - - array - - 'null' + - array + - "null" device_write_bps: items: - $ref: '#/components/schemas/DockerTypesThrottleDevice' + $ref: "#/components/schemas/DockerTypesThrottleDevice" type: - - array - - 'null' + - array + - "null" device_write_iops: items: - $ref: '#/components/schemas/DockerTypesThrottleDevice' + $ref: "#/components/schemas/DockerTypesThrottleDevice" type: - - array - - 'null' + - array + - "null" weight: format: int32 minimum: 0 type: integer weight_device: items: - $ref: '#/components/schemas/DockerTypesWeightDevice' + $ref: "#/components/schemas/DockerTypesWeightDevice" type: - - array - - 'null' + - array + - "null" type: object BuildConfig: additionalProperties: false @@ -2522,21 +3126,21 @@ components: args: additionalProperties: type: - - string - - 'null' + - string + - "null" type: object cache_from: items: type: string type: - - array - - 'null' + - array + - "null" cache_to: items: type: string type: - - array - - 'null' + - array + - "null" context: type: string dockerfile: @@ -2547,15 +3151,15 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" extra_hosts: additionalProperties: items: type: string type: - - array - - 'null' + - array + - "null" type: object isolation: type: string @@ -2571,14 +3175,14 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" platforms: items: type: string type: - - array - - 'null' + - array + - "null" privileged: type: boolean provenance: @@ -2589,30 +3193,30 @@ components: type: string secrets: items: - $ref: '#/components/schemas/DockerTypesServiceSecretConfig' + $ref: "#/components/schemas/DockerTypesServiceSecretConfig" type: - - array - - 'null' + - array + - "null" shm_size: format: int64 type: integer ssh: items: - $ref: '#/components/schemas/DockerTypesSSHKey' + $ref: "#/components/schemas/DockerTypesSSHKey" type: - - array - - 'null' + - array + - "null" tags: items: type: string type: - - array - - 'null' + - array + - "null" target: type: string ulimits: additionalProperties: - $ref: '#/components/schemas/UlimitsConfig' + $ref: "#/components/schemas/UlimitsConfig" type: object type: object BuildFileContentResponse: @@ -2624,8 +3228,8 @@ components: mimeType: type: string required: - - content - - mimeType + - content + - mimeType type: object BuildProjectInputBody: additionalProperties: false @@ -2633,7 +3237,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/BuildProjectInputBody.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/BuildProjectInputBody.json format: uri readOnly: true type: string @@ -2651,8 +3255,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" type: object CategoryCategory: additionalProperties: false @@ -2667,35 +3271,35 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" matchingSettings: items: - $ref: '#/components/schemas/MetaMetadata' + $ref: "#/components/schemas/MetaMetadata" type: - - array - - 'null' + - array + - "null" relevanceScore: format: int64 type: integer settings: items: - $ref: '#/components/schemas/MetaMetadata' + $ref: "#/components/schemas/MetaMetadata" type: - - array - - 'null' + - array + - "null" title: type: string url: type: string required: - - id - - title - - description - - icon - - url - - keywords - - settings + - id + - title + - description + - icon + - url + - keywords + - settings type: object ContainerActionResponse: additionalProperties: false @@ -2703,49 +3307,92 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerActionResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerActionResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/BaseMessageResponse' + $ref: "#/components/schemas/BaseMessageResponse" success: type: boolean required: - - success - - data + - success + - data type: object ContainerActionResult: additionalProperties: false properties: + activityId: + type: string errors: items: type: string type: - - array - - 'null' + - array + - "null" failed: items: type: string type: - - array - - 'null' + - array + - "null" started: items: type: string type: - - array - - 'null' + - array + - "null" stopped: items: type: string type: - - array - - 'null' + - array + - "null" success: type: boolean required: - - success + - success + type: object + ContainerCommitRequest: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCommitRequest.json + format: uri + readOnly: true + type: string + author: + description: Commit author + type: string + changes: + description: Dockerfile changes to apply + items: + type: string + type: + - array + - "null" + comment: + description: Commit comment + type: string + noPause: + description: Do not pause the container during commit + type: boolean + repository: + description: Target image repository + type: string + tag: + description: Target image tag + type: string + type: object + ContainerCommitResult: + additionalProperties: false + properties: + id: + type: string + required: + - id type: object ContainerComposeInfo: additionalProperties: false @@ -2759,8 +3406,8 @@ components: workingDir: type: string required: - - projectName - - serviceName + - projectName + - serviceName type: object ContainerConfig: additionalProperties: false @@ -2769,20 +3416,22 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" entrypoint: items: type: string type: - - array - - 'null' + - array + - "null" env: items: type: string type: - - array - - 'null' + - array + - "null" + healthcheck: + $ref: "#/components/schemas/ContainerHealthcheck" user: type: string workingDir: @@ -2794,7 +3443,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCreate.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCreate.json format: uri readOnly: true type: string @@ -2810,49 +3459,49 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" command: items: type: string type: - - array - - 'null' + - array + - "null" cpus: format: double type: number credentials: items: - $ref: '#/components/schemas/ContainerregistryCredential' + $ref: "#/components/schemas/ContainerregistryCredential" type: - - array - - 'null' + - array + - "null" domainname: type: string entrypoint: items: type: string type: - - array - - 'null' + - array + - "null" env: items: type: string type: - - array - - 'null' + - array + - "null" environment: items: type: string type: - - array - - 'null' + - array + - "null" exposedPorts: additionalProperties: - $ref: '#/components/schemas/Value' + $ref: "#/components/schemas/Value" type: object hostConfig: - $ref: '#/components/schemas/ContainerHostConfigCreate' + $ref: "#/components/schemas/ContainerHostConfigCreate" hostname: type: string image: @@ -2869,13 +3518,13 @@ components: networkDisabled: type: boolean networkingConfig: - $ref: '#/components/schemas/ContainerNetworkingConfigCreate' + $ref: "#/components/schemas/ContainerNetworkingConfigCreate" networks: items: type: string type: - - array - - 'null' + - array + - "null" openStdin: type: boolean ports: @@ -2896,13 +3545,13 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" workingDir: type: string required: - - name - - image + - name + - image type: object ContainerCreated: additionalProperties: false @@ -2918,11 +3567,11 @@ components: status: type: string required: - - id - - name - - image - - status - - created + - id + - name + - image + - status + - created type: object ContainerCreatedResponse: additionalProperties: false @@ -2930,29 +3579,35 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCreatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCreatedResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ContainerCreated' + $ref: "#/components/schemas/ContainerCreated" success: type: boolean required: - - success - - data + - success + - data type: object ContainerDetails: additionalProperties: false properties: + activityId: + type: string composeInfo: - $ref: '#/components/schemas/ContainerComposeInfo' + $ref: "#/components/schemas/ContainerComposeInfo" config: - $ref: '#/components/schemas/ContainerConfig' + $ref: "#/components/schemas/ContainerConfig" created: type: string hostConfig: - $ref: '#/components/schemas/ContainerHostConfig' + $ref: "#/components/schemas/ContainerHostConfig" + iconDarkUrl: + type: string + iconLightUrl: + type: string id: type: string image: @@ -2965,34 +3620,36 @@ components: type: object mounts: items: - $ref: '#/components/schemas/ContainerMount' + $ref: "#/components/schemas/ContainerMount" type: - - array - - 'null' + - array + - "null" name: type: string networkSettings: - $ref: '#/components/schemas/ContainerNetworkSettings' + $ref: "#/components/schemas/ContainerNetworkSettings" ports: items: - $ref: '#/components/schemas/ContainerPort' + $ref: "#/components/schemas/ContainerPort" type: - - array - - 'null' + - array + - "null" + redeployDisabled: + type: boolean state: - $ref: '#/components/schemas/ContainerState' - required: - - id - - name - - image - - imageId - - created - - state - - config - - hostConfig - - networkSettings - - ports - - mounts + $ref: "#/components/schemas/ContainerState" + required: + - id + - name + - image + - imageId + - created + - state + - config + - hostConfig + - networkSettings + - ports + - mounts type: object ContainerDetailsResponse: additionalProperties: false @@ -3000,17 +3657,17 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerDetailsResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerDetailsResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ContainerDetails' + $ref: "#/components/schemas/ContainerDetails" success: type: boolean required: - - success - - data + - success + - data type: object ContainerEndpointSettingsCreate: additionalProperties: false @@ -3019,8 +3676,66 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" + type: object + ContainerHealth: + additionalProperties: false + properties: + failingStreak: + format: int64 + type: integer + log: + items: + $ref: "#/components/schemas/ContainerHealthLogEntry" + type: + - array + - "null" + status: + type: string + required: + - status + - failingStreak + type: object + ContainerHealthLogEntry: + additionalProperties: false + properties: + end: + type: string + exitCode: + format: int64 + type: integer + output: + type: string + start: + type: string + required: + - exitCode + type: object + ContainerHealthcheck: + additionalProperties: false + properties: + interval: + format: int64 + type: integer + retries: + format: int64 + type: integer + startInterval: + format: int64 + type: integer + startPeriod: + format: int64 + type: integer + test: + items: + type: string + type: + - array + - "null" + timeout: + format: int64 + type: integer type: object ContainerHostConfig: additionalProperties: false @@ -3049,8 +3764,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" cpuShares: format: int64 type: integer @@ -3068,10 +3783,10 @@ components: portBindings: additionalProperties: items: - $ref: '#/components/schemas/ContainerPortBindingCreate' + $ref: "#/components/schemas/ContainerPortBindingCreate" type: - - array - - 'null' + - array + - "null" type: object privileged: type: boolean @@ -3080,7 +3795,7 @@ components: readonlyRootfs: type: boolean restartPolicy: - $ref: '#/components/schemas/ContainerRestartPolicyCreate' + $ref: "#/components/schemas/ContainerRestartPolicyCreate" type: object ContainerMount: additionalProperties: false @@ -3102,8 +3817,8 @@ components: type: type: string required: - - type - - destination + - type + - destination type: object ContainerNetworkEndpoint: additionalProperties: false @@ -3112,14 +3827,14 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" dnsNames: items: type: string type: - - array - - 'null' + - array + - "null" driverOpts: additionalProperties: type: string @@ -3148,8 +3863,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" macAddress: type: string networkId: @@ -3160,17 +3875,17 @@ components: properties: networks: additionalProperties: - $ref: '#/components/schemas/ContainerNetworkEndpoint' + $ref: "#/components/schemas/ContainerNetworkEndpoint" type: object required: - - networks + - networks type: object ContainerNetworkingConfigCreate: additionalProperties: false properties: endpointsConfig: additionalProperties: - $ref: '#/components/schemas/ContainerEndpointSettingsCreate' + $ref: "#/components/schemas/ContainerEndpointSettingsCreate" type: object type: object ContainerPaginatedResponse: @@ -3179,33 +3894,33 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerPaginatedResponse.json format: uri readOnly: true type: string counts: - $ref: '#/components/schemas/ContainerStatusCounts' + $ref: "#/components/schemas/ContainerStatusCounts" data: items: - $ref: '#/components/schemas/ContainerSummary' + $ref: "#/components/schemas/ContainerSummary" type: - - array - - 'null' + - array + - "null" groups: items: - $ref: '#/components/schemas/ContainerSummaryGroup' + $ref: "#/components/schemas/ContainerSummaryGroup" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - counts - - pagination + - success + - data + - counts + - pagination type: object ContainerPort: additionalProperties: false @@ -3221,8 +3936,8 @@ components: type: type: string required: - - privatePort - - type + - privatePort + - type type: object ContainerPortBindingCreate: additionalProperties: false @@ -3238,24 +3953,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerRegistryPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerRegistryPaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/ContainerregistryContainerRegistry' + $ref: "#/components/schemas/ContainerregistryContainerRegistry" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object ContainerRestartPolicyCreate: additionalProperties: false @@ -3274,6 +3989,8 @@ components: type: integer finishedAt: type: string + health: + $ref: "#/components/schemas/ContainerHealth" running: type: boolean startedAt: @@ -3281,8 +3998,8 @@ components: status: type: string required: - - status - - running + - status + - running type: object ContainerStatusCounts: additionalProperties: false @@ -3297,9 +4014,9 @@ components: format: int64 type: integer required: - - runningContainers - - stoppedContainers - - totalContainers + - runningContainers + - stoppedContainers + - totalContainers type: object ContainerStatusCountsResponse: additionalProperties: false @@ -3307,17 +4024,17 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerStatusCountsResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerStatusCountsResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ContainerStatusCounts' + $ref: "#/components/schemas/ContainerStatusCounts" success: type: boolean required: - - success - - data + - success + - data type: object ContainerSummary: additionalProperties: false @@ -3328,7 +4045,11 @@ components: format: int64 type: integer hostConfig: - $ref: '#/components/schemas/ContainerHostConfig' + $ref: "#/components/schemas/ContainerHostConfig" + iconDarkUrl: + type: string + iconLightUrl: + type: string id: type: string image: @@ -3341,44 +4062,46 @@ components: type: object mounts: items: - $ref: '#/components/schemas/ContainerMount' + $ref: "#/components/schemas/ContainerMount" type: - - array - - 'null' + - array + - "null" names: items: type: string type: - - array - - 'null' + - array + - "null" networkSettings: - $ref: '#/components/schemas/ContainerNetworkSettings' + $ref: "#/components/schemas/ContainerNetworkSettings" ports: items: - $ref: '#/components/schemas/ContainerPort' + $ref: "#/components/schemas/ContainerPort" type: - - array - - 'null' + - array + - "null" + redeployDisabled: + type: boolean state: type: string status: type: string updateInfo: - $ref: '#/components/schemas/ImageUpdateInfo' - required: - - id - - names - - image - - imageId - - command - - created - - ports - - labels - - state - - status - - hostConfig - - networkSettings - - mounts + $ref: "#/components/schemas/ImageUpdateInfo" + required: + - id + - names + - image + - imageId + - command + - created + - ports + - labels + - state + - status + - hostConfig + - networkSettings + - mounts type: object ContainerSummaryGroup: additionalProperties: false @@ -3387,13 +4110,13 @@ components: type: string items: items: - $ref: '#/components/schemas/ContainerSummary' + $ref: "#/components/schemas/ContainerSummary" type: - - array - - 'null' + - array + - "null" required: - - groupName - - items + - groupName + - items type: object ContainerregistryContainerRegistry: additionalProperties: false @@ -3423,14 +4146,14 @@ components: username: type: string required: - - id - - url - - username - - insecure - - enabled - - registryType - - createdAt - - updatedAt + - id + - url + - username + - insecure + - enabled + - registryType + - createdAt + - updatedAt type: object ContainerregistryCredential: additionalProperties: false @@ -3444,10 +4167,70 @@ components: username: type: string required: - - url - - username - - token - - enabled + - url + - username + - token + - enabled + type: object + ContainerregistryPullUsage: + additionalProperties: false + properties: + authMethod: + type: string + authUsername: + type: string + checkedAt: + format: date-time + type: string + displayName: + type: string + error: + type: string + limit: + format: int64 + type: integer + observedPulls: + format: int64 + type: integer + provider: + type: string + registry: + type: string + registryId: + type: string + remaining: + format: int64 + type: integer + repository: + type: string + source: + type: string + used: + format: int64 + type: integer + windowSeconds: + format: int64 + type: integer + required: + - registryId + - provider + - registry + - displayName + - observedPulls + - authMethod + - checkedAt + type: object + ContainerregistryPullUsageResponse: + additionalProperties: false + properties: + registries: + items: + $ref: "#/components/schemas/ContainerregistryPullUsage" + type: + - array + - "null" + required: + - registries type: object ContainerregistrySync: additionalProperties: false @@ -3481,15 +4264,15 @@ components: username: type: string required: - - id - - url - - username - - token - - insecure - - enabled - - registryType - - createdAt - - updatedAt + - id + - url + - username + - token + - insecure + - enabled + - registryType + - createdAt + - updatedAt type: object ContainerregistrySyncRequest: additionalProperties: false @@ -3497,18 +4280,18 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerregistrySyncRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerregistrySyncRequest.json format: uri readOnly: true type: string registries: items: - $ref: '#/components/schemas/ContainerregistrySync' + $ref: "#/components/schemas/ContainerregistrySync" type: - - array - - 'null' + - array + - "null" required: - - registries + - registries type: object CreateContainerRegistryRequest: additionalProperties: false @@ -3516,7 +4299,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/CreateContainerRegistryRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/CreateContainerRegistryRequest.json format: uri readOnly: true type: string @@ -3528,16 +4311,16 @@ components: type: string description: type: - - string - - 'null' + - string + - "null" enabled: type: - - boolean - - 'null' + - boolean + - "null" insecure: type: - - boolean - - 'null' + - boolean + - "null" registryType: type: string token: @@ -3547,16 +4330,16 @@ components: username: type: string required: - - url - - username - - token - - description - - insecure - - enabled - - registryType - - awsAccessKeyId - - awsSecretAccessKey - - awsRegion + - url + - username + - token + - description + - insecure + - enabled + - registryType + - awsAccessKeyId + - awsSecretAccessKey + - awsRegion type: object CreateGitRepositoryRequest: additionalProperties: false @@ -3564,7 +4347,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/CreateGitRepositoryRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/CreateGitRepositoryRequest.json format: uri readOnly: true type: string @@ -3587,9 +4370,27 @@ components: username: type: string required: - - name - - url - - authType + - name + - url + - authType + type: object + CreateOidcRoleMappingOutputBody: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/CreateOidcRoleMappingOutputBody.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/RoleOidcRoleMapping" + success: + type: boolean + required: + - success + - data type: object CredentialSpecConfig: additionalProperties: false @@ -3612,82 +4413,97 @@ components: severity: type: string required: - - kind - - count - - severity + - kind + - count + - severity type: object DashboardActionItems: additionalProperties: false properties: items: items: - $ref: '#/components/schemas/DashboardActionItem' + $ref: "#/components/schemas/DashboardActionItem" type: - - array - - 'null' + - array + - "null" required: - - items + - items type: object DashboardSnapshot: additionalProperties: false properties: actionItems: - $ref: '#/components/schemas/DashboardActionItems' + $ref: "#/components/schemas/DashboardActionItems" containers: - $ref: '#/components/schemas/DashboardSnapshotContainers' + $ref: "#/components/schemas/DashboardSnapshotContainers" imageUsageCounts: - $ref: '#/components/schemas/ImageUsageCounts' + $ref: "#/components/schemas/ImageUsageCounts" images: - $ref: '#/components/schemas/DashboardSnapshotImages' + $ref: "#/components/schemas/DashboardSnapshotImages" settings: - $ref: '#/components/schemas/DashboardSnapshotSettings' + $ref: "#/components/schemas/DashboardSnapshotSettings" + versionInfo: + $ref: "#/components/schemas/VersionInfo" required: - - containers - - images - - imageUsageCounts - - actionItems - - settings + - containers + - images + - imageUsageCounts + - actionItems + - settings type: object DashboardSnapshotContainers: additionalProperties: false properties: counts: - $ref: '#/components/schemas/ContainerStatusCounts' + $ref: "#/components/schemas/ContainerStatusCounts" data: items: - $ref: '#/components/schemas/ContainerSummary' + $ref: "#/components/schemas/ContainerSummary" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" required: - - data - - counts - - pagination + - data + - counts + - pagination type: object DashboardSnapshotImages: additionalProperties: false properties: data: items: - $ref: '#/components/schemas/ImageSummary' + $ref: "#/components/schemas/ImageSummary" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" required: - - data - - pagination + - data + - pagination type: object DashboardSnapshotSettings: + additionalProperties: false + type: object + DeleteOidcRoleMappingOutputBody: additionalProperties: false properties: - dockerPruneMode: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/DeleteOidcRoleMappingOutputBody.json + format: uri + readOnly: true + type: string + message: type: string + success: + type: boolean required: - - dockerPruneMode + - success + - message type: object DeployConfig: additionalProperties: false @@ -3701,18 +4517,18 @@ components: mode: type: string placement: - $ref: '#/components/schemas/DockerTypesPlacement' + $ref: "#/components/schemas/DockerTypesPlacement" replicas: format: int64 type: integer resources: - $ref: '#/components/schemas/DockerTypesResources' + $ref: "#/components/schemas/DockerTypesResources" restart_policy: - $ref: '#/components/schemas/RestartPolicy' + $ref: "#/components/schemas/RestartPolicy" rollback_config: - $ref: '#/components/schemas/UpdateConfig' + $ref: "#/components/schemas/UpdateConfig" update_config: - $ref: '#/components/schemas/UpdateConfig' + $ref: "#/components/schemas/UpdateConfig" type: object DeploymentSnippet: additionalProperties: false @@ -3723,34 +4539,88 @@ components: dockerRun: description: Docker run command snippet type: string + mtls: + $ref: "#/components/schemas/DeploymentSnippetMTLS" + description: Optional Arcane-generated mTLS deployment assets for edge agents required: - - dockerRun - - dockerCompose + - dockerRun + - dockerCompose type: object - DetailSummaryConfigStruct: + DeploymentSnippetFile: additionalProperties: false properties: - argsEscaped: + containerPath: + description: Container mount path expected by the mTLS snippet + type: string + content: + description: PEM file contents. Omitted for sensitive files such as private keys; use downloadUrl instead. + type: string + downloadUrl: + description: Pairing-permission endpoint to download this file when content is withheld + type: string + name: + description: Suggested filename + type: string + permissions: + description: Suggested file mode + type: string + sensitive: + description: True when this file is sensitive and must be fetched via downloadUrl + type: boolean + required: + - name + - containerPath + - permissions + type: object + DeploymentSnippetMTLS: + additionalProperties: false + properties: + dockerCompose: + description: Docker compose snippet using Arcane-generated mTLS assets + type: string + dockerRun: + description: Docker run snippet using Arcane-generated mTLS assets + type: string + files: + description: Generated PEM files to place on the edge host + items: + $ref: "#/components/schemas/DeploymentSnippetFile" + type: + - array + - "null" + hostDirHint: + description: Suggested host directory containing the generated PEM files + type: string + required: + - dockerRun + - dockerCompose + - files + - hostDirHint + type: object + DetailSummaryConfigStruct: + additionalProperties: false + properties: + argsEscaped: type: boolean cmd: items: type: string type: - - array - - 'null' + - array + - "null" env: items: type: string type: - - array - - 'null' + - array + - "null" exposedPorts: additionalProperties: - $ref: '#/components/schemas/Value' + $ref: "#/components/schemas/Value" type: object volumes: additionalProperties: - $ref: '#/components/schemas/Value' + $ref: "#/components/schemas/Value" type: object workingDir: type: string @@ -3766,9 +4636,9 @@ components: format: int64 type: integer required: - - mediaType - - digest - - size + - mediaType + - digest + - size type: object DetailSummaryGraphDriverStruct: additionalProperties: false @@ -3777,8 +4647,8 @@ components: name: type: string required: - - data - - name + - data + - name type: object DetailSummaryMetadataStruct: additionalProperties: false @@ -3786,7 +4656,7 @@ components: lastTagTime: type: string required: - - lastTagTime + - lastTagTime type: object DetailSummaryRootFsStruct: additionalProperties: false @@ -3795,23 +4665,23 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" type: type: string required: - - type - - layers + - type + - layers type: object DevelopConfig: additionalProperties: false properties: watch: items: - $ref: '#/components/schemas/DockerTypesTrigger' + $ref: "#/components/schemas/DockerTypesTrigger" type: - - array - - 'null' + - array + - "null" type: object DiscreteGenericResource: additionalProperties: false @@ -3822,8 +4692,8 @@ components: format: int64 type: integer required: - - kind - - value + - kind + - value type: object DockerMountBindOptions: additionalProperties: false @@ -3862,13 +4732,13 @@ components: additionalProperties: false properties: BindOptions: - $ref: '#/components/schemas/DockerMountBindOptions' + $ref: "#/components/schemas/DockerMountBindOptions" ClusterOptions: - $ref: '#/components/schemas/DockerMountClusterOptions' + $ref: "#/components/schemas/DockerMountClusterOptions" Consistency: type: string ImageOptions: - $ref: '#/components/schemas/DockerMountImageOptions' + $ref: "#/components/schemas/DockerMountImageOptions" ReadOnly: type: boolean Source: @@ -3876,11 +4746,11 @@ components: Target: type: string TmpfsOptions: - $ref: '#/components/schemas/DockerMountTmpfsOptions' + $ref: "#/components/schemas/DockerMountTmpfsOptions" Type: type: string VolumeOptions: - $ref: '#/components/schemas/DockerMountVolumeOptions' + $ref: "#/components/schemas/DockerMountVolumeOptions" type: object DockerMountTmpfsOptions: additionalProperties: false @@ -3894,11 +4764,11 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" type: - - array - - 'null' + - array + - "null" SizeBytes: format: int64 type: integer @@ -3907,7 +4777,7 @@ components: additionalProperties: false properties: DriverConfig: - $ref: '#/components/schemas/DockerMountDriver' + $ref: "#/components/schemas/DockerMountDriver" Labels: additionalProperties: type: string @@ -3923,7 +4793,7 @@ components: Network: type: string required: - - Network + - Network type: object DockerNetworkEndpointResource: additionalProperties: false @@ -3939,11 +4809,11 @@ components: Name: type: string required: - - Name - - EndpointID - - MacAddress - - IPv4Address - - IPv6Address + - Name + - EndpointID + - MacAddress + - IPv4Address + - IPv6Address type: object DockerNetworkPeerInfo: additionalProperties: false @@ -3954,8 +4824,8 @@ components: Name: type: string required: - - Name - - IP + - Name + - IP type: object DockerNetworkServiceInfo: additionalProperties: false @@ -3967,22 +4837,22 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" Tasks: items: - $ref: '#/components/schemas/DockerNetworkTask' + $ref: "#/components/schemas/DockerNetworkTask" type: - - array - - 'null' + - array + - "null" VIP: format: ip type: string required: - - VIP - - Ports - - LocalLBIndex - - Tasks + - VIP + - Ports + - LocalLBIndex + - Tasks type: object DockerNetworkTask: additionalProperties: false @@ -3999,10 +4869,10 @@ components: Name: type: string required: - - Name - - EndpointID - - EndpointIP - - Info + - Name + - EndpointID + - EndpointIP + - Info type: object DockerRegistryIndexInfo: additionalProperties: false @@ -4011,8 +4881,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" Name: type: string Official: @@ -4020,34 +4890,34 @@ components: Secure: type: boolean required: - - Name - - Mirrors - - Secure - - Official + - Name + - Mirrors + - Secure + - Official type: object DockerRegistryServiceConfig: additionalProperties: false properties: IndexConfigs: additionalProperties: - $ref: '#/components/schemas/DockerRegistryIndexInfo' + $ref: "#/components/schemas/DockerRegistryIndexInfo" type: object InsecureRegistryCIDRs: items: type: string type: - - array - - 'null' + - array + - "null" Mirrors: items: type: string type: - - array - - 'null' + - array + - "null" required: - - InsecureRegistryCIDRs - - IndexConfigs - - Mirrors + - InsecureRegistryCIDRs + - IndexConfigs + - Mirrors type: object DockerSwarmAppArmorOpts: additionalProperties: false @@ -4060,10 +4930,10 @@ components: properties: ExternalCAs: items: - $ref: '#/components/schemas/DockerSwarmExternalCA' + $ref: "#/components/schemas/DockerSwarmExternalCA" type: - - array - - 'null' + - array + - "null" ForceRotate: format: int64 minimum: 0 @@ -4090,33 +4960,33 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" ID: type: string RootRotationInProgress: type: boolean Spec: - $ref: '#/components/schemas/DockerSwarmSpec' + $ref: "#/components/schemas/DockerSwarmSpec" SubnetSize: format: int32 minimum: 0 type: integer TLSInfo: - $ref: '#/components/schemas/DockerSwarmTLSInfo' + $ref: "#/components/schemas/DockerSwarmTLSInfo" UpdatedAt: format: date-time type: string Version: - $ref: '#/components/schemas/DockerSwarmVersion' + $ref: "#/components/schemas/DockerSwarmVersion" required: - - ID - - Spec - - TLSInfo - - RootRotationInProgress - - DefaultAddrPool - - SubnetSize - - DataPathPort + - ID + - Spec + - TLSInfo + - RootRotationInProgress + - DefaultAddrPool + - SubnetSize + - DataPathPort type: object DockerSwarmConfigReference: additionalProperties: false @@ -4126,12 +4996,12 @@ components: ConfigName: type: string File: - $ref: '#/components/schemas/DockerSwarmConfigReferenceFileTarget' + $ref: "#/components/schemas/DockerSwarmConfigReferenceFileTarget" Runtime: - $ref: '#/components/schemas/DockerSwarmConfigReferenceRuntimeTarget' + $ref: "#/components/schemas/DockerSwarmConfigReferenceRuntimeTarget" required: - - ConfigID - - ConfigName + - ConfigID + - ConfigName type: object DockerSwarmConfigReferenceFileTarget: additionalProperties: false @@ -4147,10 +5017,10 @@ components: UID: type: string required: - - Name - - UID - - GID - - Mode + - Name + - UID + - GID + - Mode type: object DockerSwarmConfigReferenceRuntimeTarget: additionalProperties: false @@ -4168,9 +5038,9 @@ components: Name: type: string Templating: - $ref: '#/components/schemas/DockerSwarmDriver' + $ref: "#/components/schemas/DockerSwarmDriver" required: - - Labels + - Labels type: object DockerSwarmContainerSpec: additionalProperties: false @@ -4179,58 +5049,58 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" CapabilityAdd: items: type: string type: - - array - - 'null' + - array + - "null" CapabilityDrop: items: type: string type: - - array - - 'null' + - array + - "null" Command: items: type: string type: - - array - - 'null' + - array + - "null" Configs: items: - $ref: '#/components/schemas/DockerSwarmConfigReference' + $ref: "#/components/schemas/DockerSwarmConfigReference" type: - - array - - 'null' + - array + - "null" DNSConfig: - $ref: '#/components/schemas/DockerSwarmDNSConfig' + $ref: "#/components/schemas/DockerSwarmDNSConfig" Dir: type: string Env: items: type: string type: - - array - - 'null' + - array + - "null" Groups: items: type: string type: - - array - - 'null' + - array + - "null" Healthcheck: - $ref: '#/components/schemas/HealthcheckConfig' + $ref: "#/components/schemas/HealthcheckConfig" Hostname: type: string Hosts: items: type: string type: - - array - - 'null' + - array + - "null" Image: type: string Init: @@ -4243,25 +5113,25 @@ components: type: object Mounts: items: - $ref: '#/components/schemas/DockerMountMount' + $ref: "#/components/schemas/DockerMountMount" type: - - array - - 'null' + - array + - "null" OomScoreAdj: format: int64 type: integer OpenStdin: type: boolean Privileges: - $ref: '#/components/schemas/DockerSwarmPrivileges' + $ref: "#/components/schemas/DockerSwarmPrivileges" ReadOnly: type: boolean Secrets: items: - $ref: '#/components/schemas/DockerSwarmSecretReference' + $ref: "#/components/schemas/DockerSwarmSecretReference" type: - - array - - 'null' + - array + - "null" StopGracePeriod: format: int64 type: integer @@ -4275,10 +5145,10 @@ components: type: boolean Ulimits: items: - $ref: '#/components/schemas/Ulimit' + $ref: "#/components/schemas/Ulimit" type: - - array - - 'null' + - array + - "null" User: type: string type: object @@ -4292,9 +5162,9 @@ components: Registry: type: string required: - - Config - - File - - Registry + - Config + - File + - Registry type: object DockerSwarmDNSConfig: additionalProperties: false @@ -4304,20 +5174,20 @@ components: format: ip type: string type: - - array - - 'null' + - array + - "null" Options: items: type: string type: - - array - - 'null' + - array + - "null" Search: items: type: string type: - - array - - 'null' + - array + - "null" type: object DockerSwarmDiscreteGenericResource: additionalProperties: false @@ -4351,25 +5221,25 @@ components: AutoLockManagers: type: boolean required: - - AutoLockManagers + - AutoLockManagers type: object DockerSwarmEndpoint: additionalProperties: false properties: Ports: items: - $ref: '#/components/schemas/DockerSwarmPortConfig' + $ref: "#/components/schemas/DockerSwarmPortConfig" type: - - array - - 'null' + - array + - "null" Spec: - $ref: '#/components/schemas/DockerSwarmEndpointSpec' + $ref: "#/components/schemas/DockerSwarmEndpointSpec" VirtualIPs: items: - $ref: '#/components/schemas/DockerSwarmEndpointVirtualIP' + $ref: "#/components/schemas/DockerSwarmEndpointVirtualIP" type: - - array - - 'null' + - array + - "null" type: object DockerSwarmEndpointSpec: additionalProperties: false @@ -4378,10 +5248,10 @@ components: type: string Ports: items: - $ref: '#/components/schemas/DockerSwarmPortConfig' + $ref: "#/components/schemas/DockerSwarmPortConfig" type: - - array - - 'null' + - array + - "null" type: object DockerSwarmEndpointVirtualIP: additionalProperties: false @@ -4405,17 +5275,17 @@ components: URL: type: string required: - - Protocol - - URL - - CACert + - Protocol + - URL + - CACert type: object DockerSwarmGenericResource: additionalProperties: false properties: DiscreteResourceSpec: - $ref: '#/components/schemas/DockerSwarmDiscreteGenericResource' + $ref: "#/components/schemas/DockerSwarmDiscreteGenericResource" NamedResourceSpec: - $ref: '#/components/schemas/DockerSwarmNamedGenericResource' + $ref: "#/components/schemas/DockerSwarmNamedGenericResource" type: object DockerSwarmGlobalJob: additionalProperties: false @@ -4427,7 +5297,7 @@ components: additionalProperties: false properties: Cluster: - $ref: '#/components/schemas/DockerSwarmClusterInfo' + $ref: "#/components/schemas/DockerSwarmClusterInfo" ControlAvailable: type: boolean Error: @@ -4446,23 +5316,23 @@ components: type: integer RemoteManagers: items: - $ref: '#/components/schemas/DockerSwarmPeer' + $ref: "#/components/schemas/DockerSwarmPeer" type: - - array - - 'null' + - array + - "null" Warnings: items: type: string type: - - array - - 'null' + - array + - "null" required: - - NodeID - - NodeAddr - - LocalNodeState - - ControlAvailable - - Error - - RemoteManagers + - NodeID + - NodeAddr + - LocalNodeState + - ControlAvailable + - Error + - RemoteManagers type: object DockerSwarmLimit: additionalProperties: false @@ -4492,8 +5362,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" DriverOpts: additionalProperties: type: string @@ -4507,7 +5377,7 @@ components: ContainerID: type: string required: - - ContainerID + - ContainerID type: object DockerSwarmOrchestrationConfig: additionalProperties: false @@ -4524,8 +5394,8 @@ components: NodeID: type: string required: - - NodeID - - Addr + - NodeID + - Addr type: object DockerSwarmPlacement: additionalProperties: false @@ -4534,32 +5404,32 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" MaxReplicas: format: int64 minimum: 0 type: integer Platforms: items: - $ref: '#/components/schemas/DockerSwarmPlatform' + $ref: "#/components/schemas/DockerSwarmPlatform" type: - - array - - 'null' + - array + - "null" Preferences: items: - $ref: '#/components/schemas/DockerSwarmPlacementPreference' + $ref: "#/components/schemas/DockerSwarmPlacementPreference" type: - - array - - 'null' + - array + - "null" type: object DockerSwarmPlacementPreference: additionalProperties: false properties: Spread: - $ref: '#/components/schemas/DockerSwarmSpreadOver' + $ref: "#/components/schemas/DockerSwarmSpreadOver" required: - - Spread + - Spread type: object DockerSwarmPlatform: additionalProperties: false @@ -4591,19 +5461,19 @@ components: additionalProperties: false properties: AppArmor: - $ref: '#/components/schemas/DockerSwarmAppArmorOpts' + $ref: "#/components/schemas/DockerSwarmAppArmorOpts" CredentialSpec: - $ref: '#/components/schemas/DockerSwarmCredentialSpec' + $ref: "#/components/schemas/DockerSwarmCredentialSpec" NoNewPrivileges: type: boolean SELinuxContext: - $ref: '#/components/schemas/DockerSwarmSELinuxContext' + $ref: "#/components/schemas/DockerSwarmSELinuxContext" Seccomp: - $ref: '#/components/schemas/DockerSwarmSeccompOpts' + $ref: "#/components/schemas/DockerSwarmSeccompOpts" required: - - CredentialSpec - - SELinuxContext - - NoNewPrivileges + - CredentialSpec + - SELinuxContext + - NoNewPrivileges type: object DockerSwarmRaftConfig: additionalProperties: false @@ -4627,8 +5497,8 @@ components: minimum: 0 type: integer required: - - ElectionTick - - HeartbeatTick + - ElectionTick + - HeartbeatTick type: object DockerSwarmReplicatedJob: additionalProperties: false @@ -4654,29 +5524,29 @@ components: additionalProperties: false properties: Limits: - $ref: '#/components/schemas/DockerSwarmLimit' + $ref: "#/components/schemas/DockerSwarmLimit" MemorySwappiness: format: int64 type: - - integer - - 'null' + - integer + - "null" Reservations: - $ref: '#/components/schemas/DockerSwarmResources' + $ref: "#/components/schemas/DockerSwarmResources" SwapBytes: format: int64 type: - - integer - - 'null' + - integer + - "null" type: object DockerSwarmResources: additionalProperties: false properties: GenericResources: items: - $ref: '#/components/schemas/DockerSwarmGenericResource' + $ref: "#/components/schemas/DockerSwarmGenericResource" type: - - array - - 'null' + - array + - "null" MemoryBytes: format: int64 type: integer @@ -4711,8 +5581,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" type: object DockerSwarmRuntimeSpec: additionalProperties: false @@ -4723,16 +5593,16 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" name: type: string privileges: items: - $ref: '#/components/schemas/DockerSwarmRuntimePrivilege' + $ref: "#/components/schemas/DockerSwarmRuntimePrivilege" type: - - array - - 'null' + - array + - "null" remote: type: string type: object @@ -4750,11 +5620,11 @@ components: User: type: string required: - - Disable - - User - - Role - - Type - - Level + - Disable + - User + - Role + - Type + - Level type: object DockerSwarmSeccompOpts: additionalProperties: false @@ -4769,15 +5639,15 @@ components: additionalProperties: false properties: File: - $ref: '#/components/schemas/DockerSwarmSecretReferenceFileTarget' + $ref: "#/components/schemas/DockerSwarmSecretReferenceFileTarget" SecretID: type: string SecretName: type: string required: - - File - - SecretID - - SecretName + - File + - SecretID + - SecretName type: object DockerSwarmSecretReferenceFileTarget: additionalProperties: false @@ -4793,10 +5663,10 @@ components: UID: type: string required: - - Name - - UID - - GID - - Mode + - Name + - UID + - GID + - Mode type: object DockerSwarmSecretSpec: additionalProperties: false @@ -4805,7 +5675,7 @@ components: contentEncoding: base64 type: string Driver: - $ref: '#/components/schemas/DockerSwarmDriver' + $ref: "#/components/schemas/DockerSwarmDriver" Labels: additionalProperties: type: string @@ -4813,53 +5683,53 @@ components: Name: type: string Templating: - $ref: '#/components/schemas/DockerSwarmDriver' + $ref: "#/components/schemas/DockerSwarmDriver" required: - - Labels + - Labels type: object DockerSwarmServiceMode: additionalProperties: false properties: Global: - $ref: '#/components/schemas/DockerSwarmGlobalService' + $ref: "#/components/schemas/DockerSwarmGlobalService" GlobalJob: - $ref: '#/components/schemas/DockerSwarmGlobalJob' + $ref: "#/components/schemas/DockerSwarmGlobalJob" Replicated: - $ref: '#/components/schemas/DockerSwarmReplicatedService' + $ref: "#/components/schemas/DockerSwarmReplicatedService" ReplicatedJob: - $ref: '#/components/schemas/DockerSwarmReplicatedJob' + $ref: "#/components/schemas/DockerSwarmReplicatedJob" type: object DockerSwarmServiceSpec: additionalProperties: false properties: EndpointSpec: - $ref: '#/components/schemas/DockerSwarmEndpointSpec' + $ref: "#/components/schemas/DockerSwarmEndpointSpec" Labels: additionalProperties: type: string type: object Mode: - $ref: '#/components/schemas/DockerSwarmServiceMode' + $ref: "#/components/schemas/DockerSwarmServiceMode" Name: type: string RollbackConfig: - $ref: '#/components/schemas/DockerSwarmUpdateConfig' + $ref: "#/components/schemas/DockerSwarmUpdateConfig" TaskTemplate: - $ref: '#/components/schemas/DockerSwarmTaskSpec' + $ref: "#/components/schemas/DockerSwarmTaskSpec" UpdateConfig: - $ref: '#/components/schemas/DockerSwarmUpdateConfig' + $ref: "#/components/schemas/DockerSwarmUpdateConfig" required: - - Labels + - Labels type: object DockerSwarmSpec: additionalProperties: false properties: CAConfig: - $ref: '#/components/schemas/DockerSwarmCAConfig' + $ref: "#/components/schemas/DockerSwarmCAConfig" Dispatcher: - $ref: '#/components/schemas/DockerSwarmDispatcherConfig' + $ref: "#/components/schemas/DockerSwarmDispatcherConfig" EncryptionConfig: - $ref: '#/components/schemas/DockerSwarmEncryptionConfig' + $ref: "#/components/schemas/DockerSwarmEncryptionConfig" Labels: additionalProperties: type: string @@ -4867,13 +5737,13 @@ components: Name: type: string Orchestration: - $ref: '#/components/schemas/DockerSwarmOrchestrationConfig' + $ref: "#/components/schemas/DockerSwarmOrchestrationConfig" Raft: - $ref: '#/components/schemas/DockerSwarmRaftConfig' + $ref: "#/components/schemas/DockerSwarmRaftConfig" TaskDefaults: - $ref: '#/components/schemas/DockerSwarmTaskDefaults' + $ref: "#/components/schemas/DockerSwarmTaskDefaults" required: - - Labels + - Labels type: object DockerSwarmSpreadOver: additionalProperties: false @@ -4881,7 +5751,7 @@ components: SpreadDescriptor: type: string required: - - SpreadDescriptor + - SpreadDescriptor type: object DockerSwarmTLSInfo: additionalProperties: false @@ -4899,39 +5769,39 @@ components: additionalProperties: false properties: LogDriver: - $ref: '#/components/schemas/DockerSwarmDriver' + $ref: "#/components/schemas/DockerSwarmDriver" type: object DockerSwarmTaskSpec: additionalProperties: false properties: ContainerSpec: - $ref: '#/components/schemas/DockerSwarmContainerSpec' + $ref: "#/components/schemas/DockerSwarmContainerSpec" ForceUpdate: format: int64 minimum: 0 type: integer LogDriver: - $ref: '#/components/schemas/DockerSwarmDriver' + $ref: "#/components/schemas/DockerSwarmDriver" NetworkAttachmentSpec: - $ref: '#/components/schemas/DockerSwarmNetworkAttachmentSpec' + $ref: "#/components/schemas/DockerSwarmNetworkAttachmentSpec" Networks: items: - $ref: '#/components/schemas/DockerSwarmNetworkAttachmentConfig' + $ref: "#/components/schemas/DockerSwarmNetworkAttachmentConfig" type: - - array - - 'null' + - array + - "null" Placement: - $ref: '#/components/schemas/DockerSwarmPlacement' + $ref: "#/components/schemas/DockerSwarmPlacement" PluginSpec: - $ref: '#/components/schemas/DockerSwarmRuntimeSpec' + $ref: "#/components/schemas/DockerSwarmRuntimeSpec" Resources: - $ref: '#/components/schemas/DockerSwarmResourceRequirements' + $ref: "#/components/schemas/DockerSwarmResourceRequirements" RestartPolicy: - $ref: '#/components/schemas/DockerSwarmRestartPolicy' + $ref: "#/components/schemas/DockerSwarmRestartPolicy" Runtime: type: string required: - - ForceUpdate + - ForceUpdate type: object DockerSwarmUpdateConfig: additionalProperties: false @@ -4954,9 +5824,9 @@ components: minimum: 0 type: integer required: - - Parallelism - - MaxFailureRatio - - Order + - Parallelism + - MaxFailureRatio + - Order type: object DockerSwarmUpdateStatus: additionalProperties: false @@ -4986,7 +5856,7 @@ components: ID: type: string required: - - ID + - ID type: object DockerSystemContainerdInfo: additionalProperties: false @@ -4994,9 +5864,9 @@ components: Address: type: string Namespaces: - $ref: '#/components/schemas/DockerSystemContainerdNamespaces' + $ref: "#/components/schemas/DockerSystemContainerdNamespaces" required: - - Namespaces + - Namespaces type: object DockerSystemContainerdNamespaces: additionalProperties: false @@ -5006,8 +5876,8 @@ components: Plugins: type: string required: - - Containers - - Plugins + - Containers + - Plugins type: object DockerSystemDeviceInfo: additionalProperties: false @@ -5017,8 +5887,8 @@ components: Source: type: string required: - - Source - - ID + - Source + - ID type: object DockerSystemFirewallInfo: additionalProperties: false @@ -5032,13 +5902,13 @@ components: maxItems: 2 minItems: 2 type: - - array - - 'null' + - array + - "null" type: - - array - - 'null' + - array + - "null" required: - - Driver + - Driver type: object DockerSystemNRIInfo: additionalProperties: false @@ -5050,11 +5920,11 @@ components: maxItems: 2 minItems: 2 type: - - array - - 'null' + - array + - "null" type: - - array - - 'null' + - array + - "null" type: object DockerSystemNetworkAddressPool: additionalProperties: false @@ -5065,8 +5935,8 @@ components: format: int64 type: integer required: - - Base - - Size + - Base + - Size type: object DockerSystemPluginsInfo: additionalProperties: false @@ -5075,31 +5945,31 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" Log: items: type: string type: - - array - - 'null' + - array + - "null" Network: items: type: string type: - - array - - 'null' + - array + - "null" Volume: items: type: string type: - - array - - 'null' + - array + - "null" required: - - Volume - - Network - - Authorization - - Log + - Volume + - Network + - Authorization + - Log type: object DockerSystemRuntimeWithStatus: additionalProperties: false @@ -5113,8 +5983,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" runtimeType: type: string status: @@ -5122,6 +5992,117 @@ components: type: string type: object type: object + DockerTypesBuildRequest: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/DockerTypesBuildRequest.json + format: uri + readOnly: true + type: string + buildArgs: + additionalProperties: + type: string + description: Build arguments + type: object + cacheFrom: + description: Build cache sources + items: + type: string + type: + - array + - "null" + cacheTo: + description: Build cache targets + items: + type: string + type: + - array + - "null" + contextDir: + description: Build context directory or Git URL + minLength: 1 + type: string + dockerfile: + description: Dockerfile path + type: string + dockerfileInline: + description: Inline Dockerfile content + type: string + entitlements: + description: Build entitlements + items: + type: string + type: + - array + - "null" + extraHosts: + description: Build extra host mappings + items: + type: string + type: + - array + - "null" + isolation: + description: Build isolation mode + type: string + labels: + additionalProperties: + type: string + description: Build labels + type: object + load: + description: Load image into local Docker + type: boolean + network: + description: Build network mode + type: string + noCache: + description: Disable build cache + type: boolean + platforms: + description: Target platforms + items: + type: string + type: + - array + - "null" + privileged: + description: Enable privileged build + type: boolean + provider: + description: Build provider override + type: string + pull: + description: Always pull referenced base images + type: boolean + push: + description: Push image + type: boolean + shmSize: + description: Build shared memory size in bytes + format: int64 + type: integer + tags: + description: Image tags + items: + type: string + type: + - array + - "null" + target: + description: Target stage + type: string + ulimits: + additionalProperties: + type: string + description: Build ulimits + type: object + required: + - contextDir + type: object DockerTypesDeviceMapping: additionalProperties: false properties: @@ -5139,8 +6120,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" count: format: int64 type: integer @@ -5148,8 +6129,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" driver: type: string options: @@ -5171,7 +6152,7 @@ components: additionalProperties: false properties: discrete_resource_spec: - $ref: '#/components/schemas/DiscreteGenericResource' + $ref: "#/components/schemas/DiscreteGenericResource" type: object DockerTypesPlacement: additionalProperties: false @@ -5180,18 +6161,18 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" max_replicas_per_node: format: int64 minimum: 0 type: integer preferences: items: - $ref: '#/components/schemas/DockerTypesPlacementPreferences' + $ref: "#/components/schemas/DockerTypesPlacementPreferences" type: - - array - - 'null' + - array + - "null" type: object DockerTypesPlacementPreferences: additionalProperties: false @@ -5203,9 +6184,9 @@ components: additionalProperties: false properties: limits: - $ref: '#/components/schemas/Resource' + $ref: "#/components/schemas/Resource" reservations: - $ref: '#/components/schemas/Resource' + $ref: "#/components/schemas/Resource" type: object DockerTypesSSHKey: additionalProperties: false @@ -5225,21 +6206,21 @@ components: attach: type: boolean blkio_config: - $ref: '#/components/schemas/BlkioConfig' + $ref: "#/components/schemas/BlkioConfig" build: - $ref: '#/components/schemas/BuildConfig' + $ref: "#/components/schemas/BuildConfig" cap_add: items: type: string type: - - array - - 'null' + - array + - "null" cap_drop: items: type: string type: - - array - - 'null' + - array + - "null" cgroup: type: string cgroup_parent: @@ -5248,14 +6229,14 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" configs: items: - $ref: '#/components/schemas/DockerTypesServiceConfigObjConfig' + $ref: "#/components/schemas/DockerTypesServiceConfigObjConfig" type: - - array - - 'null' + - array + - "null" container_name: type: string cpu_count: @@ -5285,45 +6266,45 @@ components: cpuset: type: string credential_spec: - $ref: '#/components/schemas/CredentialSpecConfig' + $ref: "#/components/schemas/CredentialSpecConfig" depends_on: additionalProperties: - $ref: '#/components/schemas/DockerTypesServiceDependency' + $ref: "#/components/schemas/DockerTypesServiceDependency" type: object deploy: - $ref: '#/components/schemas/DeployConfig' + $ref: "#/components/schemas/DeployConfig" develop: - $ref: '#/components/schemas/DevelopConfig' + $ref: "#/components/schemas/DevelopConfig" device_cgroup_rules: items: type: string type: - - array - - 'null' + - array + - "null" devices: items: - $ref: '#/components/schemas/DockerTypesDeviceMapping' + $ref: "#/components/schemas/DockerTypesDeviceMapping" type: - - array - - 'null' + - array + - "null" dns: items: type: string type: - - array - - 'null' + - array + - "null" dns_opt: items: type: string type: - - array - - 'null' + - array + - "null" dns_search: items: type: string type: - - array - - 'null' + - array + - "null" dockerfile: type: string domainname: @@ -5332,56 +6313,56 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" env_file: items: - $ref: '#/components/schemas/DockerTypesEnvFile' + $ref: "#/components/schemas/DockerTypesEnvFile" type: - - array - - 'null' + - array + - "null" environment: additionalProperties: type: - - string - - 'null' + - string + - "null" type: object expose: items: type: string type: - - array - - 'null' + - array + - "null" extends: - $ref: '#/components/schemas/ExtendsConfig' + $ref: "#/components/schemas/ExtendsConfig" external_links: items: type: string type: - - array - - 'null' + - array + - "null" extra_hosts: additionalProperties: items: type: string type: - - array - - 'null' + - array + - "null" type: object gpus: items: - $ref: '#/components/schemas/DockerTypesDeviceRequest' + $ref: "#/components/schemas/DockerTypesDeviceRequest" type: - - array - - 'null' + - array + - "null" group_add: items: type: string type: - - array - - 'null' + - array + - "null" healthcheck: - $ref: '#/components/schemas/HealthCheckConfig' + $ref: "#/components/schemas/HealthCheckConfig" hostname: type: string image: @@ -5396,8 +6377,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" labels: additionalProperties: type: string @@ -5406,8 +6387,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" log_driver: type: string log_opt: @@ -5415,7 +6396,7 @@ components: type: string type: object logging: - $ref: '#/components/schemas/LoggingConfig' + $ref: "#/components/schemas/LoggingConfig" mac_address: type: string mem_limit: @@ -5432,7 +6413,7 @@ components: type: integer models: additionalProperties: - $ref: '#/components/schemas/ServiceModelConfig' + $ref: "#/components/schemas/ServiceModelConfig" type: object net: type: string @@ -5440,7 +6421,7 @@ components: type: string networks: additionalProperties: - $ref: '#/components/schemas/ServiceNetworkConfig' + $ref: "#/components/schemas/ServiceNetworkConfig" type: object oom_kill_disable: type: boolean @@ -5456,32 +6437,38 @@ components: type: string ports: items: - $ref: '#/components/schemas/DockerTypesServicePortConfig' + $ref: "#/components/schemas/DockerTypesServicePortConfig" type: - - array - - 'null' + - array + - "null" post_start: items: - $ref: '#/components/schemas/DockerTypesServiceHook' + $ref: "#/components/schemas/DockerTypesServiceHook" type: - - array - - 'null' + - array + - "null" + pre_start: + items: + $ref: "#/components/schemas/DockerTypesServiceHook" + type: + - array + - "null" pre_stop: items: - $ref: '#/components/schemas/DockerTypesServiceHook' + $ref: "#/components/schemas/DockerTypesServiceHook" type: - - array - - 'null' + - array + - "null" privileged: type: boolean profiles: items: type: string type: - - array - - 'null' + - array + - "null" provider: - $ref: '#/components/schemas/ServiceProviderConfig' + $ref: "#/components/schemas/ServiceProviderConfig" pull_policy: type: string read_only: @@ -5495,16 +6482,16 @@ components: type: integer secrets: items: - $ref: '#/components/schemas/DockerTypesServiceSecretConfig' + $ref: "#/components/schemas/DockerTypesServiceSecretConfig" type: - - array - - 'null' + - array + - "null" security_opt: items: type: string type: - - array - - 'null' + - array + - "null" shm_size: format: int64 type: integer @@ -5527,13 +6514,13 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" tty: type: boolean ulimits: additionalProperties: - $ref: '#/components/schemas/UlimitsConfig' + $ref: "#/components/schemas/UlimitsConfig" type: object use_api_socket: type: boolean @@ -5547,21 +6534,21 @@ components: type: string volumes: items: - $ref: '#/components/schemas/DockerTypesServiceVolumeConfig' + $ref: "#/components/schemas/DockerTypesServiceVolumeConfig" type: - - array - - 'null' + - array + - "null" volumes_from: items: type: string type: - - array - - 'null' + - array + - "null" working_dir: type: string required: - - command - - entrypoint + - command + - entrypoint type: object DockerTypesServiceConfigObjConfig: additionalProperties: false @@ -5588,7 +6575,7 @@ components: restart: type: boolean required: - - required + - required type: object DockerTypesServiceHook: additionalProperties: false @@ -5597,14 +6584,18 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" environment: additionalProperties: type: - - string - - 'null' + - string + - "null" type: object + image: + type: string + per_replica: + type: boolean privileged: type: boolean user: @@ -5612,7 +6603,7 @@ components: working_dir: type: string required: - - command + - command type: object DockerTypesServicePortConfig: additionalProperties: false @@ -5653,11 +6644,11 @@ components: additionalProperties: false properties: bind: - $ref: '#/components/schemas/ServiceVolumeBind' + $ref: "#/components/schemas/ServiceVolumeBind" consistency: type: string image: - $ref: '#/components/schemas/ServiceVolumeImage' + $ref: "#/components/schemas/ServiceVolumeImage" read_only: type: boolean source: @@ -5665,11 +6656,11 @@ components: target: type: string tmpfs: - $ref: '#/components/schemas/ServiceVolumeTmpfs' + $ref: "#/components/schemas/ServiceVolumeTmpfs" type: type: string volume: - $ref: '#/components/schemas/ServiceVolumeVolume' + $ref: "#/components/schemas/ServiceVolumeVolume" type: object DockerTypesThrottleDevice: additionalProperties: false @@ -5680,8 +6671,8 @@ components: format: int64 type: integer required: - - Path - - Rate + - Path + - Rate type: object DockerTypesTrigger: additionalProperties: false @@ -5689,19 +6680,19 @@ components: action: type: string exec: - $ref: '#/components/schemas/DockerTypesServiceHook' + $ref: "#/components/schemas/DockerTypesServiceHook" ignore: items: type: string type: - - array - - 'null' + - array + - "null" include: items: type: string type: - - array - - 'null' + - array + - "null" initial_sync: type: boolean path: @@ -5709,8 +6700,8 @@ components: target: type: string required: - - path - - action + - path + - action type: object DockerTypesWeightDevice: additionalProperties: false @@ -5722,8 +6713,8 @@ components: minimum: 0 type: integer required: - - Path - - Weight + - Path + - Weight type: object DockerVolumeUsageData: additionalProperties: false @@ -5735,8 +6726,8 @@ components: format: int64 type: integer required: - - RefCount - - Size + - RefCount + - Size type: object DockerinfoInfo: additionalProperties: false @@ -5744,7 +6735,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/DockerinfoInfo.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/DockerinfoInfo.json format: uri readOnly: true type: string @@ -5754,8 +6745,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" CPUSet: type: boolean CPUShares: @@ -5765,9 +6756,9 @@ components: CgroupVersion: type: string Containerd: - $ref: '#/components/schemas/DockerSystemContainerdInfo' + $ref: "#/components/schemas/DockerSystemContainerdInfo" ContainerdCommit: - $ref: '#/components/schemas/DockerSystemCommit' + $ref: "#/components/schemas/DockerSystemCommit" Containers: format: int64 type: integer @@ -5788,18 +6779,18 @@ components: type: boolean DefaultAddressPools: items: - $ref: '#/components/schemas/DockerSystemNetworkAddressPool' + $ref: "#/components/schemas/DockerSystemNetworkAddressPool" type: - - array - - 'null' + - array + - "null" DefaultRuntime: type: string DiscoveredDevices: items: - $ref: '#/components/schemas/DockerSystemDeviceInfo' + $ref: "#/components/schemas/DockerSystemDeviceInfo" type: - - array - - 'null' + - array + - "null" DockerRootDir: type: string Driver: @@ -5811,21 +6802,21 @@ components: maxItems: 2 minItems: 2 type: - - array - - 'null' + - array + - "null" type: - - array - - 'null' + - array + - "null" ExperimentalBuild: type: boolean FirewallBackend: - $ref: '#/components/schemas/DockerSystemFirewallInfo' + $ref: "#/components/schemas/DockerSystemFirewallInfo" GenericResources: items: - $ref: '#/components/schemas/DockerSwarmGenericResource' + $ref: "#/components/schemas/DockerSwarmGenericResource" type: - - array - - 'null' + - array + - "null" HttpProxy: type: string HttpsProxy: @@ -5842,7 +6833,7 @@ components: InitBinary: type: string InitCommit: - $ref: '#/components/schemas/DockerSystemCommit' + $ref: "#/components/schemas/DockerSystemCommit" Isolation: type: string KernelVersion: @@ -5851,8 +6842,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" LiveRestoreEnabled: type: boolean LoggingDriver: @@ -5875,7 +6866,7 @@ components: format: int64 type: integer NRI: - $ref: '#/components/schemas/DockerSystemNRIInfo' + $ref: "#/components/schemas/DockerSystemNRIInfo" Name: type: string NoProxy: @@ -5891,29 +6882,29 @@ components: PidsLimit: type: boolean Plugins: - $ref: '#/components/schemas/DockerSystemPluginsInfo' + $ref: "#/components/schemas/DockerSystemPluginsInfo" ProductLicense: type: string RegistryConfig: - $ref: '#/components/schemas/DockerRegistryServiceConfig' + $ref: "#/components/schemas/DockerRegistryServiceConfig" RuncCommit: - $ref: '#/components/schemas/DockerSystemCommit' + $ref: "#/components/schemas/DockerSystemCommit" Runtimes: additionalProperties: - $ref: '#/components/schemas/DockerSystemRuntimeWithStatus' + $ref: "#/components/schemas/DockerSystemRuntimeWithStatus" type: object SecurityOptions: items: type: string type: - - array - - 'null' + - array + - "null" ServerVersion: type: string SwapLimit: type: boolean Swarm: - $ref: '#/components/schemas/DockerSwarmInfo' + $ref: "#/components/schemas/DockerSwarmInfo" SystemStatus: items: items: @@ -5921,19 +6912,19 @@ components: maxItems: 2 minItems: 2 type: - - array - - 'null' + - array + - "null" type: - - array - - 'null' + - array + - "null" SystemTime: type: string Warnings: items: type: string type: - - array - - 'null' + - array + - "null" apiVersion: type: string arch: @@ -5949,68 +6940,68 @@ components: success: type: boolean required: - - success - - apiVersion - - gitCommit - - goVersion - - os - - arch - - buildTime - - ID - - Containers - - ContainersRunning - - ContainersPaused - - ContainersStopped - - Images - - Driver - - DriverStatus - - Plugins - - MemoryLimit - - SwapLimit - - CpuCfsPeriod - - CpuCfsQuota - - CPUShares - - CPUSet - - PidsLimit - - IPv4Forwarding - - Debug - - NFd - - OomKillDisable - - NGoroutines - - SystemTime - - LoggingDriver - - CgroupDriver - - NEventsListener - - KernelVersion - - OperatingSystem - - OSVersion - - OSType - - Architecture - - IndexServerAddress - - RegistryConfig - - NCPU - - MemTotal - - GenericResources - - DockerRootDir - - HttpProxy - - HttpsProxy - - NoProxy - - Name - - Labels - - ExperimentalBuild - - ServerVersion - - Runtimes - - DefaultRuntime - - Swarm - - LiveRestoreEnabled - - Isolation - - InitBinary - - ContainerdCommit - - RuncCommit - - InitCommit - - SecurityOptions - - CDISpecDirs - - Warnings + - success + - apiVersion + - gitCommit + - goVersion + - os + - arch + - buildTime + - ID + - Containers + - ContainersRunning + - ContainersPaused + - ContainersStopped + - Images + - Driver + - DriverStatus + - Plugins + - MemoryLimit + - SwapLimit + - CpuCfsPeriod + - CpuCfsQuota + - CPUShares + - CPUSet + - PidsLimit + - IPv4Forwarding + - Debug + - NFd + - OomKillDisable + - NGoroutines + - SystemTime + - LoggingDriver + - CgroupDriver + - NEventsListener + - KernelVersion + - OperatingSystem + - OSVersion + - OSType + - Architecture + - IndexServerAddress + - RegistryConfig + - NCPU + - MemTotal + - GenericResources + - DockerRootDir + - HttpProxy + - HttpsProxy + - NoProxy + - Name + - Labels + - ExperimentalBuild + - ServerVersion + - Runtimes + - DefaultRuntime + - Swarm + - LiveRestoreEnabled + - Isolation + - InitBinary + - ContainerdCommit + - RuncCommit + - InitCommit + - SecurityOptions + - CDISpecDirs + - Warnings type: object EnvSummary: additionalProperties: false @@ -6018,18 +7009,18 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvSummary.json format: uri readOnly: true type: string variables: items: - $ref: '#/components/schemas/EnvVariable' + $ref: "#/components/schemas/EnvVariable" type: - - array - - 'null' + - array + - "null" required: - - variables + - variables type: object EnvVariable: additionalProperties: false @@ -6039,8 +7030,8 @@ components: value: type: string required: - - key - - value + - key + - value type: object EnvironmentAgentPairRequest: additionalProperties: false @@ -6048,7 +7039,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentAgentPairRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentAgentPairRequest.json format: uri readOnly: true type: string @@ -6061,7 +7052,7 @@ components: token: type: string required: - - token + - token type: object EnvironmentCreate: additionalProperties: false @@ -6069,7 +7060,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentCreate.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentCreate.json format: uri readOnly: true type: string @@ -6077,8 +7068,6 @@ components: type: string apiUrl: type: string - bootstrapToken: - type: string enabled: type: boolean isEdge: @@ -6088,7 +7077,26 @@ components: useApiKey: type: boolean required: - - apiUrl + - apiUrl + type: object + EnvironmentEdgeMTLSCertificate: + additionalProperties: false + properties: + commonName: + type: string + daysRemaining: + format: int64 + type: integer + expired: + type: boolean + expiresAt: + format: date-time + type: string + expiringSoon: + type: boolean + required: + - expired + - expiringSoon type: object EnvironmentEnvironment: additionalProperties: false @@ -6102,6 +7110,20 @@ components: connectedAt: format: date-time type: string + edgeAgentInstance: + type: string + edgeCapabilities: + items: + type: string + type: + - array + - "null" + edgeMTLSCertificate: + $ref: "#/components/schemas/EnvironmentEdgeMTLSCertificate" + edgeSecurityMode: + type: string + edgeSessionId: + type: string edgeTransport: type: string enabled: @@ -6110,22 +7132,27 @@ components: type: string isEdge: type: boolean + lastEdgeTransport: + type: string lastHeartbeat: format: date-time type: string lastPollAt: format: date-time type: string + lastSeen: + format: date-time + type: string name: type: string status: type: string required: - - id - - apiUrl - - status - - enabled - - isEdge + - id + - apiUrl + - status + - enabled + - isEdge type: object EnvironmentPaginatedResponse: additionalProperties: false @@ -6133,24 +7160,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentPaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/EnvironmentEnvironment' + $ref: "#/components/schemas/EnvironmentEnvironment" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object EnvironmentTest: additionalProperties: false @@ -6160,7 +7187,7 @@ components: status: type: string required: - - status + - status type: object EnvironmentTestConnectionRequest: additionalProperties: false @@ -6168,7 +7195,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentTestConnectionRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentTestConnectionRequest.json format: uri readOnly: true type: string @@ -6181,7 +7208,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentUpdate.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/EnvironmentUpdate.json format: uri readOnly: true type: string @@ -6189,8 +7216,6 @@ components: type: string apiUrl: type: string - bootstrapToken: - type: string enabled: type: boolean name: @@ -6198,6 +7223,70 @@ components: regenerateApiKey: type: boolean type: object + EnvironmentUpdateJob: + additionalProperties: false + properties: + completedAt: + format: date-time + type: string + createdAt: + format: date-time + type: string + error: + type: string + id: + type: string + managerDigestAtStart: + type: string + managerTargetVersion: + type: string + managerVersionAtStart: + type: string + results: + items: + $ref: "#/components/schemas/EnvironmentUpdateResult" + type: + - array + - "null" + status: + type: string + updatedAt: + format: date-time + type: string + userId: + type: string + username: + type: string + required: + - status + - userId + - username + - managerVersionAtStart + - managerDigestAtStart + - managerTargetVersion + - id + - createdAt + type: object + EnvironmentUpdateResult: + additionalProperties: false + properties: + environmentId: + type: string + environmentName: + type: string + error: + type: string + fromVersion: + type: string + status: + type: string + toVersion: + type: string + required: + - environmentId + - environmentName + - status + type: object EnvironmentWithApiKey: additionalProperties: false properties: @@ -6211,6 +7300,20 @@ components: connectedAt: format: date-time type: string + edgeAgentInstance: + type: string + edgeCapabilities: + items: + type: string + type: + - array + - "null" + edgeMTLSCertificate: + $ref: "#/components/schemas/EnvironmentEdgeMTLSCertificate" + edgeSecurityMode: + type: string + edgeSessionId: + type: string edgeTransport: type: string enabled: @@ -6219,22 +7322,27 @@ components: type: string isEdge: type: boolean + lastEdgeTransport: + type: string lastHeartbeat: format: date-time type: string lastPollAt: format: date-time type: string + lastSeen: + format: date-time + type: string name: type: string status: type: string required: - - id - - apiUrl - - status - - enabled - - isEdge + - id + - apiUrl + - status + - enabled + - isEdge type: object ErrorDetail: additionalProperties: false @@ -6254,64 +7362,59 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ErrorModel.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ErrorModel.json format: uri readOnly: true type: string detail: - description: A human-readable explanation specific to this occurrence of - the problem. + description: A human-readable explanation specific to this occurrence of the problem. examples: - - Property foo is required but is missing. + - Property foo is required but is missing. type: string errors: description: Optional list of individual error details items: - $ref: '#/components/schemas/ErrorDetail' + $ref: "#/components/schemas/ErrorDetail" type: - - array - - 'null' + - array + - "null" instance: - description: A URI reference that identifies the specific occurrence of - the problem. + description: A URI reference that identifies the specific occurrence of the problem. examples: - - https://example.com/error-log/abc123 + - https://example.com/error-log/abc123 format: uri type: string status: description: HTTP status code examples: - - 400 + - 400 format: int64 type: integer title: - description: A short, human-readable summary of the problem type. This value - should not change between occurrences of the error. + description: A short, human-readable summary of the problem type. This value should not change between occurrences of the error. examples: - - Bad Request + - Bad Request type: string type: default: about:blank description: A URI reference to human-readable documentation for the error. examples: - - https://example.com/errors/example + - https://example.com/errors/example format: uri type: string type: object - EventCreateEvent: + EventEvent: additionalProperties: false properties: - $schema: - description: A URL to the JSON Schema for this object. - examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/EventCreateEvent.json - format: uri - readOnly: true + createdAt: + format: date-time type: string description: type: string environmentId: type: string + id: + type: string metadata: additionalProperties: {} type: object @@ -6323,95 +7426,286 @@ components: type: string severity: type: string + timestamp: + format: date-time + type: string title: type: string type: type: string + updatedAt: + format: date-time + type: string userId: type: string username: type: string required: - - type - - title + - id + - type + - severity + - title + - timestamp + - createdAt type: object - EventEvent: + EventPaginatedResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/EventPaginatedResponse.json + format: uri + readOnly: true + type: string + data: + items: + $ref: "#/components/schemas/EventEvent" + type: + - array + - "null" + pagination: + $ref: "#/components/schemas/BasePaginationResponse" + success: + type: boolean + required: + - success + - data + - pagination + type: object + ExtendsConfig: + additionalProperties: false + properties: + file: + type: string + service: + type: string + type: object + FederatedCreateFederatedCredential: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/FederatedCreateFederatedCredential.json + format: uri + readOnly: true + type: string + audiences: + description: Allowed external token audiences + items: + type: string + minItems: 1 + type: + - array + - "null" + description: + description: Optional description + maxLength: 1000 + type: string + enabled: + description: Whether exchanges are allowed + type: boolean + environmentId: + description: Optional environment scope for the role assignment + type: string + expiresAt: + description: Optional credential expiration + format: date-time + type: string + issuerUrl: + description: Trusted external OIDC issuer URL + format: uri + minLength: 1 + type: string + matchType: + description: Subject match strategy + enum: + - exact + - glob + type: string + name: + description: Display name + maxLength: 255 + minLength: 1 + type: string + roleId: + description: Mapped role ID + minLength: 1 + type: string + subjectClaim: + description: Claim path to match against; defaults to sub + type: string + subjectMatch: + description: Exact subject or anchored glob pattern + minLength: 1 + type: string + tokenTtlSeconds: + description: Issued token lifetime in seconds + format: int64 + maximum: 3600 + minimum: 60 + type: integer + required: + - name + - enabled + - issuerUrl + - audiences + - subjectMatch + - roleId + type: object + FederatedFederatedCredential: additionalProperties: false properties: + audiences: + description: Allowed external token audiences + items: + type: string + type: + - array + - "null" createdAt: + description: Creation timestamp format: date-time type: string description: + description: Optional description type: string + enabled: + description: Whether exchanges are allowed + type: boolean environmentId: + description: Optional environment scope for the role assignment type: string - id: + environmentName: + description: Mapped environment name when scoped type: string - metadata: - additionalProperties: {} - type: object - resourceId: + expiresAt: + description: Optional credential expiration + format: date-time type: string - resourceName: + id: + description: Unique identifier of the federated credential type: string - resourceType: + identityUserId: + description: Dedicated service user ID backing issued tokens type: string - severity: + issuerUrl: + description: Trusted external OIDC issuer URL type: string - timestamp: + lastUsedAt: + description: Last successful token exchange format: date-time type: string - title: + matchType: + description: Subject match strategy + enum: + - exact + - glob type: string - type: + name: + description: Display name type: string - updatedAt: - format: date-time + roleId: + description: Mapped role ID type: string - userId: + roleName: + description: Mapped role name type: string - username: + serviceUsername: + description: Dedicated service account username + type: string + subjectClaim: + description: Claim path to match against + type: string + subjectMatch: + description: Exact subject or anchored glob pattern + type: string + tokenTtlSeconds: + description: Issued token lifetime in seconds + format: int64 + type: integer + updatedAt: + description: Last update timestamp + format: date-time type: string required: - - id - - type - - severity - - title - - timestamp - - createdAt + - id + - name + - enabled + - issuerUrl + - audiences + - subjectClaim + - subjectMatch + - matchType + - roleId + - identityUserId + - tokenTtlSeconds + - createdAt type: object - EventPaginatedResponse: + FederatedUpdateFederatedCredential: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/EventPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/FederatedUpdateFederatedCredential.json format: uri readOnly: true type: string - data: + audiences: + description: Allowed external token audiences items: - $ref: '#/components/schemas/EventEvent' + type: string + minItems: 1 type: - - array - - 'null' - pagination: - $ref: '#/components/schemas/BasePaginationResponse' - success: + - array + - "null" + description: + description: Optional description + maxLength: 1000 + type: string + enabled: + description: Whether exchanges are allowed type: boolean - required: - - success - - data - - pagination - type: object - ExtendsConfig: - additionalProperties: false - properties: - file: + environmentId: + description: Optional environment scope for the role assignment type: string - service: + expiresAt: + description: Optional credential expiration + format: date-time + type: string + issuerUrl: + description: Trusted external OIDC issuer URL + format: uri + type: string + matchType: + description: Subject match strategy + enum: + - exact + - glob + type: string + name: + description: Display name + maxLength: 255 + type: string + roleId: + description: Mapped role ID + minLength: 1 + type: string + subjectClaim: + description: Claim path to match against + type: string + subjectMatch: + description: Exact subject or anchored glob pattern + minLength: 1 type: string + tokenTtlSeconds: + description: Issued token lifetime in seconds + format: int64 + maximum: 3600 + minimum: 60 + type: integer type: object FileContentResponse: additionalProperties: false @@ -6422,8 +7716,8 @@ components: mimeType: type: string required: - - content - - mimeType + - content + - mimeType type: object GetSwarmNodeAgentDeploymentInputBody: additionalProperties: false @@ -6431,7 +7725,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/GetSwarmNodeAgentDeploymentInputBody.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/GetSwarmNodeAgentDeploymentInputBody.json format: uri readOnly: true type: string @@ -6445,27 +7739,27 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/GitOpsSyncPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/GitOpsSyncPaginatedResponse.json format: uri readOnly: true type: string counts: - $ref: '#/components/schemas/GitopsSyncCounts' + $ref: "#/components/schemas/GitopsSyncCounts" data: items: - $ref: '#/components/schemas/GitopsGitOpsSync' + $ref: "#/components/schemas/GitopsGitOpsSync" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - counts - - pagination + - success + - data + - counts + - pagination type: object GitRepositoryPaginatedResponse: additionalProperties: false @@ -6473,24 +7767,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/GitRepositoryPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/GitRepositoryPaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/GitopsGitRepository' + $ref: "#/components/schemas/GitopsGitRepository" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object GitopsBranchInfo: additionalProperties: false @@ -6500,35 +7794,35 @@ components: name: type: string required: - - name - - isDefault + - name + - isDefault type: object GitopsBranchesResponse: additionalProperties: false properties: branches: items: - $ref: '#/components/schemas/GitopsBranchInfo' + $ref: "#/components/schemas/GitopsBranchInfo" type: - - array - - 'null' + - array + - "null" required: - - branches + - branches type: object GitopsBrowseResponse: additionalProperties: false properties: files: items: - $ref: '#/components/schemas/GitopsFileTreeNode' + $ref: "#/components/schemas/GitopsFileTreeNode" type: - - array - - 'null' + - array + - "null" path: type: string required: - - path - - files + - path + - files type: object GitopsCreateSyncRequest: additionalProperties: false @@ -6536,7 +7830,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsCreateSyncRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsCreateSyncRequest.json format: uri readOnly: true type: string @@ -6557,6 +7851,19 @@ components: type: integer name: type: string + preDeployEnv: + type: string + preDeployExtraMounts: + type: string + preDeployNetworkMode: + type: string + preDeployRunnerImage: + type: string + preDeployScriptPath: + type: string + preDeployTimeoutSec: + format: int64 + type: integer projectName: type: string repositoryId: @@ -6566,21 +7873,23 @@ components: syncInterval: format: int64 type: integer + targetType: + type: string required: - - name - - repositoryId - - branch - - composePath + - name + - repositoryId + - branch + - composePath type: object GitopsFileTreeNode: additionalProperties: false properties: children: items: - $ref: '#/components/schemas/GitopsFileTreeNode' + $ref: "#/components/schemas/GitopsFileTreeNode" type: - - array - - 'null' + - array + - "null" name: type: string path: @@ -6591,9 +7900,9 @@ components: type: type: string required: - - name - - path - - type + - name + - path + - type type: object GitopsGitOpsSync: additionalProperties: false @@ -6631,12 +7940,32 @@ components: type: integer name: type: string + preDeployEnv: + type: string + preDeployExtraMounts: + type: string + preDeployLastRunAt: + format: date-time + type: string + preDeployLastRunOutput: + type: string + preDeployLastRunStatus: + type: string + preDeployNetworkMode: + type: string + preDeployRunnerImage: + type: string + preDeployScriptPath: + type: string + preDeployTimeoutSec: + format: int64 + type: integer projectId: type: string projectName: type: string repository: - $ref: '#/components/schemas/GitopsGitRepository' + $ref: "#/components/schemas/GitopsGitRepository" repositoryId: type: string syncDirectory: @@ -6646,25 +7975,30 @@ components: type: integer syncedFiles: type: string + targetType: + type: string updatedAt: format: date-time type: string required: - - id - - name - - environmentId - - repositoryId - - branch - - composePath - - projectName - - autoSync - - syncInterval - - syncDirectory - - maxSyncFiles - - maxSyncTotalSize - - maxSyncBinarySize - - createdAt - - updatedAt + - id + - name + - environmentId + - repositoryId + - branch + - composePath + - targetType + - projectName + - autoSync + - syncInterval + - syncDirectory + - maxSyncFiles + - maxSyncTotalSize + - maxSyncBinarySize + - preDeployTimeoutSec + - preDeployNetworkMode + - createdAt + - updatedAt type: object GitopsGitRepository: additionalProperties: false @@ -6692,13 +8026,13 @@ components: username: type: string required: - - id - - name - - url - - authType - - enabled - - createdAt - - updatedAt + - id + - name + - url + - authType + - enabled + - createdAt + - updatedAt type: object GitopsImportGitOpsSyncRequest: additionalProperties: false @@ -6728,12 +8062,12 @@ components: syncName: type: string required: - - syncName - - gitRepo - - branch - - dockerComposePath - - autoSync - - syncInterval + - syncName + - gitRepo + - branch + - dockerComposePath + - autoSync + - syncInterval type: object GitopsImportGitOpsSyncResponse: additionalProperties: false @@ -6742,8 +8076,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" failedCount: format: int64 type: integer @@ -6751,9 +8085,9 @@ components: format: int64 type: integer required: - - successCount - - failedCount - - errors + - successCount + - failedCount + - errors type: object GitopsRepositorySync: additionalProperties: false @@ -6785,13 +8119,13 @@ components: username: type: string required: - - id - - name - - url - - authType - - enabled - - createdAt - - updatedAt + - id + - name + - url + - authType + - enabled + - createdAt + - updatedAt type: object GitopsRepositorySyncRequest: additionalProperties: false @@ -6799,18 +8133,18 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsRepositorySyncRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsRepositorySyncRequest.json format: uri readOnly: true type: string repositories: items: - $ref: '#/components/schemas/GitopsRepositorySync' + $ref: "#/components/schemas/GitopsRepositorySync" type: - - array - - 'null' + - array + - "null" required: - - repositories + - repositories type: object GitopsSyncCounts: additionalProperties: false @@ -6825,9 +8159,9 @@ components: format: int64 type: integer required: - - totalSyncs - - activeSyncs - - successfulSyncs + - totalSyncs + - activeSyncs + - successfulSyncs type: object GitopsSyncResult: additionalProperties: false @@ -6842,9 +8176,9 @@ components: format: date-time type: string required: - - success - - message - - syncedAt + - success + - message + - syncedAt type: object GitopsSyncStatus: additionalProperties: false @@ -6866,8 +8200,8 @@ components: format: date-time type: string required: - - id - - autoSync + - id + - autoSync type: object GitopsUpdateSyncRequest: additionalProperties: false @@ -6875,7 +8209,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsUpdateSyncRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsUpdateSyncRequest.json format: uri readOnly: true type: string @@ -6896,6 +8230,19 @@ components: type: integer name: type: string + preDeployEnv: + type: string + preDeployExtraMounts: + type: string + preDeployNetworkMode: + type: string + preDeployRunnerImage: + type: string + preDeployScriptPath: + type: string + preDeployTimeoutSec: + format: int64 + type: integer projectName: type: string repositoryId: @@ -6905,6 +8252,8 @@ components: syncInterval: format: int64 type: integer + targetType: + type: string type: object HealthCheckConfig: additionalProperties: false @@ -6928,8 +8277,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" timeout: format: int64 type: integer @@ -6953,36 +8302,101 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" Timeout: format: int64 type: integer type: object - ImageBuildPaginatedResponse: + ImageAttestation: additionalProperties: false properties: - $schema: - description: A URL to the JSON Schema for this object. - examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageBuildPaginatedResponse.json - format: uri + artifactType: + type: string + digest: + type: string + mediaType: + type: string + platform: + type: string + predicateType: + type: string + size: + format: int64 + type: integer + statement: {} + statementType: + type: string + subject: + items: + $ref: "#/components/schemas/ImageAttestationSubject" + type: + - array + - "null" + required: + - digest + - mediaType + - predicateType + - subject + - size + type: object + ImageAttestationList: + additionalProperties: false + properties: + attestations: + items: + $ref: "#/components/schemas/ImageAttestation" + type: + - array + - "null" + imageRef: + type: string + platform: + type: string + subjectDigest: + type: string + required: + - imageRef + - subjectDigest + - attestations + type: object + ImageAttestationSubject: + additionalProperties: false + properties: + digest: + additionalProperties: + type: string + type: object + name: + type: string + required: + - name + - digest + type: object + ImageBuildPaginatedResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageBuildPaginatedResponse.json + format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/ImageBuildRecord' + $ref: "#/components/schemas/ImageBuildRecord" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object ImageBuildRecord: additionalProperties: false @@ -6995,14 +8409,14 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" cacheTo: items: type: string type: - - array - - 'null' + - array + - "null" completedAt: format: date-time type: string @@ -7022,8 +8436,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" environmentId: type: string errorMessage: @@ -7032,8 +8446,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" id: type: string isolation: @@ -7056,8 +8470,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" privileged: type: boolean provider: @@ -7075,8 +8489,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" target: type: string ulimits: @@ -7088,128 +8502,17 @@ components: username: type: string required: - - id - - environmentId - - status - - contextDir - - noCache - - pull - - privileged - - push - - load - - outputTruncated - - createdAt - type: object - ImageBuildRequest: - additionalProperties: false - properties: - $schema: - description: A URL to the JSON Schema for this object. - examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageBuildRequest.json - format: uri - readOnly: true - type: string - buildArgs: - additionalProperties: - type: string - description: Build arguments - type: object - cacheFrom: - description: Build cache sources - items: - type: string - type: - - array - - 'null' - cacheTo: - description: Build cache targets - items: - type: string - type: - - array - - 'null' - contextDir: - description: Build context directory or Git URL - minLength: 1 - type: string - dockerfile: - description: Dockerfile path - type: string - dockerfileInline: - description: Inline Dockerfile content - type: string - entitlements: - description: Build entitlements - items: - type: string - type: - - array - - 'null' - extraHosts: - description: Build extra host mappings - items: - type: string - type: - - array - - 'null' - isolation: - description: Build isolation mode - type: string - labels: - additionalProperties: - type: string - description: Build labels - type: object - load: - description: Load image into local Docker - type: boolean - network: - description: Build network mode - type: string - noCache: - description: Disable build cache - type: boolean - platforms: - description: Target platforms - items: - type: string - type: - - array - - 'null' - privileged: - description: Enable privileged build - type: boolean - provider: - description: Build provider override - type: string - pull: - description: Always pull referenced base images - type: boolean - push: - description: Push image - type: boolean - shmSize: - description: Build shared memory size in bytes - format: int64 - type: integer - tags: - description: Image tags - items: - type: string - type: - - array - - 'null' - target: - description: Target stage - type: string - ulimits: - additionalProperties: - type: string - description: Build ulimits - type: object - required: - - contextDir + - id + - environmentId + - status + - contextDir + - noCache + - pull + - privileged + - push + - load + - outputTruncated + - createdAt type: object ImageDetailSummary: additionalProperties: false @@ -7221,51 +8524,80 @@ components: comment: type: string config: - $ref: '#/components/schemas/DetailSummaryConfigStruct' + $ref: "#/components/schemas/DetailSummaryConfigStruct" created: type: string descriptor: - $ref: '#/components/schemas/DetailSummaryDescriptorStruct' + $ref: "#/components/schemas/DetailSummaryDescriptorStruct" graphDriver: - $ref: '#/components/schemas/DetailSummaryGraphDriverStruct' + $ref: "#/components/schemas/DetailSummaryGraphDriverStruct" id: type: string metadata: - $ref: '#/components/schemas/DetailSummaryMetadataStruct' + $ref: "#/components/schemas/DetailSummaryMetadataStruct" os: type: string repoDigests: items: type: string type: - - array - - 'null' + - array + - "null" repoTags: items: type: string type: - - array - - 'null' + - array + - "null" rootFs: - $ref: '#/components/schemas/DetailSummaryRootFsStruct' + $ref: "#/components/schemas/DetailSummaryRootFsStruct" + size: + format: int64 + type: integer + required: + - id + - repoTags + - repoDigests + - comment + - created + - author + - config + - architecture + - os + - size + - graphDriver + - rootFs + - metadata + - descriptor + type: object + ImageHistoryItem: + additionalProperties: false + properties: + comment: + type: string + created: + format: int64 + type: integer + createdBy: + type: string + id: + type: string size: format: int64 type: integer + tags: + items: + type: string + type: + - array + - "null" required: - - id - - repoTags - - repoDigests - - comment - - created - - author - - config - - architecture - - os - - size - - graphDriver - - rootFs - - metadata - - descriptor + - id + - created + - createdBy + - tags + - size + - comment type: object ImageLoadResult: additionalProperties: false @@ -7273,7 +8605,7 @@ components: stream: type: string required: - - stream + - stream type: object ImagePaginatedResponse: additionalProperties: false @@ -7281,24 +8613,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ImagePaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ImagePaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/ImageSummary' + $ref: "#/components/schemas/ImageSummary" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object ImagePruneReport: additionalProperties: false @@ -7307,14 +8639,14 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" spaceReclaimed: format: int64 type: integer required: - - imagesDeleted - - spaceReclaimed + - imagesDeleted + - spaceReclaimed type: object ImagePullOptions: additionalProperties: false @@ -7322,18 +8654,18 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ImagePullOptions.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ImagePullOptions.json format: uri readOnly: true type: string auth: - $ref: '#/components/schemas/ContainerregistryCredential' + $ref: "#/components/schemas/ContainerregistryCredential" credentials: items: - $ref: '#/components/schemas/ContainerregistryCredential' + $ref: "#/components/schemas/ContainerregistryCredential" type: - - array - - 'null' + - array + - "null" imageName: description: Name of the image to pull (e.g., nginx) minLength: 1 @@ -7342,7 +8674,28 @@ components: description: Tag of the image to pull (e.g., latest) type: string required: - - imageName + - imageName + type: object + ImageSearchResult: + additionalProperties: false + properties: + automated: + type: boolean + description: + type: string + name: + type: string + official: + type: boolean + starCount: + format: int64 + type: integer + required: + - name + - description + - starCount + - official + - automated type: object ImageSummary: additionalProperties: false @@ -7363,43 +8716,62 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" repoTags: items: type: string type: - - array - - 'null' + - array + - "null" size: format: int64 type: integer tag: type: string updateInfo: - $ref: '#/components/schemas/ImageUpdateInfo' + $ref: "#/components/schemas/ImageUpdateInfo" usedBy: items: - $ref: '#/components/schemas/ImageUsedBy' + $ref: "#/components/schemas/ImageUsedBy" type: - - array - - 'null' + - array + - "null" virtualSize: format: int64 type: integer vulnerabilityScan: - $ref: '#/components/schemas/VulnerabilityScanSummary' - required: - - id - - repoTags - - repoDigests - - created - - size - - virtualSize - - labels - - inUse - - repo - - tag + $ref: "#/components/schemas/VulnerabilityScanSummary" + required: + - id + - repoTags + - repoDigests + - created + - size + - virtualSize + - labels + - inUse + - repo + - tag + type: object + ImageTagRequest: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageTagRequest.json + format: uri + readOnly: true + type: string + repository: + description: Target repository name + type: string + tag: + description: Target tag + type: string + required: + - repository type: object ImageUpdateInfo: additionalProperties: false @@ -7433,15 +8805,15 @@ components: usedCredential: type: boolean required: - - hasUpdate - - updateType - - currentVersion - - latestVersion - - currentDigest - - latestDigest - - checkTime - - responseTimeMs - - error + - hasUpdate + - updateType + - currentVersion + - latestVersion + - currentDigest + - latestDigest + - checkTime + - responseTimeMs + - error type: object ImageUsageCounts: additionalProperties: false @@ -7459,10 +8831,10 @@ components: format: int64 type: integer required: - - imagesInuse - - imagesUnused - - totalImages - - totalImageSize + - imagesInuse + - imagesUnused + - totalImages + - totalImageSize type: object ImageUsageCountsResponse: additionalProperties: false @@ -7470,17 +8842,17 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageUsageCountsResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageUsageCountsResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/ImageUsageCounts' + $ref: "#/components/schemas/ImageUsageCounts" success: type: boolean required: - - success - - data + - success + - data type: object ImageUsedBy: additionalProperties: false @@ -7492,8 +8864,8 @@ components: type: type: string required: - - type - - name + - type + - name type: object ImageupdateBatchImageUpdateRequest: additionalProperties: false @@ -7501,24 +8873,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageupdateBatchImageUpdateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageupdateBatchImageUpdateRequest.json format: uri readOnly: true type: string credentials: items: - $ref: '#/components/schemas/ContainerregistryCredential' + $ref: "#/components/schemas/ContainerregistryCredential" type: - - array - - 'null' + - array + - "null" imageRefs: items: type: string type: - - array - - 'null' + - array + - "null" required: - - imageRefs + - imageRefs type: object ImageupdateCheckAllImagesRequest: additionalProperties: false @@ -7526,20 +8898,22 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageupdateCheckAllImagesRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ImageupdateCheckAllImagesRequest.json format: uri readOnly: true type: string credentials: items: - $ref: '#/components/schemas/ContainerregistryCredential' + $ref: "#/components/schemas/ContainerregistryCredential" type: - - array - - 'null' + - array + - "null" type: object ImageupdateResponse: additionalProperties: false properties: + activityId: + type: string authMethod: type: string authRegistry: @@ -7569,11 +8943,11 @@ components: usedCredential: type: boolean required: - - hasUpdate - - updateType - - currentVersion - - checkTime - - responseTimeMs + - hasUpdate + - updateType + - currentVersion + - checkTime + - responseTimeMs type: object ImageupdateSummary: additionalProperties: false @@ -7591,10 +8965,10 @@ components: format: int64 type: integer required: - - totalImages - - imagesWithUpdates - - digestUpdates - - errorsCount + - totalImages + - imagesWithUpdates + - digestUpdates + - errorsCount type: object JobscheduleConfig: additionalProperties: false @@ -7602,7 +8976,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleConfig.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleConfig.json format: uri readOnly: true type: string @@ -7610,11 +8984,13 @@ components: type: string autoUpdateInterval: type: string + dockerClientRefreshInterval: + type: string environmentHealthInterval: type: string eventCleanupInterval: type: string - gitopsSyncInterval: + expiredSessionsCleanupInterval: type: string pollingInterval: type: string @@ -7623,14 +8999,15 @@ components: vulnerabilityScanInterval: type: string required: - - environmentHealthInterval - - eventCleanupInterval - - autoUpdateInterval - - pollingInterval - - scheduledPruneInterval - - gitopsSyncInterval - - vulnerabilityScanInterval - - autoHealInterval + - environmentHealthInterval + - eventCleanupInterval + - expiredSessionsCleanupInterval + - autoUpdateInterval + - dockerClientRefreshInterval + - pollingInterval + - scheduledPruneInterval + - vulnerabilityScanInterval + - autoHealInterval type: object JobscheduleJobListResponse: additionalProperties: false @@ -7638,7 +9015,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleJobListResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleJobListResponse.json format: uri readOnly: true type: string @@ -7646,13 +9023,13 @@ components: type: boolean jobs: items: - $ref: '#/components/schemas/JobscheduleJobStatus' + $ref: "#/components/schemas/JobscheduleJobStatus" type: - - array - - 'null' + - array + - "null" required: - - jobs - - isAgent + - jobs + - isAgent type: object JobscheduleJobPrerequisite: additionalProperties: false @@ -7666,9 +9043,9 @@ components: settingsUrl: type: string required: - - settingKey - - label - - isMet + - settingKey + - label + - isMet type: object JobscheduleJobRunResponse: additionalProperties: false @@ -7676,7 +9053,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleJobRunResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleJobRunResponse.json format: uri readOnly: true type: string @@ -7685,8 +9062,8 @@ components: success: type: boolean required: - - success - - message + - success + - message type: object JobscheduleJobStatus: additionalProperties: false @@ -7712,25 +9089,25 @@ components: type: string prerequisites: items: - $ref: '#/components/schemas/JobscheduleJobPrerequisite' + $ref: "#/components/schemas/JobscheduleJobPrerequisite" type: - - array - - 'null' + - array + - "null" schedule: type: string settingsKey: type: string required: - - id - - name - - description - - category - - schedule - - enabled - - managerOnly - - isContinuous - - canRunManually - - prerequisites + - id + - name + - description + - category + - schedule + - enabled + - managerOnly + - isContinuous + - canRunManually + - prerequisites type: object JobscheduleUpdate: additionalProperties: false @@ -7738,7 +9115,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleUpdate.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/JobscheduleUpdate.json format: uri readOnly: true type: string @@ -7746,11 +9123,13 @@ components: type: string autoUpdateInterval: type: string + dockerClientRefreshInterval: + type: string environmentHealthInterval: type: string eventCleanupInterval: type: string - gitopsSyncInterval: + expiredSessionsCleanupInterval: type: string pollingInterval: type: string @@ -7759,6 +9138,28 @@ components: vulnerabilityScanInterval: type: string type: object + ListOidcRoleMappingsOutputBody: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/ListOidcRoleMappingsOutputBody.json + format: uri + readOnly: true + type: string + data: + items: + $ref: "#/components/schemas/RoleOidcRoleMapping" + type: + - array + - "null" + success: + type: boolean + required: + - success + - data + type: object LoggingConfig: additionalProperties: false properties: @@ -7780,16 +9181,16 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" label: type: string type: type: string required: - - key - - label - - type + - key + - label + - type type: object MetaTemplateMeta: additionalProperties: false @@ -7808,8 +9209,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" updatedAt: type: string version: @@ -7831,12 +9232,12 @@ components: name: type: string required: - - id - - name - - endpointId - - ipv4Address - - ipv6Address - - macAddress + - id + - name + - endpointId + - ipv4Address + - ipv6Address + - macAddress type: object NetworkCountsApiResponse: additionalProperties: false @@ -7844,17 +9245,17 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCountsApiResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCountsApiResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/NetworkUsageCounts' + $ref: "#/components/schemas/NetworkUsageCounts" success: type: boolean required: - - success - - data + - success + - data type: object NetworkCreateOptions: additionalProperties: false @@ -7878,7 +9279,7 @@ components: description: Restrict external access to the network type: boolean ipam: - $ref: '#/components/schemas/NetworkIPAM' + $ref: "#/components/schemas/NetworkIPAM" description: IP Address Management configuration labels: additionalProperties: @@ -7897,7 +9298,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCreateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCreateRequest.json format: uri readOnly: true type: string @@ -7906,21 +9307,23 @@ components: minLength: 1 type: string options: - $ref: '#/components/schemas/NetworkCreateOptions' + $ref: "#/components/schemas/NetworkCreateOptions" description: Network creation options required: - - name - - options + - name + - options type: object NetworkCreateResponse: additionalProperties: false properties: + activityId: + type: string id: type: string warning: type: string required: - - id + - id type: object NetworkCreatedApiResponse: additionalProperties: false @@ -7928,27 +9331,27 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCreatedApiResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkCreatedApiResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/NetworkCreateResponse' + $ref: "#/components/schemas/NetworkCreateResponse" success: type: boolean required: - - success - - data + - success + - data type: object NetworkIPAM: additionalProperties: false properties: config: items: - $ref: '#/components/schemas/NetworkIPAMConfig' + $ref: "#/components/schemas/NetworkIPAMConfig" type: - - array - - 'null' + - array + - "null" driver: type: string options: @@ -7976,19 +9379,19 @@ components: attachable: type: boolean configFrom: - $ref: '#/components/schemas/DockerNetworkConfigReference' + $ref: "#/components/schemas/DockerNetworkConfigReference" configOnly: type: boolean containers: additionalProperties: - $ref: '#/components/schemas/DockerNetworkEndpointResource' + $ref: "#/components/schemas/DockerNetworkEndpointResource" type: object containersList: items: - $ref: '#/components/schemas/NetworkContainerEndpoint' + $ref: "#/components/schemas/NetworkContainerEndpoint" type: - - array - - 'null' + - array + - "null" created: format: date-time type: string @@ -8005,7 +9408,7 @@ components: internal: type: boolean ipam: - $ref: '#/components/schemas/NetworkIPAM' + $ref: "#/components/schemas/NetworkIPAM" labels: additionalProperties: type: string @@ -8018,34 +9421,34 @@ components: type: object peers: items: - $ref: '#/components/schemas/DockerNetworkPeerInfo' + $ref: "#/components/schemas/DockerNetworkPeerInfo" type: - - array - - 'null' + - array + - "null" scope: type: string services: additionalProperties: - $ref: '#/components/schemas/DockerNetworkServiceInfo' + $ref: "#/components/schemas/DockerNetworkServiceInfo" type: object required: - - id - - name - - driver - - scope - - created - - enableIPv4 - - enableIPv6 - - ipam - - internal - - attachable - - ingress - - configFrom - - configOnly - - containers - - options - - labels - - containersList + - id + - name + - driver + - scope + - created + - enableIPv4 + - enableIPv6 + - ipam + - internal + - attachable + - ingress + - configFrom + - configOnly + - containers + - options + - labels + - containersList type: object NetworkInspectApiResponse: additionalProperties: false @@ -8053,17 +9456,17 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkInspectApiResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkInspectApiResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/NetworkInspect' + $ref: "#/components/schemas/NetworkInspect" success: type: boolean required: - - success - - data + - success + - data type: object NetworkMessageApiResponse: additionalProperties: false @@ -8071,17 +9474,17 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkMessageApiResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkMessageApiResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/BaseMessageResponse' + $ref: "#/components/schemas/BaseMessageResponse" success: type: boolean required: - - success - - data + - success + - data type: object NetworkPaginatedResponse: additionalProperties: false @@ -8089,44 +9492,46 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkPaginatedResponse.json format: uri readOnly: true type: string counts: - $ref: '#/components/schemas/NetworkUsageCounts' + $ref: "#/components/schemas/NetworkUsageCounts" data: items: - $ref: '#/components/schemas/NetworkSummary' + $ref: "#/components/schemas/NetworkSummary" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - counts - - pagination + - success + - data + - counts + - pagination type: object NetworkPruneReport: additionalProperties: false properties: + activityId: + type: string networksDeleted: items: type: string type: - - array - - 'null' + - array + - "null" spaceReclaimed: format: int64 minimum: 0 type: integer required: - - networksDeleted - - spaceReclaimed + - networksDeleted + - spaceReclaimed type: object NetworkPruneResponse: additionalProperties: false @@ -8134,17 +9539,17 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkPruneResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkPruneResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/NetworkPruneReport' + $ref: "#/components/schemas/NetworkPruneReport" success: type: boolean required: - - success - - data + - success + - data type: object NetworkSummary: additionalProperties: false @@ -8173,34 +9578,34 @@ components: scope: type: string required: - - id - - name - - driver - - scope - - created - - options - - labels - - inUse - - isDefault + - id + - name + - driver + - scope + - created + - options + - labels + - inUse + - isDefault type: object NetworkTopology: additionalProperties: false properties: edges: items: - $ref: '#/components/schemas/NetworkTopologyEdge' + $ref: "#/components/schemas/NetworkTopologyEdge" type: - - array - - 'null' + - array + - "null" nodes: items: - $ref: '#/components/schemas/NetworkTopologyNode' + $ref: "#/components/schemas/NetworkTopologyNode" type: - - array - - 'null' + - array + - "null" required: - - nodes - - edges + - nodes + - edges type: object NetworkTopologyApiResponse: additionalProperties: false @@ -8208,17 +9613,17 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkTopologyApiResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NetworkTopologyApiResponse.json format: uri readOnly: true type: string data: - $ref: '#/components/schemas/NetworkTopology' + $ref: "#/components/schemas/NetworkTopology" success: type: boolean required: - - success - - data + - success + - data type: object NetworkTopologyEdge: additionalProperties: false @@ -8234,9 +9639,9 @@ components: target: type: string required: - - id - - source - - target + - id + - source + - target type: object NetworkTopologyNode: additionalProperties: false @@ -8244,16 +9649,16 @@ components: id: type: string metadata: - $ref: '#/components/schemas/NetworkTopologyNodeMetadata' + $ref: "#/components/schemas/NetworkTopologyNodeMetadata" name: type: string type: type: string required: - - id - - name - - type - - metadata + - id + - name + - type + - metadata type: object NetworkTopologyNodeMetadata: additionalProperties: false @@ -8282,83 +9687,30 @@ components: format: int64 type: integer required: - - inuse - - unused - - total + - inuse + - unused + - total type: object - NotificationAppriseResponse: + NotificationDispatchAutoHeal: additionalProperties: false properties: - $schema: - description: A URL to the JSON Schema for this object. - examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationAppriseResponse.json - format: uri - readOnly: true - type: string - apiUrl: + containerId: type: string - containerUpdateTag: - type: string - enabled: - type: boolean - id: - format: int64 - minimum: 0 - type: integer - imageUpdateTag: - type: string - required: - - id - - apiUrl - - enabled - - imageUpdateTag - - containerUpdateTag - type: object - NotificationAppriseUpdate: - additionalProperties: false - properties: - $schema: - description: A URL to the JSON Schema for this object. - examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationAppriseUpdate.json - format: uri - readOnly: true - type: string - apiUrl: - type: string - containerUpdateTag: - type: string - enabled: - type: boolean - imageUpdateTag: - type: string - required: - - apiUrl - - enabled - - imageUpdateTag - - containerUpdateTag - type: object - NotificationDispatchAutoHeal: - additionalProperties: false - properties: - containerId: - type: string - containerName: + containerName: type: string required: - - containerName - - containerId + - containerName + - containerId type: object NotificationDispatchBatchImageUpdate: additionalProperties: false properties: updates: additionalProperties: - $ref: '#/components/schemas/ImageupdateResponse' + $ref: "#/components/schemas/ImageupdateResponse" type: object required: - - updates + - updates type: object NotificationDispatchContainerUpdate: additionalProperties: false @@ -8372,8 +9724,8 @@ components: oldDigest: type: string required: - - containerName - - imageRef + - containerName + - imageRef type: object NotificationDispatchImageUpdate: additionalProperties: false @@ -8381,18 +9733,18 @@ components: imageRef: type: string updateInfo: - $ref: '#/components/schemas/ImageupdateResponse' + $ref: "#/components/schemas/ImageupdateResponse" required: - - imageRef - - updateInfo + - imageRef + - updateInfo type: object NotificationDispatchPruneReport: additionalProperties: false properties: result: - $ref: '#/components/schemas/SystemPruneAllResult' + $ref: "#/components/schemas/SystemPruneAllResult" required: - - result + - result type: object NotificationDispatchRequest: additionalProperties: false @@ -8400,26 +9752,38 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationDispatchRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationDispatchRequest.json format: uri readOnly: true type: string autoHeal: - $ref: '#/components/schemas/NotificationDispatchAutoHeal' + $ref: "#/components/schemas/NotificationDispatchAutoHeal" batchImageUpdate: - $ref: '#/components/schemas/NotificationDispatchBatchImageUpdate' + $ref: "#/components/schemas/NotificationDispatchBatchImageUpdate" containerUpdate: - $ref: '#/components/schemas/NotificationDispatchContainerUpdate' + $ref: "#/components/schemas/NotificationDispatchContainerUpdate" imageUpdate: - $ref: '#/components/schemas/NotificationDispatchImageUpdate' + $ref: "#/components/schemas/NotificationDispatchImageUpdate" kind: type: string pruneReport: - $ref: '#/components/schemas/NotificationDispatchPruneReport' + $ref: "#/components/schemas/NotificationDispatchPruneReport" vulnerabilityFound: - $ref: '#/components/schemas/NotificationDispatchVulnerabilityFound' + $ref: "#/components/schemas/NotificationDispatchVulnerabilityFound" + required: + - kind + type: object + NotificationDispatchResponse: + additionalProperties: false + properties: + delivered: + format: int64 + type: integer + message: + type: string required: - - kind + - message + - delivered type: object NotificationDispatchVulnerabilityFound: additionalProperties: false @@ -8439,10 +9803,10 @@ components: severity: type: string required: - - cveId - - cveLink - - severity - - imageName + - cveId + - cveLink + - severity + - imageName type: object NotificationResponse: additionalProperties: false @@ -8450,7 +9814,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationResponse.json format: uri readOnly: true type: string @@ -8466,10 +9830,20 @@ components: provider: type: string required: - - id - - provider - - enabled - - config + - id + - provider + - enabled + - config + type: object + NotificationTestResponse: + additionalProperties: false + properties: + message: + type: string + warning: + type: string + required: + - message type: object NotificationUpdate: additionalProperties: false @@ -8477,7 +9851,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationUpdate.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationUpdate.json format: uri readOnly: true type: string @@ -8489,9 +9863,9 @@ components: provider: type: string required: - - provider - - enabled - - config + - provider + - enabled + - config type: object PortPaginatedResponse: additionalProperties: false @@ -8499,24 +9873,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/PortPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/PortPaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/PortPortMapping' + $ref: "#/components/schemas/PortPortMapping" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object PortPortMapping: additionalProperties: false @@ -8540,12 +9914,12 @@ components: protocol: type: string required: - - id - - containerId - - containerName - - containerPort - - protocol - - isPublished + - id + - containerId + - containerName + - containerPort + - protocol + - isPublished type: object ProjectCreateProject: additionalProperties: false @@ -8553,7 +9927,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectCreateProject.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectCreateProject.json format: uri readOnly: true type: string @@ -8563,13 +9937,25 @@ components: type: string name: type: string + projectFiles: + items: + $ref: "#/components/schemas/ProjectProjectFileDraft" + maxItems: 500 + type: + - array + - "null" required: - - name - - composeContent + - name + - composeContent type: object ProjectCreateReponse: additionalProperties: false properties: + activityId: + type: string + archivedAt: + format: date-time + type: string createdAt: type: string dirName: @@ -8578,6 +9964,8 @@ components: type: string id: type: string + isArchived: + type: boolean name: type: string path: @@ -8597,14 +9985,15 @@ components: updatedAt: type: string required: - - id - - name - - path - - status - - serviceCount - - runningCount - - createdAt - - updatedAt + - id + - name + - path + - status + - serviceCount + - runningCount + - isArchived + - createdAt + - updatedAt type: object ProjectDeployOptions: additionalProperties: false @@ -8612,7 +10001,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectDeployOptions.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectDeployOptions.json format: uri readOnly: true type: string @@ -8620,6 +10009,8 @@ components: type: boolean pullPolicy: type: string + removeOrphans: + type: boolean type: object ProjectDestroy: additionalProperties: false @@ -8627,7 +10018,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectDestroy.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectDestroy.json format: uri readOnly: true type: string @@ -8639,42 +10030,65 @@ components: ProjectDetails: additionalProperties: false properties: + activityId: + type: string + archivedAt: + format: date-time + type: string composeContent: type: string + composeFileName: + type: string createdAt: type: string dirName: type: string directoryFiles: items: - $ref: '#/components/schemas/ProjectIncludeFile' + $ref: "#/components/schemas/ProjectIncludeFile" type: - - array - - 'null' + - array + - "null" envContent: type: string + fileTreeRevision: + type: string gitOpsManagedBy: type: string gitRepositoryURL: type: string hasBuildDirective: type: boolean - iconUrl: + iconDarkUrl: + type: string + iconLightUrl: type: string id: type: string includeFiles: items: - $ref: '#/components/schemas/ProjectIncludeFile' + $ref: "#/components/schemas/ProjectIncludeFile" type: - - array - - 'null' + - array + - "null" + isArchived: + type: boolean + isDiscovered: + type: boolean lastSyncCommit: type: string name: type: string path: type: string + projectFiles: + items: + $ref: "#/components/schemas/ProjectProjectFile" + type: + - array + - "null" + redeployDisabled: + type: boolean relativePath: type: string runningCount: @@ -8682,40 +10096,43 @@ components: type: integer runtimeServices: items: - $ref: '#/components/schemas/ProjectRuntimeService' + $ref: "#/components/schemas/ProjectRuntimeService" type: - - array - - 'null' + - array + - "null" serviceCount: format: int64 type: integer services: items: - $ref: '#/components/schemas/DockerTypesServiceConfig' + $ref: "#/components/schemas/DockerTypesServiceConfig" type: - - array - - 'null' + - array + - "null" status: type: string statusReason: type: string + updateInfo: + $ref: "#/components/schemas/ProjectUpdateInfo" updatedAt: type: string urls: items: type: string type: - - array - - 'null' - required: - - id - - name - - path - - status - - serviceCount - - runningCount - - createdAt - - updatedAt + - array + - "null" + required: + - id + - name + - path + - status + - serviceCount + - runningCount + - isArchived + - createdAt + - updatedAt type: object ProjectIncludeFile: additionalProperties: false @@ -8727,9 +10144,8 @@ components: relativePath: type: string required: - - path - - relativePath - - content + - path + - relativePath type: object ProjectPaginatedResponse: additionalProperties: false @@ -8737,24 +10153,92 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectPaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/ProjectDetails' + $ref: "#/components/schemas/ProjectDetails" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination + type: object + ProjectProjectFile: + additionalProperties: false + properties: + content: + type: string + isDirectory: + type: boolean + modTime: + format: date-time + type: string + name: + type: string + path: + type: string + protected: + type: boolean + relativePath: + type: string + size: + format: int64 + type: integer + required: + - path + - relativePath + - name + - isDirectory + - size + - modTime + type: object + ProjectProjectFileChange: + additionalProperties: false + properties: + content: + type: string + newName: + type: string + newParentPath: + type: string + operation: + enum: + - create_file + - create_folder + - update_file + - rename + - move + - delete + type: string + recursive: + type: boolean + relativePath: + type: string + required: + - operation + - relativePath + type: object + ProjectProjectFileDraft: + additionalProperties: false + properties: + content: + type: string + isDirectory: + type: boolean + relativePath: + type: string + required: + - relativePath + - isDirectory type: object ProjectRuntimeService: additionalProperties: false @@ -8765,7 +10249,9 @@ components: type: string health: type: string - iconUrl: + iconDarkUrl: + type: string + iconLightUrl: type: string image: type: string @@ -8775,20 +10261,25 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" + redeployDisabled: + type: boolean serviceConfig: - $ref: '#/components/schemas/ServiceConfig' + $ref: "#/components/schemas/ServiceConfig" status: type: string required: - - name - - image - - status + - name + - image + - status type: object ProjectStatusCounts: additionalProperties: false properties: + archivedProjects: + format: int64 + type: integer runningProjects: format: int64 type: integer @@ -8799,9 +10290,10 @@ components: format: int64 type: integer required: - - runningProjects - - stoppedProjects - - totalProjects + - runningProjects + - stoppedProjects + - totalProjects + - archivedProjects type: object ProjectUpdateIncludeFile: additionalProperties: false @@ -8809,7 +10301,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectUpdateIncludeFile.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectUpdateIncludeFile.json format: uri readOnly: true type: string @@ -8818,8 +10310,52 @@ components: relativePath: type: string required: - - relativePath - - content + - relativePath + - content + type: object + ProjectUpdateInfo: + additionalProperties: false + properties: + checkedImageCount: + format: int64 + type: integer + errorCount: + format: int64 + type: integer + errorMessage: + type: string + hasUpdate: + type: boolean + imageCount: + format: int64 + type: integer + imageRefs: + items: + type: string + type: + - array + - "null" + imagesWithUpdates: + format: int64 + type: integer + lastCheckedAt: + format: date-time + type: string + status: + type: string + updatedImageRefs: + items: + type: string + type: + - array + - "null" + required: + - status + - hasUpdate + - imageCount + - checkedImageCount + - imagesWithUpdates + - errorCount type: object ProjectUpdateProject: additionalProperties: false @@ -8827,7 +10363,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectUpdateProject.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectUpdateProject.json format: uri readOnly: true type: string @@ -8835,6 +10371,15 @@ components: type: string envContent: type: string + fileChanges: + items: + $ref: "#/components/schemas/ProjectProjectFileChange" + maxItems: 500 + type: + - array + - "null" + fileTreeRevision: + type: string name: type: string type: object @@ -8844,7 +10389,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/PruneImagesInputBody.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/PruneImagesInputBody.json format: uri readOnly: true type: string @@ -8855,9 +10400,13 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" type: object + mode: + type: string + until: + type: string type: object Resource: additionalProperties: false @@ -8867,16 +10416,16 @@ components: type: number devices: items: - $ref: '#/components/schemas/DockerTypesDeviceRequest' + $ref: "#/components/schemas/DockerTypesDeviceRequest" type: - - array - - 'null' + - array + - "null" generic_resources: items: - $ref: '#/components/schemas/DockerTypesGenericResource' + $ref: "#/components/schemas/DockerTypesGenericResource" type: - - array - - 'null' + - array + - "null" memory: format: int64 type: integer @@ -8906,7 +10455,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/RestoreBackupFilesInputBody.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/RestoreBackupFilesInputBody.json format: uri readOnly: true type: string @@ -8915,111 +10464,587 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" required: - - paths + - paths type: object - ScannerStatus: + RoleAccessSurface: additionalProperties: false properties: - available: - type: boolean - version: + accessMode: + description: How reachability is evaluated + enum: + - permissions + - any-child + type: string + children: + description: Child surface IDs used by aggregate landing surfaces + items: + type: string + type: + - array + - "null" + fallbackOrder: + description: Positive ordering hint for route fallback selection + format: int64 + type: integer + id: + description: Stable surface identifier + examples: + - settings.category.webhooks + type: string + kind: + description: Surface type + enum: + - route + - settings-category + - customize-category + - landing + type: string + label: + description: Human-readable surface label + examples: + - Webhooks + type: string + matchMode: + description: How permissions are combined when accessMode is permissions + enum: + - any-of + - all-of + type: string + permissions: + description: Permissions used by permission-based surfaces + items: + type: string + type: + - array + - "null" + scopeMode: + description: Which effective permission scope is considered + enum: + - global-only + - selected-env-plus-global + - any-effective-scope + type: string + url: + description: Route URL or prefix represented by this surface + examples: + - /settings/webhooks type: string required: - - available + - id + - kind + - label + - accessMode + - matchMode + - scopeMode type: object - SearchRequest: + RoleCreateOidcRoleMapping: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SearchRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/RoleCreateOidcRoleMapping.json format: uri readOnly: true type: string - query: + claimValue: + description: OIDC claim value to match + minLength: 1 + type: string + environmentId: + description: Environment ID to scope the assignment to; omit for a global assignment + type: string + roleId: + description: Role to grant + minLength: 1 type: string required: - - query + - claimValue + - roleId type: object - SearchResponse: + RoleCreateRole: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SearchResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/RoleCreateRole.json format: uri readOnly: true type: string - count: - format: int64 - type: integer - query: + description: + description: Optional human description + maxLength: 500 type: string - results: + name: + description: Display name of the role + examples: + - Deploy Bot + maxLength: 100 + minLength: 1 + type: string + permissions: + description: Permission strings granted by this role items: - $ref: '#/components/schemas/CategoryCategory' + type: string + minItems: 1 type: - - array - - 'null' + - array + - "null" required: - - results - - query - - count + - name + - permissions type: object - ServiceConfig: + RoleOidcRoleMapping: additionalProperties: false properties: - annotations: - additionalProperties: - type: string - type: object - attach: - type: boolean - blkio_config: - $ref: '#/components/schemas/BlkioConfig' - build: - $ref: '#/components/schemas/BuildConfig' - cap_add: - items: - type: string - type: - - array - - 'null' - cap_drop: - items: - type: string - type: - - array - - 'null' - cgroup: + claimValue: + description: OIDC claim value that triggers this mapping + examples: + - docker-admins type: string - cgroup_parent: + createdAt: + format: date-time type: string - command: - items: - type: string - type: - - array - - 'null' - configs: - items: - $ref: '#/components/schemas/DockerTypesServiceConfigObjConfig' - type: - - array - - 'null' - container_name: + environmentId: + description: Environment ID to scope the assignment to; omit for a global assignment type: string - cpu_count: - format: int64 - type: integer - cpu_percent: - format: float - type: number + id: + description: Unique identifier of the mapping + type: string + roleId: + description: Role to assign when the claim matches + type: string + source: + description: How this mapping was created. 'manual' rows are UI/API-managed and freely editable; 'env' rows are declared via OIDC_ROLE_MAPPINGS and are read-only at runtime. + enum: + - manual + - env + type: string + updatedAt: + format: date-time + type: string + required: + - id + - claimValue + - roleId + - source + - createdAt + type: object + RolePaginatedResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/RolePaginatedResponse.json + format: uri + readOnly: true + type: string + data: + items: + $ref: "#/components/schemas/RoleRole" + type: + - array + - "null" + pagination: + $ref: "#/components/schemas/BasePaginationResponse" + success: + type: boolean + required: + - success + - data + - pagination + type: object + RolePermissionAction: + additionalProperties: false + properties: + description: + description: Optional longer description + type: string + key: + description: Action verb + examples: + - start + type: string + label: + description: Human-readable label + examples: + - Start + type: string + permission: + description: Fully-qualified permission string used in role definitions + examples: + - containers:start + type: string + requires: + description: Permissions that should be auto-selected when this permission is chosen in the UI + items: + type: string + type: + - array + - "null" + required: + - key + - permission + - label + type: object + RolePermissionPreset: + additionalProperties: false + properties: + description: + description: Optional longer description for the preset + type: string + key: + description: Stable preset key + examples: + - editor + type: string + label: + description: Human-readable preset label + examples: + - All permissions (non-admin) + type: string + permissions: + description: Permissions included when the preset is selected + items: + type: string + type: + - array + - "null" + required: + - key + - label + - permissions + type: object + RolePermissionResource: + additionalProperties: false + properties: + actions: + description: Actions available on this resource + items: + $ref: "#/components/schemas/RolePermissionAction" + type: + - array + - "null" + key: + description: Stable resource key + examples: + - containers + type: string + label: + description: Human-readable label + examples: + - Containers + type: string + scope: + description: "'global' for org-level perms; 'env' for per-environment perms" + enum: + - global + - env + type: string + required: + - key + - label + - scope + - actions + type: object + RolePermissionsManifest: + additionalProperties: false + properties: + accessSurfaces: + description: Backend-owned route, landing, and category access metadata for frontend UX gating + items: + $ref: "#/components/schemas/RoleAccessSurface" + type: + - array + - "null" + presets: + description: Optional preset permission bundles for bulk selection in the UI + items: + $ref: "#/components/schemas/RolePermissionPreset" + type: + - array + - "null" + resources: + description: Resource groups, in display order + items: + $ref: "#/components/schemas/RolePermissionResource" + type: + - array + - "null" + required: + - resources + type: object + RoleRole: + additionalProperties: false + properties: + assignedUserCount: + description: How many users currently hold an assignment to this role + format: int64 + type: integer + builtIn: + description: True for built-in roles (Admin/Editor/Deployer/Viewer); built-ins cannot be edited or deleted + type: boolean + createdAt: + description: Creation timestamp + format: date-time + type: string + description: + description: Optional human description + type: string + id: + description: Unique identifier of the role + examples: + - role_admin + type: string + name: + description: Display name of the role + examples: + - Admin + type: string + permissions: + description: Permission strings granted by this role + examples: + - - containers:start + - projects:deploy + items: + type: string + type: + - array + - "null" + updatedAt: + description: Last update timestamp + format: date-time + type: string + required: + - id + - name + - permissions + - builtIn + - assignedUserCount + - createdAt + type: object + RoleRoleAssignment: + additionalProperties: false + properties: + createdAt: + description: Creation timestamp + format: date-time + type: string + environmentId: + description: Environment ID this assignment is scoped to; omit for a global assignment + type: string + id: + description: Unique identifier of the assignment + type: string + roleId: + description: ID of the granted role + type: string + source: + description: How the assignment was created + enum: + - manual + - oidc + type: string + userId: + description: ID of the user holding this assignment + type: string + required: + - id + - userId + - roleId + - source + - createdAt + type: object + RoleSetUserAssignments: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/RoleSetUserAssignments.json + format: uri + readOnly: true + type: string + assignments: + description: Desired manual role assignments for the user + items: + $ref: "#/components/schemas/RoleUserAssignmentInput" + type: + - array + - "null" + required: + - assignments + type: object + RoleUpdateOidcRoleMapping: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/RoleUpdateOidcRoleMapping.json + format: uri + readOnly: true + type: string + claimValue: + minLength: 1 + type: string + environmentId: + type: string + roleId: + minLength: 1 + type: string + required: + - claimValue + - roleId + type: object + RoleUpdateRole: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/RoleUpdateRole.json + format: uri + readOnly: true + type: string + description: + description: Optional human description + maxLength: 500 + type: string + name: + description: Display name of the role + maxLength: 100 + minLength: 1 + type: string + permissions: + description: Permission strings granted by this role + items: + type: string + minItems: 1 + type: + - array + - "null" + required: + - name + - permissions + type: object + RoleUserAssignmentInput: + additionalProperties: false + properties: + environmentId: + description: Environment ID to scope the assignment to; omit for a global assignment + type: string + roleId: + description: ID of the role to grant + type: string + required: + - roleId + type: object + ScannerStatus: + additionalProperties: false + properties: + available: + type: boolean + version: + type: string + required: + - available + type: object + SearchRequest: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/SearchRequest.json + format: uri + readOnly: true + type: string + query: + type: string + required: + - query + type: object + SearchResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/SearchResponse.json + format: uri + readOnly: true + type: string + count: + format: int64 + type: integer + query: + type: string + results: + items: + $ref: "#/components/schemas/CategoryCategory" + type: + - array + - "null" + required: + - results + - query + - count + type: object + ServiceConfig: + additionalProperties: false + properties: + annotations: + additionalProperties: + type: string + type: object + attach: + type: boolean + blkio_config: + $ref: "#/components/schemas/BlkioConfig" + build: + $ref: "#/components/schemas/BuildConfig" + cap_add: + items: + type: string + type: + - array + - "null" + cap_drop: + items: + type: string + type: + - array + - "null" + cgroup: + type: string + cgroup_parent: + type: string + command: + items: + type: string + type: + - array + - "null" + configs: + items: + $ref: "#/components/schemas/DockerTypesServiceConfigObjConfig" + type: + - array + - "null" + container_name: + type: string + cpu_count: + format: int64 + type: integer + cpu_percent: + format: float + type: number cpu_period: format: int64 type: integer @@ -9041,45 +11066,45 @@ components: cpuset: type: string credential_spec: - $ref: '#/components/schemas/CredentialSpecConfig' + $ref: "#/components/schemas/CredentialSpecConfig" depends_on: additionalProperties: - $ref: '#/components/schemas/DockerTypesServiceDependency' + $ref: "#/components/schemas/DockerTypesServiceDependency" type: object deploy: - $ref: '#/components/schemas/DeployConfig' + $ref: "#/components/schemas/DeployConfig" develop: - $ref: '#/components/schemas/DevelopConfig' + $ref: "#/components/schemas/DevelopConfig" device_cgroup_rules: items: type: string type: - - array - - 'null' + - array + - "null" devices: items: - $ref: '#/components/schemas/DockerTypesDeviceMapping' + $ref: "#/components/schemas/DockerTypesDeviceMapping" type: - - array - - 'null' + - array + - "null" dns: items: type: string type: - - array - - 'null' + - array + - "null" dns_opt: items: type: string type: - - array - - 'null' + - array + - "null" dns_search: items: type: string type: - - array - - 'null' + - array + - "null" dockerfile: type: string domainname: @@ -9088,56 +11113,56 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" env_file: items: - $ref: '#/components/schemas/DockerTypesEnvFile' + $ref: "#/components/schemas/DockerTypesEnvFile" type: - - array - - 'null' + - array + - "null" environment: additionalProperties: type: - - string - - 'null' + - string + - "null" type: object expose: items: type: string type: - - array - - 'null' + - array + - "null" extends: - $ref: '#/components/schemas/ExtendsConfig' + $ref: "#/components/schemas/ExtendsConfig" external_links: items: type: string type: - - array - - 'null' + - array + - "null" extra_hosts: additionalProperties: items: type: string type: - - array - - 'null' + - array + - "null" type: object gpus: items: - $ref: '#/components/schemas/DockerTypesDeviceRequest' + $ref: "#/components/schemas/DockerTypesDeviceRequest" type: - - array - - 'null' + - array + - "null" group_add: items: type: string type: - - array - - 'null' + - array + - "null" healthcheck: - $ref: '#/components/schemas/HealthCheckConfig' + $ref: "#/components/schemas/HealthCheckConfig" hostname: type: string image: @@ -9152,8 +11177,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" labels: additionalProperties: type: string @@ -9162,8 +11187,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" log_driver: type: string log_opt: @@ -9171,7 +11196,7 @@ components: type: string type: object logging: - $ref: '#/components/schemas/LoggingConfig' + $ref: "#/components/schemas/LoggingConfig" mac_address: type: string mem_limit: @@ -9188,7 +11213,7 @@ components: type: integer models: additionalProperties: - $ref: '#/components/schemas/ServiceModelConfig' + $ref: "#/components/schemas/ServiceModelConfig" type: object net: type: string @@ -9196,7 +11221,7 @@ components: type: string networks: additionalProperties: - $ref: '#/components/schemas/ServiceNetworkConfig' + $ref: "#/components/schemas/ServiceNetworkConfig" type: object oom_kill_disable: type: boolean @@ -9212,32 +11237,38 @@ components: type: string ports: items: - $ref: '#/components/schemas/DockerTypesServicePortConfig' + $ref: "#/components/schemas/DockerTypesServicePortConfig" type: - - array - - 'null' + - array + - "null" post_start: items: - $ref: '#/components/schemas/DockerTypesServiceHook' + $ref: "#/components/schemas/DockerTypesServiceHook" + type: + - array + - "null" + pre_start: + items: + $ref: "#/components/schemas/DockerTypesServiceHook" type: - - array - - 'null' + - array + - "null" pre_stop: items: - $ref: '#/components/schemas/DockerTypesServiceHook' + $ref: "#/components/schemas/DockerTypesServiceHook" type: - - array - - 'null' + - array + - "null" privileged: type: boolean profiles: items: type: string type: - - array - - 'null' + - array + - "null" provider: - $ref: '#/components/schemas/ServiceProviderConfig' + $ref: "#/components/schemas/ServiceProviderConfig" pull_policy: type: string read_only: @@ -9251,16 +11282,16 @@ components: type: integer secrets: items: - $ref: '#/components/schemas/DockerTypesServiceSecretConfig' + $ref: "#/components/schemas/DockerTypesServiceSecretConfig" type: - - array - - 'null' + - array + - "null" security_opt: items: type: string type: - - array - - 'null' + - array + - "null" shm_size: format: int64 type: integer @@ -9283,13 +11314,13 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" tty: type: boolean ulimits: additionalProperties: - $ref: '#/components/schemas/UlimitsConfig' + $ref: "#/components/schemas/UlimitsConfig" type: object use_api_socket: type: boolean @@ -9303,21 +11334,21 @@ components: type: string volumes: items: - $ref: '#/components/schemas/DockerTypesServiceVolumeConfig' + $ref: "#/components/schemas/DockerTypesServiceVolumeConfig" type: - - array - - 'null' + - array + - "null" volumes_from: items: type: string type: - - array - - 'null' + - array + - "null" working_dir: type: string required: - - command - - entrypoint + - command + - entrypoint type: object ServiceModelConfig: additionalProperties: false @@ -9334,8 +11365,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" driver_opts: additionalProperties: type: string @@ -9353,8 +11384,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" mac_address: type: string priority: @@ -9369,8 +11400,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" type: object type: type: string @@ -9422,7 +11453,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SetAutoUpdateInputBody.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SetAutoUpdateInputBody.json format: uri readOnly: true type: string @@ -9430,7 +11461,7 @@ components: description: Whether auto-update is enabled for this container type: boolean required: - - enabled + - enabled type: object SettingsPublicSetting: additionalProperties: false @@ -9442,9 +11473,9 @@ components: value: type: string required: - - key - - type - - value + - key + - type + - value type: object SettingsSettingDto: additionalProperties: false @@ -9458,10 +11489,10 @@ components: value: type: string required: - - isPublic - - key - - type - - value + - isPublic + - key + - type + - value type: object SettingsUpdate: additionalProperties: false @@ -9469,18 +11500,22 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SettingsUpdate.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SettingsUpdate.json format: uri readOnly: true type: string accentColor: type: string + activityHistoryMaxEntries: + type: string + activityHistoryRetentionDays: + type: string + animationsEnabled: + type: string applicationTheme: type: string authLocalEnabled: type: string - authOidcConfig: - type: string authPasswordPolicy: type: string authSessionTimeout: @@ -9503,6 +11538,8 @@ components: type: string autoUpdateInterval: type: string + avatarMaxUploadSizeMb: + type: string baseServerUrl: type: string buildProvider: @@ -9523,12 +11560,12 @@ components: type: string dockerApiTimeout: type: string + dockerClientRefreshInterval: + type: string dockerHost: type: string dockerImagePullTimeout: type: string - dockerPruneMode: - type: string enableGravatar: type: string environmentHealthInterval: @@ -9543,20 +11580,26 @@ components: type: string gitSyncMaxTotalSizeMb: type: string + glassEffectsEnabled: + type: string httpClientTimeout: type: string + iconCatalog: + type: string keyboardShortcutsEnabled: type: string + lifecycleDefaultRunnerImage: + type: string + lifecycleEnabled: + type: string + lifecycleMaxTimeoutSec: + type: string maxImageUploadSize: type: string mobileNavigationMode: type: string mobileNavigationShowLabels: type: string - oidcAdminClaim: - type: string - oidcAdminValue: - type: string oidcAutoRedirectToProvider: type: string oidcClientId: @@ -9565,6 +11608,8 @@ components: type: string oidcEnabled: type: string + oidcGroupsClaim: + type: string oidcIssuerUrl: type: string oidcMergeAccounts: @@ -9587,30 +11632,42 @@ components: type: string proxyRequestTimeout: type: string - registryTimeout: + pruneBuildCacheMode: type: string - scheduledPruneBuildCache: + pruneBuildCacheUntil: type: string - scheduledPruneContainers: + pruneContainerMode: type: string - scheduledPruneEnabled: + pruneContainerUntil: type: string - scheduledPruneImages: + pruneImageMode: type: string - scheduledPruneInterval: + pruneImageUntil: + type: string + pruneNetworkMode: type: string - scheduledPruneNetworks: + pruneNetworkUntil: type: string - scheduledPruneVolumes: + pruneVolumeMode: + type: string + registryTimeout: + type: string + scheduledPruneEnabled: + type: string + scheduledPruneInterval: type: string sidebarHoverExpansion: type: string swarmStackSourcesDirectory: type: string + templatesDirectory: + type: string trivyConcurrentScanContainers: type: string trivyCpuLimit: type: string + trivyIgnoreUnfixed: + type: string trivyImage: type: string trivyMemoryLimitMb: @@ -9627,6 +11684,14 @@ components: type: string trivySecurityOpts: type: string + trivyServerEnabled: + type: string + trivyServerToken: + type: string + trivyServerUrl: + type: string + volumeBrowserHelperIdleTimeout: + type: string vulnerabilityScanEnabled: type: string vulnerabilityScanInterval: @@ -9638,14 +11703,14 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmConfigCreateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmConfigCreateRequest.json format: uri readOnly: true type: string spec: description: Config specification required: - - spec + - spec type: object SwarmConfigSummary: additionalProperties: false @@ -9656,18 +11721,18 @@ components: id: type: string spec: - $ref: '#/components/schemas/DockerSwarmConfigSpec' + $ref: "#/components/schemas/DockerSwarmConfigSpec" updatedAt: format: date-time type: string version: - $ref: '#/components/schemas/DockerSwarmVersion' + $ref: "#/components/schemas/DockerSwarmVersion" required: - - id - - version - - createdAt - - updatedAt - - spec + - id + - version + - createdAt + - updatedAt + - spec type: object SwarmConfigUpdateRequest: additionalProperties: false @@ -9675,7 +11740,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmConfigUpdateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmConfigUpdateRequest.json format: uri readOnly: true type: string @@ -9686,13 +11751,13 @@ components: minimum: 0 type: integer required: - - spec + - spec type: object SwarmNodeAgentDeployment: additionalProperties: false properties: agent: - $ref: '#/components/schemas/SwarmNodeAgentStatus' + $ref: "#/components/schemas/SwarmNodeAgentStatus" dockerCompose: description: Docker compose YAML snippet type: string @@ -9701,11 +11766,14 @@ components: type: string environmentId: type: string + mtls: + $ref: "#/components/schemas/DeploymentSnippetMTLS" + description: Optional Arcane-generated mTLS deployment assets for edge agents required: - - environmentId - - agent - - dockerRun - - dockerCompose + - environmentId + - agent + - dockerRun + - dockerCompose type: object SwarmNodeAgentStatus: additionalProperties: false @@ -9727,7 +11795,7 @@ components: state: type: string required: - - state + - state type: object SwarmNodeIdentity: additionalProperties: false @@ -9743,11 +11811,11 @@ components: swarmNodeId: type: string required: - - swarmNodeId - - hostname - - role - - engineVersion - - swarmActive + - swarmNodeId + - hostname + - role + - engineVersion + - swarmActive type: object SwarmNodeSummary: additionalProperties: false @@ -9755,7 +11823,7 @@ components: address: type: string agent: - $ref: '#/components/schemas/SwarmNodeAgentStatus' + $ref: "#/components/schemas/SwarmNodeAgentStatus" availability: type: string createdAt: @@ -9781,18 +11849,22 @@ components: type: string status: type: string + systemLabels: + additionalProperties: + type: string + type: object updatedAt: format: date-time type: string required: - - id - - hostname - - role - - availability - - status - - createdAt - - updatedAt - - agent + - id + - hostname + - role + - availability + - status + - createdAt + - updatedAt + - agent type: object SwarmNodeUpdateRequest: additionalProperties: false @@ -9800,7 +11872,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmNodeUpdateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmNodeUpdateRequest.json format: uri readOnly: true type: string @@ -9825,24 +11897,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseNodeSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseNodeSummary.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/SwarmNodeSummary' + $ref: "#/components/schemas/SwarmNodeSummary" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object SwarmPaginatedResponseServiceSummary: additionalProperties: false @@ -9850,24 +11922,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseServiceSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseServiceSummary.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/SwarmServiceSummary' + $ref: "#/components/schemas/SwarmServiceSummary" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object SwarmPaginatedResponseStackSummary: additionalProperties: false @@ -9875,24 +11947,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseStackSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseStackSummary.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/SwarmStackSummary' + $ref: "#/components/schemas/SwarmStackSummary" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object SwarmPaginatedResponseTaskSummary: additionalProperties: false @@ -9900,24 +11972,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseTaskSummary.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmPaginatedResponseTaskSummary.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/SwarmTaskSummary' + $ref: "#/components/schemas/SwarmTaskSummary" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object SwarmRuntimeStatus: additionalProperties: false @@ -9925,7 +11997,7 @@ components: enabled: type: boolean required: - - enabled + - enabled type: object SwarmSecretCreateRequest: additionalProperties: false @@ -9933,14 +12005,14 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSecretCreateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSecretCreateRequest.json format: uri readOnly: true type: string spec: description: Secret specification required: - - spec + - spec type: object SwarmSecretSummary: additionalProperties: false @@ -9951,18 +12023,18 @@ components: id: type: string spec: - $ref: '#/components/schemas/DockerSwarmSecretSpec' + $ref: "#/components/schemas/DockerSwarmSecretSpec" updatedAt: format: date-time type: string version: - $ref: '#/components/schemas/DockerSwarmVersion' + $ref: "#/components/schemas/DockerSwarmVersion" required: - - id - - version - - createdAt - - updatedAt - - spec + - id + - version + - createdAt + - updatedAt + - spec type: object SwarmSecretUpdateRequest: additionalProperties: false @@ -9970,7 +12042,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSecretUpdateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSecretUpdateRequest.json format: uri readOnly: true type: string @@ -9981,7 +12053,7 @@ components: minimum: 0 type: integer required: - - spec + - spec type: object SwarmServiceCreateOptions: additionalProperties: false @@ -9997,17 +12069,17 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceCreateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceCreateRequest.json format: uri readOnly: true type: string options: - $ref: '#/components/schemas/SwarmServiceCreateOptions' + $ref: "#/components/schemas/SwarmServiceCreateOptions" description: Additional create options spec: description: Service specification required: - - spec + - spec type: object SwarmServiceCreateResponse: additionalProperties: false @@ -10018,10 +12090,10 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" required: - - id + - id type: object SwarmServiceInspect: additionalProperties: false @@ -10030,41 +12102,41 @@ components: format: date-time type: string endpoint: - $ref: '#/components/schemas/DockerSwarmEndpoint' + $ref: "#/components/schemas/DockerSwarmEndpoint" id: type: string mounts: items: - $ref: '#/components/schemas/SwarmServiceMount' + $ref: "#/components/schemas/SwarmServiceMount" type: - - array - - 'null' + - array + - "null" networkDetails: additionalProperties: - $ref: '#/components/schemas/SwarmServiceNetworkDetail' + $ref: "#/components/schemas/SwarmServiceNetworkDetail" type: object nodes: items: type: string type: - - array - - 'null' + - array + - "null" spec: - $ref: '#/components/schemas/DockerSwarmServiceSpec' + $ref: "#/components/schemas/DockerSwarmServiceSpec" updateStatus: - $ref: '#/components/schemas/DockerSwarmUpdateStatus' + $ref: "#/components/schemas/DockerSwarmUpdateStatus" updatedAt: format: date-time type: string version: - $ref: '#/components/schemas/DockerSwarmVersion' + $ref: "#/components/schemas/DockerSwarmVersion" required: - - id - - version - - createdAt - - updatedAt - - spec - - endpoint + - id + - version + - createdAt + - updatedAt + - spec + - endpoint type: object SwarmServiceMount: additionalProperties: false @@ -10086,8 +12158,8 @@ components: type: string type: object required: - - type - - target + - type + - target type: object SwarmServiceNetworkConfigDetail: additionalProperties: false @@ -10100,16 +12172,16 @@ components: type: boolean ipv4Configs: items: - $ref: '#/components/schemas/SwarmServiceNetworkIPAMConfig' + $ref: "#/components/schemas/SwarmServiceNetworkIPAMConfig" type: - - array - - 'null' + - array + - "null" ipv6Configs: items: - $ref: '#/components/schemas/SwarmServiceNetworkIPAMConfig' + $ref: "#/components/schemas/SwarmServiceNetworkIPAMConfig" type: - - array - - 'null' + - array + - "null" name: type: string options: @@ -10119,11 +12191,11 @@ components: scope: type: string required: - - name - - driver - - scope - - enableIPv4 - - enableIPv6 + - name + - driver + - scope + - enableIPv4 + - enableIPv6 type: object SwarmServiceNetworkDetail: additionalProperties: false @@ -10133,7 +12205,7 @@ components: configFrom: type: string configNetwork: - $ref: '#/components/schemas/SwarmServiceNetworkConfigDetail' + $ref: "#/components/schemas/SwarmServiceNetworkConfigDetail" configOnly: type: boolean driver: @@ -10150,10 +12222,10 @@ components: type: boolean ipamConfigs: items: - $ref: '#/components/schemas/SwarmServiceNetworkIPAMConfig' + $ref: "#/components/schemas/SwarmServiceNetworkIPAMConfig" type: - - array - - 'null' + - array + - "null" name: type: string options: @@ -10163,16 +12235,16 @@ components: scope: type: string required: - - id - - name - - driver - - scope - - internal - - attachable - - ingress - - enableIPv4 - - enableIPv6 - - configOnly + - id + - name + - driver + - scope + - internal + - attachable + - ingress + - enableIPv4 + - enableIPv6 + - configOnly type: object SwarmServiceNetworkIPAMConfig: additionalProperties: false @@ -10200,8 +12272,8 @@ components: minimum: 0 type: integer required: - - protocol - - targetPort + - protocol + - targetPort type: object SwarmServiceScaleRequest: additionalProperties: false @@ -10209,7 +12281,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceScaleRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceScaleRequest.json format: uri readOnly: true type: string @@ -10218,7 +12290,7 @@ components: minimum: 0 type: integer required: - - replicas + - replicas type: object SwarmServiceSummary: additionalProperties: false @@ -10238,30 +12310,30 @@ components: type: string mounts: items: - $ref: '#/components/schemas/SwarmServiceMount' + $ref: "#/components/schemas/SwarmServiceMount" type: - - array - - 'null' + - array + - "null" name: type: string networks: items: type: string type: - - array - - 'null' + - array + - "null" nodes: items: type: string type: - - array - - 'null' + - array + - "null" ports: items: - $ref: '#/components/schemas/SwarmServicePort' + $ref: "#/components/schemas/SwarmServicePort" type: - - array - - 'null' + - array + - "null" replicas: format: int64 minimum: 0 @@ -10276,19 +12348,19 @@ components: format: date-time type: string required: - - id - - name - - image - - mode - - replicas - - runningReplicas - - ports - - createdAt - - updatedAt - - labels - - nodes - - networks - - mounts + - id + - name + - image + - mode + - replicas + - runningReplicas + - ports + - createdAt + - updatedAt + - labels + - nodes + - networks + - mounts type: object SwarmServiceUpdateOptions: additionalProperties: false @@ -10308,21 +12380,21 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceUpdateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmServiceUpdateRequest.json format: uri readOnly: true type: string options: - $ref: '#/components/schemas/SwarmServiceUpdateOptions' + $ref: "#/components/schemas/SwarmServiceUpdateOptions" spec: - $ref: '#/components/schemas/DockerSwarmServiceSpec' + $ref: "#/components/schemas/DockerSwarmServiceSpec" version: format: int64 minimum: 0 type: integer required: - - version - - spec + - version + - spec type: object SwarmServiceUpdateResponse: additionalProperties: false @@ -10331,8 +12403,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" type: object SwarmStackDeployRequest: additionalProperties: false @@ -10340,7 +12412,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackDeployRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackDeployRequest.json format: uri readOnly: true type: string @@ -10348,6 +12420,12 @@ components: type: string envContent: type: string + files: + items: + $ref: "#/components/schemas/SwarmSyncFile" + type: + - array + - "null" name: type: string prune: @@ -10356,9 +12434,11 @@ components: type: string withRegistryAuth: type: boolean + workingDir: + type: string required: - - name - - composeContent + - name + - composeContent type: object SwarmStackDeployResponse: additionalProperties: false @@ -10366,7 +12446,7 @@ components: name: type: string required: - - name + - name type: object SwarmStackInspect: additionalProperties: false @@ -10385,11 +12465,11 @@ components: format: date-time type: string required: - - name - - namespace - - services - - createdAt - - updatedAt + - name + - namespace + - services + - createdAt + - updatedAt type: object SwarmStackRenderConfigRequest: additionalProperties: false @@ -10397,7 +12477,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackRenderConfigRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackRenderConfigRequest.json format: uri readOnly: true type: string @@ -10408,8 +12488,8 @@ components: name: type: string required: - - name - - composeContent + - name + - composeContent type: object SwarmStackRenderConfigResponse: additionalProperties: false @@ -10418,50 +12498,50 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" name: type: string networks: items: type: string type: - - array - - 'null' + - array + - "null" renderedCompose: type: string secrets: items: type: string type: - - array - - 'null' + - array + - "null" services: items: type: string type: - - array - - 'null' + - array + - "null" volumes: items: type: string type: - - array - - 'null' + - array + - "null" warnings: items: type: string type: - - array - - 'null' + - array + - "null" required: - - name - - renderedCompose - - services - - networks - - volumes - - configs - - secrets + - name + - renderedCompose + - services + - networks + - volumes + - configs + - secrets type: object SwarmStackSource: additionalProperties: false @@ -10470,11 +12550,40 @@ components: type: string envContent: type: string + files: + items: + $ref: "#/components/schemas/SwarmSyncFile" + type: + - array + - "null" name: type: string required: - - name - - composeContent + - name + - composeContent + type: object + SwarmStackSourceUpdateRequest: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackSourceUpdateRequest.json + format: uri + readOnly: true + type: string + composeContent: + type: string + envContent: + type: string + files: + items: + $ref: "#/components/schemas/SwarmSyncFile" + type: + - array + - "null" + required: + - composeContent type: object SwarmStackSummary: additionalProperties: false @@ -10495,12 +12604,12 @@ components: format: date-time type: string required: - - id - - name - - namespace - - services - - createdAt - - updatedAt + - id + - name + - namespace + - services + - createdAt + - updatedAt type: object SwarmSwarmInfo: additionalProperties: false @@ -10513,16 +12622,16 @@ components: rootRotationInProgress: type: boolean spec: - $ref: '#/components/schemas/DockerSwarmSpec' + $ref: "#/components/schemas/DockerSwarmSpec" updatedAt: format: date-time type: string required: - - id - - createdAt - - updatedAt - - spec - - rootRotationInProgress + - id + - createdAt + - updatedAt + - spec + - rootRotationInProgress type: object SwarmSwarmInitRequest: additionalProperties: false @@ -10530,7 +12639,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmInitRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmInitRequest.json format: uri readOnly: true type: string @@ -10550,20 +12659,20 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" forceNewCluster: type: boolean listenAddr: type: string spec: - $ref: '#/components/schemas/DockerSwarmSpec' + description: Swarm specification subnetSize: format: int32 minimum: 0 type: integer required: - - spec + - spec type: object SwarmSwarmInitResponse: additionalProperties: false @@ -10571,7 +12680,7 @@ components: nodeId: type: string required: - - nodeId + - nodeId type: object SwarmSwarmJoinRequest: additionalProperties: false @@ -10579,7 +12688,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmJoinRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmJoinRequest.json format: uri readOnly: true type: string @@ -10597,11 +12706,11 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" required: - - remoteAddrs - - joinToken + - remoteAddrs + - joinToken type: object SwarmSwarmJoinTokensResponse: additionalProperties: false @@ -10611,8 +12720,8 @@ components: worker: type: string required: - - worker - - manager + - worker + - manager type: object SwarmSwarmLeaveRequest: additionalProperties: false @@ -10620,7 +12729,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmLeaveRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmLeaveRequest.json format: uri readOnly: true type: string @@ -10633,7 +12742,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmRotateJoinTokensRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmRotateJoinTokensRequest.json format: uri readOnly: true type: string @@ -10648,7 +12757,7 @@ components: unlockKey: type: string required: - - unlockKey + - unlockKey type: object SwarmSwarmUnlockRequest: additionalProperties: false @@ -10656,14 +12765,14 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmUnlockRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmUnlockRequest.json format: uri readOnly: true type: string key: type: string required: - - key + - key type: object SwarmSwarmUpdateRequest: additionalProperties: false @@ -10671,7 +12780,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmUpdateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmSwarmUpdateRequest.json format: uri readOnly: true type: string @@ -10682,13 +12791,25 @@ components: rotateWorkerToken: type: boolean spec: - $ref: '#/components/schemas/DockerSwarmSpec' + description: Updated swarm specification version: format: int64 minimum: 0 type: integer required: - - spec + - spec + type: object + SwarmSyncFile: + additionalProperties: false + properties: + content: + contentEncoding: base64 + type: string + relativePath: + type: string + required: + - relativePath + - content type: object SwarmTaskSummary: additionalProperties: false @@ -10725,16 +12846,16 @@ components: format: date-time type: string required: - - id - - name - - serviceId - - serviceName - - nodeId - - nodeName - - desiredState - - currentState - - createdAt - - updatedAt + - id + - name + - serviceId + - serviceName + - nodeId + - nodeName + - desiredState + - currentState + - createdAt + - updatedAt type: object SystemConvertDockerRunRequest: additionalProperties: false @@ -10742,53 +12863,213 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SystemConvertDockerRunRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SystemConvertDockerRunRequest.json + format: uri + readOnly: true + type: string + dockerRunCommand: + type: string + required: + - dockerRunCommand + type: object + SystemConvertDockerRunResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/SystemConvertDockerRunResponse.json + format: uri + readOnly: true + type: string + dockerCompose: + type: string + envVars: + type: string + serviceName: + type: string + success: + type: boolean + required: + - success + - dockerCompose + - envVars + - serviceName + type: object + SystemDiagnostics: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/SystemDiagnostics.json + format: uri + readOnly: true + type: string + gc: + $ref: "#/components/schemas/SystemGCInfo" + memory: + $ref: "#/components/schemas/SystemMemoryInfo" + runtime: + $ref: "#/components/schemas/SystemRuntimeInfo" + timestamp: + format: date-time + type: string + websocket: + $ref: "#/components/schemas/SystemWebSocketDiagnostics" + required: + - timestamp + - runtime + - memory + - gc + - websocket + type: object + SystemGCInfo: + additionalProperties: false + properties: + lastGc: + format: date-time + type: string + numGc: + format: int64 + type: integer + pauseTotalNs: + format: int64 + type: integer + recentPausesNs: + items: + format: int64 + type: integer + type: + - array + - "null" + required: + - lastGc + - numGc + - pauseTotalNs + - recentPausesNs + type: object + SystemHealthResponse: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/SystemHealthResponse.json format: uri readOnly: true type: string - dockerRunCommand: + status: type: string required: - - dockerRunCommand + - status type: object - SystemConvertDockerRunResponse: + SystemLogEntry: additionalProperties: false properties: - $schema: - description: A URL to the JSON Schema for this object. - examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SystemConvertDockerRunResponse.json - format: uri - readOnly: true - type: string - dockerCompose: + attrs: + additionalProperties: {} + type: object + level: type: string - envVars: + message: type: string - serviceName: + time: + format: date-time type: string - success: - type: boolean required: - - success - - dockerCompose - - envVars - - serviceName + - time + - level + - message type: object - SystemHealthResponse: + SystemMemoryInfo: additionalProperties: false properties: - $schema: - description: A URL to the JSON Schema for this object. - examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SystemHealthResponse.json - format: uri - readOnly: true - type: string - status: - type: string + alloc: + format: int64 + minimum: 0 + type: integer + gcCpuFraction: + format: double + type: number + heapAlloc: + format: int64 + minimum: 0 + type: integer + heapIdle: + format: int64 + minimum: 0 + type: integer + heapInuse: + format: int64 + minimum: 0 + type: integer + heapObjects: + format: int64 + minimum: 0 + type: integer + heapReleased: + format: int64 + minimum: 0 + type: integer + heapSys: + format: int64 + minimum: 0 + type: integer + mcacheInuse: + format: int64 + minimum: 0 + type: integer + mspanInuse: + format: int64 + minimum: 0 + type: integer + nextGc: + format: int64 + minimum: 0 + type: integer + numForcedGc: + format: int32 + minimum: 0 + type: integer + numGc: + format: int32 + minimum: 0 + type: integer + stackInuse: + format: int64 + minimum: 0 + type: integer + stackSys: + format: int64 + minimum: 0 + type: integer + sys: + format: int64 + minimum: 0 + type: integer + totalAlloc: + format: int64 + minimum: 0 + type: integer required: - - status + - alloc + - totalAlloc + - sys + - heapAlloc + - heapSys + - heapInuse + - heapIdle + - heapReleased + - heapObjects + - stackInuse + - stackSys + - mspanInuse + - mcacheInuse + - nextGc + - numGc + - numForcedGc + - gcCpuFraction type: object SystemPruneAllRequest: additionalProperties: false @@ -10796,33 +13077,26 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/SystemPruneAllRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/SystemPruneAllRequest.json format: uri readOnly: true type: string buildCache: - type: boolean + $ref: "#/components/schemas/SystemPruneBuildCacheOptions" containers: - type: boolean - dangling: - type: boolean + $ref: "#/components/schemas/SystemPruneContainersOptions" images: - type: boolean + $ref: "#/components/schemas/SystemPruneImagesOptions" networks: - type: boolean + $ref: "#/components/schemas/SystemPruneNetworksOptions" volumes: - type: boolean - required: - - containers - - images - - volumes - - networks - - buildCache - - dangling + $ref: "#/components/schemas/SystemPruneVolumesOptions" type: object SystemPruneAllResult: additionalProperties: false properties: + activityId: + type: string buildCacheSpaceReclaimed: format: int64 minimum: 0 @@ -10835,14 +13109,14 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" errors: items: type: string type: - - array - - 'null' + - array + - "null" imageSpaceReclaimed: format: int64 minimum: 0 @@ -10851,14 +13125,14 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" networksDeleted: items: type: string type: - - array - - 'null' + - array + - "null" spaceReclaimed: format: int64 minimum: 0 @@ -10873,11 +13147,166 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" + required: + - spaceReclaimed + - success + type: object + SystemPruneBuildCacheOptions: + additionalProperties: false + properties: + mode: + type: string + until: + type: string + required: + - mode + type: object + SystemPruneContainersOptions: + additionalProperties: false + properties: + mode: + type: string + until: + type: string + required: + - mode + type: object + SystemPruneImagesOptions: + additionalProperties: false + properties: + mode: + type: string + until: + type: string + required: + - mode + type: object + SystemPruneNetworksOptions: + additionalProperties: false + properties: + mode: + type: string + until: + type: string + required: + - mode + type: object + SystemPruneVolumesOptions: + additionalProperties: false + properties: + mode: + type: string + required: + - mode + type: object + SystemRuntimeInfo: + additionalProperties: false + properties: + arch: + type: string + goVersion: + type: string + gomaxprocs: + format: int64 + type: integer + goroutines: + format: int64 + type: integer + numCgoCall: + format: int64 + type: integer + numCpu: + format: int64 + type: integer + os: + type: string + uptimeSeconds: + format: int64 + type: integer + wsWorkerGoroutines: + format: int64 + type: integer + required: + - goroutines + - wsWorkerGoroutines + - gomaxprocs + - numCpu + - goVersion + - os + - arch + - numCgoCall + - uptimeSeconds + type: object + SystemWebSocketConnectionInfo: + additionalProperties: false + properties: + clientIp: + type: string + envId: + type: string + id: + type: string + kind: + type: string + resourceId: + type: string + startedAt: + format: date-time + type: string + userAgent: + type: string + userId: + type: string + required: + - id + - kind + - startedAt + type: object + SystemWebSocketDiagnostics: + additionalProperties: false + properties: + connections: + items: + $ref: "#/components/schemas/SystemWebSocketConnectionInfo" + type: + - array + - "null" + snapshot: + $ref: "#/components/schemas/SystemWebSocketMetricsSnapshot" + required: + - snapshot + - connections + type: object + SystemWebSocketMetricsSnapshot: + additionalProperties: false + properties: + containerExec: + format: int64 + type: integer + containerLogsActive: + format: int64 + type: integer + containerStats: + format: int64 + type: integer + projectLogsActive: + format: int64 + type: integer + serviceLogsActive: + format: int64 + type: integer + systemStats: + format: int64 + type: integer required: - - spaceReclaimed - - success + - projectLogsActive + - containerLogsActive + - containerStats + - containerExec + - systemStats + - serviceLogsActive type: object TemplateCreateRegistryRequest: additionalProperties: false @@ -10885,7 +13314,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateCreateRegistryRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateCreateRegistryRequest.json format: uri readOnly: true type: string @@ -10898,10 +13327,10 @@ components: url: type: string required: - - name - - url - - description - - enabled + - name + - url + - description + - enabled type: object TemplateCreateRequest: additionalProperties: false @@ -10909,7 +13338,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateCreateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateCreateRequest.json format: uri readOnly: true type: string @@ -10922,10 +13351,10 @@ components: name: type: string required: - - name - - description - - content - - envContent + - name + - description + - content + - envContent type: object TemplateDefaultTemplatesResponse: additionalProperties: false @@ -10939,10 +13368,10 @@ components: swarmStackTemplate: type: string required: - - composeTemplate - - swarmStackTemplate - - swarmStackEnvTemplate - - envTemplate + - composeTemplate + - swarmStackTemplate + - swarmStackEnvTemplate + - envTemplate type: object TemplatePaginatedResponse: additionalProperties: false @@ -10950,24 +13379,24 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplatePaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplatePaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/TemplateTemplate' + $ref: "#/components/schemas/TemplateTemplate" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination type: object TemplateRemoteRegistry: additionalProperties: false @@ -10982,21 +13411,21 @@ components: type: string templates: items: - $ref: '#/components/schemas/TemplateRemoteTemplate' + $ref: "#/components/schemas/TemplateRemoteTemplate" type: - - array - - 'null' + - array + - "null" url: type: string version: type: string required: - - version - - author - - templates - - name - - description - - url + - version + - author + - templates + - name + - description + - url type: object TemplateRemoteTemplate: additionalProperties: false @@ -11019,20 +13448,20 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" version: type: string required: - - version - - author - - compose_url - - env_url - - documentation_url - - tags - - id - - name - - description + - version + - author + - compose_url + - env_url + - documentation_url + - tags + - id + - name + - description type: object TemplateSaveDefaultTemplatesRequest: additionalProperties: false @@ -11040,7 +13469,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateSaveDefaultTemplatesRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateSaveDefaultTemplatesRequest.json format: uri readOnly: true type: string @@ -11049,8 +13478,8 @@ components: envContent: type: string required: - - composeContent - - envContent + - composeContent + - envContent type: object TemplateTemplate: additionalProperties: false @@ -11068,20 +13497,20 @@ components: isRemote: type: boolean metadata: - $ref: '#/components/schemas/MetaTemplateMeta' + $ref: "#/components/schemas/MetaTemplateMeta" name: type: string registry: - $ref: '#/components/schemas/TemplateTemplateRegistry' + $ref: "#/components/schemas/TemplateTemplateRegistry" registryId: type: string required: - - content - - isCustom - - isRemote - - id - - name - - description + - content + - isCustom + - isRemote + - id + - name + - description type: object TemplateTemplateContent: additionalProperties: false @@ -11092,24 +13521,24 @@ components: type: string envVariables: items: - $ref: '#/components/schemas/EnvVariable' + $ref: "#/components/schemas/EnvVariable" type: - - array - - 'null' + - array + - "null" services: items: type: string type: - - array - - 'null' + - array + - "null" template: - $ref: '#/components/schemas/TemplateTemplate' + $ref: "#/components/schemas/TemplateTemplate" required: - - template - - content - - envContent - - services - - envVariables + - template + - content + - envContent + - services + - envVariables type: object TemplateTemplateRegistry: additionalProperties: false @@ -11120,16 +13549,18 @@ components: type: boolean id: type: string + lastFetchError: + type: string name: type: string url: type: string required: - - id - - enabled - - name - - description - - url + - id + - enabled + - name + - description + - url type: object TemplateUpdateRegistryRequest: additionalProperties: false @@ -11137,7 +13568,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateUpdateRegistryRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateUpdateRegistryRequest.json format: uri readOnly: true type: string @@ -11150,10 +13581,10 @@ components: url: type: string required: - - name - - url - - description - - enabled + - name + - url + - description + - enabled type: object TemplateUpdateRequest: additionalProperties: false @@ -11161,7 +13592,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateUpdateRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/TemplateUpdateRequest.json format: uri readOnly: true type: string @@ -11174,10 +13605,10 @@ components: name: type: string required: - - name - - description - - content - - envContent + - name + - description + - content + - envContent type: object Ulimit: additionalProperties: false @@ -11191,9 +13622,9 @@ components: format: int64 type: integer required: - - Name - - Hard - - Soft + - Name + - Hard + - Soft type: object UlimitsConfig: additionalProperties: false @@ -11235,90 +13666,148 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateContainerRegistryRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateContainerRegistryRequest.json format: uri readOnly: true type: string awsAccessKeyId: type: - - string - - 'null' + - string + - "null" awsRegion: type: - - string - - 'null' + - string + - "null" awsSecretAccessKey: type: - - string - - 'null' + - string + - "null" description: type: - - string - - 'null' + - string + - "null" enabled: type: - - boolean - - 'null' + - boolean + - "null" insecure: type: - - boolean - - 'null' + - boolean + - "null" registryType: type: - - string - - 'null' + - string + - "null" token: type: - - string - - 'null' + - string + - "null" url: type: - - string - - 'null' + - string + - "null" username: type: - - string - - 'null' + - string + - "null" + required: + - url + - username + - token + - description + - insecure + - enabled + - registryType + - awsAccessKeyId + - awsSecretAccessKey + - awsRegion + type: object + UpdateGitRepositoryRequest: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateGitRepositoryRequest.json + format: uri + readOnly: true + type: string + authType: + type: string + description: + type: string + enabled: + type: boolean + name: + type: string + sshHostKeyVerification: + type: string + sshKey: + type: string + token: + type: string + url: + type: string + username: + type: string + type: object + UpdateMyProfileInputBody: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateMyProfileInputBody.json + format: uri + readOnly: true + type: string + displayName: + type: string + email: + type: string + fontSize: + format: int64 + maximum: 20 + minimum: 12 + type: integer + locale: + type: string + type: object + UpdateOidcRoleMappingOutputBody: + additionalProperties: false + properties: + $schema: + description: A URL to the JSON Schema for this object. + examples: + - https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateOidcRoleMappingOutputBody.json + format: uri + readOnly: true + type: string + data: + $ref: "#/components/schemas/RoleOidcRoleMapping" + success: + type: boolean required: - - url - - username - - token - - description - - insecure - - enabled - - registryType - - awsAccessKeyId - - awsSecretAccessKey - - awsRegion + - success + - data type: object - UpdateGitRepositoryRequest: + UpdateProjectServicesInputBody: additionalProperties: false properties: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateGitRepositoryRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateProjectServicesInputBody.json format: uri readOnly: true type: string - authType: - type: string - description: - type: string - enabled: - type: boolean - name: - type: string - sshHostKeyVerification: - type: string - sshKey: - type: string - token: - type: string - url: - type: string - username: - type: string + services: + description: Service names to update; empty updates all services + items: + type: string + type: + - array + - "null" type: object UpdaterOptions: additionalProperties: false @@ -11326,7 +13815,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/UpdaterOptions.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/UpdaterOptions.json format: uri readOnly: true type: string @@ -11338,8 +13827,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" type: type: string type: object @@ -11372,13 +13861,15 @@ components: updateAvailable: type: boolean required: - - resourceId - - resourceType - - status + - resourceId + - resourceType + - status type: object UpdaterResult: additionalProperties: false properties: + activityId: + type: string checked: format: int64 type: integer @@ -11391,10 +13882,13 @@ components: type: integer items: items: - $ref: '#/components/schemas/UpdaterResourceResult' + $ref: "#/components/schemas/UpdaterResourceResult" type: - - array - - 'null' + - array + - "null" + restarted: + format: int64 + type: integer skipped: format: int64 type: integer @@ -11406,12 +13900,12 @@ components: format: int64 type: integer required: - - checked - - updated - - skipped - - failed - - duration - - items + - checked + - updated + - skipped + - failed + - duration + - items type: object UpdaterStatus: additionalProperties: false @@ -11420,14 +13914,14 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" projectIds: items: type: string type: - - array - - 'null' + - array + - "null" updatingContainers: format: int64 type: integer @@ -11435,10 +13929,10 @@ components: format: int64 type: integer required: - - updatingContainers - - updatingProjects - - containerIds - - projectIds + - updatingContainers + - updatingProjects + - containerIds + - projectIds type: object UpgradeCheckResultData: additionalProperties: false @@ -11446,7 +13940,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/UpgradeCheckResultData.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/UpgradeCheckResultData.json format: uri readOnly: true type: string @@ -11457,9 +13951,9 @@ components: message: type: string required: - - canUpgrade - - error - - message + - canUpgrade + - error + - message type: object UserCreateUser: additionalProperties: false @@ -11467,49 +13961,40 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/UserCreateUser.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/UserCreateUser.json format: uri readOnly: true type: string displayName: description: Display name of the user examples: - - John Doe + - John Doe maxLength: 255 type: string email: description: Email address of the user examples: - - john@example.com + - john@example.com type: string locale: description: Locale preference of the user examples: - - en-US + - en-US type: string password: description: Password of the user minLength: 8 type: string - roles: - description: Roles assigned to the user - examples: - - - user - items: - type: string - type: - - array - - 'null' username: description: Username of the user examples: - - johndoe + - johndoe maxLength: 255 minLength: 1 type: string required: - - username - - password + - username + - password type: object UserPaginatedResponse: additionalProperties: false @@ -11517,24 +14002,43 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/UserPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/UserPaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/UserUser' + $ref: "#/components/schemas/UserUser" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - pagination + - success + - data + - pagination + type: object + UserRoleAssignmentSummary: + additionalProperties: false + properties: + environmentId: + description: Environment ID this assignment is scoped to; omit for a global assignment + type: string + roleId: + description: Role ID granted by this assignment + type: string + source: + description: How the assignment was created + enum: + - manual + - oidc + type: string + required: + - roleId + - source type: object UserUpdateUser: additionalProperties: false @@ -11542,7 +14046,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/UserUpdateUser.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/UserUpdateUser.json format: uri readOnly: true type: string @@ -11560,13 +14064,6 @@ components: description: New password for the user minLength: 8 type: string - roles: - description: Roles assigned to the user - items: - type: string - type: - - array - - 'null' username: description: Username of the user maxLength: 255 @@ -11576,6 +14073,9 @@ components: UserUser: additionalProperties: false properties: + avatarUrl: + description: URL to the user's custom avatar image; omitted when using the default profile picture + type: string canDelete: description: Whether the user can currently be deleted type: boolean @@ -11585,53 +14085,72 @@ components: displayName: description: Display name of the user examples: - - John Doe + - John Doe type: string email: description: Email address of the user examples: - - john@example.com + - john@example.com type: string + fontSize: + description: Preferred root UI font size in px + examples: + - 14 + format: int64 + maximum: 20 + minimum: 12 + type: integer id: description: Unique identifier of the user examples: - - 550e8400-e29b-41d4-a716-446655440000 + - 550e8400-e29b-41d4-a716-446655440000 type: string + isGlobalAdmin: + description: Whether the user effectively holds global administrator access + type: boolean locale: description: Locale preference of the user examples: - - en-US + - en-US type: string oidcSubjectId: description: OIDC subject identifier for SSO users type: string + permissionsByEnv: + additionalProperties: + items: + type: string + type: + - array + - "null" + description: Permissions the user effectively holds, keyed by environment ID. The 'global' key holds permissions that apply across every environment (and to org-level endpoints). + type: object requiresPasswordChange: description: Whether the user must change their password type: boolean - roles: - description: Roles assigned to the user - examples: - - - user - - admin + roleAssignments: + description: Role assignments held by the user items: - type: string + $ref: "#/components/schemas/UserRoleAssignmentSummary" type: - - array - - 'null' + - array + - "null" updatedAt: description: Date and time when the user was last updated type: string username: description: Username of the user examples: - - johndoe + - johndoe type: string required: - - id - - username - - roles - - canDelete - - requiresPasswordChange + - id + - username + - roleAssignments + - permissionsByEnv + - isGlobalAdmin + - canDelete + - requiresPasswordChange type: object Value: additionalProperties: false @@ -11642,7 +14161,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/VersionCheck.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/VersionCheck.json format: uri readOnly: true type: string @@ -11655,8 +14174,8 @@ components: updateAvailable: type: boolean required: - - currentVersion - - updateAvailable + - currentVersion + - updateAvailable type: object VersionInfo: additionalProperties: false @@ -11664,7 +14183,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/VersionInfo.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/VersionInfo.json format: uri readOnly: true type: string @@ -11682,8 +14201,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" goVersion: type: string isSemverVersion: @@ -11692,26 +14211,38 @@ components: type: string newestVersion: type: string + nodeVersion: + type: string + releaseNotes: + type: string releaseUrl: type: string + releasedAt: + type: string revision: type: string shortRevision: type: string + svelteKitVersion: + type: string updateAvailable: type: boolean required: - - currentVersion - - revision - - shortRevision - - goVersion - - displayVersion - - isSemverVersion - - updateAvailable + - currentVersion + - revision + - shortRevision + - goVersion + - nodeVersion + - svelteKitVersion + - displayVersion + - isSemverVersion + - updateAvailable type: object VolumeBackup: additionalProperties: false properties: + activityId: + type: string createdAt: format: date-time type: string @@ -11726,10 +14257,10 @@ components: volumeName: type: string required: - - volumeName - - size - - createdAt - - id + - volumeName + - size + - createdAt + - id type: object VolumeBackupPaginatedResponse: additionalProperties: false @@ -11737,30 +14268,30 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/VolumeBackupPaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/VolumeBackupPaginatedResponse.json format: uri readOnly: true type: string data: items: - $ref: '#/components/schemas/VolumeBackup' + $ref: "#/components/schemas/VolumeBackup" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean warnings: items: type: string type: - - array - - 'null' + - array + - "null" required: - - success - - data - - pagination + - success + - data + - pagination type: object VolumeCreate: additionalProperties: false @@ -11768,7 +14299,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/VolumeCreate.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/VolumeCreate.json format: uri readOnly: true type: string @@ -11790,7 +14321,7 @@ components: minLength: 1 type: string required: - - name + - name type: object VolumeFileEntry: additionalProperties: false @@ -11822,13 +14353,13 @@ components: format: int64 type: integer required: - - name - - path - - isDirectory - - size - - modTime - - mode - - isSymlink + - name + - path + - isDirectory + - size + - modTime + - mode + - isSymlink type: object VolumePaginatedResponse: additionalProperties: false @@ -11836,31 +14367,33 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/VolumePaginatedResponse.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/VolumePaginatedResponse.json format: uri readOnly: true type: string counts: - $ref: '#/components/schemas/VolumeUsageCountsData' + $ref: "#/components/schemas/VolumeUsageCountsData" data: items: - $ref: '#/components/schemas/VolumeVolume' + $ref: "#/components/schemas/VolumeVolume" type: - - array - - 'null' + - array + - "null" pagination: - $ref: '#/components/schemas/BasePaginationResponse' + $ref: "#/components/schemas/BasePaginationResponse" success: type: boolean required: - - success - - data - - counts - - pagination + - success + - data + - counts + - pagination type: object VolumePruneReportData: additionalProperties: false properties: + activityId: + type: string spaceReclaimed: format: int64 minimum: 0 @@ -11869,10 +14402,10 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" required: - - spaceReclaimed + - spaceReclaimed type: object VolumeSizeInfo: additionalProperties: false @@ -11886,9 +14419,9 @@ components: format: int64 type: integer required: - - name - - size - - refCount + - name + - size + - refCount type: object VolumeUsageCountsData: additionalProperties: false @@ -11903,9 +14436,9 @@ components: format: int64 type: integer required: - - inuse - - unused - - total + - inuse + - unused + - total type: object VolumeUsageResponse: additionalProperties: false @@ -11914,23 +14447,25 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" inUse: type: boolean required: - - inUse - - containers + - inUse + - containers type: object VolumeVolume: additionalProperties: false properties: + activityId: + type: string containers: items: type: string type: - - array - - 'null' + - array + - "null" createdAt: type: string driver: @@ -11957,19 +14492,19 @@ components: format: int64 type: integer usageData: - $ref: '#/components/schemas/DockerVolumeUsageData' - required: - - id - - name - - driver - - mountpoint - - scope - - options - - labels - - createdAt - - inUse - - size - - containers + $ref: "#/components/schemas/DockerVolumeUsageData" + required: + - id + - name + - driver + - mountpoint + - scope + - options + - labels + - createdAt + - inUse + - size + - containers type: object VulnerabilityCVSSInfo: additionalProperties: false @@ -11992,13 +14527,13 @@ components: format: int64 type: integer summary: - $ref: '#/components/schemas/VulnerabilitySeveritySummary' + $ref: "#/components/schemas/VulnerabilitySeveritySummary" totalImages: format: int64 type: integer required: - - totalImages - - scannedImages + - totalImages + - scannedImages type: object VulnerabilityIgnorePayload: additionalProperties: false @@ -12006,38 +14541,38 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/VulnerabilityIgnorePayload.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/VulnerabilityIgnorePayload.json format: uri readOnly: true type: string createdBy: examples: - - user-123 + - user-123 type: string imageId: examples: - - sha256:abc123 + - sha256:abc123 type: string installedVersion: examples: - - 1.1.1l + - 1.1.1l type: string pkgName: examples: - - openssl + - openssl type: string reason: examples: - - False positive - not exploitable + - False positive - not exploitable type: string vulnerabilityId: examples: - - CVE-2023-1234 + - CVE-2023-1234 type: string required: - - imageId - - vulnerabilityId - - pkgName + - imageId + - vulnerabilityId + - pkgName type: object VulnerabilityIgnoredVulnerability: additionalProperties: false @@ -12062,18 +14597,20 @@ components: vulnerabilityId: type: string required: - - id - - environmentId - - imageId - - vulnerabilityId - - pkgName - - installedVersion - - createdBy - - createdAt + - id + - environmentId + - imageId + - vulnerabilityId + - pkgName + - installedVersion + - createdBy + - createdAt type: object VulnerabilityScanResult: additionalProperties: false properties: + activityId: + type: string duration: format: int64 type: integer @@ -12093,18 +14630,18 @@ components: status: type: string summary: - $ref: '#/components/schemas/VulnerabilitySeveritySummary' + $ref: "#/components/schemas/VulnerabilitySeveritySummary" vulnerabilities: items: - $ref: '#/components/schemas/VulnerabilityVulnerability' + $ref: "#/components/schemas/VulnerabilityVulnerability" type: - - array - - 'null' + - array + - "null" required: - - imageId - - imageName - - scanTime - - status + - imageId + - imageName + - scanTime + - status type: object VulnerabilityScanSummariesRequest: additionalProperties: false @@ -12112,7 +14649,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/VulnerabilityScanSummariesRequest.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/VulnerabilityScanSummariesRequest.json format: uri readOnly: true type: string @@ -12120,20 +14657,20 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" required: - - imageIds + - imageIds type: object VulnerabilityScanSummariesResponse: additionalProperties: false properties: summaries: additionalProperties: - $ref: '#/components/schemas/VulnerabilityScanSummary' + $ref: "#/components/schemas/VulnerabilityScanSummary" type: object required: - - summaries + - summaries type: object VulnerabilityScanSummary: additionalProperties: false @@ -12150,11 +14687,11 @@ components: status: type: string summary: - $ref: '#/components/schemas/VulnerabilitySeveritySummary' + $ref: "#/components/schemas/VulnerabilitySeveritySummary" required: - - imageId - - scanTime - - status + - imageId + - scanTime + - status type: object VulnerabilitySeveritySummary: additionalProperties: false @@ -12178,18 +14715,18 @@ components: format: int64 type: integer required: - - critical - - high - - medium - - low - - unknown - - total + - critical + - high + - medium + - low + - unknown + - total type: object VulnerabilityVulnerability: additionalProperties: false properties: cvss: - $ref: '#/components/schemas/VulnerabilityCVSSInfo' + $ref: "#/components/schemas/VulnerabilityCVSSInfo" description: type: string fixedVersion: @@ -12208,8 +14745,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" severity: type: string title: @@ -12217,16 +14754,16 @@ components: vulnerabilityId: type: string required: - - vulnerabilityId - - pkgName - - installedVersion - - severity + - vulnerabilityId + - pkgName + - installedVersion + - severity type: object VulnerabilityVulnerabilityWithImage: additionalProperties: false properties: cvss: - $ref: '#/components/schemas/VulnerabilityCVSSInfo' + $ref: "#/components/schemas/VulnerabilityCVSSInfo" description: type: string fixedVersion: @@ -12249,8 +14786,8 @@ components: items: type: string type: - - array - - 'null' + - array + - "null" severity: type: string title: @@ -12258,12 +14795,12 @@ components: vulnerabilityId: type: string required: - - imageId - - imageName - - vulnerabilityId - - pkgName - - installedVersion - - severity + - imageId + - imageName + - vulnerabilityId + - pkgName + - installedVersion + - severity type: object WebhookCreateInput: additionalProperties: false @@ -12271,23 +14808,22 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/WebhookCreateInput.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/WebhookCreateInput.json format: uri readOnly: true type: string actionType: - description: Action to run for the selected target type. Supported values - depend on targetType. + description: Action to run for the selected target type. Supported values depend on targetType. enum: - - update - - start - - stop - - restart - - redeploy - - up - - down - - run - - sync + - update + - start + - stop + - restart + - redeploy + - up + - down + - run + - sync type: string name: description: Human-readable name for this webhook @@ -12295,23 +14831,21 @@ components: minLength: 1 type: string targetId: - description: Container ID, project ID, or GitOps sync ID to target. Leave - empty for 'updater' webhooks. + description: Container ID, project ID, or GitOps sync ID to target. Leave empty for 'updater' webhooks. type: string targetType: - description: 'Resource type this webhook targets: ''container'', ''project'', - ''updater'', or ''gitops''' + description: "Resource type this webhook targets: 'container', 'project', 'updater', or 'gitops'" enum: - - container - - project - - updater - - gitops + - container + - project + - updater + - gitops type: string required: - - name - - targetType - - actionType - - targetId + - name + - targetType + - actionType + - targetId type: object WebhookCreated: additionalProperties: false @@ -12336,17 +14870,16 @@ components: description: Target type type: string token: - description: Full webhook token — store this securely, it will not be shown - again + description: Full webhook token — store this securely, it will not be shown again type: string required: - - id - - name - - token - - targetType - - actionType - - targetId - - createdAt + - id + - name + - token + - targetType + - actionType + - targetId + - createdAt type: object WebhookSummary: additionalProperties: false @@ -12381,21 +14914,21 @@ components: description: Resolved target resource name when available type: string targetType: - description: 'Target type: ''container'', ''project'', ''updater'', or ''gitops''' + description: "Target type: 'container', 'project', 'updater', or 'gitops'" type: string tokenPrefix: description: Masked token prefix for identification type: string required: - - id - - name - - tokenPrefix - - targetType - - actionType - - targetId - - environmentId - - enabled - - createdAt + - id + - name + - tokenPrefix + - targetType + - actionType + - targetId + - environmentId + - enabled + - createdAt type: object WebhookUpdateInput: additionalProperties: false @@ -12403,7 +14936,7 @@ components: $schema: description: A URL to the JSON Schema for this object. examples: - - https://arcane.randomsynergy.xyz:3552/api/schemas/WebhookUpdateInput.json + - https://arcane.randomsynergy.xyz:3552/api/schemas/WebhookUpdateInput.json format: uri readOnly: true type: string @@ -12411,7 +14944,7 @@ components: description: Whether the webhook is active type: boolean required: - - enabled + - enabled type: object securitySchemes: ApiKeyAuth: @@ -12427,73 +14960,102 @@ components: info: description: Modern Docker Management, Designed for Everyone title: Arcane API - version: v1.17.0 + version: v2.3.2 openapi: 3.1.0 paths: + /activities/stream: + get: + description: Stream background activity updates for the local environment and all enabled remote environments as JSON lines + operationId: stream-all-activities + parameters: + - description: Snapshot limit per environment + explode: false + in: query + name: limit + schema: + default: 50 + description: Snapshot limit per environment + format: int64 + type: integer + responses: + "200": + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Stream background activities across all environments + tags: + - Activities /api-keys: get: description: Get a paginated list of API keys operationId: list-api-keys parameters: - - description: Search query for filtering by name or description - explode: false - in: query - name: search - schema: - description: Search query for filtering by name or description - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Search query for filtering by name or description + explode: false + in: query + name: search + schema: + description: Search query for filtering by name or description + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/ApiKeyPaginatedResponse' + $ref: "#/components/schemas/ApiKeyPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List API keys tags: - - API Keys + - API Keys post: description: Create a new API key for programmatic access operationId: create-api-key @@ -12501,130 +15063,130 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/ApikeyCreateApiKey' + $ref: "#/components/schemas/ApikeyCreateApiKey" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseApiKeyCreatedDto' + $ref: "#/components/schemas/BaseApiResponseApiKeyCreatedDto" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create an API key tags: - - API Keys + - API Keys /api-keys/{id}: delete: description: Delete an API key by ID operationId: delete-api-key parameters: - - description: API key ID - in: path - name: id - required: true - schema: - description: API key ID - type: string + - description: API key ID + in: path + name: id + required: true + schema: + description: API key ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete an API key tags: - - API Keys + - API Keys get: description: Get details of a specific API key by ID operationId: get-api-key parameters: - - description: API key ID - in: path - name: id - required: true - schema: - description: API key ID - type: string + - description: API key ID + in: path + name: id + required: true + schema: + description: API key ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseApiKey' + $ref: "#/components/schemas/BaseApiResponseApiKey" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get an API key tags: - - API Keys + - API Keys put: description: Update an existing API key's details operationId: update-api-key parameters: - - description: API key ID - in: path - name: id - required: true - schema: - description: API key ID - type: string + - description: API key ID + in: path + name: id + required: true + schema: + description: API key ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ApikeyUpdateApiKey' + $ref: "#/components/schemas/ApikeyUpdateApiKey" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseApiKey' + $ref: "#/components/schemas/BaseApiResponseApiKey" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update an API key tags: - - API Keys + - API Keys /app-images/favicon: get: description: Get the application favicon image operationId: get-favicon responses: - '200': + "200": content: application/json: schema: @@ -12638,39 +15200,41 @@ paths: Content-Type: schema: type: string + X-Content-Type-Options: + schema: + type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Get application favicon tags: - - Application Images + - Application Images /app-images/logo: get: description: Get the application logo image operationId: get-logo parameters: - - description: Return full logo instead of icon - explode: false - in: query - name: full - schema: - default: false - description: Return full logo instead of icon - type: boolean - - description: Optional accent color override for preview (e.g., 'oklch(0.65 - 0.2 150)') - explode: false - in: query - name: color - schema: - description: Optional accent color override for preview (e.g., 'oklch(0.65 - 0.2 150)') - type: string + - description: Return full logo instead of icon + explode: false + in: query + name: full + schema: + default: false + description: Return full logo instead of icon + type: boolean + - description: Optional accent color override for preview (e.g., 'oklch(0.65 0.2 150)') + explode: false + in: query + name: color + schema: + description: Optional accent color override for preview (e.g., 'oklch(0.65 0.2 150)') + type: string responses: - '200': + "200": content: application/json: schema: @@ -12684,21 +15248,25 @@ paths: Content-Type: schema: type: string + X-Content-Type-Options: + schema: + type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Get application logo tags: - - Application Images + - Application Images /app-images/logo-email: get: description: Get the application logo image in PNG format for emails operationId: get-logo-email responses: - '200': + "200": content: application/json: schema: @@ -12712,21 +15280,25 @@ paths: Content-Type: schema: type: string + X-Content-Type-Options: + schema: + type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Get application logo for email tags: - - Application Images + - Application Images /app-images/profile: get: description: Get the default user profile image operationId: get-default-profile responses: - '200': + "200": content: application/json: schema: @@ -12740,31 +15312,35 @@ paths: Content-Type: schema: type: string + X-Content-Type-Options: + schema: + type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Get default profile image tags: - - Application Images + - Application Images /app-images/pwa/{filename}: get: description: Get a Progressive Web App icon image operationId: get-pwa-icon parameters: - - description: PWA icon filename - in: path - name: filename - required: true - schema: - description: PWA icon filename - examples: - - icon-192x192.png - type: string + - description: PWA icon filename + in: path + name: filename + required: true + schema: + description: PWA icon filename + examples: + - icon-192x192.png + type: string responses: - '200': + "200": content: application/json: schema: @@ -12778,51 +15354,61 @@ paths: Content-Type: schema: type: string + X-Content-Type-Options: + schema: + type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Get PWA icon tags: - - Application Images + - Application Images /app-version: get: description: Get the current application version operationId: getAppVersion responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/VersionInfo' + $ref: "#/components/schemas/VersionInfo" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Get app version tags: - - Version + - Version /auth/login: post: description: Authenticate a user with username and password operationId: login + parameters: + - in: header + name: User-Agent + schema: + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/AuthLogin' + $ref: "#/components/schemas/AuthLogin" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseLoginResponse' + $ref: "#/components/schemas/BaseApiResponseLoginResponse" description: OK headers: Set-Cookie: @@ -12833,21 +15419,22 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Login tags: - - Auth + - Auth /auth/logout: post: description: Clear authentication session operationId: logout responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK headers: Set-Cookie: @@ -12858,34 +15445,200 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Logout tags: - - Auth + - Auth /auth/me: get: description: Get the currently authenticated user's information operationId: get-current-user responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseUser' + $ref: "#/components/schemas/BaseApiResponseUser" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get current user tags: - - Auth + - Auth + /auth/me/api-keys: + get: + description: List API keys owned by the current user + operationId: list-my-api-keys + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseListApiKey" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List my API keys + tags: + - API Keys + post: + description: Create a new personal API key owned by the current user. Personal keys inherit the owner's role permissions. + operationId: create-my-api-key + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ApikeyCreateUserApiKey" + required: true + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseApiKeyCreatedDto" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + summary: Create my API key + tags: + - API Keys + /auth/me/api-keys/{id}: + delete: + description: Delete one of the current user's own API keys + operationId: delete-my-api-key + parameters: + - description: API key ID + in: path + name: id + required: true + schema: + description: API key ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseMessageResponse" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + summary: Delete my API key + tags: + - API Keys + /auth/me/avatar: + delete: + description: Remove the current user's custom profile picture, reverting to the default avatar. + operationId: delete-my-avatar + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseUser" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Delete own avatar + tags: + - Auth + post: + description: Upload a custom profile picture (PNG, JPEG or WebP). Replaces any existing avatar. + operationId: upload-my-avatar + requestBody: + content: + multipart/form-data: + schema: + properties: + file: + contentMediaType: application/octet-stream + format: binary + type: string + type: object + required: true + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseUser" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Upload own avatar + tags: + - Auth + /auth/me/profile: + put: + description: Update the current user's display name and email. Forbidden for OIDC-managed accounts. + operationId: update-my-profile + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateMyProfileInputBody" + required: true + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseUser" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Update own profile + tags: + - Auth /auth/password: post: description: Change the current user's password @@ -12894,122 +15647,151 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/AuthPasswordChange' + $ref: "#/components/schemas/AuthPasswordChange" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Change password tags: - - Auth + - Auth /auth/refresh: post: description: Obtain a new access token using a refresh token operationId: refresh-token + parameters: + - in: header + name: User-Agent + schema: + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/AuthRefresh' + $ref: "#/components/schemas/AuthRefresh" required: true responses: - '200': + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseTokenRefreshResponse" + description: OK + headers: + Set-Cookie: + schema: + description: Updated session cookie + type: string + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: [] + summary: Refresh token + tags: + - Auth + /auth/sessions/logout-all: + post: + description: Revoke every session for the current user except the one making this request + operationId: logout-all-other-sessions + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseTokenRefreshResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK - headers: - Set-Cookie: - schema: - description: Updated session cookie - type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - summary: Refresh token + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Logout all other sessions tags: - - Auth + - Auth /container-registries: get: description: Get a paginated list of container registries operationId: listContainerRegistries parameters: - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction - type: string - - description: Start index - explode: false - in: query - name: start - schema: - default: 0 - description: Start index - format: int64 - type: integer - - description: Items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Items per page - format: int64 - type: integer - responses: - '200': + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerRegistryPaginatedResponse' + $ref: "#/components/schemas/ContainerRegistryPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List container registries tags: - - Container Registries + - Container Registries post: description: Create a new container registry operationId: createContainerRegistry @@ -13017,27 +15799,50 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateContainerRegistryRequest' + $ref: "#/components/schemas/CreateContainerRegistryRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseContainerRegistry' + $ref: "#/components/schemas/BaseApiResponseContainerRegistry" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create a container registry tags: - - Container Registries + - Container Registries + /container-registries/pull-usage: + get: + description: Get configured registry pull usage and rate limit visibility + operationId: getContainerRegistryPullUsage + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponsePullUsageResponse" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get container registry pull usage + tags: + - Container Registries /container-registries/sync: post: description: Sync container registries from a remote source @@ -13046,246 +15851,246 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/ContainerregistrySyncRequest' + $ref: "#/components/schemas/ContainerregistrySyncRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Sync container registries tags: - - Container Registries + - Container Registries /container-registries/{id}: delete: description: Delete a container registry by ID operationId: deleteContainerRegistry parameters: - - description: Registry ID - in: path - name: id - required: true - schema: - description: Registry ID - type: string + - description: Registry ID + in: path + name: id + required: true + schema: + description: Registry ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete a container registry tags: - - Container Registries + - Container Registries get: description: Get a container registry by ID operationId: getContainerRegistry parameters: - - description: Registry ID - in: path - name: id - required: true - schema: - description: Registry ID - type: string + - description: Registry ID + in: path + name: id + required: true + schema: + description: Registry ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseContainerRegistry' + $ref: "#/components/schemas/BaseApiResponseContainerRegistry" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get a container registry tags: - - Container Registries + - Container Registries put: description: Update an existing container registry operationId: updateContainerRegistry parameters: - - description: Registry ID - in: path - name: id - required: true - schema: - description: Registry ID - type: string + - description: Registry ID + in: path + name: id + required: true + schema: + description: Registry ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/UpdateContainerRegistryRequest' + $ref: "#/components/schemas/UpdateContainerRegistryRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseContainerRegistry' + $ref: "#/components/schemas/BaseApiResponseContainerRegistry" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update a container registry tags: - - Container Registries + - Container Registries /container-registries/{id}/test: post: description: Test connectivity and authentication to a container registry operationId: testContainerRegistry parameters: - - description: Registry ID - in: path - name: id - required: true - schema: - description: Registry ID - type: string + - description: Registry ID + in: path + name: id + required: true + schema: + description: Registry ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Test a container registry tags: - - Container Registries + - Container Registries /customize/categories: get: description: Get all available customization categories with metadata operationId: get-customize-categories responses: - '200': + "200": content: application/json: schema: items: - $ref: '#/components/schemas/CategoryCategory' + $ref: "#/components/schemas/CategoryCategory" type: - - array - - 'null' + - array + - "null" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get customization categories tags: - - Customize + - Customize /customize/git-repositories: get: description: Get a paginated list of git repositories operationId: listGitRepositories parameters: - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction - type: string - - description: Start index - explode: false - in: query - name: start - schema: - default: 0 - description: Start index - format: int64 - type: integer - - description: Items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Items per page - format: int64 - type: integer - responses: - '200': + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/GitRepositoryPaginatedResponse' + $ref: "#/components/schemas/GitRepositoryPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List git repositories tags: - - Customize + - Customize post: description: Create a new git repository configuration operationId: createGitRepository @@ -13293,240 +16098,238 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateGitRepositoryRequest' + $ref: "#/components/schemas/CreateGitRepositoryRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseGitRepository' + $ref: "#/components/schemas/BaseApiResponseGitRepository" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create a git repository tags: - - Customize + - Customize /customize/git-repositories/{id}: delete: description: Delete a git repository configuration by ID operationId: deleteGitRepository parameters: - - description: Repository ID - in: path - name: id - required: true - schema: - description: Repository ID - type: string + - description: Repository ID + in: path + name: id + required: true + schema: + description: Repository ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete a git repository tags: - - Customize + - Customize get: description: Get a git repository by ID operationId: getGitRepository parameters: - - description: Repository ID - in: path - name: id - required: true - schema: - description: Repository ID - type: string + - description: Repository ID + in: path + name: id + required: true + schema: + description: Repository ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseGitRepository' + $ref: "#/components/schemas/BaseApiResponseGitRepository" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get a git repository tags: - - Customize + - Customize put: description: Update an existing git repository configuration operationId: updateGitRepository parameters: - - description: Repository ID - in: path - name: id - required: true - schema: - description: Repository ID - type: string + - description: Repository ID + in: path + name: id + required: true + schema: + description: Repository ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/UpdateGitRepositoryRequest' + $ref: "#/components/schemas/UpdateGitRepositoryRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseGitRepository' + $ref: "#/components/schemas/BaseApiResponseGitRepository" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update a git repository tags: - - Customize + - Customize /customize/git-repositories/{id}/branches: get: description: Get all branches from a git repository with default branch detection operationId: listGitRepositoryBranches parameters: - - description: Repository ID - in: path - name: id - required: true - schema: - description: Repository ID - type: string + - description: Repository ID + in: path + name: id + required: true + schema: + description: Repository ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseBranchesResponse' + $ref: "#/components/schemas/BaseApiResponseBranchesResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List repository branches tags: - - Customize + - Customize /customize/git-repositories/{id}/files: get: description: Browse files and directories in a git repository operationId: browseGitRepositoryFiles parameters: - - description: Repository ID - in: path - name: id - required: true - schema: - description: Repository ID - type: string - - description: Branch to browse - explode: false - in: query - name: branch - schema: - description: Branch to browse - type: string - - description: Path within repository (optional) - explode: false - in: query - name: path - schema: - description: Path within repository (optional) - type: string + - description: Repository ID + in: path + name: id + required: true + schema: + description: Repository ID + type: string + - description: Branch to browse + explode: false + in: query + name: branch + schema: + description: Branch to browse + type: string + - description: Path within repository (optional) + explode: false + in: query + name: path + schema: + description: Path within repository (optional) + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseBrowseResponse' + $ref: "#/components/schemas/BaseApiResponseBrowseResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Browse repository files tags: - - Customize + - Customize /customize/git-repositories/{id}/test: post: description: Test connectivity and authentication to a git repository operationId: testGitRepository parameters: - - description: Repository ID - in: path - name: id - required: true - schema: - description: Repository ID - type: string - - description: Branch to test (optional, uses repository default branch when - omitted) - explode: false - in: query - name: branch - schema: - description: Branch to test (optional, uses repository default branch when - omitted) - type: string + - description: Repository ID + in: path + name: id + required: true + schema: + description: Repository ID + type: string + - description: Branch to test (optional, uses repository default branch when omitted) + explode: false + in: query + name: branch + schema: + description: Branch to test (optional, uses repository default branch when omitted) + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Test a git repository tags: - - Customize + - Customize /customize/search: post: description: Search customization categories and options by query @@ -13535,91 +16338,195 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SearchRequest' + $ref: "#/components/schemas/SearchRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/SearchResponse' + $ref: "#/components/schemas/SearchResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Search customization options tags: - - Customize + - Customize + /dashboard/stream: + get: + description: Stream dashboard snapshot updates for the local environment and all enabled remote environments as JSON lines + operationId: stream-all-dashboards + parameters: + - description: "Debug mode: force an empty action item list" + explode: false + in: query + name: debugAllGood + schema: + default: false + description: "Debug mode: force an empty action item list" + type: boolean + responses: + "200": + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Stream dashboard snapshots across all environments + tags: + - Dashboard + /diagnostics: + get: + description: Returns Go runtime, memory, garbage-collector, and WebSocket connection statistics. + operationId: get-diagnostics + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/SystemDiagnostics" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get runtime diagnostics + tags: + - Diagnostics + /diagnostics/logs: + get: + description: Returns the most recent buffered backend log entries (oldest first). + operationId: get-diagnostics-logs + responses: + "200": + content: + application/json: + schema: + items: + $ref: "#/components/schemas/SystemLogEntry" + type: + - array + - "null" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get recent backend logs + tags: + - Diagnostics + /edge-mtls/ca: + get: + description: Download the Arcane-managed certificate authority used for generated edge mTLS client certificates + operationId: downloadEdgeMTLSCA + responses: + "200": + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Download Arcane-generated edge mTLS CA + tags: + - Environments /environments: get: description: Get a paginated list of Docker environments operationId: listEnvironments parameters: - - description: Search query for filtering by name or API URL - explode: false - in: query - name: search - schema: - description: Search query for filtering by name or API URL - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Items per page - format: int64 - type: integer + - description: Search query for filtering by name or API URL + explode: false + in: query + name: search + schema: + description: Search query for filtering by name or API URL + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Items per page + format: int64 + type: integer + - description: "Filter by environment type (comma-separated: http,edge,websocket,grpc,polling)" + explode: false + in: query + name: type + schema: + description: "Filter by environment type (comma-separated: http,edge,websocket,grpc,polling)" + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/EnvironmentPaginatedResponse' + $ref: "#/components/schemas/EnvironmentPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List environments tags: - - Environments + - Environments post: description: Create a new Docker environment operationId: createEnvironment @@ -13627,213 +16534,429 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/EnvironmentCreate' + $ref: "#/components/schemas/EnvironmentCreate" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseEnvironmentWithApiKey' + $ref: "#/components/schemas/BaseApiResponseEnvironmentWithApiKey" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create an environment tags: - - Environments + - Environments /environments/pair: post: description: Agent sends API key to complete environment pairing operationId: pairEnvironment parameters: - - description: API key for environment pairing - in: header - name: X-API-Key - schema: - description: API key for environment pairing - type: string + - description: API key for environment pairing + in: header + name: X-API-Key + schema: + description: API key for environment pairing + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Pair agent with manager tags: - - Environments + - Environments /environments/{id}: delete: description: Delete a Arcane environment operationId: deleteEnvironment parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete an environment tags: - - Environments + - Environments get: description: Get a Docker environment by ID operationId: getEnvironment parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseEnvironment' + $ref: "#/components/schemas/BaseApiResponseEnvironment" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get an environment tags: - - Environments + - Environments put: description: Update a Docker environment operationId: updateEnvironment parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/EnvironmentUpdate' + $ref: "#/components/schemas/EnvironmentUpdate" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseEnvironment' + $ref: "#/components/schemas/BaseApiResponseEnvironment" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update an environment tags: - - Environments + - Environments + /environments/{id}/activities: + get: + description: Get current and recent background activities for an environment + operationId: list-activities + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: desc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Limit + explode: false + in: query + name: limit + schema: + default: 50 + description: Limit + format: int64 + type: integer + - description: Filter by activity status + explode: false + in: query + name: status + schema: + description: Filter by activity status + type: string + - description: Filter by activity type + explode: false + in: query + name: type + schema: + description: Filter by activity type + type: string + - description: Filter by resource type + explode: false + in: query + name: resourceType + schema: + description: Filter by resource type + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BasePaginatedActivity" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List background activities + tags: + - Activities + /environments/{id}/activities/history: + delete: + description: Delete completed background activity history for an environment + operationId: clear-activity-history + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseClearHistoryResult" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Clear background activity history + tags: + - Activities + /environments/{id}/activities/{activityId}: + get: + description: Get a background activity with its recent output messages + operationId: get-activity + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Activity ID + in: path + name: activityId + required: true + schema: + description: Activity ID + type: string + - description: Maximum messages to return + explode: false + in: query + name: limit + schema: + default: 500 + description: Maximum messages to return + format: int64 + type: integer + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseDetail" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get background activity + tags: + - Activities + /environments/{id}/activities/{activityId}/cancel: + post: + description: Request cancellation of a running or queued background activity + operationId: cancel-activity + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Activity ID + in: path + name: activityId + required: true + schema: + description: Activity ID + type: string + - description: Display name to attribute the cancellation to (used when proxying to a remote environment) + explode: false + in: query + name: requestedBy + schema: + description: Display name to attribute the cancellation to (used when proxying to a remote environment) + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseActivity" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Cancel a background activity + tags: + - Activities /environments/{id}/agent/pair: post: description: Generate or rotate the local agent pairing token operationId: pairAgent parameters: - - description: Environment ID (must be 0 for local) - in: path - name: id - required: true - schema: - description: Environment ID (must be 0 for local) - type: string + - description: Environment ID (must be 0 for local) + in: path + name: id + required: true + schema: + description: Environment ID (must be 0 for local) + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/EnvironmentAgentPairRequest' + $ref: "#/components/schemas/EnvironmentAgentPairRequest" responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseAgentPairResponse' + $ref: "#/components/schemas/BaseApiResponseAgentPairResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Pair with local agent tags: - - Environments + - Environments /environments/{id}/builds/browse: delete: description: Delete a file or directory under the builds workspace root operationId: builds-browse-delete parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: File or directory path to delete - explode: false - in: query - name: path - schema: - description: File or directory path to delete - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: File or directory path to delete + explode: false + in: query + name: path + schema: + description: File or directory path to delete + type: string responses: - '204': + "204": description: No Content headers: Data: schema: - $ref: '#/components/schemas/BaseMessageResponse' + $ref: "#/components/schemas/BaseMessageResponse" description: Response data Success: schema: @@ -13843,120 +16966,120 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete build workspace file tags: - - Builds + - Builds get: description: List files and directories under the builds workspace root operationId: builds-browse parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Directory path to browse - explode: false - in: query - name: path - schema: - default: / - description: Directory path to browse - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Directory path to browse + explode: false + in: query + name: path + schema: + default: / + description: Directory path to browse + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListFileEntry' + $ref: "#/components/schemas/BaseApiResponseListFileEntry" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Browse build workspace files - tags: - - Builds - /environments/{id}/builds/browse/content: - get: - description: Read file content under the builds workspace root - operationId: builds-browse-content - parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: File path - explode: false - in: query - name: path - schema: - description: File path - type: string - - description: Maximum bytes to read (default 1MB) - explode: false - in: query - name: maxBytes - schema: - default: 1048576 - description: Maximum bytes to read (default 1MB) - format: int64 - type: integer - responses: - '200': + tags: + - Builds + /environments/{id}/builds/browse/content: + get: + description: Read file content under the builds workspace root + operationId: builds-browse-content + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: File path + explode: false + in: query + name: path + schema: + description: File path + type: string + - description: Maximum bytes to read (default 1MB) + explode: false + in: query + name: maxBytes + schema: + default: 1048576 + description: Maximum bytes to read (default 1MB) + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseBuildFileContentResponse' + $ref: "#/components/schemas/BaseApiResponseBuildFileContentResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get build workspace file content tags: - - Builds + - Builds /environments/{id}/builds/browse/download: get: description: Download a file from the builds workspace root operationId: builds-browse-download parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: File path - explode: false - in: query - name: path - schema: - description: File path - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: File path + explode: false + in: query + name: path + schema: + description: File path + type: string responses: - '200': + "200": content: application/json: schema: {} @@ -13976,40 +17099,40 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Download build workspace file tags: - - Builds + - Builds /environments/{id}/builds/browse/mkdir: post: description: Create a directory under the builds workspace root operationId: builds-browse-mkdir parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Directory path to create - explode: false - in: query - name: path - schema: - description: Directory path to create - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Directory path to create + explode: false + in: query + name: path + schema: + description: Directory path to create + type: string responses: - '204': + "204": description: No Content headers: Data: schema: - $ref: '#/components/schemas/BaseMessageResponse' + $ref: "#/components/schemas/BaseMessageResponse" description: Response data Success: schema: @@ -14019,34 +17142,34 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create build workspace directory tags: - - Builds + - Builds /environments/{id}/builds/browse/upload: post: description: Upload a file into the builds workspace root operationId: builds-browse-upload parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Destination path - explode: false - in: query - name: path - schema: - default: / - description: Destination path - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Destination path + explode: false + in: query + name: path + schema: + default: / + description: Destination path + type: string requestBody: content: multipart/form-data: @@ -14058,16 +17181,16 @@ paths: format: binary type: string required: - - file + - file type: object required: true responses: - '204': + "204": description: No Content headers: Data: schema: - $ref: '#/components/schemas/BaseMessageResponse' + $ref: "#/components/schemas/BaseMessageResponse" description: Response data Success: schema: @@ -14077,1602 +17200,1869 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Upload build workspace file tags: - - Builds + - Builds /environments/{id}/containers: get: description: Paginated list of containers operationId: list-containers parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction - type: string - - description: Start index - explode: false - in: query - name: start - schema: - default: 0 - description: Start index - format: int64 - type: integer - - description: Limit - explode: false - in: query - name: limit - schema: - default: 20 - description: Limit - format: int64 - type: integer - - description: 'Optional grouping mode (for example: project)' - explode: false - in: query - name: groupBy - schema: - description: 'Optional grouping mode (for example: project)' - type: string - - description: Include internal containers - explode: false - in: query - name: includeInternal - schema: - default: false - description: Include internal containers - type: boolean - - description: Filter by update status (has_update, up_to_date, error, unknown) - explode: false - in: query - name: updates - schema: - description: Filter by update status (has_update, up_to_date, error, unknown) - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Limit + explode: false + in: query + name: limit + schema: + default: 20 + description: Limit + format: int64 + type: integer + - description: "Optional grouping mode (for example: project)" + explode: false + in: query + name: groupBy + schema: + description: "Optional grouping mode (for example: project)" + type: string + - description: Include internal containers + explode: false + in: query + name: includeInternal + schema: + default: false + description: Include internal containers + type: boolean + - description: Filter by update status (has_update, up_to_date, error, unknown) + explode: false + in: query + name: updates + schema: + description: Filter by update status (has_update, up_to_date, error, unknown) + type: string + - description: Filter standalone containers only (true/false) + explode: false + in: query + name: standalone + schema: + description: Filter standalone containers only (true/false) + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerPaginatedResponse' + $ref: "#/components/schemas/ContainerPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List containers tags: - - Containers + - Containers post: operationId: create-container parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ContainerCreate' + $ref: "#/components/schemas/ContainerCreate" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerCreatedResponse' + $ref: "#/components/schemas/ContainerCreatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create container tags: - - Containers + - Containers /environments/{id}/containers/counts: get: operationId: container-status-counts parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Include internal containers - explode: false - in: query - name: includeInternal - schema: - default: false - description: Include internal containers - type: boolean + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Include internal containers + explode: false + in: query + name: includeInternal + schema: + default: false + description: Include internal containers + type: boolean responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerStatusCountsResponse' + $ref: "#/components/schemas/ContainerStatusCountsResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Container status counts tags: - - Containers + - Containers /environments/{id}/containers/{containerId}: delete: operationId: delete-container parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Container ID - in: path - name: containerId - required: true - schema: - description: Container ID - type: string - - description: Force delete running container - explode: false - in: query - name: force - schema: - default: false - description: Force delete running container - type: boolean - - description: Remove associated volumes - explode: false - in: query - name: volumes - schema: - default: false - description: Remove associated volumes - type: boolean - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string + - description: Force delete running container + explode: false + in: query + name: force + schema: + default: false + description: Force delete running container + type: boolean + - description: Remove associated volumes + explode: false + in: query + name: volumes + schema: + default: false + description: Remove associated volumes + type: boolean + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerActionResponse' + $ref: "#/components/schemas/ContainerActionResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete container tags: - - Containers + - Containers get: operationId: get-container parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Container ID - in: path - name: containerId - required: true - schema: - description: Container ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerDetailsResponse' + $ref: "#/components/schemas/ContainerDetailsResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get container tags: - - Containers + - Containers /environments/{id}/containers/{containerId}/auto-update: put: description: Enable or disable auto-update for a specific container operationId: set-container-auto-update parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Container ID - in: path - name: containerId - required: true - schema: - description: Container ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SetAutoUpdateInputBody' + $ref: "#/components/schemas/SetAutoUpdateInputBody" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerActionResponse' + $ref: "#/components/schemas/ContainerActionResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Set container auto-update tags: - - Containers - - Updater + - Containers + - Updater + /environments/{id}/containers/{containerId}/commit: + post: + description: Create an image from a container + operationId: commit-container + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ContainerCommitRequest" + required: true + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseCommitResult" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Commit container + tags: + - Containers + - Images + /environments/{id}/containers/{containerId}/kill: + post: + description: Send a signal to the container's main process (default SIGKILL) + operationId: kill-container + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string + - description: Signal to send (for example SIGTERM, SIGKILL). Defaults to SIGKILL. + explode: false + in: query + name: signal + schema: + description: Signal to send (for example SIGTERM, SIGKILL). Defaults to SIGKILL. + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ContainerActionResponse" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Kill container + tags: + - Containers + /environments/{id}/containers/{containerId}/pause: + post: + operationId: pause-container + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ContainerActionResponse" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Pause container + tags: + - Containers /environments/{id}/containers/{containerId}/redeploy: post: description: Pull latest image and recreate container operationId: redeploy-container parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Container ID - in: path - name: containerId - required: true - schema: - description: Container ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerDetailsResponse' + $ref: "#/components/schemas/ContainerDetailsResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Redeploy container tags: - - Containers + - Containers /environments/{id}/containers/{containerId}/restart: post: operationId: restart-container parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Container ID - in: path - name: containerId - required: true - schema: - description: Container ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerActionResponse' + $ref: "#/components/schemas/ContainerActionResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Restart container tags: - - Containers + - Containers /environments/{id}/containers/{containerId}/start: post: operationId: start-container parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Container ID - in: path - name: containerId - required: true - schema: - description: Container ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerActionResponse' + $ref: "#/components/schemas/ContainerActionResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Start container tags: - - Containers + - Containers /environments/{id}/containers/{containerId}/stop: post: operationId: stop-container parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Container ID - in: path - name: containerId - required: true - schema: - description: Container ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ContainerActionResponse' + $ref: "#/components/schemas/ContainerActionResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Stop container tags: - - Containers + - Containers + /environments/{id}/containers/{containerId}/unpause: + post: + operationId: unpause-container + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID + in: path + name: containerId + required: true + schema: + description: Container ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ContainerActionResponse" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Unpause container + tags: + - Containers /environments/{id}/containers/{containerId}/update: post: - description: Pull the latest image and apply the appropriate update strategy - for a specific container + description: Pull the latest image and apply the appropriate update strategy for a specific container operationId: update-container parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Container ID to update - in: path - name: containerId - required: true - schema: - description: Container ID to update - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Container ID to update + in: path + name: containerId + required: true + schema: + description: Container ID to update + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseResult' + $ref: "#/components/schemas/BaseApiResponseResult" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update a single container tags: - - Updater - - Containers + - Updater + - Containers /environments/{id}/dashboard: get: description: Returns the dashboard first-paint snapshot in a single response operationId: get-dashboard parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: 'Debug mode: force an empty action item list' - explode: false - in: query - name: debugAllGood - schema: - default: false - description: 'Debug mode: force an empty action item list' - type: boolean + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: "Debug mode: force an empty action item list" + explode: false + in: query + name: debugAllGood + schema: + default: false + description: "Debug mode: force an empty action item list" + type: boolean responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSnapshot' + $ref: "#/components/schemas/BaseApiResponseSnapshot" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get dashboard snapshot tags: - - Dashboard - /environments/{id}/dashboard/action-items: + - Dashboard + /environments/{id}/deployment: get: - description: Returns only dashboard action items that currently need attention - operationId: get-dashboard-action-items + description: Get Docker run and compose snippets for environment deployment + operationId: getDeploymentSnippets parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: 'Debug mode: force an empty action item list' - explode: false - in: query - name: debugAllGood - schema: - default: false - description: 'Debug mode: force an empty action item list' - type: boolean + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseActionItems' + $ref: "#/components/schemas/BaseApiResponseDeploymentSnippet" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Get dashboard action items + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get deployment snippets tags: - - Dashboard - /environments/{id}/deployment: + - Environments + /environments/{id}/deployment/mtls/bundle: get: - description: Get Docker run and compose snippets for environment deployment - operationId: getDeploymentSnippets + description: Download the generated mTLS client certificate bundle for an edge environment + operationId: downloadEnvironmentMTLSBundle parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": + description: OK + default: content: - application/json: + application/problem+json: schema: - $ref: '#/components/schemas/BaseApiResponseDeploymentSnippet' + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Download environment mTLS bundle + tags: + - Environments + /environments/{id}/deployment/mtls/{fileName}: + get: + description: Download an individual generated mTLS client certificate asset for an edge environment + operationId: downloadEnvironmentMTLSFile + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: mTLS asset filename + in: path + name: fileName + required: true + schema: + description: mTLS asset filename + type: string + responses: + "200": description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Get deployment snippets + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Download environment mTLS asset tags: - - Environments + - Environments /environments/{id}/gitops-syncs: get: description: Get a paginated list of GitOps syncs for an environment operationId: listGitOpsSyncs parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction - type: string - - description: Start index - explode: false - in: query - name: start - schema: - default: 0 - description: Start index - format: int64 - type: integer - - description: Items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/GitOpsSyncPaginatedResponse' + $ref: "#/components/schemas/GitOpsSyncPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List GitOps syncs tags: - - GitOps Syncs + - GitOps Syncs post: description: Create a new GitOps sync configuration for an environment operationId: createGitOpsSync parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/GitopsCreateSyncRequest' + $ref: "#/components/schemas/GitopsCreateSyncRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseGitOpsSync' + $ref: "#/components/schemas/BaseApiResponseGitOpsSync" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create a GitOps sync tags: - - GitOps Syncs + - GitOps Syncs /environments/{id}/gitops-syncs/import: post: description: Import multiple GitOps sync configurations from JSON operationId: importGitOpsSyncs parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: items: - $ref: '#/components/schemas/GitopsImportGitOpsSyncRequest' + $ref: "#/components/schemas/GitopsImportGitOpsSyncRequest" type: - - array - - 'null' + - array + - "null" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseImportGitOpsSyncResponse' + $ref: "#/components/schemas/BaseApiResponseImportGitOpsSyncResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Import GitOps syncs tags: - - GitOps Syncs + - GitOps Syncs /environments/{id}/gitops-syncs/{syncId}: delete: description: Delete a GitOps sync configuration by ID operationId: deleteGitOpsSync parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Sync ID - in: path - name: syncId - required: true - schema: - description: Sync ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Sync ID + in: path + name: syncId + required: true + schema: + description: Sync ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete a GitOps sync tags: - - GitOps Syncs + - GitOps Syncs get: description: Get a GitOps sync by ID operationId: getGitOpsSync parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Sync ID - in: path - name: syncId - required: true - schema: - description: Sync ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Sync ID + in: path + name: syncId + required: true + schema: + description: Sync ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseGitOpsSync' + $ref: "#/components/schemas/BaseApiResponseGitOpsSync" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get a GitOps sync tags: - - GitOps Syncs + - GitOps Syncs put: description: Update an existing GitOps sync configuration operationId: updateGitOpsSync parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Sync ID - in: path - name: syncId - required: true - schema: - description: Sync ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Sync ID + in: path + name: syncId + required: true + schema: + description: Sync ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/GitopsUpdateSyncRequest' + $ref: "#/components/schemas/GitopsUpdateSyncRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseGitOpsSync' + $ref: "#/components/schemas/BaseApiResponseGitOpsSync" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update a GitOps sync tags: - - GitOps Syncs + - GitOps Syncs /environments/{id}/gitops-syncs/{syncId}/files: get: description: Browse files in the synced repository operationId: browseGitOpsSyncFiles parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Sync ID - in: path - name: syncId - required: true - schema: - description: Sync ID - type: string - - description: Path to browse (optional) - explode: false - in: query - name: path - schema: - description: Path to browse (optional) - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Sync ID + in: path + name: syncId + required: true + schema: + description: Sync ID + type: string + - description: Path to browse (optional) + explode: false + in: query + name: path + schema: + description: Path to browse (optional) + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseBrowseResponse' + $ref: "#/components/schemas/BaseApiResponseBrowseResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Browse GitOps sync files tags: - - GitOps Syncs + - GitOps Syncs /environments/{id}/gitops-syncs/{syncId}/status: get: description: Get the current status of a GitOps sync operationId: getGitOpsSyncStatus parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Sync ID - in: path - name: syncId - required: true - schema: - description: Sync ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Sync ID + in: path + name: syncId + required: true + schema: + description: Sync ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSyncStatus' + $ref: "#/components/schemas/BaseApiResponseSyncStatus" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get GitOps sync status tags: - - GitOps Syncs + - GitOps Syncs /environments/{id}/gitops-syncs/{syncId}/sync: post: description: Manually trigger a sync operation operationId: performGitOpsSync parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Sync ID - in: path - name: syncId - required: true - schema: - description: Sync ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Sync ID + in: path + name: syncId + required: true + schema: + description: Sync ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSyncResult' + $ref: "#/components/schemas/BaseApiResponseSyncResult" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Perform a GitOps sync tags: - - GitOps Syncs + - GitOps Syncs /environments/{id}/heartbeat: post: description: Update the heartbeat timestamp for an environment operationId: updateHeartbeat parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update environment heartbeat tags: - - Environments + - Environments + /environments/{id}/image-updates/by-refs: + get: + operationId: get-update-info-by-refs + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Comma-separated image references + explode: false + in: query + name: imageRefs + schema: + description: Comma-separated image references + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseMapStringUpdateInfo" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get persisted update info for image references + tags: + - Image Updates /environments/{id}/image-updates/check: get: operationId: check-image-update parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Image reference - explode: false - in: query - name: imageRef - schema: - description: Image reference - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image reference + explode: false + in: query + name: imageRef + schema: + description: Image reference + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseResponse' + $ref: "#/components/schemas/BaseApiResponseResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Check image update by reference tags: - - Image Updates + - Image Updates /environments/{id}/image-updates/check-all: post: operationId: check-all-images parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ImageupdateCheckAllImagesRequest' + $ref: "#/components/schemas/ImageupdateCheckAllImagesRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseBatchResponse' + $ref: "#/components/schemas/BaseApiResponseBatchResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Check all images tags: - - Image Updates + - Image Updates /environments/{id}/image-updates/check-batch: post: operationId: check-multiple-images parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ImageupdateBatchImageUpdateRequest' + $ref: "#/components/schemas/ImageupdateBatchImageUpdateRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseBatchResponse' + $ref: "#/components/schemas/BaseApiResponseBatchResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Check multiple images tags: - - Image Updates + - Image Updates /environments/{id}/image-updates/check/{imageId}: get: operationId: check-image-update-by-id parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Image ID - in: path - name: imageId - required: true - schema: - description: Image ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID + in: path + name: imageId + required: true + schema: + description: Image ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseResponse' + $ref: "#/components/schemas/BaseApiResponseResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Check image update by ID tags: - - Image Updates + - Image Updates post: operationId: check-image-update-by-id-post parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Image ID - in: path - name: imageId - required: true - schema: - description: Image ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID + in: path + name: imageId + required: true + schema: + description: Image ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseResponse' + $ref: "#/components/schemas/BaseApiResponseResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Check image update by ID (POST) tags: - - Image Updates + - Image Updates /environments/{id}/image-updates/summary: get: operationId: get-update-summary parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSummary' + $ref: "#/components/schemas/BaseApiResponseSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get update summary tags: - - Image Updates + - Image Updates /environments/{id}/images: get: description: Get a paginated list of Docker images operationId: list-images parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - - description: Filter by in-use status (true/false) - explode: false - in: query - name: inUse - schema: - description: Filter by in-use status (true/false) - type: string - - description: Filter by update availability (true/false) - explode: false - in: query - name: updates - schema: - description: Filter by update availability (true/false) - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + - description: Filter by in-use status (true/false) + explode: false + in: query + name: inUse + schema: + description: Filter by in-use status (true/false) + type: string + - description: Filter by update availability (true/false) + explode: false + in: query + name: updates + schema: + description: Filter by update availability (true/false) + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ImagePaginatedResponse' + $ref: "#/components/schemas/ImagePaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List images tags: - - Images + - Images /environments/{id}/images/build: post: description: Build a Docker image using BuildKit with streaming progress output operationId: build-image parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ImageBuildRequest' + $ref: "#/components/schemas/DockerTypesBuildRequest" required: true responses: - '200': + "200": description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Build an image tags: - - Images + - Images /environments/{id}/images/builds: get: description: Get a paginated list of image build history for an environment operationId: list-image-builds parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: desc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - - description: Filter by status - explode: false - in: query - name: status - schema: - description: Filter by status - type: string - - description: Filter by provider - explode: false - in: query - name: provider - schema: - description: Filter by provider - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: desc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + - description: Filter by status + explode: false + in: query + name: status + schema: + description: Filter by status + type: string + - description: Filter by provider + explode: false + in: query + name: provider + schema: + description: Filter by provider + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ImageBuildPaginatedResponse' + $ref: "#/components/schemas/ImageBuildPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List image builds tags: - - Images + - Images /environments/{id}/images/builds/{buildId}: get: description: Get a single image build history entry with output operationId: get-image-build parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Build ID - in: path - name: buildId - required: true - schema: - description: Build ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Build ID + in: path + name: buildId + required: true + schema: + description: Build ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseBuildRecord' + $ref: "#/components/schemas/BaseApiResponseBuildRecord" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get image build tags: - - Images + - Images /environments/{id}/images/counts: get: description: Get counts of images in use, unused, total, and total size operationId: get-image-usage-counts parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ImageUsageCountsResponse' + $ref: "#/components/schemas/ImageUsageCountsResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get image usage counts tags: - - Images + - Images /environments/{id}/images/prune: post: description: Remove unused Docker images operationId: prune-images parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Only remove dangling images - explode: false - in: query - name: dangling - schema: - description: Only remove dangling images - type: boolean + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Only remove dangling images + explode: false + in: query + name: dangling + schema: + description: Only remove dangling images + type: boolean requestBody: content: application/json: schema: - $ref: '#/components/schemas/PruneImagesInputBody' + $ref: "#/components/schemas/PruneImagesInputBody" responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponsePruneReport' + $ref: "#/components/schemas/BaseApiResponsePruneReport" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Prune unused images tags: - - Images + - Images /environments/{id}/images/pull: post: description: Pull a Docker image from a registry with streaming progress output operationId: pull-image parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ImagePullOptions' + $ref: "#/components/schemas/ImagePullOptions" required: true responses: - '200': + "200": description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Pull an image tags: - - Images + - Images + /environments/{id}/images/search: + get: + description: Search Docker Hub images + operationId: search-images + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search term + explode: false + in: query + name: term + schema: + description: Search term + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseListSearchResult" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Search images + tags: + - Images /environments/{id}/images/upload: post: description: Upload a Docker image from a tar archive operationId: upload-image parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: multipart/form-data: @@ -15684,4866 +19074,5361 @@ paths: format: binary type: string required: - - file + - file type: object required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseLoadResult' + $ref: "#/components/schemas/BaseApiResponseLoadResult" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Upload an image tags: - - Images + - Images /environments/{id}/images/vulnerabilities/summaries: post: description: Retrieves scan summaries for a list of images (batch) operationId: get-image-vulnerability-summaries parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/VulnerabilityScanSummariesRequest' + $ref: "#/components/schemas/VulnerabilityScanSummariesRequest" description: Batch scan summary request required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseScanSummariesResponse' + $ref: "#/components/schemas/BaseApiResponseScanSummariesResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get vulnerability scan summaries tags: - - Vulnerabilities + - Vulnerabilities /environments/{id}/images/{imageId}: delete: description: Remove a Docker image by ID operationId: remove-image parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Image ID - in: path - name: imageId - required: true - schema: - description: Image ID - type: string - - description: Force removal - explode: false - in: query - name: force - schema: - description: Force removal - type: boolean + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID + in: path + name: imageId + required: true + schema: + description: Image ID + type: string + - description: Force removal + explode: false + in: query + name: force + schema: + description: Force removal + type: boolean responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Remove an image tags: - - Images + - Images get: description: Get a Docker image by its ID operationId: get-image parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Image ID - in: path - name: imageId - required: true - schema: - description: Image ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID + in: path + name: imageId + required: true + schema: + description: Image ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseDetailSummary' + $ref: "#/components/schemas/BaseApiResponseDetailSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get image by ID tags: - - Images + - Images /environments/{id}/images/{imageId}/vulnerabilities: get: description: Retrieves the most recent vulnerability scan result for an image operationId: get-image-vulnerabilities parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Image ID - in: path - name: imageId - required: true - schema: - description: Image ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID + in: path + name: imageId + required: true + schema: + description: Image ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseScanResult' + $ref: "#/components/schemas/BaseApiResponseScanResult" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get vulnerability scan result tags: - - Vulnerabilities + - Vulnerabilities /environments/{id}/images/{imageId}/vulnerabilities/list: get: description: Retrieves paginated vulnerabilities for an image operationId: list-image-vulnerabilities parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Image ID - in: path - name: imageId - required: true - schema: - description: Image ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Sort field - explode: false - in: query - name: sort - schema: - description: Sort field - type: string - - description: Sort order - explode: false - in: query - name: order - schema: - description: Sort order - type: string - - description: Start offset - explode: false - in: query - name: start - schema: - description: Start offset - format: int64 - type: integer - - description: Limit - explode: false - in: query - name: limit - schema: - description: Limit - format: int64 - type: integer - - description: Page number - explode: false - in: query - name: page - schema: - description: Page number - format: int64 - type: integer - - description: Comma-separated severity filter - explode: false - in: query - name: severity - schema: - description: Comma-separated severity filter - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID + in: path + name: imageId + required: true + schema: + description: Image ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Sort field + explode: false + in: query + name: sort + schema: + description: Sort field + type: string + - description: Sort order + explode: false + in: query + name: order + schema: + description: Sort order + type: string + - description: Start offset + explode: false + in: query + name: start + schema: + description: Start offset + format: int64 + type: integer + - description: Limit + explode: false + in: query + name: limit + schema: + description: Limit + format: int64 + type: integer + - description: Comma-separated severity filter + explode: false + in: query + name: severity + schema: + description: Comma-separated severity filter + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BasePaginatedVulnerability" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List image vulnerabilities + tags: + - Vulnerabilities + /environments/{id}/images/{imageId}/vulnerabilities/scan: + post: + description: Initiates a vulnerability scan for the specified image using Trivy + operationId: scan-image-vulnerabilities + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID to scan + in: path + name: imageId + required: true + schema: + description: Image ID to scan + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseScanResult" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Scan image for vulnerabilities + tags: + - Vulnerabilities + /environments/{id}/images/{imageId}/vulnerabilities/summary: + get: + description: Retrieves just the summary of vulnerabilities for an image (for list views) + operationId: get-image-vulnerability-summary + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID + in: path + name: imageId + required: true + schema: + description: Image ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseScanSummary" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get vulnerability scan summary + tags: + - Vulnerabilities + /environments/{id}/images/{name}/attestations: + get: + description: Get in-toto attestation statements attached to a Docker image + operationId: get-image-attestations + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID or image reference + in: path + name: name + required: true + schema: + description: Image ID or image reference + type: string + - description: OCI platform selector, for example linux/amd64 + explode: false + in: query + name: platform + schema: + description: OCI platform selector, for example linux/amd64 + type: string + - description: Exact in-toto predicate type URI to include + explode: false + in: query + name: predicateType + schema: + description: Exact in-toto predicate type URI to include + type: string + - description: Include verbatim statement JSON bodies + explode: false + in: query + name: statement + schema: + default: false + description: Include verbatim statement JSON bodies + type: boolean responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BasePaginatedVulnerability' + $ref: "#/components/schemas/BaseApiResponseAttestationList" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: List image vulnerabilities + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get image attestations tags: - - Vulnerabilities - /environments/{id}/images/{imageId}/vulnerabilities/scan: - post: - description: Initiates a vulnerability scan for the specified image using Trivy - operationId: scan-image-vulnerabilities + - Images + /environments/{id}/images/{name}/export: + get: + description: Download a Docker image as a tar archive + operationId: export-image parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Image ID to scan - in: path - name: imageId - required: true - schema: - description: Image ID to scan - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID or image reference + in: path + name: name + required: true + schema: + description: Image ID or image reference + type: string + responses: + "200": + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Export image + tags: + - Images + /environments/{id}/images/{name}/history: + get: + description: Get Docker image layer history + operationId: get-image-history + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID or image reference + in: path + name: name + required: true + schema: + description: Image ID or image reference + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseScanResult' + $ref: "#/components/schemas/BaseApiResponseListHistoryItem" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Scan image for vulnerabilities + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get image history tags: - - Vulnerabilities - /environments/{id}/images/{imageId}/vulnerabilities/summary: - get: - description: Retrieves just the summary of vulnerabilities for an image (for - list views) - operationId: get-image-vulnerability-summary + - Images + /environments/{id}/images/{name}/tag: + post: + description: Add a repository tag to an image + operationId: tag-image parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Image ID - in: path - name: imageId + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Image ID or image reference + in: path + name: name + required: true + schema: + description: Image ID or image reference + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ImageTagRequest" required: true - schema: - description: Image ID - type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseScanSummary' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Get vulnerability scan summary + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Tag image tags: - - Vulnerabilities + - Images /environments/{id}/job-schedules: get: description: Get configured cron schedules for background jobs operationId: get-job-schedules parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/JobscheduleConfig' + $ref: "#/components/schemas/JobscheduleConfig" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get job schedules tags: - - JobSchedules + - JobSchedules put: description: Update background job cron schedules and reschedule running jobs operationId: update-job-schedules parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/JobscheduleUpdate' + $ref: "#/components/schemas/JobscheduleUpdate" description: Job schedule update data required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseConfig' + $ref: "#/components/schemas/BaseApiResponseConfig" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update job schedules tags: - - JobSchedules + - JobSchedules /environments/{id}/jobs: get: description: Get status, schedule, and metadata for all background jobs operationId: list-jobs parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/JobscheduleJobListResponse' + $ref: "#/components/schemas/JobscheduleJobListResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List all background jobs tags: - - JobSchedules + - JobSchedules /environments/{id}/jobs/{jobId}/run: post: description: Manually trigger a background job to run immediately operationId: run-job parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Job ID to run - in: path - name: jobId - required: true - schema: - description: Job ID to run - minLength: 1 - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Job ID to run + in: path + name: jobId + required: true + schema: + description: Job ID to run + minLength: 1 + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/JobscheduleJobRunResponse' + $ref: "#/components/schemas/JobscheduleJobRunResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Run a job now tags: - - JobSchedules + - JobSchedules /environments/{id}/networks: get: operationId: list-networks parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - - description: Filter by in-use status (true/false) - explode: false - in: query - name: inUse - schema: - description: Filter by in-use status (true/false) - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + - description: Filter by in-use status (true/false) + explode: false + in: query + name: inUse + schema: + description: Filter by in-use status (true/false) + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/NetworkPaginatedResponse' + $ref: "#/components/schemas/NetworkPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List networks tags: - - Networks + - Networks post: operationId: create-network parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/NetworkCreateRequest' + $ref: "#/components/schemas/NetworkCreateRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/NetworkCreatedApiResponse' + $ref: "#/components/schemas/NetworkCreatedApiResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create network tags: - - Networks + - Networks /environments/{id}/networks/counts: get: operationId: network-counts parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/NetworkCountsApiResponse' + $ref: "#/components/schemas/NetworkCountsApiResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Network counts tags: - - Networks + - Networks /environments/{id}/networks/prune: post: operationId: prune-networks parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/NetworkPruneResponse' + $ref: "#/components/schemas/NetworkPruneResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Prune networks tags: - - Networks + - Networks /environments/{id}/networks/topology: get: operationId: get-network-topology parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/NetworkTopologyApiResponse' + $ref: "#/components/schemas/NetworkTopologyApiResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get network topology tags: - - Networks + - Networks /environments/{id}/networks/{networkId}: delete: operationId: delete-network parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Network ID - in: path - name: networkId - required: true - schema: - description: Network ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Network ID + in: path + name: networkId + required: true + schema: + description: Network ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/NetworkMessageApiResponse' + $ref: "#/components/schemas/NetworkMessageApiResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete network tags: - - Networks + - Networks get: operationId: get-network parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Network ID - in: path - name: networkId - required: true - schema: - description: Network ID - type: string - - explode: false - in: query - name: sort - schema: - default: name - type: string - - explode: false - in: query - name: order - schema: - default: asc - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Network ID + in: path + name: networkId + required: true + schema: + description: Network ID + type: string + - explode: false + in: query + name: sort + schema: + default: name + type: string + - explode: false + in: query + name: order + schema: + default: asc + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/NetworkInspectApiResponse' + $ref: "#/components/schemas/NetworkInspectApiResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get network tags: - - Networks - /environments/{id}/notifications/apprise: - get: - operationId: get-apprise-settings - parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/NotificationAppriseResponse' - description: OK - default: - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ErrorModel' - description: Error - security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Get Apprise settings - tags: - - Notifications - post: - operationId: create-or-update-apprise-settings - parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/NotificationAppriseUpdate' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/NotificationAppriseResponse' - description: OK - default: - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ErrorModel' - description: Error - security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Create or update Apprise settings - tags: - - Notifications - /environments/{id}/notifications/apprise/test: - post: - operationId: test-apprise-notification - parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - explode: false - in: query - name: type - schema: - default: simple - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' - description: OK - default: - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ErrorModel' - description: Error - security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Test Apprise notification - tags: - - Notifications + - Networks /environments/{id}/notifications/settings: get: operationId: get-all-notification-settings parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: items: - $ref: '#/components/schemas/NotificationResponse' + $ref: "#/components/schemas/NotificationResponse" type: - - array - - 'null' + - array + - "null" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get all notification settings tags: - - Notifications + - Notifications post: operationId: create-or-update-notification-settings parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/NotificationUpdate' + $ref: "#/components/schemas/NotificationUpdate" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/NotificationResponse' + $ref: "#/components/schemas/NotificationResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create or update notification settings tags: - - Notifications + - Notifications /environments/{id}/notifications/settings/{provider}: delete: operationId: delete-notification-settings parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Provider - in: path - name: provider - required: true - schema: - description: Provider - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Provider + in: path + name: provider + required: true + schema: + description: Provider + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete notification settings tags: - - Notifications + - Notifications get: operationId: get-notification-settings parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Provider - in: path - name: provider - required: true - schema: - description: Provider - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Provider + in: path + name: provider + required: true + schema: + description: Provider + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/NotificationResponse' + $ref: "#/components/schemas/NotificationResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get notification settings by provider tags: - - Notifications + - Notifications /environments/{id}/notifications/test/{provider}: post: operationId: test-notification parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Provider - in: path - name: provider - required: true - schema: - description: Provider - type: string - - explode: false - in: query - name: type - schema: - default: simple - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Provider + in: path + name: provider + required: true + schema: + description: Provider + type: string + - explode: false + in: query + name: type + schema: + default: simple + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseTestResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Test notification tags: - - Notifications + - Notifications /environments/{id}/ports: get: operationId: list-ports parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/PortPaginatedResponse' + $ref: "#/components/schemas/PortPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List port mappings tags: - - Ports + - Ports /environments/{id}/projects: get: description: Get a paginated list of Docker Compose projects operationId: list-projects parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - - description: 'Filter by status (comma-separated: running,stopped,partially - running)' - explode: false - in: query - name: status - schema: - description: 'Filter by status (comma-separated: running,stopped,partially - running)' - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + - description: "Filter by status (comma-separated: running,stopped,partially running)" + explode: false + in: query + name: status + schema: + description: "Filter by status (comma-separated: running,stopped,partially running)" + type: string + - description: Filter by update status (has_update, up_to_date, error, unknown) + explode: false + in: query + name: updates + schema: + description: Filter by update status (has_update, up_to_date, error, unknown) + type: string + - description: "Archived filter: 'true' (only archived), 'all' (include archived). Default excludes archived." + explode: false + in: query + name: archived + schema: + description: "Archived filter: 'true' (only archived), 'all' (include archived). Default excludes archived." + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/ProjectPaginatedResponse' + $ref: "#/components/schemas/ProjectPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List projects tags: - - Projects + - Projects post: description: Create a new Docker Compose project operationId: create-project parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ProjectCreateProject' + $ref: "#/components/schemas/ProjectCreateProject" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseCreateReponse' + $ref: "#/components/schemas/BaseApiResponseCreateReponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create a project tags: - - Projects + - Projects /environments/{id}/projects/counts: get: description: Get counts of running, stopped, and total projects operationId: get-project-status-counts parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseStatusCounts' + $ref: "#/components/schemas/BaseApiResponseStatusCounts" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get project status counts tags: - - Projects + - Projects /environments/{id}/projects/{projectId}: get: description: Get a Docker Compose project by ID operationId: get-project parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseDetails' + $ref: "#/components/schemas/BaseApiResponseDetails" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get a project tags: - - Projects + - Projects put: description: Update a Docker Compose project configuration operationId: update-project parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ProjectUpdateProject' + $ref: "#/components/schemas/ProjectUpdateProject" required: true responses: - '200': + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseDetails" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Update a project + tags: + - Projects + /environments/{id}/projects/{projectId}/archive: + post: + description: Archive a stopped Docker Compose project + operationId: archive-project + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseDetails' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Update a project + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Archive a project tags: - - Projects + - Projects /environments/{id}/projects/{projectId}/build: post: description: Build Docker Compose services with build directives using BuildKit operationId: build-project-images parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/BuildProjectInputBody' + $ref: "#/components/schemas/BuildProjectInputBody" responses: - '200': + "200": description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Build project images tags: - - Projects + - Projects + /environments/{id}/projects/{projectId}/compose: + get: + description: Get compose content, includes, and service configs for a project + operationId: get-project-compose + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseDetails" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get project compose details + tags: + - Projects /environments/{id}/projects/{projectId}/destroy: delete: description: Destroy a Docker Compose project and optionally remove files/volumes operationId: destroy-project parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ProjectDestroy' + $ref: "#/components/schemas/ProjectDestroy" responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Destroy a project tags: - - Projects + - Projects /environments/{id}/projects/{projectId}/down: post: description: Bring down a Docker Compose project (docker-compose down) operationId: down-project parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Bring down a project tags: - - Projects + - Projects + /environments/{id}/projects/{projectId}/file: + get: + description: Get the contents of a single project-related file by relative path + operationId: get-project-file + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string + - description: Path to the file relative to the project + explode: false + in: query + name: relativePath + schema: + description: Path to the file relative to the project + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseIncludeFile" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get a project file + tags: + - Projects + /environments/{id}/projects/{projectId}/files: + get: + description: Get directory files for a project + operationId: get-project-files + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseDetails" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get project files + tags: + - Projects /environments/{id}/projects/{projectId}/includes: put: description: Update an include file within a Docker Compose project operationId: update-project-include parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ProjectUpdateIncludeFile' + $ref: "#/components/schemas/ProjectUpdateIncludeFile" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseDetails' + $ref: "#/components/schemas/BaseApiResponseDetails" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update project include file tags: - - Projects + - Projects /environments/{id}/projects/{projectId}/pull: post: - description: Pull all images for a Docker Compose project with streaming progress - output + description: Pull all images for a Docker Compose project with streaming progress output operationId: pull-project-images parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string responses: - '200': + "200": description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Pull project images tags: - - Projects + - Projects /environments/{id}/projects/{projectId}/redeploy: post: description: Redeploy a Docker Compose project (down + up) operationId: redeploy-project parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ProjectDeployOptions" responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Redeploy a project tags: - - Projects + - Projects /environments/{id}/projects/{projectId}/restart: post: description: Restart all containers in a Docker Compose project operationId: restart-project parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Restart a project tags: - - Projects + - Projects + /environments/{id}/projects/{projectId}/runtime: + get: + description: Get runtime service state for a project + operationId: get-project-runtime + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseDetails" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get project runtime + tags: + - Projects + /environments/{id}/projects/{projectId}/unarchive: + post: + description: Unarchive a Docker Compose project + operationId: unarchive-project + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseMessageResponse" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Unarchive a project + tags: + - Projects /environments/{id}/projects/{projectId}/up: post: description: Deploy a Docker Compose project (docker-compose up) operationId: deploy-project parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Project ID - in: path - name: projectId - required: true - schema: - description: Project ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/ProjectDeployOptions' + $ref: "#/components/schemas/ProjectDeployOptions" responses: - '200': + "200": description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Deploy a project tags: - - Projects + - Projects + /environments/{id}/projects/{projectId}/update-services: + post: + description: Pull latest images and recreate the given services (all services when none are specified) + operationId: update-project-services + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateProjectServicesInputBody" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseMessageResponse" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Update project services + tags: + - Projects + /environments/{id}/projects/{projectId}/updates: + get: + description: Get image update summary for a project + operationId: get-project-updates + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Project ID + in: path + name: projectId + required: true + schema: + description: Project ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseDetails" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get project updates + tags: + - Projects /environments/{id}/settings: get: description: Get all settings for an environment operationId: get-settings parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: items: - $ref: '#/components/schemas/SettingsPublicSetting' + $ref: "#/components/schemas/SettingsPublicSetting" type: - - array - - 'null' + - array + - "null" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get settings tags: - - Settings + - Settings put: description: Update settings for an environment operationId: update-settings parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SettingsUpdate' + $ref: "#/components/schemas/SettingsUpdate" description: Settings update data required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListSettingDto' + $ref: "#/components/schemas/BaseApiResponseListSettingDto" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update settings tags: - - Settings + - Settings /environments/{id}/settings/public: get: description: Get all public settings for an environment operationId: get-public-settings parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: items: - $ref: '#/components/schemas/SettingsPublicSetting' + $ref: "#/components/schemas/SettingsPublicSetting" type: - - array - - 'null' + - array + - "null" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Get public settings tags: - - Settings + - Settings /environments/{id}/swarm/configs: get: operationId: list-swarm-configs parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListConfigSummary' + $ref: "#/components/schemas/BaseApiResponseListConfigSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List swarm configs tags: - - Swarm + - Swarm post: operationId: create-swarm-config parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmConfigCreateRequest' + $ref: "#/components/schemas/SwarmConfigCreateRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseConfigSummary' + $ref: "#/components/schemas/BaseApiResponseConfigSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create swarm config tags: - - Swarm + - Swarm /environments/{id}/swarm/configs/{configId}: delete: operationId: delete-swarm-config parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Config ID - in: path - name: configId - required: true - schema: - description: Config ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Config ID + in: path + name: configId + required: true + schema: + description: Config ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete swarm config tags: - - Swarm + - Swarm get: operationId: get-swarm-config parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Config ID - in: path - name: configId - required: true - schema: - description: Config ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Config ID + in: path + name: configId + required: true + schema: + description: Config ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseConfigSummary' + $ref: "#/components/schemas/BaseApiResponseConfigSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm config tags: - - Swarm + - Swarm put: operationId: update-swarm-config parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Config ID - in: path - name: configId - required: true - schema: - description: Config ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Config ID + in: path + name: configId + required: true + schema: + description: Config ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmConfigUpdateRequest' + $ref: "#/components/schemas/SwarmConfigUpdateRequest" required: true responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/BaseApiResponseConfigSummary' - description: OK + "204": + description: No Content default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update swarm config tags: - - Swarm + - Swarm /environments/{id}/swarm/info: get: operationId: get-swarm-info parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSwarmInfo' + $ref: "#/components/schemas/BaseApiResponseSwarmInfo" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm info tags: - - Swarm + - Swarm /environments/{id}/swarm/init: post: operationId: init-swarm parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmSwarmInitRequest' + $ref: "#/components/schemas/SwarmSwarmInitRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSwarmInitResponse' + $ref: "#/components/schemas/BaseApiResponseSwarmInitResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Initialize swarm tags: - - Swarm + - Swarm /environments/{id}/swarm/join: post: operationId: join-swarm parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmSwarmJoinRequest' + $ref: "#/components/schemas/SwarmSwarmJoinRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Join swarm tags: - - Swarm + - Swarm /environments/{id}/swarm/join-tokens: get: operationId: get-swarm-join-tokens parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSwarmJoinTokensResponse' + $ref: "#/components/schemas/BaseApiResponseSwarmJoinTokensResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm join tokens tags: - - Swarm + - Swarm /environments/{id}/swarm/join-tokens/rotate: post: operationId: rotate-swarm-join-tokens - parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmSwarmRotateJoinTokensRequest' + $ref: "#/components/schemas/SwarmSwarmRotateJoinTokensRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Rotate swarm join tokens tags: - - Swarm + - Swarm /environments/{id}/swarm/leave: post: operationId: leave-swarm parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmSwarmLeaveRequest' + $ref: "#/components/schemas/SwarmSwarmLeaveRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Leave swarm tags: - - Swarm + - Swarm /environments/{id}/swarm/nodes: get: operationId: list-swarm-nodes parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/SwarmPaginatedResponseNodeSummary' + $ref: "#/components/schemas/SwarmPaginatedResponseNodeSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List swarm nodes tags: - - Swarm + - Swarm /environments/{id}/swarm/nodes/{nodeId}: delete: operationId: delete-swarm-node parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Node ID - in: path - name: nodeId - required: true - schema: - description: Node ID - type: string - - description: Force node removal - explode: false - in: query - name: force - schema: - default: false - description: Force node removal - type: boolean + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Node ID + in: path + name: nodeId + required: true + schema: + description: Node ID + type: string + - description: Force node removal + explode: false + in: query + name: force + schema: + default: false + description: Force node removal + type: boolean responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete swarm node tags: - - Swarm + - Swarm get: operationId: get-swarm-node parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Node ID - in: path - name: nodeId - required: true - schema: - description: Node ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Node ID + in: path + name: nodeId + required: true + schema: + description: Node ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseNodeSummary' + $ref: "#/components/schemas/BaseApiResponseNodeSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm node tags: - - Swarm + - Swarm patch: operationId: update-swarm-node parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Node ID - in: path - name: nodeId - required: true - schema: - description: Node ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Node ID + in: path + name: nodeId + required: true + schema: + description: Node ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmNodeUpdateRequest' + $ref: "#/components/schemas/SwarmNodeUpdateRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update swarm node tags: - - Swarm + - Swarm /environments/{id}/swarm/nodes/{nodeId}/agent/deployment: post: operationId: get-swarm-node-agent-deployment parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Node ID - in: path - name: nodeId - required: true - schema: - description: Node ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Node ID + in: path + name: nodeId + required: true + schema: + description: Node ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/GetSwarmNodeAgentDeploymentInputBody' + $ref: "#/components/schemas/GetSwarmNodeAgentDeploymentInputBody" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSwarmNodeAgentDeployment' + $ref: "#/components/schemas/BaseApiResponseSwarmNodeAgentDeployment" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm node agent deployment snippets tags: - - Swarm + - Swarm /environments/{id}/swarm/nodes/{nodeId}/demote: post: operationId: demote-swarm-node parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Node ID - in: path - name: nodeId - required: true - schema: - description: Node ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Node ID + in: path + name: nodeId + required: true + schema: + description: Node ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Demote swarm node tags: - - Swarm + - Swarm /environments/{id}/swarm/nodes/{nodeId}/promote: post: operationId: promote-swarm-node parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Node ID - in: path - name: nodeId - required: true - schema: - description: Node ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Node ID + in: path + name: nodeId + required: true + schema: + description: Node ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Promote swarm node tags: - - Swarm + - Swarm /environments/{id}/swarm/nodes/{nodeId}/tasks: get: operationId: list-swarm-node-tasks parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Node ID - in: path - name: nodeId - required: true - schema: - description: Node ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Node ID + in: path + name: nodeId + required: true + schema: + description: Node ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/SwarmPaginatedResponseTaskSummary' + $ref: "#/components/schemas/SwarmPaginatedResponseTaskSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List tasks for a swarm node tags: - - Swarm + - Swarm /environments/{id}/swarm/secrets: get: operationId: list-swarm-secrets parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListSecretSummary' + $ref: "#/components/schemas/BaseApiResponseListSecretSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List swarm secrets tags: - - Swarm + - Swarm post: operationId: create-swarm-secret parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmSecretCreateRequest' + $ref: "#/components/schemas/SwarmSecretCreateRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSecretSummary' + $ref: "#/components/schemas/BaseApiResponseSecretSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create swarm secret tags: - - Swarm + - Swarm /environments/{id}/swarm/secrets/{secretId}: delete: operationId: delete-swarm-secret parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Secret ID - in: path - name: secretId - required: true - schema: - description: Secret ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Secret ID + in: path + name: secretId + required: true + schema: + description: Secret ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete swarm secret tags: - - Swarm + - Swarm get: operationId: get-swarm-secret parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Secret ID - in: path - name: secretId - required: true - schema: - description: Secret ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Secret ID + in: path + name: secretId + required: true + schema: + description: Secret ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSecretSummary' + $ref: "#/components/schemas/BaseApiResponseSecretSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm secret tags: - - Swarm + - Swarm put: operationId: update-swarm-secret parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Secret ID - in: path - name: secretId - required: true - schema: - description: Secret ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Secret ID + in: path + name: secretId + required: true + schema: + description: Secret ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmSecretUpdateRequest' + $ref: "#/components/schemas/SwarmSecretUpdateRequest" required: true responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/BaseApiResponseSecretSummary' - description: OK + "204": + description: No Content default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update swarm secret tags: - - Swarm + - Swarm /environments/{id}/swarm/services: get: operationId: list-swarm-services parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/SwarmPaginatedResponseServiceSummary' + $ref: "#/components/schemas/SwarmPaginatedResponseServiceSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List swarm services tags: - - Swarm + - Swarm post: operationId: create-swarm-service parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmServiceCreateRequest' + $ref: "#/components/schemas/SwarmServiceCreateRequest" description: Service creation request required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseServiceCreateResponse' + $ref: "#/components/schemas/BaseApiResponseServiceCreateResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create swarm service tags: - - Swarm + - Swarm /environments/{id}/swarm/services/{serviceId}: delete: operationId: delete-swarm-service parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Service ID - in: path - name: serviceId - required: true - schema: - description: Service ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Service ID + in: path + name: serviceId + required: true + schema: + description: Service ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete swarm service tags: - - Swarm + - Swarm get: operationId: get-swarm-service parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Service ID - in: path - name: serviceId - required: true - schema: - description: Service ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Service ID + in: path + name: serviceId + required: true + schema: + description: Service ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseServiceInspect' + $ref: "#/components/schemas/BaseApiResponseServiceInspect" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm service tags: - - Swarm + - Swarm put: operationId: update-swarm-service parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Service ID - in: path - name: serviceId - required: true - schema: - description: Service ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Service ID + in: path + name: serviceId + required: true + schema: + description: Service ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmServiceUpdateRequest' + $ref: "#/components/schemas/SwarmServiceUpdateRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseServiceUpdateResponse' + $ref: "#/components/schemas/BaseApiResponseServiceUpdateResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update swarm service tags: - - Swarm + - Swarm /environments/{id}/swarm/services/{serviceId}/rollback: post: operationId: rollback-swarm-service parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Service ID - in: path - name: serviceId - required: true - schema: - description: Service ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Service ID + in: path + name: serviceId + required: true + schema: + description: Service ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseServiceUpdateResponse' + $ref: "#/components/schemas/BaseApiResponseServiceUpdateResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Rollback a swarm service tags: - - Swarm + - Swarm /environments/{id}/swarm/services/{serviceId}/scale: post: operationId: scale-swarm-service parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Service ID - in: path - name: serviceId - required: true - schema: - description: Service ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Service ID + in: path + name: serviceId + required: true + schema: + description: Service ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmServiceScaleRequest' + $ref: "#/components/schemas/SwarmServiceScaleRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseServiceUpdateResponse' + $ref: "#/components/schemas/BaseApiResponseServiceUpdateResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Scale a swarm service tags: - - Swarm + - Swarm /environments/{id}/swarm/services/{serviceId}/tasks: get: operationId: list-swarm-service-tasks parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Service ID - in: path - name: serviceId - required: true - schema: - description: Service ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Service ID + in: path + name: serviceId + required: true + schema: + description: Service ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/SwarmPaginatedResponseTaskSummary' + $ref: "#/components/schemas/SwarmPaginatedResponseTaskSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List tasks for a swarm service tags: - - Swarm + - Swarm /environments/{id}/swarm/spec: put: operationId: update-swarm-spec parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmSwarmUpdateRequest' + $ref: "#/components/schemas/SwarmSwarmUpdateRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update swarm spec tags: - - Swarm + - Swarm /environments/{id}/swarm/stacks: get: operationId: list-swarm-stacks parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/SwarmPaginatedResponseStackSummary' + $ref: "#/components/schemas/SwarmPaginatedResponseStackSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List swarm stacks tags: - - Swarm + - Swarm post: operationId: deploy-swarm-stack parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmStackDeployRequest' + $ref: "#/components/schemas/SwarmStackDeployRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseStackDeployResponse' + $ref: "#/components/schemas/BaseApiResponseStackDeployResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Deploy swarm stack tags: - - Swarm + - Swarm /environments/{id}/swarm/stacks/config/render: post: operationId: render-swarm-stack-config parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmStackRenderConfigRequest' + $ref: "#/components/schemas/SwarmStackRenderConfigRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseStackRenderConfigResponse' + $ref: "#/components/schemas/BaseApiResponseStackRenderConfigResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Render/validate swarm stack config tags: - - Swarm + - Swarm /environments/{id}/swarm/stacks/{name}: delete: operationId: delete-swarm-stack parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Stack name - in: path - name: name - required: true - schema: - description: Stack name - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Stack name + in: path + name: name + required: true + schema: + description: Stack name + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete swarm stack tags: - - Swarm + - Swarm get: operationId: get-swarm-stack parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Stack name - in: path - name: name - required: true - schema: - description: Stack name - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Stack name + in: path + name: name + required: true + schema: + description: Stack name + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseStackInspect' + $ref: "#/components/schemas/BaseApiResponseStackInspect" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm stack tags: - - Swarm + - Swarm /environments/{id}/swarm/stacks/{name}/services: get: operationId: list-swarm-stack-services parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Stack name - in: path - name: name - required: true - schema: - description: Stack name - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Stack name + in: path + name: name + required: true + schema: + description: Stack name + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/SwarmPaginatedResponseServiceSummary' + $ref: "#/components/schemas/SwarmPaginatedResponseServiceSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List swarm stack services tags: - - Swarm + - Swarm /environments/{id}/swarm/stacks/{name}/source: get: operationId: get-swarm-stack-source parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Stack name - in: path - name: name - required: true - schema: - description: Stack name - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Stack name + in: path + name: name + required: true + schema: + description: Stack name + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseStackSource' + $ref: "#/components/schemas/BaseApiResponseStackSource" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm stack source tags: - - Swarm + - Swarm + put: + operationId: update-swarm-stack-source + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Stack name + in: path + name: name + required: true + schema: + description: Stack name + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SwarmStackSourceUpdateRequest" + required: true + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseStackSource" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Update swarm stack source + tags: + - Swarm /environments/{id}/swarm/stacks/{name}/tasks: get: operationId: list-swarm-stack-tasks parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Stack name - in: path - name: name - required: true - schema: - description: Stack name - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Stack name + in: path + name: name + required: true + schema: + description: Stack name + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/SwarmPaginatedResponseTaskSummary' + $ref: "#/components/schemas/SwarmPaginatedResponseTaskSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List swarm stack tasks tags: - - Swarm + - Swarm /environments/{id}/swarm/status: get: operationId: get-swarm-status parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseRuntimeStatus' + $ref: "#/components/schemas/BaseApiResponseRuntimeStatus" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm status tags: - - Swarm + - Swarm /environments/{id}/swarm/tasks: get: operationId: list-swarm-tasks parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/SwarmPaginatedResponseTaskSummary' + $ref: "#/components/schemas/SwarmPaginatedResponseTaskSummary" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List swarm tasks tags: - - Swarm + - Swarm /environments/{id}/swarm/unlock: post: operationId: unlock-swarm parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SwarmSwarmUnlockRequest' + $ref: "#/components/schemas/SwarmSwarmUnlockRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Unlock swarm tags: - - Swarm + - Swarm /environments/{id}/swarm/unlock-key: get: operationId: get-swarm-unlock-key parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSwarmUnlockKeyResponse' + $ref: "#/components/schemas/BaseApiResponseSwarmUnlockKeyResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get swarm unlock key tags: - - Swarm + - Swarm /environments/{id}/sync: post: description: Sync container registries and git repositories to a remote environment operationId: syncEnvironment parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Sync environment tags: - - Environments + - Environments /environments/{id}/system/containers/start-all: post: description: Start all Docker containers operationId: start-all-containers parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseActionResult' + $ref: "#/components/schemas/BaseApiResponseActionResult" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Start all containers tags: - - System + - System /environments/{id}/system/containers/start-stopped: post: description: Start all stopped Docker containers operationId: start-all-stopped-containers parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseActionResult' + $ref: "#/components/schemas/BaseApiResponseActionResult" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Start all stopped containers tags: - - System + - System /environments/{id}/system/containers/stop-all: post: description: Stop all running Docker containers operationId: stop-all-containers parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseActionResult' + $ref: "#/components/schemas/BaseApiResponseActionResult" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Stop all containers tags: - - System + - System /environments/{id}/system/convert: post: description: Convert a docker run command to docker-compose format operationId: convert-docker-run parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SystemConvertDockerRunRequest' + $ref: "#/components/schemas/SystemConvertDockerRunRequest" description: Docker run command required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/SystemConvertDockerRunResponse' + $ref: "#/components/schemas/SystemConvertDockerRunResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Convert docker run command tags: - - System + - System /environments/{id}/system/docker/info: get: description: Get Docker daemon version and system information operationId: get-docker-info parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/DockerinfoInfo' + $ref: "#/components/schemas/DockerinfoInfo" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get Docker info tags: - - System + - System /environments/{id}/system/health: head: description: Check if the Docker daemon is responsive operationId: system-health parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Check system health tags: - - System + - System /environments/{id}/system/prune: post: description: Remove unused Docker resources (containers, images, volumes, networks) operationId: prune-all parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/SystemPruneAllRequest' + $ref: "#/components/schemas/SystemPruneAllRequest" description: Prune options required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponsePruneAllResult' + $ref: "#/components/schemas/BaseApiResponsePruneAllResult" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Prune Docker resources tags: - - System + - System /environments/{id}/system/upgrade: post: description: Trigger a system upgrade operationId: trigger-upgrade parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '202': + "202": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: Accepted default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Trigger system upgrade tags: - - System + - System + /environments/{id}/system/upgrade/all: + post: + description: Upgrade every Arcane environment, starting with the manager + operationId: trigger-update-all + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + responses: + "202": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseEnvironmentUpdateJob" + description: Accepted + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Update all environments + tags: + - System + /environments/{id}/system/upgrade/all/status: + get: + description: Get the status of the latest update-all-environments job + operationId: update-all-status + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseEnvironmentUpdateJob" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get update-all status + tags: + - System /environments/{id}/system/upgrade/check: get: description: Check if a system upgrade is available operationId: check-upgrade parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/UpgradeCheckResultData' + $ref: "#/components/schemas/UpgradeCheckResultData" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Check for system upgrade tags: - - System + - System /environments/{id}/templates/variables: get: description: Get global template variables for an environment operationId: getGlobalVariables parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListVariable' + $ref: "#/components/schemas/BaseApiResponseListVariable" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get global variables tags: - - Templates + - Templates put: description: Update global template variables for an environment operationId: updateGlobalVariables parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/EnvSummary' + $ref: "#/components/schemas/EnvSummary" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update global variables tags: - - Templates + - Templates /environments/{id}/test: post: description: Test connectivity to a Arcane environment operationId: testConnection parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/EnvironmentTestConnectionRequest' + $ref: "#/components/schemas/EnvironmentTestConnectionRequest" responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseTest' + $ref: "#/components/schemas/BaseApiResponseTest" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Test environment connection tags: - - Environments + - Environments /environments/{id}/updater/history: get: description: Get the history of update operations operationId: get-updater-history parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Number of history entries to return - explode: false - in: query - name: limit - schema: - default: 50 - description: Number of history entries to return - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Number of history entries to return + explode: false + in: query + name: limit + schema: + default: 50 + description: Number of history entries to return + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListAutoUpdateRecord' + $ref: "#/components/schemas/BaseApiResponseListAutoUpdateRecord" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get updater history tags: - - Updater + - Updater /environments/{id}/updater/run: post: description: Apply pending container updates operationId: run-updater parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/UpdaterOptions' + $ref: "#/components/schemas/UpdaterOptions" description: Updater run options responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseResult' + $ref: "#/components/schemas/BaseApiResponseResult" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Run updater tags: - - Updater + - Updater /environments/{id}/updater/status: get: description: Get the current status of the updater operationId: get-updater-status parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseStatus' + $ref: "#/components/schemas/BaseApiResponseStatus" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get updater status tags: - - Updater + - Updater /environments/{id}/version: get: description: Get the version of a remote environment operationId: getEnvironmentVersion parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseInfo' + $ref: "#/components/schemas/BaseApiResponseInfo" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get environment version tags: - - Environments + - Environments /environments/{id}/volumes: get: description: Get a paginated list of Docker volumes operationId: list-volumes parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction (asc or desc) - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction (asc or desc) - type: string - - description: Start index for pagination - explode: false - in: query - name: start - schema: - default: 0 - description: Start index for pagination - format: int64 - type: integer - - description: Number of items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Number of items per page - format: int64 - type: integer - - description: Filter by in-use status (true/false) - explode: false - in: query - name: inUse - schema: - description: Filter by in-use status (true/false) - type: string - - description: Include internal volumes - explode: false - in: query - name: includeInternal - schema: - default: false - description: Include internal volumes - type: boolean + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + - description: Filter by in-use status (true/false) + explode: false + in: query + name: inUse + schema: + description: Filter by in-use status (true/false) + type: string + - description: Include internal volumes + explode: false + in: query + name: includeInternal + schema: + default: false + description: Include internal volumes + type: boolean responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/VolumePaginatedResponse' + $ref: "#/components/schemas/VolumePaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List volumes tags: - - Volumes + - Volumes post: description: Create a new Docker volume operationId: create-volume parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/VolumeCreate' + $ref: "#/components/schemas/VolumeCreate" description: Volume creation data required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseVolume' + $ref: "#/components/schemas/BaseApiResponseVolume" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create a volume tags: - - Volumes + - Volumes /environments/{id}/volumes/backups/{backupId}: delete: operationId: delete-volume-backup parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Backup ID - in: path - name: backupId - required: true - schema: - description: Backup ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Backup ID + in: path + name: backupId + required: true + schema: + description: Backup ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete volume backup tags: - - Volume Backup + - Volume Backup /environments/{id}/volumes/backups/{backupId}/download: get: operationId: download-volume-backup parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Backup ID - in: path - name: backupId - required: true - schema: - description: Backup ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Backup ID + in: path + name: backupId + required: true + schema: + description: Backup ID + type: string responses: - '200': + "200": description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Download volume backup tags: - - Volume Backup + - Volume Backup /environments/{id}/volumes/backups/{backupId}/files: get: operationId: list-backup-files parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Backup ID - in: path - name: backupId - required: true - schema: - description: Backup ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Backup ID + in: path + name: backupId + required: true + schema: + description: Backup ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListString' + $ref: "#/components/schemas/BaseApiResponseListString" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List files in a volume backup tags: - - Volume Backup + - Volume Backup /environments/{id}/volumes/backups/{backupId}/has-path: get: operationId: backup-has-path parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Backup ID - in: path - name: backupId - required: true - schema: - description: Backup ID - type: string - - description: Path to check - explode: false - in: query - name: path - schema: - description: Path to check - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Backup ID + in: path + name: backupId + required: true + schema: + description: Backup ID + type: string + - description: Path to check + explode: false + in: query + name: path + schema: + description: Path to check + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseBackupHasPathResponse' + $ref: "#/components/schemas/BaseApiResponseBackupHasPathResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Check if backup contains path tags: - - Volume Backup + - Volume Backup /environments/{id}/volumes/counts: get: description: Get counts of volumes in use, unused, and total operationId: get-volume-usage-counts parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Include internal volumes - explode: false - in: query - name: includeInternal - schema: - default: false - description: Include internal volumes - type: boolean + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Include internal volumes + explode: false + in: query + name: includeInternal + schema: + default: false + description: Include internal volumes + type: boolean responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseVolumeUsageCountsData' + $ref: "#/components/schemas/BaseApiResponseVolumeUsageCountsData" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get volume usage counts tags: - - Volumes + - Volumes /environments/{id}/volumes/prune: post: description: Remove all unused Docker volumes operationId: prune-volumes parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseVolumePruneReportData' + $ref: "#/components/schemas/BaseApiResponseVolumePruneReportData" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Prune unused volumes tags: - - Volumes + - Volumes /environments/{id}/volumes/sizes: get: description: Get disk usage sizes for all volumes (slow operation) operationId: get-volume-sizes parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListVolumeSizeInfo' + $ref: "#/components/schemas/BaseApiResponseListVolumeSizeInfo" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get volume sizes tags: - - Volumes + - Volumes /environments/{id}/volumes/{volumeName}: delete: description: Remove a Docker volume by name operationId: remove-volume parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: Force removal - explode: false - in: query - name: force - schema: - description: Force removal - type: boolean + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: Force removal + explode: false + in: query + name: force + schema: + description: Force removal + type: boolean responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Remove a volume tags: - - Volumes + - Volumes get: description: Get a Docker volume by its name operationId: get-volume parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseVolume' + $ref: "#/components/schemas/BaseApiResponseVolume" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get volume by name tags: - - Volumes + - Volumes /environments/{id}/volumes/{volumeName}/backups: get: operationId: list-volume-backups parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction - type: string - - description: Start index - explode: false - in: query - name: start - schema: - default: 0 - description: Start index - format: int64 - type: integer - - description: Limit - explode: false - in: query - name: limit - schema: - default: 20 - description: Limit - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Limit + explode: false + in: query + name: limit + schema: + default: 20 + description: Limit + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/VolumeBackupPaginatedResponse' + $ref: "#/components/schemas/VolumeBackupPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List volume backups tags: - - Volume Backup + - Volume Backup post: operationId: create-volume-backup parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseVolumeBackup' + $ref: "#/components/schemas/BaseApiResponseVolumeBackup" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create volume backup tags: - - Volume Backup + - Volume Backup /environments/{id}/volumes/{volumeName}/backups/upload: post: operationId: upload-volume-backup parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string requestBody: content: multipart/form-data: @@ -20555,154 +24440,154 @@ paths: format: binary type: string required: - - file + - file type: object required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Upload and restore volume backup tags: - - Volume Backup + - Volume Backup /environments/{id}/volumes/{volumeName}/backups/{backupId}/restore: post: operationId: restore-volume-backup parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: Backup ID - in: path - name: backupId - required: true - schema: - description: Backup ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: Backup ID + in: path + name: backupId + required: true + schema: + description: Backup ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Restore volume backup tags: - - Volume Backup + - Volume Backup /environments/{id}/volumes/{volumeName}/backups/{backupId}/restore-files: post: operationId: restore-volume-backup-files parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: Backup ID - in: path - name: backupId - required: true - schema: - description: Backup ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: Backup ID + in: path + name: backupId + required: true + schema: + description: Backup ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/RestoreBackupFilesInputBody' + $ref: "#/components/schemas/RestoreBackupFilesInputBody" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Restore specific files from a volume backup tags: - - Volume Backup + - Volume Backup /environments/{id}/volumes/{volumeName}/browse: delete: operationId: delete-volume-file parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: File or directory path to delete - explode: false - in: query - name: path - schema: - description: File or directory path to delete - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: File or directory path to delete + explode: false + in: query + name: path + schema: + description: File or directory path to delete + type: string responses: - '204': + "204": description: No Content headers: Data: schema: - $ref: '#/components/schemas/BaseMessageResponse' + $ref: "#/components/schemas/BaseMessageResponse" description: Response data Success: schema: @@ -20712,183 +24597,183 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete file or directory in volume tags: - - Volume Browser + - Volume Browser get: operationId: browse-volume-directory parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: Directory path to browse - explode: false - in: query - name: path - schema: - default: / - description: Directory path to browse - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: Directory path to browse + explode: false + in: query + name: path + schema: + default: / + description: Directory path to browse + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListFileEntry' + $ref: "#/components/schemas/BaseApiResponseListFileEntry" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List volume directory tags: - - Volume Browser + - Volume Browser /environments/{id}/volumes/{volumeName}/browse/content: get: operationId: get-volume-file-content parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: File path - explode: false - in: query - name: path - schema: - description: File path - type: string - - description: Maximum bytes to read (default 1MB) - explode: false - in: query - name: maxBytes - schema: - default: 1048576 - description: Maximum bytes to read (default 1MB) - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: File path + explode: false + in: query + name: path + schema: + description: File path + type: string + - description: Maximum bytes to read (default 1MB) + explode: false + in: query + name: maxBytes + schema: + default: 1048576 + description: Maximum bytes to read (default 1MB) + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseFileContentResponse' + $ref: "#/components/schemas/BaseApiResponseFileContentResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get file content preview tags: - - Volume Browser + - Volume Browser /environments/{id}/volumes/{volumeName}/browse/download: get: operationId: download-volume-file parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: File path - explode: false - in: query - name: path - schema: - description: File path - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: File path + explode: false + in: query + name: path + schema: + description: File path + type: string responses: - '200': + "200": description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Download file from volume tags: - - Volume Browser + - Volume Browser /environments/{id}/volumes/{volumeName}/browse/mkdir: post: operationId: create-volume-directory parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: Directory path to create - explode: false - in: query - name: path - schema: - description: Directory path to create - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: Directory path to create + explode: false + in: query + name: path + schema: + description: Directory path to create + type: string responses: - '204': + "204": description: No Content headers: Data: schema: - $ref: '#/components/schemas/BaseMessageResponse' + $ref: "#/components/schemas/BaseMessageResponse" description: Response data Success: schema: @@ -20898,40 +24783,40 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create directory in volume tags: - - Volume Browser + - Volume Browser /environments/{id}/volumes/{volumeName}/browse/upload: post: operationId: upload-volume-file parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string - - description: Destination path - explode: false - in: query - name: path - schema: - default: / - description: Destination path - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string + - description: Destination path + explode: false + in: query + name: path + schema: + default: / + description: Destination path + type: string requestBody: content: multipart/form-data: @@ -20943,16 +24828,16 @@ paths: format: binary type: string required: - - file + - file type: object required: true responses: - '204': + "204": description: No Content headers: Data: schema: - $ref: '#/components/schemas/BaseMessageResponse' + $ref: "#/components/schemas/BaseMessageResponse" description: Response data Success: schema: @@ -20962,1196 +24847,1594 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Upload file to volume tags: - - Volume Browser + - Volume Browser /environments/{id}/volumes/{volumeName}/usage: get: description: Get containers using a specific volume operationId: get-volume-usage parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Volume name - in: path - name: volumeName - required: true - schema: - description: Volume name - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Volume name + in: path + name: volumeName + required: true + schema: + description: Volume name + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseVolumeUsageResponse' + $ref: "#/components/schemas/BaseApiResponseVolumeUsageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get volume usage tags: - - Volumes + - Volumes /environments/{id}/vulnerabilities/all: get: - description: Retrieves paginated vulnerabilities across all scanned images in - the environment + description: Retrieves paginated vulnerabilities across all scanned images in the environment operationId: list-environment-vulnerabilities parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Sort field - explode: false - in: query - name: sort - schema: - description: Sort field - type: string - - description: Sort order - explode: false - in: query - name: order - schema: - description: Sort order - type: string - - description: Start offset - explode: false - in: query - name: start - schema: - description: Start offset - format: int64 - type: integer - - description: Limit - explode: false - in: query - name: limit - schema: - description: Limit - format: int64 - type: integer - - description: Page number - explode: false - in: query - name: page - schema: - description: Page number - format: int64 - type: integer - - description: Comma-separated severity filter - explode: false - in: query - name: severity - schema: - description: Comma-separated severity filter - type: string - - description: Filter by image/repo name (substring) - explode: false - in: query - name: imageName - schema: - description: Filter by image/repo name (substring) - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Sort field + explode: false + in: query + name: sort + schema: + description: Sort field + type: string + - description: Sort order + explode: false + in: query + name: order + schema: + description: Sort order + type: string + - description: Start offset + explode: false + in: query + name: start + schema: + description: Start offset + format: int64 + type: integer + - description: Limit + explode: false + in: query + name: limit + schema: + description: Limit + format: int64 + type: integer + - description: Comma-separated severity filter + explode: false + in: query + name: severity + schema: + description: Comma-separated severity filter + type: string + - description: Filter by image/repo name (substring) + explode: false + in: query + name: imageName + schema: + description: Filter by image/repo name (substring) + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BasePaginatedVulnerabilityWithImage' + $ref: "#/components/schemas/BasePaginatedVulnerabilityWithImage" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List environment vulnerabilities tags: - - Vulnerabilities + - Vulnerabilities /environments/{id}/vulnerabilities/ignore: post: description: Creates an ignore record for a specific vulnerability operationId: ignore-vulnerability parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/VulnerabilityIgnorePayload' + $ref: "#/components/schemas/VulnerabilityIgnorePayload" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseIgnoredVulnerability' + $ref: "#/components/schemas/BaseApiResponseIgnoredVulnerability" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Ignore a vulnerability tags: - - Vulnerabilities + - Vulnerabilities /environments/{id}/vulnerabilities/ignore/{ignoreId}: delete: description: Removes an ignore record for a vulnerability operationId: unignore-vulnerability parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Ignore record ID - in: path - name: ignoreId - required: true - schema: - description: Ignore record ID - type: string + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Ignore record ID + in: path + name: ignoreId + required: true + schema: + description: Ignore record ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseStruct {}' + $ref: "#/components/schemas/BaseApiResponseStruct {}" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Unignore a vulnerability tags: - - Vulnerabilities + - Vulnerabilities /environments/{id}/vulnerabilities/ignored: get: description: Retrieves a list of all ignored vulnerabilities for the environment operationId: list-ignored-vulnerabilities parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Sort field - explode: false - in: query - name: sort - schema: - description: Sort field - type: string - - description: Sort order - explode: false - in: query - name: order - schema: - description: Sort order - type: string - - description: Start offset - explode: false - in: query - name: start - schema: - description: Start offset - format: int64 - type: integer - - description: Limit - explode: false - in: query - name: limit - schema: - description: Limit - format: int64 - type: integer - - description: Page number - explode: false - in: query - name: page - schema: - description: Page number - format: int64 - type: integer - responses: - '200': + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Sort field + explode: false + in: query + name: sort + schema: + description: Sort field + type: string + - description: Sort order + explode: false + in: query + name: order + schema: + description: Sort order + type: string + - description: Start offset + explode: false + in: query + name: start + schema: + description: Start offset + format: int64 + type: integer + - description: Limit + explode: false + in: query + name: limit + schema: + description: Limit + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/BasePaginatedIgnoredVulnerability' + $ref: "#/components/schemas/BasePaginatedIgnoredVulnerability" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List ignored vulnerabilities tags: - - Vulnerabilities + - Vulnerabilities /environments/{id}/vulnerabilities/image-options: get: description: Retrieves available image filter options for environment vulnerabilities operationId: list-environment-vulnerability-image-options parameters: - - description: Environment ID - in: path - name: id + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Comma-separated severity filter + explode: false + in: query + name: severity + schema: + description: Comma-separated severity filter + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseListString" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List vulnerability image options + tags: + - Vulnerabilities + /environments/{id}/vulnerabilities/scanner-status: + get: + description: Check if the vulnerability scanner (Trivy) is available and get its version + operationId: get-vulnerability-scanner-status + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseScannerStatus" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get vulnerability scanner status + tags: + - Vulnerabilities + /environments/{id}/vulnerabilities/summary: + get: + description: Retrieves aggregated vulnerability counts across all images in the environment + operationId: get-environment-vulnerability-summary + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseEnvironmentVulnerabilitySummary" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get environment vulnerability summary + tags: + - Vulnerabilities + /environments/{id}/webhooks: + get: + description: List all webhooks configured for this environment + operationId: list-webhooks + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseListSummary" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List webhooks + tags: + - Webhooks + post: + description: Create a webhook that triggers a container or stack update. The token is only returned once. + operationId: create-webhook + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/WebhookCreateInput" required: true - schema: - description: Environment ID - type: string - - description: Comma-separated severity filter - explode: false - in: query - name: severity - schema: - description: Comma-separated severity filter - type: string responses: - '200': + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseCreated" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Create webhook + tags: + - Webhooks + /environments/{id}/webhooks/{webhookId}: + delete: + description: Delete a webhook by ID + operationId: delete-webhook + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Webhook ID + in: path + name: webhookId + required: true + schema: + description: Webhook ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseInterface {}" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Delete webhook + tags: + - Webhooks + patch: + description: Update a webhook's enabled state + operationId: update-webhook + parameters: + - description: Environment ID + in: path + name: id + required: true + schema: + description: Environment ID + type: string + - description: Webhook ID + in: path + name: webhookId + required: true + schema: + description: Webhook ID + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/WebhookUpdateInput" + required: true + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseInterface {}" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Update webhook + tags: + - Webhooks + /events: + get: + description: Get a paginated list of system events + operationId: listEvents + parameters: + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Limit + explode: false + in: query + name: limit + schema: + default: 20 + description: Limit + format: int64 + type: integer + - description: Filter by severity + explode: false + in: query + name: severity + schema: + description: Filter by severity + type: string + - description: Filter by event type + explode: false + in: query + name: type + schema: + description: Filter by event type + type: string + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListString' + $ref: "#/components/schemas/EventPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: List vulnerability image options + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List events tags: - - Vulnerabilities - /environments/{id}/vulnerabilities/scanner-status: + - Events + /events/environment/{environmentId}: get: - description: Check if the vulnerability scanner (Trivy) is available and get - its version - operationId: get-vulnerability-scanner-status + description: Get a paginated list of events for a specific environment + operationId: getEventsByEnvironment parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Environment ID + in: path + name: environmentId + required: true + schema: + description: Environment ID + type: string + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Limit + explode: false + in: query + name: limit + schema: + default: 20 + description: Limit + format: int64 + type: integer + - description: Filter by severity + explode: false + in: query + name: severity + schema: + description: Filter by severity + type: string + - description: Filter by event type + explode: false + in: query + name: type + schema: + description: Filter by event type + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseScannerStatus' + $ref: "#/components/schemas/EventPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Get vulnerability scanner status + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get events by environment tags: - - Vulnerabilities - /environments/{id}/vulnerabilities/summary: - get: - description: Retrieves aggregated vulnerability counts across all images in - the environment - operationId: get-environment-vulnerability-summary + - Events + /events/{eventId}: + delete: + description: Delete a system event by ID + operationId: deleteEvent parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + - description: Event ID + in: path + name: eventId + required: true + schema: + description: Event ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseEnvironmentVulnerabilitySummary' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Get environment vulnerability summary + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Delete an event tags: - - Vulnerabilities - /environments/{id}/webhooks: + - Events + /federated-credentials: get: - description: List all webhooks configured for this environment - operationId: list-webhooks + description: Get a paginated list of workload identity federation trust rules + operationId: list-federated-credentials parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - responses: - '200': + - description: Search query for filtering by name, issuer, or subject + explode: false + in: query + name: search + schema: + description: Search query for filtering by name, issuer, or subject + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Number of items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Number of items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListSummary' + $ref: "#/components/schemas/BasePaginatedFederatedCredential" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: List webhooks + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List federated credentials tags: - - Webhooks + - Federated Credentials post: - description: Create a webhook that triggers a container or stack update. The - token is only returned once. - operationId: create-webhook - parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string + description: Create a workload identity federation trust rule + operationId: create-federated-credential requestBody: content: application/json: schema: - $ref: '#/components/schemas/WebhookCreateInput' + $ref: "#/components/schemas/FederatedCreateFederatedCredential" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseCreated' + $ref: "#/components/schemas/BaseApiResponseFederatedCredential" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Create webhook + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Create a federated credential tags: - - Webhooks - /environments/{id}/webhooks/{webhookId}: + - Federated Credentials + /federated-credentials/{id}: delete: - description: Delete a webhook by ID - operationId: delete-webhook + description: Delete a workload identity federation trust rule and its service user + operationId: delete-federated-credential parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Webhook ID - in: path - name: webhookId - required: true - schema: - description: Webhook ID - type: string + - description: Federated credential ID + in: path + name: id + required: true + schema: + description: Federated credential ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseInterface {}' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Delete webhook + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Delete a federated credential tags: - - Webhooks - patch: - description: Update a webhook's enabled state - operationId: update-webhook + - Federated Credentials + get: + description: Get details of a workload identity federation trust rule + operationId: get-federated-credential parameters: - - description: Environment ID - in: path - name: id - required: true - schema: - description: Environment ID - type: string - - description: Webhook ID - in: path - name: webhookId - required: true - schema: - description: Webhook ID - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/WebhookUpdateInput' - required: true + - description: Federated credential ID + in: path + name: id + required: true + schema: + description: Federated credential ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseInterface {}' + $ref: "#/components/schemas/BaseApiResponseFederatedCredential" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Update webhook + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get a federated credential tags: - - Webhooks - /events: - get: - description: Get a paginated list of system events - operationId: listEvents + - Federated Credentials + put: + description: Update a workload identity federation trust rule + operationId: update-federated-credential parameters: - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction - type: string - - description: Start index - explode: false - in: query - name: start - schema: - default: 0 - description: Start index - format: int64 - type: integer - - description: Limit - explode: false - in: query - name: limit - schema: - default: 20 - description: Limit - format: int64 - type: integer - - description: Filter by severity - explode: false - in: query - name: severity - schema: - description: Filter by severity - type: string - - description: Filter by event type - explode: false - in: query - name: type - schema: - description: Filter by event type - type: string + - description: Federated credential ID + in: path + name: id + required: true + schema: + description: Federated credential ID + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/FederatedUpdateFederatedCredential" + required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/EventPaginatedResponse' + $ref: "#/components/schemas/BaseApiResponseFederatedCredential" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: List events + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Update a federated credential tags: - - Events + - Federated Credentials + /git-repositories/sync: post: - description: Create a new system event - operationId: createEvent - parameters: - - description: API key for environment-scoped event forwarding - in: header - name: X-API-Key - schema: - description: API key for environment-scoped event forwarding - type: string + description: Sync git repositories from a manager to this agent instance + operationId: syncGitRepositories requestBody: content: application/json: schema: - $ref: '#/components/schemas/EventCreateEvent' + $ref: "#/components/schemas/GitopsRepositorySyncRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseEvent' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Create an event + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Sync git repositories tags: - - Events - /events/environment/{environmentId}: + - Git Repositories + /health: get: - description: Get a paginated list of events for a specific environment - operationId: getEventsByEnvironment - parameters: - - description: Environment ID - in: path - name: environmentId - required: true - schema: - description: Environment ID - type: string - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction - type: string - - description: Start index - explode: false - in: query - name: start - schema: - default: 0 - description: Start index - format: int64 - type: integer - - description: Limit - explode: false - in: query - name: limit - schema: - default: 20 - description: Limit - format: int64 - type: integer - - description: Filter by severity - explode: false - in: query - name: severity - schema: - description: Filter by severity - type: string - - description: Filter by event type - explode: false - in: query - name: type - schema: - description: Filter by event type - type: string + description: Check if the API is healthy + operationId: health-check responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/EventPaginatedResponse' + $ref: "#/components/schemas/SystemHealthResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Get events by environment + security: [] + summary: Health check tags: - - Events - /events/{eventId}: - delete: - description: Delete a system event by ID - operationId: deleteEvent + - Health + head: + description: Check if the API is healthy (HEAD request) + operationId: health-check-head + responses: + "200": + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: [] + summary: Health check (HEAD) + tags: + - Health + /notifications/dispatch: + post: + operationId: dispatch-notification parameters: - - description: Event ID - in: path - name: eventId + - description: Remote environment access token + in: header + name: X-API-Key + schema: + description: Remote environment access token + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/NotificationDispatchRequest" required: true - schema: - description: Event ID - type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseDispatchResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Delete an event + - ApiKeyAuth: [] + summary: Dispatch notification from remote agent to manager tags: - - Events - /fonts/mono: - get: - description: Get the application monospace font (Geist Mono) - operationId: get-mono-font + - Notifications + /oidc/callback: + post: + description: Process the OIDC callback and complete authentication + operationId: handle-oidc-callback + parameters: + - in: header + name: Origin + schema: + type: string + - in: header + name: X-Forwarded-Host + schema: + type: string + - in: header + name: X-Forwarded-Proto + schema: + type: string + - in: header + name: Host + schema: + type: string + - in: header + name: User-Agent + schema: + type: string + - description: OIDC state cookie from auth URL request + in: cookie + name: oidc_state + schema: + description: OIDC state cookie from auth URL request + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AuthOidcCallbackRequest" + required: true responses: - '200': + "200": content: application/json: schema: - contentEncoding: base64 - type: string + $ref: "#/components/schemas/AuthOidcCallbackResponse" description: OK headers: - Cache-Control: - schema: - type: string - Content-Type: + Set-Cookie: schema: + description: Session and clear state cookies type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: [] - summary: Get monospace font + summary: Handle OIDC callback tags: - - Fonts - /fonts/sans: + - OIDC + /oidc/config: get: - description: Get the application sans-serif font (Geist) - operationId: get-sans-font + description: Get the OIDC client configuration + operationId: get-oidc-config + parameters: + - in: header + name: Origin + schema: + type: string + - in: header + name: X-Forwarded-Host + schema: + type: string + - in: header + name: X-Forwarded-Proto + schema: + type: string + - in: header + name: Host + schema: + type: string + - in: header + name: User-Agent + schema: + type: string responses: - '200': + "200": content: application/json: schema: - contentEncoding: base64 - type: string + $ref: "#/components/schemas/AuthOidcConfigResponse" description: OK - headers: - Cache-Control: - schema: - type: string - Content-Type: - schema: - type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: [] - summary: Get sans-serif font + summary: Get OIDC config tags: - - Fonts - /fonts/serif: - get: - description: Get the application serif font (Calistoga) - operationId: get-serif-font + - OIDC + /oidc/device/code: + post: + description: Start the device authorization flow for CLI authentication + operationId: initiate-oidc-device-auth responses: - '200': + "200": content: application/json: schema: - contentEncoding: base64 - type: string + $ref: "#/components/schemas/AuthOidcDeviceAuthResponse" description: OK - headers: - Cache-Control: - schema: - type: string - Content-Type: - schema: - type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: [] - summary: Get serif font + summary: Initiate OIDC device authorization tags: - - Fonts - /git-repositories/sync: + - OIDC + /oidc/device/token: post: - description: Sync git repositories from a manager to this agent instance - operationId: syncGitRepositories + description: Exchange a device code for authentication tokens + operationId: exchange-oidc-device-token + parameters: + - in: header + name: User-Agent + schema: + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/GitopsRepositorySyncRequest' + $ref: "#/components/schemas/AuthOidcDeviceTokenRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/AuthOidcDeviceTokenResponse" description: OK + headers: + Set-Cookie: + schema: + description: Session token cookie + type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - security: - - BearerAuth: [] - - ApiKeyAuth: [] - summary: Sync git repositories + security: [] + summary: Exchange device code for tokens tags: - - Git Repositories - /health: + - OIDC + /oidc/role-mappings: get: - description: Check if the API is healthy - operationId: health-check + description: Returns every mapping. On each OIDC login the user's group claim is matched against ClaimValue and matching rows become source='oidc' role assignments. + operationId: list-oidc-role-mappings + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ListOidcRoleMappingsOutputBody" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List OIDC group → role mappings + tags: + - OIDC + post: + operationId: create-oidc-role-mapping + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoleCreateOidcRoleMapping" + required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/SystemHealthResponse' + $ref: "#/components/schemas/CreateOidcRoleMappingOutputBody" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - summary: Health check + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Create an OIDC role mapping tags: - - Health - head: - description: Check if the API is healthy (HEAD request) - operationId: health-check-head + - OIDC + /oidc/role-mappings/{id}: + delete: + operationId: delete-oidc-role-mapping + parameters: + - description: Mapping ID + in: path + name: id + required: true + schema: + description: Mapping ID + type: string responses: - '200': + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/DeleteOidcRoleMappingOutputBody" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - summary: Health check (HEAD) + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Delete an OIDC role mapping tags: - - Health - /notifications/dispatch: - post: - operationId: dispatch-notification + - OIDC + put: + operationId: update-oidc-role-mapping parameters: - - description: Remote environment access token - in: header - name: X-API-Key - schema: - description: Remote environment access token - type: string + - description: Mapping ID + in: path + name: id + required: true + schema: + description: Mapping ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/NotificationDispatchRequest' + $ref: "#/components/schemas/RoleUpdateOidcRoleMapping" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/UpdateOidcRoleMappingOutputBody" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - ApiKeyAuth: [] - summary: Dispatch notification from remote agent to manager + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Update an OIDC role mapping tags: - - Notifications - /oidc/callback: + - OIDC + /oidc/status: + get: + description: Get the current OIDC configuration status + operationId: get-oidc-status + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/AuthOidcStatusInfo" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: [] + summary: Get OIDC status + tags: + - OIDC + /oidc/url: post: - description: Process the OIDC callback and complete authentication - operationId: handle-oidc-callback + description: Generate an OIDC authorization URL for login + operationId: get-oidc-auth-url parameters: - - in: header - name: Origin - schema: - type: string - - in: header - name: X-Forwarded-Host - schema: - type: string - - in: header - name: X-Forwarded-Proto - schema: - type: string - - in: header - name: Host - schema: - type: string - - description: OIDC state cookie from auth URL request - in: cookie - name: oidc_state - schema: - description: OIDC state cookie from auth URL request - type: string + - in: header + name: Origin + schema: + type: string + - in: header + name: X-Forwarded-Host + schema: + type: string + - in: header + name: X-Forwarded-Proto + schema: + type: string + - in: header + name: Host + schema: + type: string + - in: header + name: User-Agent + schema: + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/AuthOidcCallbackRequest' + $ref: "#/components/schemas/AuthOidcAuthUrlRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/AuthOidcCallbackResponse' + $ref: "#/components/schemas/AuthOidcAuthUrlResponse" description: OK headers: Set-Cookie: schema: - description: Session and clear state cookies + description: OIDC state cookie type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - summary: Handle OIDC callback + security: [] + summary: Get OIDC auth URL tags: - - OIDC - /oidc/config: + - OIDC + /roles: get: - description: Get the OIDC client configuration - operationId: get-oidc-config + description: Get a paginated list of roles (built-in + custom) + operationId: list-roles parameters: - - in: header - name: Origin - schema: - type: string - - in: header - name: X-Forwarded-Host - schema: - type: string - - in: header - name: X-Forwarded-Proto - schema: - type: string - - in: header - name: Host - schema: - type: string - responses: - '200': + - description: Search by role name or description + explode: false + in: query + name: search + schema: + description: Search by role name or description + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction (asc or desc) + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction (asc or desc) + type: string + - description: Start index for pagination + explode: false + in: query + name: start + schema: + default: 0 + description: Start index for pagination + format: int64 + type: integer + - description: Items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/AuthOidcConfigResponse' + $ref: "#/components/schemas/RolePaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - summary: Get OIDC config + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List roles tags: - - OIDC - /oidc/device/code: + - Roles post: - description: Start the device authorization flow for CLI authentication - operationId: initiate-oidc-device-auth + description: Built-in roles cannot be created via this endpoint; only custom roles are accepted. Reserved for global admins. + operationId: create-role + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoleCreateRole" + required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/AuthOidcDeviceAuthResponse' + $ref: "#/components/schemas/BaseApiResponseRole" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - summary: Initiate OIDC device authorization + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Create a custom role tags: - - OIDC - /oidc/device/token: - post: - description: Exchange a device code for authentication tokens - operationId: exchange-oidc-device-token - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/AuthOidcDeviceTokenRequest' - required: true + - Roles + /roles/available-permissions: + get: + description: Returns every permission the server recognizes, grouped by resource. Used by permission-picking UIs. + operationId: get-permissions-manifest responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/AuthOidcDeviceTokenResponse' + $ref: "#/components/schemas/BaseApiResponsePermissionsManifest" description: OK - headers: - Set-Cookie: + default: + content: + application/problem+json: schema: - description: Session token cookie - type: string + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get the permission manifest + tags: + - Roles + /roles/{id}: + delete: + description: Built-in roles are protected; deleting cascades all user assignments. Reserved for global admins. + operationId: delete-role + parameters: + - description: Role ID + in: path + name: id + required: true + schema: + description: Role ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseMessageResponse" + description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - summary: Exchange device code for tokens + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Delete a custom role tags: - - OIDC - /oidc/status: + - Roles get: - description: Get the current OIDC configuration status - operationId: get-oidc-status + operationId: get-role + parameters: + - description: Role ID + in: path + name: id + required: true + schema: + description: Role ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/AuthOidcStatusInfo' + $ref: "#/components/schemas/BaseApiResponseRole" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - summary: Get OIDC status + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Get a role tags: - - OIDC - /oidc/url: - post: - description: Generate an OIDC authorization URL for login - operationId: get-oidc-auth-url + - Roles + put: + description: Built-in roles are read-only and return 403 on update. Reserved for global admins. + operationId: update-role parameters: - - in: header - name: Origin - schema: - type: string - - in: header - name: X-Forwarded-Host - schema: - type: string - - in: header - name: X-Forwarded-Proto - schema: - type: string - - in: header - name: Host - schema: - type: string + - description: Role ID + in: path + name: id + required: true + schema: + description: Role ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/AuthOidcAuthUrlRequest' + $ref: "#/components/schemas/RoleUpdateRole" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/AuthOidcAuthUrlResponse' + $ref: "#/components/schemas/BaseApiResponseRole" description: OK - headers: - Set-Cookie: - schema: - description: OIDC state cookie - type: string default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error - summary: Get OIDC auth URL + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Update a custom role tags: - - OIDC + - Roles /settings/categories: get: description: Get all available settings categories with metadata operationId: get-settings-categories responses: - '200': + "200": content: application/json: schema: items: - $ref: '#/components/schemas/CategoryCategory' + $ref: "#/components/schemas/CategoryCategory" type: - - array - - 'null' + - array + - "null" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get settings categories tags: - - Settings + - Settings /settings/search: post: description: Search settings categories and individual settings by query @@ -22160,111 +26443,118 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SearchRequest' + $ref: "#/components/schemas/SearchRequest" description: Search query required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/SearchResponse' + $ref: "#/components/schemas/SearchResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Search settings tags: - - Settings + - Settings /swarm/node-identity: get: operationId: get-swarm-node-identity responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseSwarmNodeIdentity' + $ref: "#/components/schemas/BaseApiResponseSwarmNodeIdentity" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get local swarm node identity tags: - - Swarm + - Swarm /templates: get: description: Get a paginated list of compose templates operationId: listTemplatesPaginated parameters: - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction - type: string - - description: Start index - explode: false - in: query - name: start - schema: - default: 0 - description: Start index - format: int64 - type: integer - - description: Items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Items per page - format: int64 - type: integer + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Items per page + format: int64 + type: integer + - description: "Filter by template type (comma-separated: false,true)" + explode: false + in: query + name: type + schema: + description: "Filter by template type (comma-separated: false,true)" + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/TemplatePaginatedResponse' + $ref: "#/components/schemas/TemplatePaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error summary: List templates (paginated) tags: - - Templates + - Templates post: description: Create a new compose template operationId: createTemplate @@ -22272,70 +26562,70 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TemplateCreateRequest' + $ref: "#/components/schemas/TemplateCreateRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseTemplate' + $ref: "#/components/schemas/BaseApiResponseTemplate" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create a template tags: - - Templates + - Templates /templates/all: get: description: Get all compose templates without pagination operationId: getAllTemplates responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListTemplate' + $ref: "#/components/schemas/BaseApiResponseListTemplate" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error summary: List all templates tags: - - Templates + - Templates /templates/default: get: description: Get the default compose and env templates operationId: getDefaultTemplates responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseDefaultTemplatesResponse' + $ref: "#/components/schemas/BaseApiResponseDefaultTemplatesResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get default templates tags: - - Templates + - Templates post: description: Save the default compose and env templates operationId: saveDefaultTemplates @@ -22343,79 +26633,82 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TemplateSaveDefaultTemplatesRequest' + $ref: "#/components/schemas/TemplateSaveDefaultTemplatesRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Save default templates tags: - - Templates + - Templates /templates/fetch: get: description: Fetch templates from a remote registry URL operationId: fetchTemplateRegistry parameters: - - description: Registry URL - explode: false - in: query - name: url - required: true - schema: - description: Registry URL - type: string + - description: Registry URL + explode: false + in: query + name: url + required: true + schema: + description: Registry URL + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseRemoteRegistry' + $ref: "#/components/schemas/BaseApiResponseRemoteRegistry" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] summary: Fetch remote registry tags: - - Templates + - Templates /templates/registries: get: description: Get all template registries operationId: getTemplateRegistries responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseListTemplateRegistry' + $ref: "#/components/schemas/BaseApiResponseListTemplateRegistry" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List template registries tags: - - Templates + - Templates post: description: Create a new template registry operationId: createTemplateRegistry @@ -22423,311 +26716,311 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TemplateCreateRegistryRequest' + $ref: "#/components/schemas/TemplateCreateRegistryRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseTemplateRegistry' + $ref: "#/components/schemas/BaseApiResponseTemplateRegistry" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create a template registry tags: - - Templates + - Templates /templates/registries/{id}: delete: description: Delete a template registry operationId: deleteTemplateRegistry parameters: - - description: Registry ID - in: path - name: id - required: true - schema: - description: Registry ID - type: string + - description: Registry ID + in: path + name: id + required: true + schema: + description: Registry ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete a template registry tags: - - Templates + - Templates put: description: Update an existing template registry operationId: updateTemplateRegistry parameters: - - description: Registry ID - in: path - name: id - required: true - schema: - description: Registry ID - type: string + - description: Registry ID + in: path + name: id + required: true + schema: + description: Registry ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/TemplateUpdateRegistryRequest' + $ref: "#/components/schemas/TemplateUpdateRegistryRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update a template registry tags: - - Templates + - Templates /templates/{id}: delete: description: Delete a compose template operationId: deleteTemplate parameters: - - description: Template ID - in: path - name: id - required: true - schema: - description: Template ID - type: string + - description: Template ID + in: path + name: id + required: true + schema: + description: Template ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete a template tags: - - Templates + - Templates get: description: Get a compose template by ID operationId: getTemplate parameters: - - description: Template ID - in: path - name: id - required: true - schema: - description: Template ID - type: string + - description: Template ID + in: path + name: id + required: true + schema: + description: Template ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseTemplate' + $ref: "#/components/schemas/BaseApiResponseTemplate" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error summary: Get a template tags: - - Templates + - Templates put: description: Update an existing compose template operationId: updateTemplate parameters: - - description: Template ID - in: path - name: id - required: true - schema: - description: Template ID - type: string + - description: Template ID + in: path + name: id + required: true + schema: + description: Template ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/TemplateUpdateRequest' + $ref: "#/components/schemas/TemplateUpdateRequest" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseTemplate' + $ref: "#/components/schemas/BaseApiResponseTemplate" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update a template tags: - - Templates + - Templates /templates/{id}/content: get: description: Get the compose content for a template with parsed data operationId: getTemplateContent parameters: - - description: Template ID - in: path - name: id - required: true - schema: - description: Template ID - type: string + - description: Template ID + in: path + name: id + required: true + schema: + description: Template ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseTemplateContent' + $ref: "#/components/schemas/BaseApiResponseTemplateContent" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error summary: Get template content tags: - - Templates + - Templates /templates/{id}/download: post: description: Download a remote template to local storage operationId: downloadTemplate parameters: - - description: Template ID - in: path - name: id - required: true - schema: - description: Template ID - type: string + - description: Template ID + in: path + name: id + required: true + schema: + description: Template ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseTemplate' + $ref: "#/components/schemas/BaseApiResponseTemplate" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Download a template tags: - - Templates + - Templates /users: get: description: Get a paginated list of all users operationId: listUsers parameters: - - description: Search query - explode: false - in: query - name: search - schema: - description: Search query - type: string - - description: Column to sort by - explode: false - in: query - name: sort - schema: - description: Column to sort by - type: string - - description: Sort direction - explode: false - in: query - name: order - schema: - default: asc - description: Sort direction - type: string - - description: Start index - explode: false - in: query - name: start - schema: - default: 0 - description: Start index - format: int64 - type: integer - - description: Items per page - explode: false - in: query - name: limit - schema: - default: 20 - description: Items per page - format: int64 - type: integer - responses: - '200': + - description: Search query + explode: false + in: query + name: search + schema: + description: Search query + type: string + - description: Column to sort by + explode: false + in: query + name: sort + schema: + description: Column to sort by + type: string + - description: Sort direction + explode: false + in: query + name: order + schema: + default: asc + description: Sort direction + type: string + - description: Start index + explode: false + in: query + name: start + schema: + default: 0 + description: Start index + format: int64 + type: integer + - description: Items per page + explode: false + in: query + name: limit + schema: + default: 20 + description: Items per page + format: int64 + type: integer + responses: + "200": content: application/json: schema: - $ref: '#/components/schemas/UserPaginatedResponse' + $ref: "#/components/schemas/UserPaginatedResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: List users tags: - - Users + - Users post: description: Create a new user account operationId: createUser @@ -22735,151 +27028,262 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/UserCreateUser' + $ref: "#/components/schemas/UserCreateUser" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseUser' + $ref: "#/components/schemas/BaseApiResponseUser" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Create a user tags: - - Users + - Users /users/{userId}: delete: description: Delete a user by ID operationId: deleteUser parameters: - - description: User ID - in: path - name: userId - required: true - schema: - description: User ID - type: string + - description: User ID + in: path + name: userId + required: true + schema: + description: User ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseMessageResponse' + $ref: "#/components/schemas/BaseApiResponseMessageResponse" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Delete a user tags: - - Users + - Users get: description: Get a user by ID operationId: getUser parameters: - - description: User ID - in: path - name: userId - required: true - schema: - description: User ID - type: string + - description: User ID + in: path + name: userId + required: true + schema: + description: User ID + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseUser' + $ref: "#/components/schemas/BaseApiResponseUser" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Get a user tags: - - Users + - Users put: description: Update an existing user's information operationId: updateUser parameters: - - description: User ID - in: path - name: userId - required: true - schema: - description: User ID - type: string + - description: User ID + in: path + name: userId + required: true + schema: + description: User ID + type: string requestBody: content: application/json: schema: - $ref: '#/components/schemas/UserUpdateUser' + $ref: "#/components/schemas/UserUpdateUser" required: true responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/BaseApiResponseUser' + $ref: "#/components/schemas/BaseApiResponseUser" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error security: - - BearerAuth: [] - - ApiKeyAuth: [] + - BearerAuth: [] + - ApiKeyAuth: [] summary: Update a user tags: - - Users + - Users + /users/{userId}/avatar: + get: + description: Get the custom profile picture for a user + operationId: getUserAvatar + parameters: + - description: User ID + in: path + name: userId + required: true + schema: + description: User ID + type: string + responses: + "200": + content: + application/json: + schema: + contentEncoding: base64 + type: string + description: OK + headers: + Cache-Control: + schema: + type: string + Content-Type: + schema: + type: string + X-Content-Type-Options: + schema: + type: string + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: [] + summary: Get user avatar + tags: + - Users + /users/{userId}/role-assignments: + get: + description: Reserved for global admins. + operationId: list-user-role-assignments + parameters: + - description: User ID + in: path + name: userId + required: true + schema: + description: User ID + type: string + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseListRoleAssignment" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: List a user's role assignments + tags: + - Roles + put: + description: Replaces every source='manual' assignment for the user. source='oidc' assignments are not touched. Reserved for global admins; enforces the last-admin guard. + operationId: set-user-role-assignments + parameters: + - description: User ID + in: path + name: userId + required: true + schema: + description: User ID + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoleSetUserAssignments" + required: true + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/BaseApiResponseListRoleAssignment" + description: OK + default: + content: + application/problem+json: + schema: + $ref: "#/components/schemas/ErrorModel" + description: Error + security: + - BearerAuth: [] + - ApiKeyAuth: [] + summary: Replace a user's manual role assignments + tags: + - Roles /version: get: description: Get application version information and check for updates operationId: getVersion parameters: - - description: Current version to compare against - explode: false - in: query - name: current - schema: - description: Current version to compare against - type: string + - description: Current version to compare against + explode: false + in: query + name: current + schema: + description: Current version to compare against + type: string responses: - '200': + "200": content: application/json: schema: - $ref: '#/components/schemas/VersionCheck' + $ref: "#/components/schemas/VersionCheck" description: OK default: content: application/problem+json: schema: - $ref: '#/components/schemas/ErrorModel' + $ref: "#/components/schemas/ErrorModel" description: Error + security: [] summary: Get version information tags: - - Version + - Version +security: + - BearerAuth: [] + - ApiKeyAuth: [] servers: -- url: https://arcane.randomsynergy.xyz:3552/api + - url: https://arcane.randomsynergy.xyz:3552/api diff --git a/commands/configure.md b/commands/configure.md index 2bc430b..5c4a441 100644 --- a/commands/configure.md +++ b/commands/configure.md @@ -5,7 +5,7 @@ allowed-tools: [Read, Write, AskUserQuestion, Bash, ReadMcpResourceTool] # /arcane:configure — Tool filter setup -Use this slash command to trim which Arcane MCP tools are exposed to Claude Code. The full server registers 180 tools; surfacing all of them in `tools/list` bloats the context window. This command writes a `tools` block to `~/.arcane/config.json` that selects a preset, module allowlist, and per-tool overrides. The Arcane MCP server picks up changes live when its config watcher is attached. +Use this slash command to trim which Arcane MCP tools are exposed to Claude Code. The full server registers 174 tools; surfacing all of them in `tools/list` bloats the context window. This command writes a `tools` block to `~/.arcane/config.json` that selects a preset, module allowlist, and per-tool overrides. The Arcane MCP server picks up changes live when its config watcher is attached. ## Workflow @@ -14,7 +14,7 @@ Use this slash command to trim which Arcane MCP tools are exposed to Claude Code - `read-only` — every `*_list` / `*_get` / `*_inspect` / `*_stats` / `*_status` / `*_summary` tool (~60 tools) - `minimal` — dashboard + container list/get/counts (5 tools) - `deploy` — project, gitops, template, registry, environment, build (~40 tools) - - `full` — all 180 tools (current default if the user has never configured this) + - `full` — all 174 tools (current default if the user has never configured this) - `custom` — fine-tune modules and individual tools 2. **If the user picks `custom`** (or says they want to fine-tune after picking another preset): @@ -42,7 +42,7 @@ Use this slash command to trim which Arcane MCP tools are exposed to Claude Code - `full` — every tool - `commonly-used` — every tool whose `module ∈ {container, image, project, volume, network}` - `deploy` — every tool whose `module ∈ {project, gitops, template, registry, environment, build}` - - `minimal` — `arcane_dashboard_get`, `arcane_dashboard_get_action_items`, `arcane_container_list`, `arcane_container_get`, `arcane_container_get_counts` + - `minimal` — `arcane_dashboard_get`, `arcane_container_list`, `arcane_container_get`, `arcane_container_get_counts` - `read-only` — every tool whose `name` ends with `_list`, `_get`, `_inspect`, `_stats`, `_counts`, `_check`, `_search`, `_status`, `_summary` (or contains `_list_`, `_get_`) - `custom` — start from every tool (modules/enabled/disabled do the narrowing) - `added` = `proposed − current`; `removed` = `current − proposed`. @@ -60,6 +60,6 @@ Use this slash command to trim which Arcane MCP tools are exposed to Claude Code ## Notes -- Keep the conversation tight. Do not dump the full 180-tool list — summarise the chosen preset and let the user opt into fine-tuning. +- Keep the conversation tight. Do not dump the full 174-tool list — summarise the chosen preset and let the user opt into fine-tuning. - Never remove other keys from `~/.arcane/config.json`. A malformed file will brick the server. - For Claude Desktop and other MCP clients without slash commands, the same flow is available via the `arcane_configure_tools` prompt — this slash command is a Claude Code shortcut to the same outcome. diff --git a/package-lock.json b/package-lock.json index 2beb13a..e03c655 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@randomsynergy/arcane-mcp-server", - "version": "2.1.0", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@randomsynergy/arcane-mcp-server", - "version": "2.1.0", + "version": "3.0.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.12.0", diff --git a/package.json b/package.json index 4c7347a..2749c2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@randomsynergy/arcane-mcp-server", - "version": "2.1.0", + "version": "3.0.0", "description": "MCP Server for Arcane Docker Management API - Modern Docker Management for AI Assistants", "type": "module", "main": "dist/index.js", diff --git a/skills/arcane-mcp-server/SKILL.md b/skills/arcane-mcp-server/SKILL.md index 4d2ef37..b9f30eb 100644 --- a/skills/arcane-mcp-server/SKILL.md +++ b/skills/arcane-mcp-server/SKILL.md @@ -1,7 +1,7 @@ --- name: arcane-mcp-server description: > - Manages Docker infrastructure via 180+ Arcane MCP tools. Use when + Manages Docker infrastructure via 170+ Arcane MCP tools. Use when working with Docker containers, images, volumes, networks, stacks, Compose projects, Swarm services, registries, or environments. Covers deployment, rollback, troubleshooting, cleanup, GitOps sync, @@ -12,7 +12,7 @@ compatibility: Requires the Arcane MCP server running and a configured Arcane Do # Arcane Docker Management -Guides effective use of the Arcane MCP server's 180+ tools for Docker infrastructure management. This skill activates when users ask about Docker operations and `arcane_*` tools are available. +Guides effective use of the Arcane MCP server's 170+ tools for Docker infrastructure management. This skill activates when users ask about Docker operations and `arcane_*` tools are available. **Announce:** "Using the arcane-mcp-server skill to guide this Docker operation." @@ -32,10 +32,10 @@ When the user says something general, map it to the right tool sequence: | User says | Tools to use | |-----------|-------------| | "What's running?" / "Show me my containers" | `arcane_container_list` | -| "How's everything looking?" / "Status" | `arcane_dashboard_get` then `arcane_dashboard_get_action_items` | +| "How's everything looking?" / "Status" | `arcane_dashboard_get` | | "Deploy this compose file" | `arcane_project_create` then `arcane_project_up` | | "Update everything" | `arcane_image_update_check_all` then `arcane_updater_run` (with `dryRun: true` first) | -| "What needs attention?" | `arcane_dashboard_get_action_items` | +| "What needs attention?" | `arcane_dashboard_get` then `arcane_event_list` (severity filter) | | "Is anything vulnerable?" | `arcane_vulnerability_get_environment_summary` | | "Set up a new stack" | `arcane_project_create` with compose YAML | | "Scale this up" | `arcane_swarm_scale_service` (swarm) or redeploy with updated config (compose) | @@ -73,7 +73,7 @@ If a deployment goes wrong: When something is broken, investigate systematically: -1. **Dashboard first** — `arcane_dashboard_get` + `arcane_dashboard_get_action_items` +1. **Dashboard first** — `arcane_dashboard_get` 2. **Container state** — `arcane_container_list` to find stopped/unhealthy containers 3. **Container detail** — `arcane_container_get` on the suspect container 4. **Port conflicts** — `arcane_port_list` if networking issues suspected @@ -106,7 +106,7 @@ For Docker Swarm clusters: 2. **Deploy services** — `arcane_swarm_create_service` with replicas, ports, networks 3. **Scale** — `arcane_swarm_scale_service` to adjust replica count 4. **Monitor** — `arcane_swarm_list_services` + `arcane_swarm_get_service` for task status -5. **Logs** — `arcane_swarm_get_service_logs` for debugging +5. **Tasks** — `arcane_swarm_get_service` for task status when debugging ### Auto-Update Management diff --git a/src/__tests__/integration/tool-filtering.test.ts b/src/__tests__/integration/tool-filtering.test.ts index 358b817..2436bca 100644 --- a/src/__tests__/integration/tool-filtering.test.ts +++ b/src/__tests__/integration/tool-filtering.test.ts @@ -79,7 +79,6 @@ describe("integration: boot-per-preset", () => { "arcane_container_get_counts", "arcane_container_list", "arcane_dashboard_get", - "arcane_dashboard_get_action_items", ]); }); @@ -202,7 +201,7 @@ describe("integration: hot reload cycle", () => { writeFileSync(tmpFile, JSON.stringify({ tools: { preset: "minimal" } })); // Wait for the watcher to debounce + apply - await waitFor(() => countEnabled(registry).enabled === 5); + await waitFor(() => countEnabled(registry).enabled === 4); const { enabledNames } = countEnabled(registry); expect(enabledNames.sort()).toEqual([ @@ -210,7 +209,6 @@ describe("integration: hot reload cycle", () => { "arcane_container_get_counts", "arcane_container_list", "arcane_dashboard_get", - "arcane_dashboard_get_action_items", ]); } finally { watcher.stop(); @@ -298,7 +296,7 @@ describe("integration: upgrade notice lifecycle", () => { // Unconfigured state → explicit call to /arcane:configure const handler = handlers.get("arcane-tools-config-notice")!; const result = await handler(new URL("arcane://tools-config-notice")); - expect(result.contents[0].text).toContain("180 tools"); + expect(result.contents[0].text).toContain("174 tools"); expect(result.contents[0].text).toContain("/arcane:configure"); // Flip to configured — body should swap diff --git a/src/auth/auth-manager.ts b/src/auth/auth-manager.ts index 66b32f8..29fe925 100644 --- a/src/auth/auth-manager.ts +++ b/src/auth/auth-manager.ts @@ -29,6 +29,14 @@ interface RefreshResponse { expiresAt: string; } +/** Auth endpoints wrap their payload in `{ success, data }` — unwrap if present. */ +function unwrapAuthResponse(json: unknown): T { + if (json && typeof json === "object" && "data" in json && (json as { data?: unknown }).data) { + return (json as { data: T }).data; + } + return json as T; +} + export class AuthManager { private apiKey?: string; private jwtTokens?: JwtTokens; @@ -126,7 +134,7 @@ export class AuthManager { throw new Error(`Login failed: ${response.status} ${error}`); } - const data = await response.json() as LoginResponse; + const data = unwrapAuthResponse(await response.json()); this.jwtTokens = { accessToken: data.token, @@ -180,7 +188,7 @@ export class AuthManager { throw new Error(`Token refresh failed: ${response.status} ${error}`); } - const data = await response.json() as RefreshResponse; + const data = unwrapAuthResponse(await response.json()); this.jwtTokens = { accessToken: data.token, diff --git a/src/client/arcane-client.ts b/src/client/arcane-client.ts index 4cc9072..5bcce8a 100644 --- a/src/client/arcane-client.ts +++ b/src/client/arcane-client.ts @@ -255,8 +255,8 @@ export class ArcaneClient { /** * DELETE request */ - async delete(path: string, params?: Record): Promise { - return this.request(path, { method: "DELETE", params }); + async delete(path: string, params?: Record, body?: unknown): Promise { + return this.request(path, { method: "DELETE", params, body }); } /** diff --git a/src/prompts/__tests__/prompts.test.ts b/src/prompts/__tests__/prompts.test.ts index e199924..277d8c0 100644 --- a/src/prompts/__tests__/prompts.test.ts +++ b/src/prompts/__tests__/prompts.test.ts @@ -143,7 +143,7 @@ describe("prompts", () => { const text = result.messages[0].content.text; expect(text).toContain("my-app"); expect(text).toContain("arcane_container_get"); - expect(text).toContain("arcane_dashboard_get_action_items"); + expect(text).toContain("arcane_dashboard_get"); expect(text).toContain("arcane_image_update_check_by_id"); }); }); diff --git a/src/prompts/index.ts b/src/prompts/index.ts index 3eeefd6..a3387af 100644 --- a/src/prompts/index.ts +++ b/src/prompts/index.ts @@ -70,7 +70,7 @@ export function registerPrompts(server: McpServer): void { "", "Follow this systematic diagnostic workflow using Arcane tools:", "1. Use arcane_container_get to check the container's current state, config, and labels.", - "2. Use arcane_dashboard_get_action_items to see if there are known issues flagged.", + "2. Use arcane_dashboard_get for an overview of the environment (unhealthy containers, pending updates).", "3. Check if the container is part of a project with arcane_project_list, then arcane_project_get for service-level status.", "4. Use arcane_image_update_check_by_id to see if the image is outdated.", "5. Use arcane_port_list to check for port conflicts across the environment.", @@ -188,7 +188,7 @@ export function registerPrompts(server: McpServer): void { "Help the user configure which Arcane MCP tools are active.", "", "Context:", - "- Arcane registers 180 tools by default, which bloats the tool-list context window.", + "- Arcane registers 174 tools by default, which bloats the tool-list context window.", "- The server supports a `tools` config in `~/.arcane/config.json` (or env vars ARCANE_TOOL_PRESET / ARCANE_ENABLED_MODULES / ARCANE_ENABLED_TOOLS / ARCANE_DISABLED_TOOLS).", "- Hot reload: changes to `~/.arcane/config.json` apply live via `notifications/tools/list_changed`.", "- If the watcher isn't attached (e.g., missing file or HTTP-only setup), the user must reconnect the MCP server for changes to take effect.", @@ -198,7 +198,7 @@ export function registerPrompts(server: McpServer): void { "- read-only: every *_list / *_get / *_inspect / *_stats / *_status / *_summary tool (~60 tools)", "- minimal: dashboard + container list/get/counts (5 tools)", "- deploy: project, gitops, template, registry, environment, build (~40 tools)", - "- full: all 180 (default on upgrade)", + "- full: all 174 (default on upgrade)", "- custom: fine-grained modules + per-tool overrides only", "", "Flow:", @@ -216,7 +216,7 @@ export function registerPrompts(server: McpServer): void { "network, network-topology, notification, port, project, registry, settings, swarm, system,", "template, updater, user, volume, vulnerability, webhook", "", - "Keep the conversation short — don't re-print the full 180-tool list. Confirm the chosen preset and summarise the tools/modules set before writing.", + "Keep the conversation short — don't re-print the full 174-tool list. Confirm the chosen preset and summarise the tools/modules set before writing.", ].join("\n"), }, }, diff --git a/src/resources/__tests__/resources.test.ts b/src/resources/__tests__/resources.test.ts index 9981188..fcdc4e5 100644 --- a/src/resources/__tests__/resources.test.ts +++ b/src/resources/__tests__/resources.test.ts @@ -131,7 +131,7 @@ describe("resources", () => { const result = await handler(new URL("arcane://tools-config-notice")); const text = result.contents[0].text; - expect(text).toContain("180 tools"); + expect(text).toContain("174 tools"); expect(text).toContain("/arcane:configure"); expect(text).toContain("commonly-used"); }); diff --git a/src/resources/index.ts b/src/resources/index.ts index 277f510..626737b 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -186,7 +186,7 @@ export function registerResources(server: McpServer): void { const lines: string[] = []; if (unconfigured) { - lines.push("Arcane MCP Server is currently exposing all 180 tools."); + lines.push("Arcane MCP Server is currently exposing all 174 tools."); lines.push(""); lines.push("You can reduce context bloat by picking a preset:"); lines.push(" - commonly-used — containers, images, projects, volumes, networks (~52 tools)"); diff --git a/src/tools/__tests__/dashboard-tools.test.ts b/src/tools/__tests__/dashboard-tools.test.ts index 13e37c4..f804102 100644 --- a/src/tools/__tests__/dashboard-tools.test.ts +++ b/src/tools/__tests__/dashboard-tools.test.ts @@ -57,10 +57,9 @@ describe("dashboard-tools", () => { registerDashboardTools(server as unknown as Parameters[0]); }); - it("registers both dashboard tools", () => { + it("registers the dashboard tool", () => { expect(server.tools.has("arcane_dashboard_get")).toBe(true); - expect(server.tools.has("arcane_dashboard_get_action_items")).toBe(true); - expect(server.tools.size).toBe(2); + expect(server.tools.size).toBe(1); }); describe("arcane_dashboard_get", () => { @@ -114,51 +113,11 @@ describe("dashboard-tools", () => { expect(text).toContain("Containers: 1 total"); expect(text).not.toContain("System:"); }); - }); - - describe("arcane_dashboard_get_action_items", () => { - it("returns action items list", async () => { - mockClient.get.mockResolvedValueOnce({ - data: [ - { - type: "container_unhealthy", - severity: "high", - title: "Container my-app is unhealthy", - description: "Health check failing for 10 minutes", - resourceName: "my-app", - }, - { - type: "image_update", - severity: "low", - title: "Image update available for nginx", - resourceName: "nginx", - }, - ], - }); - - const handler = server.tools.get("arcane_dashboard_get_action_items")!; - const result = await handler({ environmentId: "env-1" }); - - const text = result.content[0].text; - expect(text).toContain("2 action items"); - expect(text).toContain("[HIGH] Container my-app is unhealthy"); - expect(text).toContain("[LOW] Image update available for nginx"); - expect(text).toContain("Health check failing"); - }); - - it("returns 'everything looks good' when no action items", async () => { - mockClient.get.mockResolvedValueOnce({ data: [] }); - - const handler = server.tools.get("arcane_dashboard_get_action_items")!; - const result = await handler({ environmentId: "env-1" }); - - expect(result.content[0].text).toContain("everything looks good"); - }); it("returns isError when client throws", async () => { mockClient.get.mockRejectedValueOnce(new Error("Server error")); - const handler = server.tools.get("arcane_dashboard_get_action_items")!; + const handler = server.tools.get("arcane_dashboard_get")!; const result = await handler({ environmentId: "env-1" }); expect(result.isError).toBe(true); diff --git a/src/tools/build-tools.ts b/src/tools/build-tools.ts index 7e95d54..9dee058 100644 --- a/src/tools/build-tools.ts +++ b/src/tools/build-tools.ts @@ -17,7 +17,7 @@ export function registerBuildTools(server: McpServer, registry?: ToolRegistry): "arcane_build_image", { title: "Build image", - description: "Build a Docker image from a Dockerfile or Git URL with support for build args and multi-platform builds", + description: "Build a Docker image from a build workspace directory with support for build args and multi-platform builds. Use the build workspace tools to browse/upload the build context first.", annotations: { readOnlyHint: false, destructiveHint: false, @@ -26,35 +26,26 @@ export function registerBuildTools(server: McpServer, registry?: ToolRegistry): }, inputSchema: { environmentId: z.string().describe("Environment ID"), - dockerfile: z.string().optional().describe("Dockerfile content to build from"), - gitUrl: z.string().optional().describe("Git repository URL to build from"), + contextDir: z.string().describe("Build context directory (path within the build workspace)"), + dockerfile: z.string().optional().describe("Path to the Dockerfile within the context (default: Dockerfile)"), + dockerfileInline: z.string().optional().describe("Inline Dockerfile content (used instead of a Dockerfile in the context)"), tag: z.string().describe("Image tag (e.g., myapp:latest)"), buildArgs: z.record(z.string()).optional().describe("Build arguments as key-value pairs"), platform: z.string().optional().describe("Target platform (e.g., linux/amd64, linux/arm64)"), + noCache: z.boolean().optional().default(false).describe("Build without using the cache"), }, }, - toolHandler(async ({ environmentId, dockerfile, gitUrl, tag, buildArgs, platform }, client) => { - const body: Record = { tag }; + toolHandler(async ({ environmentId, contextDir, dockerfile, dockerfileInline, tag, buildArgs, platform, noCache }, client) => { + const body: Record = { contextDir, tags: [tag], noCache }; if (dockerfile) body.dockerfile = dockerfile; - if (gitUrl) body.gitUrl = gitUrl; + if (dockerfileInline) body.dockerfileInline = dockerfileInline; if (buildArgs) body.buildArgs = buildArgs; - if (platform) body.platform = platform; + if (platform) body.platforms = [platform]; - const response = await client.post<{ data: Build }>( - `/environments/${environmentId}/images/build`, - body - ); - - const build = response.data; - const lines = [ - `Build started:`, - ` Build ID: ${build.id}`, - ` Tag: ${build.tag || tag}`, - ` Status: ${build.status}`, - ]; - if (build.platform) lines.push(` Platform: ${build.platform}`); + // The build endpoint streams progress and finishes when the build is done. + await client.post(`/environments/${environmentId}/images/build`, body); - return lines.join("\n"); + return `Build for ${tag} finished. Use arcane_build_list to inspect the result.`; }) ); diff --git a/src/tools/dashboard-tools.ts b/src/tools/dashboard-tools.ts index 21ac2fb..42b6e78 100644 --- a/src/tools/dashboard-tools.ts +++ b/src/tools/dashboard-tools.ts @@ -6,7 +6,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; -import type { DashboardSnapshot, ActionItem } from "../types/arcane-types.js"; +import type { DashboardSnapshot } from "../types/arcane-types.js"; export function registerDashboardTools(server: McpServer, registry?: ToolRegistry): void { const register = moduleRegistrar(server, registry, "dashboard"); @@ -59,41 +59,4 @@ export function registerDashboardTools(server: McpServer, registry?: ToolRegistr }) ); - // arcane_dashboard_get_action_items - register( - "arcane_dashboard_get_action_items", - { - title: "Get action items", - description: "Get dashboard action items that need attention (unhealthy containers, available updates, etc.)", - annotations: { - readOnlyHint: true, - destructiveHint: false, - idempotentHint: true, - openWorldHint: false, - }, - inputSchema: { - environmentId: z.string().describe("Environment ID"), - }, - }, - toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ data: ActionItem[] }>( - `/environments/${environmentId}/dashboard/action-items` - ); - - if (!response.data || response.data.length === 0) { - return "No action items — everything looks good!"; - } - - const lines = [`${response.data.length} action items:\n`]; - for (const item of response.data) { - lines.push(`[${item.severity.toUpperCase()}] ${item.title}`); - if (item.description) lines.push(` ${item.description}`); - if (item.resourceName) lines.push(` Resource: ${item.resourceName}`); - lines.push(""); - } - - return lines.join("\n"); - }) - ); - } diff --git a/src/tools/environment-tools.ts b/src/tools/environment-tools.ts index df66cd6..aca7cdd 100644 --- a/src/tools/environment-tools.ts +++ b/src/tools/environment-tools.ts @@ -261,30 +261,27 @@ export function registerEnvironmentTools(server: McpServer, registry?: ToolRegis }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ - data: { - serverVersion: string; - operatingSystem: string; - architecture: string; - containers: number; - containersRunning: number; - containersStopped: number; - images: number; - memTotal: number; - ncpu: number; - }; - }>(`/environments/${environmentId}/system/docker-info`); + const info = await client.get<{ + ServerVersion: string; + OperatingSystem: string; + Architecture: string; + Containers: number; + ContainersRunning: number; + ContainersStopped: number; + Images: number; + MemTotal: number; + NCPU: number; + }>(`/environments/${environmentId}/system/docker/info`); - const info = response.data; const lines = [ "Docker System Info:", - ` Version: ${info.serverVersion}`, - ` OS: ${info.operatingSystem}`, - ` Architecture: ${info.architecture}`, - ` CPUs: ${info.ncpu}`, - ` Memory: ${formatSizeGB(info.memTotal)}`, - ` Containers: ${info.containers} (${info.containersRunning} running, ${info.containersStopped} stopped)`, - ` Images: ${info.images}`, + ` Version: ${info.ServerVersion}`, + ` OS: ${info.OperatingSystem}`, + ` Architecture: ${info.Architecture}`, + ` CPUs: ${info.NCPU}`, + ` Memory: ${formatSizeGB(info.MemTotal)}`, + ` Containers: ${info.Containers} (${info.ContainersRunning} running, ${info.ContainersStopped} stopped)`, + ` Images: ${info.Images}`, ]; return lines.join("\n"); @@ -308,15 +305,15 @@ export function registerEnvironmentTools(server: McpServer, registry?: ToolRegis }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ data: { docker?: string; dockerCompose?: string } }>( - `/environments/${environmentId}/deployment-snippets` + const response = await client.get<{ data: { dockerRun?: string; dockerCompose?: string } }>( + `/environments/${environmentId}/deployment` ); const snippets = response.data; let text = "Deployment Snippets:\n\n"; - if (snippets.docker) { - text += "Docker Command:\n```\n" + snippets.docker + "\n```\n\n"; + if (snippets.dockerRun) { + text += "Docker Command:\n```\n" + snippets.dockerRun + "\n```\n\n"; } if (snippets.dockerCompose) { text += "Docker Compose:\n```yaml\n" + snippets.dockerCompose + "\n```"; diff --git a/src/tools/event-tools.ts b/src/tools/event-tools.ts index 458e841..c658031 100644 --- a/src/tools/event-tools.ts +++ b/src/tools/event-tools.ts @@ -26,16 +26,16 @@ export function registerEventTools(server: McpServer, registry?: ToolRegistry): }, inputSchema: { type: z.string().optional().describe("Filter by event type"), - resourceType: z.string().optional().describe("Filter by resource type (container, image, etc.)"), + severity: z.string().optional().describe("Filter by severity (e.g., info, warning, error)"), start: z.number().optional().default(0).describe("Pagination start"), limit: z.number().optional().default(50).describe("Items per page"), }, }, - toolHandler(async ({ type, resourceType, start, limit }, client) => { + toolHandler(async ({ type, severity, start, limit }, client) => { const response = await client.get<{ data: Event[]; pagination: { total: number }; - }>("/events", { type, resourceType, start, limit }); + }>("/events", { type, severity, start, limit }); if (!response.data || response.data.length === 0) { return "No events found."; @@ -44,8 +44,8 @@ export function registerEventTools(server: McpServer, registry?: ToolRegistry): const lines = [`Found ${response.pagination.total} events:\n`]; for (const event of response.data.slice(0, MAX_DISPLAY_EVENTS)) { const time = new Date(event.createdAt).toLocaleString(); - lines.push(`[${time}] ${event.type}`); - lines.push(` ${event.message}`); + lines.push(`[${time}] [${event.severity.toUpperCase()}] ${event.type}`); + lines.push(` ${event.title}${event.description ? ` — ${event.description}` : ""}`); if (event.resourceName) { lines.push(` Resource: ${event.resourceType}/${event.resourceName}`); } @@ -95,8 +95,8 @@ export function registerEventTools(server: McpServer, registry?: ToolRegistry): const lines = [`Found ${response.pagination.total} events:\n`]; for (const event of response.data.slice(0, MAX_DISPLAY_EVENTS)) { const time = new Date(event.createdAt).toLocaleString(); - lines.push(`[${time}] ${event.type}`); - lines.push(` ${event.message}`); + lines.push(`[${time}] [${event.severity.toUpperCase()}] ${event.type}`); + lines.push(` ${event.title}${event.description ? ` — ${event.description}` : ""}`); if (event.resourceName) { lines.push(` Resource: ${event.resourceType}/${event.resourceName}`); } @@ -107,41 +107,6 @@ export function registerEventTools(server: McpServer, registry?: ToolRegistry): }) ); - // arcane_event_create - register( - "arcane_event_create", - { - title: "Create event", - description: "Create a custom event for tracking", - annotations: { - readOnlyHint: false, - destructiveHint: false, - idempotentHint: false, - openWorldHint: false, - }, - inputSchema: { - type: z.string().describe("Event type"), - message: z.string().describe("Event message"), - resourceType: z.string().optional().describe("Resource type"), - resourceId: z.string().optional().describe("Resource ID"), - resourceName: z.string().optional().describe("Resource name"), - metadata: z.record(z.unknown()).optional().describe("Additional metadata"), - }, - }, - toolHandler(async ({ type, message, resourceType, resourceId, resourceName, metadata }, client) => { - const response = await client.post<{ data: { id: string } }>("/events", { - type, - message, - resourceType, - resourceId, - resourceName, - metadata, - }); - - return `Event created: ${response.data.id}`; - }) - ); - // arcane_event_delete register( "arcane_event_delete", diff --git a/src/tools/image-tools.ts b/src/tools/image-tools.ts index f1a6c3b..122ae11 100644 --- a/src/tools/image-tools.ts +++ b/src/tools/image-tools.ts @@ -169,14 +169,14 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ environmentId, all }, client) => { - const response = await client.post<{ imagesDeleted?: string[]; spaceReclaimed?: number }>( + const response = await client.post<{ data: { imagesDeleted?: string[]; spaceReclaimed?: number } }>( `/environments/${environmentId}/images/prune`, - { all } + { mode: all ? "all" : "dangling", dangling: !all } ); - const deleted = response.imagesDeleted?.length || 0; - const space = response.spaceReclaimed - ? formatSizeMB(response.spaceReclaimed) + const deleted = response.data?.imagesDeleted?.length || 0; + const space = response.data?.spaceReclaimed + ? formatSizeMB(response.data.spaceReclaimed) : "unknown"; return `Pruned ${deleted} images, reclaimed ${space} of disk space.`; @@ -201,12 +201,16 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): }, toolHandler(async ({ environmentId }, client) => { const response = await client.get<{ - total: number; - size: number; - danglingCount?: number; + data: { + totalImages: number; + totalImageSize: number; + imagesInuse: number; + imagesUnused: number; + }; }>(`/environments/${environmentId}/images/counts`); - return `Image Statistics:\n Total: ${response.total}\n Total Size: ${formatSizeGB(response.size)}\n Dangling: ${response.danglingCount || 0}`; + const c = response.data; + return `Image Statistics:\n Total: ${c.totalImages}\n Total Size: ${formatSizeGB(c.totalImageSize)}\n In Use: ${c.imagesInuse}\n Unused: ${c.imagesUnused}`; }) ); @@ -228,16 +232,21 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ environmentId, image }, client) => { - const response = await client.post<{ + const response = await client.get<{ data: { hasUpdate: boolean; + currentVersion?: string; + latestVersion?: string; currentDigest?: string; latestDigest?: string; }; - }>(`/environments/${environmentId}/image-updates/check`, { image }); + }>(`/environments/${environmentId}/image-updates/check`, { imageRef: image }); - if (response.data.hasUpdate) { - return `Update available for ${image}!\n Current: ${response.data.currentDigest?.substring(0, DOCKER_DIGEST_PREFIX_LENGTH + DOCKER_SHORT_ID_LENGTH) || "unknown"}\n Latest: ${response.data.latestDigest?.substring(0, DOCKER_DIGEST_PREFIX_LENGTH + DOCKER_SHORT_ID_LENGTH) || "unknown"}`; + const u = response.data; + if (u.hasUpdate) { + const current = u.currentVersion || u.currentDigest?.substring(0, DOCKER_DIGEST_PREFIX_LENGTH + DOCKER_SHORT_ID_LENGTH) || "unknown"; + const latest = u.latestVersion || u.latestDigest?.substring(0, DOCKER_DIGEST_PREFIX_LENGTH + DOCKER_SHORT_ID_LENGTH) || "unknown"; + return `Update available for ${image}!\n Current: ${current}\n Latest: ${latest}`; } else { return `${image} is up to date.`; } @@ -262,17 +271,17 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): }, toolHandler(async ({ environmentId }, client) => { const response = await client.post<{ - data: Array<{ image: string; hasUpdate: boolean }>; - }>(`/environments/${environmentId}/image-updates/check-all`); + data: Record; + }>(`/environments/${environmentId}/image-updates/check-all`, {}); - const updates = response.data.filter(i => i.hasUpdate); + const updates = Object.entries(response.data || {}).filter(([, r]) => r.hasUpdate); if (updates.length === 0) { return "All images are up to date."; } const lines = [`Found ${updates.length} images with updates:\n`]; - for (const img of updates) { - lines.push(` - ${img.image}`); + for (const [imageRef] of updates) { + lines.push(` - ${imageRef}`); } return lines.join("\n"); @@ -299,12 +308,14 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): const response = await client.get<{ data: { totalImages: number; - updatesAvailable: number; - lastChecked?: string; + imagesWithUpdates: number; + digestUpdates: number; + errorsCount: number; }; }>(`/environments/${environmentId}/image-updates/summary`); - return `Update Summary:\n Total Images: ${response.data.totalImages}\n Updates Available: ${response.data.updatesAvailable}\n Last Checked: ${response.data.lastChecked || "Never"}`; + const s = response.data; + return `Update Summary:\n Total Images: ${s.totalImages}\n Updates Available: ${s.imagesWithUpdates}\n Digest Updates: ${s.digestUpdates}\n Check Errors: ${s.errorsCount}`; }) ); diff --git a/src/tools/image-update-tools.ts b/src/tools/image-update-tools.ts index 989ee0d..0387f51 100644 --- a/src/tools/image-update-tools.ts +++ b/src/tools/image-update-tools.ts @@ -8,6 +8,39 @@ import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; import type { ImageUpdateResponse, BatchImageUpdateResponse, ImageUpdateSummary } from "../types/arcane-types.js"; +function formatUpdateCheck(imageRef: string, u: ImageUpdateResponse): string { + if (u.error) { + return `Check failed for ${imageRef}: ${u.error}`; + } + if (u.hasUpdate) { + const current = u.currentVersion || u.currentDigest?.substring(0, 12) || "unknown"; + const latest = u.latestVersion || u.latestDigest?.substring(0, 12) || "unknown"; + return `Update available for ${imageRef}! (${u.updateType || "update"})\n Current: ${current}\n Latest: ${latest}`; + } + return `${imageRef} is up to date.`; +} + +function formatBatchResults(batch: BatchImageUpdateResponse): string { + const entries = Object.entries(batch); + const updates = entries.filter(([, r]) => r.hasUpdate); + const errors = entries.filter(([, r]) => r.error); + + const lines = [ + `Checked ${entries.length} images: ${updates.length} updates available\n`, + ]; + + for (const [ref, result] of entries) { + const status = result.error ? "[ERROR]" : result.hasUpdate ? "[UPDATE]" : "[OK]"; + lines.push(`${status} ${ref}${result.error ? `: ${result.error}` : ""}`); + } + + if (updates.length === 0 && errors.length === 0) { + lines.push("\nAll images are up to date."); + } + + return lines.join("\n"); +} + export function registerImageUpdateTools(server: McpServer, registry?: ToolRegistry): void { const register = moduleRegistrar(server, registry, "image-update"); @@ -34,11 +67,7 @@ export function registerImageUpdateTools(server: McpServer, registry?: ToolRegis { imageRef } ); - const u = response.data; - if (u.updateAvailable) { - return `Update available for ${u.imageRef}!\n Current: ${u.currentDigest?.substring(0, 12) || u.currentTag || "unknown"}\n Latest: ${u.latestDigest?.substring(0, 12) || u.latestTag || "unknown"}`; - } - return `${u.imageRef} is up to date.`; + return formatUpdateCheck(imageRef, response.data); }) ); @@ -64,11 +93,7 @@ export function registerImageUpdateTools(server: McpServer, registry?: ToolRegis `/environments/${environmentId}/image-updates/check/${imageId}` ); - const u = response.data; - if (u.updateAvailable) { - return `Update available for ${u.imageRef}!\n Current: ${u.currentDigest?.substring(0, 12) || u.currentTag || "unknown"}\n Latest: ${u.latestDigest?.substring(0, 12) || u.latestTag || "unknown"}`; - } - return `${u.imageRef} is up to date.`; + return formatUpdateCheck(imageId, response.data); }) ); @@ -77,7 +102,7 @@ export function registerImageUpdateTools(server: McpServer, registry?: ToolRegis "arcane_image_update_check_multiple", { title: "Check multiple image updates", - description: "Check for updates on multiple images at once", + description: "Check for updates on multiple images at once by image reference", annotations: { readOnlyHint: true, destructiveHint: false, @@ -86,26 +111,16 @@ export function registerImageUpdateTools(server: McpServer, registry?: ToolRegis }, inputSchema: { environmentId: z.string().describe("Environment ID"), - imageIds: z.array(z.string()).describe("List of image IDs to check"), + imageRefs: z.array(z.string()).describe("List of image references to check (e.g., ['nginx:latest'])"), }, }, - toolHandler(async ({ environmentId, imageIds }, client) => { + toolHandler(async ({ environmentId, imageRefs }, client) => { const response = await client.post<{ data: BatchImageUpdateResponse }>( - `/environments/${environmentId}/image-updates/check-multiple`, - { imageIds } + `/environments/${environmentId}/image-updates/check-batch`, + { imageRefs } ); - const batch = response.data; - const lines = [ - `Checked ${batch.total} images: ${batch.updatesAvailable} updates available\n`, - ]; - - for (const result of batch.results) { - const status = result.updateAvailable ? "[UPDATE]" : "[OK]"; - lines.push(`${status} ${result.imageRef} (${result.imageId})`); - } - - return lines.join("\n"); + return formatBatchResults(response.data || {}); }) ); @@ -127,25 +142,11 @@ export function registerImageUpdateTools(server: McpServer, registry?: ToolRegis }, toolHandler(async ({ environmentId }, client) => { const response = await client.post<{ data: BatchImageUpdateResponse }>( - `/environments/${environmentId}/image-updates/check-all` + `/environments/${environmentId}/image-updates/check-all`, + {} ); - const batch = response.data; - const lines = [ - `Checked ${batch.total} images: ${batch.updatesAvailable} updates available\n`, - ]; - - for (const result of batch.results) { - if (result.updateAvailable) { - lines.push(`[UPDATE] ${result.imageRef}`); - } - } - - if (batch.updatesAvailable === 0) { - lines.push("All images are up to date."); - } - - return lines.join("\n"); + return formatBatchResults(response.data || {}); }) ); @@ -174,9 +175,9 @@ export function registerImageUpdateTools(server: McpServer, registry?: ToolRegis const lines = [ `Image Update Summary:`, ` Total Images: ${s.totalImages}`, - ` Checked: ${s.checkedImages}`, - ` Updates Available: ${s.updatesAvailable}`, - ` Last Checked: ${s.lastCheckedAt || "Never"}`, + ` Updates Available: ${s.imagesWithUpdates}`, + ` Digest Updates: ${s.digestUpdates}`, + ` Check Errors: ${s.errorsCount}`, ]; return lines.join("\n"); diff --git a/src/tools/notification-tools.ts b/src/tools/notification-tools.ts index 71b8478..22d24c7 100644 --- a/src/tools/notification-tools.ts +++ b/src/tools/notification-tools.ts @@ -7,14 +7,43 @@ import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; +const NOTIFICATION_PROVIDERS = [ + "discord", + "email", + "telegram", + "signal", + "slack", + "ntfy", + "pushover", + "matrix", + "generic", +] as const; + +interface NotificationSettings { + id: string; + provider: string; + enabled: boolean; + config: Record; +} + +/** Mask likely-sensitive config values (tokens, webhook URLs with credentials) */ +function formatConfig(config: Record): string[] { + return Object.entries(config).map(([key, value]) => { + const sensitive = /token|secret|password|key|webhook/i.test(key); + const display = sensitive ? "*****" : String(value); + return ` ${key}: ${display}`; + }); +} + export function registerNotificationTools(server: McpServer, registry?: ToolRegistry): void { const register = moduleRegistrar(server, registry, "notification"); + // arcane_notification_get_settings register( "arcane_notification_get_settings", { title: "Get notification settings", - description: "Get notification settings for an environment", + description: "List configured notification providers for an environment (Discord, email, Telegram, Slack, ntfy, etc.)", annotations: { readOnlyHint: true, destructiveHint: false, @@ -23,30 +52,34 @@ export function registerNotificationTools(server: McpServer, registry?: ToolRegi }, inputSchema: { environmentId: z.string().describe("Environment ID"), + provider: z.enum(NOTIFICATION_PROVIDERS).optional().describe("Only show a specific provider"), }, }, - toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ - data: { - enabled: boolean; - onContainerStart: boolean; - onContainerStop: boolean; - onContainerHealth: boolean; - onImageUpdate: boolean; - onBackupComplete: boolean; - }; - }>(`/environments/${environmentId}/notifications/settings`); + toolHandler(async ({ environmentId, provider }, client) => { + if (provider) { + const settings = await client.get( + `/environments/${environmentId}/notifications/settings/${provider}` + ); + const lines = [ + `Notification Settings (${settings.provider}):`, + ` Enabled: ${settings.enabled ? "Yes" : "No"}`, + ...formatConfig(settings.config || {}), + ]; + return lines.join("\n"); + } - const settings = response.data; - const lines = [ - `Notification Settings:`, - ` Enabled: ${settings.enabled ? "Yes" : "No"}`, - ` Container Start: ${settings.onContainerStart ? "Yes" : "No"}`, - ` Container Stop: ${settings.onContainerStop ? "Yes" : "No"}`, - ` Container Health: ${settings.onContainerHealth ? "Yes" : "No"}`, - ` Image Update: ${settings.onImageUpdate ? "Yes" : "No"}`, - ` Backup Complete: ${settings.onBackupComplete ? "Yes" : "No"}`, - ]; + const settings = await client.get( + `/environments/${environmentId}/notifications/settings` + ); + + if (!settings || settings.length === 0) { + return "No notification providers configured."; + } + + const lines = ["Notification Settings:"]; + for (const s of settings) { + lines.push(` ${s.provider}: ${s.enabled ? "enabled" : "disabled"}`); + } return lines.join("\n"); }) @@ -57,137 +90,59 @@ export function registerNotificationTools(server: McpServer, registry?: ToolRegi "arcane_notification_update_settings", { title: "Update notification settings", - description: "Update notification settings for an environment", - annotations: { - readOnlyHint: false, - destructiveHint: false, - idempotentHint: true, - openWorldHint: false, - }, - inputSchema: { - environmentId: z.string().describe("Environment ID"), - enabled: z.boolean().optional().describe("Enable/disable notifications"), - onContainerStart: z.boolean().optional().describe("Notify on container start"), - onContainerStop: z.boolean().optional().describe("Notify on container stop"), - onContainerHealth: z.boolean().optional().describe("Notify on health check changes"), - onImageUpdate: z.boolean().optional().describe("Notify when image updates available"), - onBackupComplete: z.boolean().optional().describe("Notify on backup completion"), - }, - }, - toolHandler(async ({ environmentId, enabled, onContainerStart, onContainerStop, onContainerHealth, onImageUpdate, onBackupComplete }, client) => { - const body: Record = {}; - if (enabled !== undefined) body.enabled = enabled; - if (onContainerStart !== undefined) body.onContainerStart = onContainerStart; - if (onContainerStop !== undefined) body.onContainerStop = onContainerStop; - if (onContainerHealth !== undefined) body.onContainerHealth = onContainerHealth; - if (onImageUpdate !== undefined) body.onImageUpdate = onImageUpdate; - if (onBackupComplete !== undefined) body.onBackupComplete = onBackupComplete; - - await client.put(`/environments/${environmentId}/notifications/settings`, body); - return "Notification settings updated."; - }) - ); - - // arcane_notification_test - register( - "arcane_notification_test", - { - title: "Test notification", - description: "Send a test notification to verify configuration", + description: "Create or update notification settings for a provider (Discord, email, Telegram, Slack, ntfy, etc.)", annotations: { readOnlyHint: false, destructiveHint: false, - idempotentHint: false, - openWorldHint: false, - }, - inputSchema: { - environmentId: z.string().describe("Environment ID"), - provider: z.string().optional().describe("Specific provider to test"), - }, - }, - toolHandler(async ({ environmentId, provider }, client) => { - await client.post(`/environments/${environmentId}/notifications/test/${provider || "all"}`); - return "Test notification sent."; - }) - ); - - // arcane_notification_apprise_get - register( - "arcane_notification_apprise_get", - { - title: "Get Apprise config", - description: "Get Apprise notification configuration", - annotations: { - readOnlyHint: true, - destructiveHint: false, idempotentHint: true, openWorldHint: false, }, inputSchema: { environmentId: z.string().describe("Environment ID"), + provider: z.enum(NOTIFICATION_PROVIDERS).describe("Notification provider"), + enabled: z.boolean().describe("Enable/disable this provider"), + config: z.record(z.unknown()).optional().describe("Provider-specific configuration (e.g., webhookUrl for Discord, smtp settings for email)"), }, }, - toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ - data: { - enabled: boolean; - urls: string[]; - }; - }>(`/environments/${environmentId}/notifications/apprise`); - - const config = response.data; - const lines = [ - `Apprise Configuration:`, - ` Enabled: ${config.enabled ? "Yes" : "No"}`, - ` URLs: ${config.urls?.length || 0}`, - ]; - - if (config.urls && config.urls.length > 0) { - for (const url of config.urls) { - // Mask sensitive parts of URLs - const maskedUrl = url.replace(/:\/\/[^@]+@/, "://*****@"); - lines.push(` - ${maskedUrl}`); - } - } - - return lines.join("\n"); + toolHandler(async ({ environmentId, provider, enabled, config }, client) => { + await client.post(`/environments/${environmentId}/notifications/settings`, { + provider, + enabled, + config: config || {}, + }); + return `Notification settings for ${provider} updated.`; }) ); - // arcane_notification_apprise_update + // arcane_notification_delete_settings register( - "arcane_notification_apprise_update", + "arcane_notification_delete_settings", { - title: "Update Apprise config", - description: "Update Apprise notification configuration", + title: "Delete notification settings", + description: "Delete the notification settings of a provider", annotations: { readOnlyHint: false, - destructiveHint: false, + destructiveHint: true, idempotentHint: true, openWorldHint: false, }, inputSchema: { environmentId: z.string().describe("Environment ID"), - enabled: z.boolean().optional().describe("Enable/disable Apprise"), - urls: z.array(z.string()).optional().describe("Apprise notification URLs"), + provider: z.enum(NOTIFICATION_PROVIDERS).describe("Notification provider to delete"), }, }, - toolHandler(async ({ environmentId, enabled, urls }, client) => { - const body: Record = {}; - if (enabled !== undefined) body.enabled = enabled; - if (urls !== undefined) body.urls = urls; - - await client.put(`/environments/${environmentId}/notifications/apprise`, body); - return "Apprise configuration updated."; + toolHandler(async ({ environmentId, provider }, client) => { + await client.delete(`/environments/${environmentId}/notifications/settings/${provider}`); + return `Notification settings for ${provider} deleted.`; }) ); - // arcane_notification_apprise_test + // arcane_notification_test register( - "arcane_notification_apprise_test", + "arcane_notification_test", { - title: "Test Apprise notification", - description: "Send a test notification through Apprise", + title: "Test notification", + description: "Send a test notification to verify a provider's configuration", annotations: { readOnlyHint: false, destructiveHint: false, @@ -196,11 +151,17 @@ export function registerNotificationTools(server: McpServer, registry?: ToolRegi }, inputSchema: { environmentId: z.string().describe("Environment ID"), + provider: z.enum(NOTIFICATION_PROVIDERS).describe("Provider to test"), }, }, - toolHandler(async ({ environmentId }, client) => { - await client.post(`/environments/${environmentId}/notifications/apprise/test`); - return "Apprise test notification sent."; + toolHandler(async ({ environmentId, provider }, client) => { + const response = await client.post<{ data?: { message?: string; warning?: string } }>( + `/environments/${environmentId}/notifications/test/${provider}` + ); + + let text = response.data?.message || "Test notification sent."; + if (response.data?.warning) text += `\nWarning: ${response.data.warning}`; + return text; }) ); diff --git a/src/tools/project-tools.ts b/src/tools/project-tools.ts index 0eadd73..a1878a7 100644 --- a/src/tools/project-tools.ts +++ b/src/tools/project-tools.ts @@ -273,10 +273,15 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) environmentId: z.string().describe("Environment ID"), projectId: z.string().describe("Project ID"), removeVolumes: z.boolean().optional().default(false).describe("Also remove volumes (DATA LOSS!)"), + removeFiles: z.boolean().optional().default(false).describe("Also remove the project files from disk"), }, }, - toolHandler(async ({ environmentId, projectId, removeVolumes }, client) => { - await client.delete(`/environments/${environmentId}/projects/${projectId}`, { removeVolumes }); + toolHandler(async ({ environmentId, projectId, removeVolumes, removeFiles }, client) => { + await client.delete( + `/environments/${environmentId}/projects/${projectId}/destroy`, + undefined, + { removeVolumes, removeFiles } + ); return `Project ${projectId} destroyed.${removeVolumes ? " Volumes were also removed." : ""}`; }) ); diff --git a/src/tools/settings-tools.ts b/src/tools/settings-tools.ts index f160c61..d8afacb 100644 --- a/src/tools/settings-tools.ts +++ b/src/tools/settings-tools.ts @@ -26,14 +26,17 @@ export function registerSettingsTools(server: McpServer, registry?: ToolRegistry }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ - data: Record; - }>(`/environments/${environmentId}/settings`); + const settings = await client.get>( + `/environments/${environmentId}/settings` + ); + + if (!settings || settings.length === 0) { + return "No settings found."; + } const lines = ["Environment Settings:\n"]; - for (const [key, value] of Object.entries(response.data)) { - const displayValue = typeof value === "object" ? JSON.stringify(value) : String(value); - lines.push(` ${key}: ${displayValue}`); + for (const setting of settings) { + lines.push(` ${setting.key}: ${setting.value}`); } return lines.join("\n"); @@ -75,16 +78,22 @@ export function registerSettingsTools(server: McpServer, registry?: ToolRegistry idempotentHint: true, openWorldHint: false, }, + inputSchema: { + environmentId: z.string().describe("Environment ID"), }, - toolHandler(async (_params, client) => { - const response = await client.get<{ - data: Record; - }>("/settings/public"); + }, + toolHandler(async ({ environmentId }, client) => { + const settings = await client.get>( + `/environments/${environmentId}/settings/public` + ); + + if (!settings || settings.length === 0) { + return "No public settings found."; + } const lines = ["Public Settings:\n"]; - for (const [key, value] of Object.entries(response.data)) { - const displayValue = typeof value === "object" ? JSON.stringify(value) : String(value); - lines.push(` ${key}: ${displayValue}`); + for (const setting of settings) { + lines.push(` ${setting.key}: ${setting.value}`); } return lines.join("\n"); diff --git a/src/tools/swarm-tools.ts b/src/tools/swarm-tools.ts index 60e2465..e8a19b8 100644 --- a/src/tools/swarm-tools.ts +++ b/src/tools/swarm-tools.ts @@ -227,35 +227,6 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): }) ); - // arcane_swarm_get_service_logs - register( - "arcane_swarm_get_service_logs", - { - title: "Get Swarm service logs", - description: "Get logs from a Swarm service", - annotations: { - readOnlyHint: true, - destructiveHint: false, - idempotentHint: true, - openWorldHint: false, - }, - inputSchema: { - environmentId: z.string().describe("Environment ID"), - serviceId: z.string().describe("Swarm service ID"), - tail: z.number().optional().default(100).describe("Number of log lines to return"), - timestamps: z.boolean().optional().default(false).describe("Include timestamps"), - }, - }, - toolHandler(async ({ environmentId, serviceId, tail, timestamps }, client) => { - const response = await client.get<{ data: string }>( - `/environments/${environmentId}/swarm/services/${serviceId}/logs`, - { tail, timestamps } - ); - - return response.data || "No logs available."; - }) - ); - // arcane_swarm_init_cluster register( "arcane_swarm_init_cluster", diff --git a/src/tools/system-tools.ts b/src/tools/system-tools.ts index 8bc7923..2207d3f 100644 --- a/src/tools/system-tools.ts +++ b/src/tools/system-tools.ts @@ -55,33 +55,29 @@ export function registerSystemTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ - data: { - serverVersion: string; - operatingSystem: string; - architecture: string; - containers: number; - containersRunning: number; - containersStopped: number; - images: number; - memTotal: number; - ncpu: number; - driver: string; - }; - }>(`/environments/${environmentId}/system/docker-info`); - - const info = response.data; + const info = await client.get<{ + ServerVersion: string; + OperatingSystem: string; + Architecture: string; + Containers: number; + ContainersRunning: number; + ContainersStopped: number; + Images: number; + MemTotal: number; + NCPU: number; + Driver: string; + }>(`/environments/${environmentId}/system/docker/info`); const lines = [ "Docker System Information:", - ` Version: ${info.serverVersion}`, - ` OS: ${info.operatingSystem}`, - ` Architecture: ${info.architecture}`, - ` Storage Driver: ${info.driver}`, - ` CPUs: ${info.ncpu}`, - ` Memory: ${formatSizeGB(info.memTotal)}`, - ` Containers: ${info.containers} (${info.containersRunning} running, ${info.containersStopped} stopped)`, - ` Images: ${info.images}`, + ` Version: ${info.ServerVersion}`, + ` OS: ${info.OperatingSystem}`, + ` Architecture: ${info.Architecture}`, + ` Storage Driver: ${info.Driver}`, + ` CPUs: ${info.NCPU}`, + ` Memory: ${formatSizeGB(info.MemTotal)}`, + ` Containers: ${info.Containers} (${info.ContainersRunning} running, ${info.ContainersStopped} stopped)`, + ` Images: ${info.Images}`, ]; return lines.join("\n"); @@ -102,32 +98,43 @@ export function registerSystemTools(server: McpServer, registry?: ToolRegistry): }, inputSchema: { environmentId: z.string().describe("Environment ID"), - volumes: z.boolean().optional().default(false).describe("Also prune volumes (DATA LOSS!)"), + volumes: z.boolean().optional().default(false).describe("Also prune all unused volumes (DATA LOSS!)"), all: z.boolean().optional().default(false).describe("Remove all unused images, not just dangling"), + buildCache: z.boolean().optional().default(false).describe("Also prune unused build cache"), }, }, - toolHandler(async ({ environmentId, volumes, all }, client) => { + toolHandler(async ({ environmentId, volumes, all, buildCache }, client) => { const response = await client.post<{ - containersDeleted?: number; - networksDeleted?: number; - imagesDeleted?: number; - volumesDeleted?: number; - spaceReclaimed?: number; - }>(`/environments/${environmentId}/system/prune`, { volumes, all }); - - const spaceMB = response.spaceReclaimed - ? formatSizeMB(response.spaceReclaimed) - : "unknown"; + data: { + containersPruned?: string[]; + imagesDeleted?: string[]; + networksDeleted?: string[]; + volumesDeleted?: string[]; + spaceReclaimed?: number; + errors?: string[]; + }; + }>(`/environments/${environmentId}/system/prune`, { + containers: { mode: "stopped" }, + images: { mode: all ? "all" : "dangling" }, + networks: { mode: "unused" }, + volumes: { mode: volumes ? "all" : "none" }, + buildCache: { mode: buildCache ? "unused" : "none" }, + }); + const r = response.data; const lines = [ "System Prune Complete:", - ` Containers removed: ${response.containersDeleted || 0}`, - ` Networks removed: ${response.networksDeleted || 0}`, - ` Images removed: ${response.imagesDeleted || 0}`, - ` Volumes removed: ${response.volumesDeleted || 0}`, - ` Space reclaimed: ${spaceMB}`, + ` Containers removed: ${r.containersPruned?.length || 0}`, + ` Networks removed: ${r.networksDeleted?.length || 0}`, + ` Images removed: ${r.imagesDeleted?.length || 0}`, + ` Volumes removed: ${r.volumesDeleted?.length || 0}`, + ` Space reclaimed: ${r.spaceReclaimed ? formatSizeMB(r.spaceReclaimed) : "unknown"}`, ]; + if (r.errors && r.errors.length > 0) { + lines.push(` Errors: ${r.errors.join("; ")}`); + } + return lines.join("\n"); }) ); diff --git a/src/tools/template-tools.ts b/src/tools/template-tools.ts index fb4f993..6083afe 100644 --- a/src/tools/template-tools.ts +++ b/src/tools/template-tools.ts @@ -204,17 +204,22 @@ export function registerTemplateTools(server: McpServer, registry?: ToolRegistry idempotentHint: true, openWorldHint: false, }, + inputSchema: { + environmentId: z.string().describe("Environment ID"), + }, }, - toolHandler(async (_params, client) => { - const response = await client.get<{ data: Record }>("/templates/variables"); + toolHandler(async ({ environmentId }, client) => { + const response = await client.get<{ data: Array<{ key: string; value: string }> }>( + `/environments/${environmentId}/templates/variables` + ); - if (!response.data || Object.keys(response.data).length === 0) { + if (!response.data || response.data.length === 0) { return "No global variables configured."; } const lines = ["Global Template Variables:\n"]; - for (const [key, value] of Object.entries(response.data)) { - lines.push(` ${key}: ${value}`); + for (const variable of response.data) { + lines.push(` ${variable.key}: ${variable.value}`); } return lines.join("\n"); @@ -234,11 +239,13 @@ export function registerTemplateTools(server: McpServer, registry?: ToolRegistry openWorldHint: false, }, inputSchema: { + environmentId: z.string().describe("Environment ID"), variables: z.record(z.string()).describe("Variables to set (key-value pairs)"), }, }, - toolHandler(async ({ variables }, client) => { - await client.put("/templates/variables", { variables }); + toolHandler(async ({ environmentId, variables }, client) => { + const variableList = Object.entries(variables).map(([key, value]) => ({ key, value })); + await client.put(`/environments/${environmentId}/templates/variables`, { variables: variableList }); return "Global variables updated."; }) ); diff --git a/src/tools/updater-tools.ts b/src/tools/updater-tools.ts index 7eb948a..a006dac 100644 --- a/src/tools/updater-tools.ts +++ b/src/tools/updater-tools.ts @@ -16,7 +16,7 @@ export function registerUpdaterTools(server: McpServer, registry?: ToolRegistry) "arcane_updater_run", { title: "Run auto-updater", - description: "Run the auto-updater to check and update all containers with available image updates", + description: "Run the auto-updater to check and update containers/projects with available image updates", annotations: { readOnlyHint: false, destructiveHint: false, @@ -26,27 +26,33 @@ export function registerUpdaterTools(server: McpServer, registry?: ToolRegistry) inputSchema: { environmentId: z.string().describe("Environment ID"), dryRun: z.boolean().optional().default(false).describe("Simulate without actually updating"), + forceUpdate: z.boolean().optional().default(false).describe("Update even if no new image was detected"), + resourceIds: z.array(z.string()).optional().describe("Limit the run to specific container/project IDs"), }, }, - toolHandler(async ({ environmentId, dryRun }, client) => { + toolHandler(async ({ environmentId, dryRun, forceUpdate, resourceIds }, client) => { + const body: Record = { dryRun, forceUpdate }; + if (resourceIds && resourceIds.length > 0) body.resourceIds = resourceIds; + const response = await client.post<{ data: UpdaterResult }>( `/environments/${environmentId}/updater/run`, - { dryRun } + body ); const r = response.data; const mode = dryRun ? " (DRY RUN)" : ""; const lines = [ `Updater Run${mode}:`, + ` Checked: ${r.checked}`, ` Updated: ${r.updated}`, ` Failed: ${r.failed}`, ` Skipped: ${r.skipped}`, ]; - if (r.results && r.results.length > 0) { + if (r.items && r.items.length > 0) { lines.push(""); - for (const result of r.results) { - lines.push(` [${result.status.toUpperCase()}] ${result.containerName}${result.message ? `: ${result.message}` : ""}`); + for (const item of r.items) { + lines.push(` [${item.status.toUpperCase()}] ${item.resourceName || item.resourceId}${item.error ? `: ${item.error}` : ""}`); } } @@ -54,43 +60,12 @@ export function registerUpdaterTools(server: McpServer, registry?: ToolRegistry) }) ); - // arcane_updater_update_container - register( - "arcane_updater_update_container", - { - title: "Update single container", - description: "Update a single container to the latest image version", - annotations: { - readOnlyHint: false, - destructiveHint: false, - idempotentHint: false, - openWorldHint: false, - }, - inputSchema: { - environmentId: z.string().describe("Environment ID"), - containerId: z.string().describe("Container ID to update"), - }, - }, - toolHandler(async ({ environmentId, containerId }, client) => { - const response = await client.post<{ data: UpdaterResult }>( - `/environments/${environmentId}/updater/containers/${containerId}` - ); - - const r = response.data; - if (r.results && r.results.length > 0) { - const result = r.results[0]; - return `Container ${result.containerName}: ${result.status}${result.message ? ` — ${result.message}` : ""}`; - } - return `Update completed for container ${containerId}.`; - }) - ); - // arcane_updater_get_status register( "arcane_updater_get_status", { title: "Get updater status", - description: "Get the current auto-updater status and schedule", + description: "Get the currently running auto-update operations (containers and projects being updated)", annotations: { readOnlyHint: true, destructiveHint: false, @@ -107,12 +82,15 @@ export function registerUpdaterTools(server: McpServer, registry?: ToolRegistry) ); const s = response.data; + const busy = (s.updatingContainers || 0) + (s.updatingProjects || 0); + if (busy === 0) { + return "Updater Status: idle — no updates currently in progress."; + } + const lines = [ - `Updater Status:`, - ` Running: ${s.running ? "Yes" : "No"}`, - ` Schedule: ${s.schedule || "Not configured"}`, - ` Last Run: ${s.lastRunAt || "Never"}`, - ` Next Run: ${s.nextRunAt || "N/A"}`, + `Updater Status: ${busy} update(s) in progress`, + ` Containers updating: ${s.updatingContainers || 0}${s.containerIds?.length ? ` (${s.containerIds.join(", ")})` : ""}`, + ` Projects updating: ${s.updatingProjects || 0}${s.projectIds?.length ? ` (${s.projectIds.join(", ")})` : ""}`, ]; return lines.join("\n"); @@ -146,12 +124,20 @@ export function registerUpdaterTools(server: McpServer, registry?: ToolRegistry) return "No update history found."; } + const formatImages = (versions?: Record) => + versions && Object.keys(versions).length > 0 + ? Object.entries(versions).map(([k, v]) => `${k}: ${String(v)}`).join(", ") + : undefined; + const lines = [`Update History (${response.data.length} entries):\n`]; for (const record of response.data) { - lines.push(`[${record.status.toUpperCase()}] ${record.containerName}`); - lines.push(` Old: ${record.oldImage}`); - lines.push(` New: ${record.newImage}`); - lines.push(` Date: ${record.updatedAt}`); + lines.push(`[${record.status.toUpperCase()}] ${record.resourceName || record.resourceId} (${record.resourceType || "container"})`); + const oldImages = formatImages(record.oldImageVersions); + const newImages = formatImages(record.newImageVersions); + if (oldImages) lines.push(` Old: ${oldImages}`); + if (newImages) lines.push(` New: ${newImages}`); + if (record.error) lines.push(` Error: ${record.error}`); + lines.push(` Date: ${record.createdAt}`); lines.push(""); } diff --git a/src/tools/user-tools.ts b/src/tools/user-tools.ts index aaaf634..9ecf2b5 100644 --- a/src/tools/user-tools.ts +++ b/src/tools/user-tools.ts @@ -40,14 +40,11 @@ export function registerUserTools(server: McpServer, registry?: ToolRegistry): v const lines = [`Found ${response.pagination.total} users:\n`]; for (const user of response.data) { - lines.push(`${user.username}`); + lines.push(`${user.username}${user.displayName ? ` (${user.displayName})` : ""}`); lines.push(` ID: ${user.id}`); - lines.push(` Role: ${user.role}`); + lines.push(` Global Admin: ${user.isGlobalAdmin ? "Yes" : "No"}`); lines.push(` Created: ${user.createdAt}`); - if (user.lastLoginAt) { - lines.push(` Last Login: ${user.lastLoginAt}`); - } - if (user.oidcSubject) { + if (user.oidcSubjectId) { lines.push(` OIDC: Yes`); } lines.push(""); @@ -80,10 +77,11 @@ export function registerUserTools(server: McpServer, registry?: ToolRegistry): v const lines = [ `User: ${user.username}`, ` ID: ${user.id}`, - ` Role: ${user.role}`, + ` Display Name: ${user.displayName || "N/A"}`, + ` Email: ${user.email || "N/A"}`, + ` Global Admin: ${user.isGlobalAdmin ? "Yes" : "No"}`, ` Created: ${user.createdAt}`, - ` Last Login: ${user.lastLoginAt || "Never"}`, - ` OIDC: ${user.oidcSubject ? "Yes" : "No"}`, + ` OIDC: ${user.oidcSubjectId ? "Yes" : "No"}`, ]; return lines.join("\n"); @@ -105,17 +103,19 @@ export function registerUserTools(server: McpServer, registry?: ToolRegistry): v inputSchema: { username: z.string().describe("Username"), password: z.string().min(8).describe("Password (minimum 8 characters)"), - role: z.enum(["admin", "user", "readonly"]).optional().default("user").describe("User role"), + displayName: z.string().optional().describe("Display name"), + email: z.string().optional().describe("Email address"), }, }, - toolHandler(async ({ username, password, role }, client) => { + toolHandler(async ({ username, password, displayName, email }, client) => { const response = await client.post<{ data: { id: string; username: string } }>("/users", { username, password, - role, + displayName, + email, }); - return `User created: ${response.data.username} (ID: ${response.data.id})`; + return `User created: ${response.data.username} (ID: ${response.data.id})\nNote: roles are managed via Arcane's role assignments (not supported by this tool).`; }) ); @@ -134,13 +134,17 @@ export function registerUserTools(server: McpServer, registry?: ToolRegistry): v inputSchema: { userId: z.string().describe("User ID"), username: z.string().optional().describe("New username"), - role: z.enum(["admin", "user", "readonly"]).optional().describe("New role"), + displayName: z.string().optional().describe("New display name"), + email: z.string().optional().describe("New email address"), + password: z.string().min(8).optional().describe("New password (minimum 8 characters)"), }, }, - toolHandler(async ({ userId, username, role }, client) => { + toolHandler(async ({ userId, username, displayName, email, password }, client) => { const body: Record = {}; if (username) body.username = username; - if (role) body.role = role; + if (displayName) body.displayName = displayName; + if (email) body.email = email; + if (password) body.password = password; await client.put(`/users/${userId}`, body); return `User ${userId} updated.`; diff --git a/src/tools/volume-tools.ts b/src/tools/volume-tools.ts index af8f603..083b53e 100644 --- a/src/tools/volume-tools.ts +++ b/src/tools/volume-tools.ts @@ -348,8 +348,7 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): const lines = [`Backups for ${volumeName}:\n`]; for (const backup of response.data) { - lines.push(`${backup.filename}`); - lines.push(` ID: ${backup.id}`); + lines.push(`Backup ${backup.id}`); lines.push(` Size: ${formatSizeMB(backup.size)}`); lines.push(` Created: ${backup.createdAt}`); lines.push(""); @@ -381,7 +380,7 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): `/environments/${environmentId}/volumes/${volumeName}/backups` ); - return `Backup created: ${response.data.filename}\n ID: ${response.data.id}\n Size: ${formatSizeMB(response.data.size)}`; + return `Backup created for volume ${volumeName}.\n ID: ${response.data.id}\n Size: ${formatSizeMB(response.data.size)}`; }) ); @@ -399,12 +398,11 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): }, inputSchema: { environmentId: z.string().describe("Environment ID"), - volumeName: z.string().describe("Volume name"), backupId: z.string().describe("Backup ID to delete"), }, }, - toolHandler(async ({ environmentId, volumeName, backupId }, client) => { - await client.delete(`/environments/${environmentId}/volumes/${volumeName}/backups/${backupId}`); + toolHandler(async ({ environmentId, backupId }, client) => { + await client.delete(`/environments/${environmentId}/volumes/backups/${backupId}`); return `Backup ${backupId} deleted.`; }) ); @@ -447,27 +445,21 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): }, inputSchema: { environmentId: z.string().describe("Environment ID"), - volumeName: z.string().describe("Volume name"), backupId: z.string().describe("Backup ID"), - path: z.string().optional().default("/").describe("Path within the backup"), }, }, - toolHandler(async ({ environmentId, volumeName, backupId, path }, client) => { - if (path) validatePath(path); - - const response = await client.get<{ data: FileEntry[] }>( - `/environments/${environmentId}/volumes/${volumeName}/backups/${backupId}/files`, - { path } + toolHandler(async ({ environmentId, backupId }, client) => { + const response = await client.get<{ data: string[] }>( + `/environments/${environmentId}/volumes/backups/${backupId}/files` ); if (!response.data || response.data.length === 0) { - return `Path ${path} is empty or not found in backup.`; + return `Backup ${backupId} contains no files.`; } - const lines = [`Files in backup at ${path}:\n`]; - for (const entry of response.data) { - const type = entry.isDir ? "DIR " : "FILE"; - lines.push(`${type} ${entry.name}`); + const lines = [`Files in backup ${backupId}:\n`]; + for (const file of response.data) { + lines.push(` ${file}`); } return lines.join("\n"); diff --git a/src/tools/vulnerability-tools.ts b/src/tools/vulnerability-tools.ts index 7493ea2..c614a71 100644 --- a/src/tools/vulnerability-tools.ts +++ b/src/tools/vulnerability-tools.ts @@ -6,7 +6,33 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; -import type { ScanResult, Vulnerability } from "../types/arcane-types.js"; +import type { IgnoredVulnerability, ScanResult, SeveritySummary, Vulnerability } from "../types/arcane-types.js"; + +function formatSummary(s?: SeveritySummary): string { + if (!s) return "no summary available"; + return `${s.total} total (Critical: ${s.critical}, High: ${s.high}, Medium: ${s.medium}, Low: ${s.low})`; +} + +function formatScanResult(scan: ScanResult): string { + const lines = [ + `Scan Result for ${scan.imageName || scan.imageId}:`, + ` Status: ${scan.status}${scan.scanPhase ? ` (${scan.scanPhase})` : ""}`, + ` Scanned: ${scan.scanTime || "N/A"}`, + ` Vulnerabilities: ${formatSummary(scan.summary)}`, + ]; + if (scan.error) lines.push(` Error: ${scan.error}`); + return lines.join("\n"); +} + +function formatVulnerability(vuln: Vulnerability): string[] { + const lines = [`[${vuln.severity.toUpperCase()}] ${vuln.vulnerabilityId}`]; + lines.push(` Package: ${vuln.pkgName}${vuln.installedVersion ? ` (${vuln.installedVersion})` : ""}`); + if (vuln.imageName) lines.push(` Image: ${vuln.imageName}`); + if (vuln.fixedVersion) lines.push(` Fix: ${vuln.fixedVersion}`); + if (vuln.title) lines.push(` ${vuln.title}`); + lines.push(""); + return lines; +} export function registerVulnerabilityTools(server: McpServer, registry?: ToolRegistry): void { const register = moduleRegistrar(server, registry, "vulnerability"); @@ -33,15 +59,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg `/environments/${environmentId}/images/${imageId}/vulnerabilities/scan` ); - const scan = response.data; - const lines = [ - `Vulnerability scan initiated for image ${scan.imageRef}`, - ` Status: ${scan.status}`, - ` Total: ${scan.totalVulnerabilities}`, - ` Critical: ${scan.critical} | High: ${scan.high} | Medium: ${scan.medium} | Low: ${scan.low}`, - ]; - - return lines.join("\n"); + return `Vulnerability scan initiated.\n${formatScanResult(response.data)}`; }) ); @@ -50,7 +68,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg "arcane_vulnerability_get_scan_result", { title: "Get scan result", - description: "Get the full vulnerability scan result for an image", + description: "Get the vulnerability scan result for an image", annotations: { readOnlyHint: true, destructiveHint: false, @@ -64,22 +82,10 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, toolHandler(async ({ environmentId, imageId }, client) => { const response = await client.get<{ data: ScanResult }>( - `/environments/${environmentId}/images/${imageId}/vulnerabilities/result` + `/environments/${environmentId}/images/${imageId}/vulnerabilities` ); - const scan = response.data; - const lines = [ - `Scan Result for ${scan.imageRef}:`, - ` Scanned: ${scan.scannedAt}`, - ` Status: ${scan.status}`, - ` Total Vulnerabilities: ${scan.totalVulnerabilities}`, - ` Critical: ${scan.critical}`, - ` High: ${scan.high}`, - ` Medium: ${scan.medium}`, - ` Low: ${scan.low}`, - ]; - - return lines.join("\n"); + return formatScanResult(response.data); }) ); @@ -101,12 +107,12 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, }, toolHandler(async ({ environmentId, imageId }, client) => { - const response = await client.get<{ data: { total: number; critical: number; high: number; medium: number; low: number; scannedAt?: string } }>( - `/environments/${environmentId}/images/${imageId}/vulnerabilities/summary` - ); + const response = await client.get<{ + data: { status: string; scanPhase?: string; scanTime?: string; summary?: SeveritySummary }; + }>(`/environments/${environmentId}/images/${imageId}/vulnerabilities/summary`); const s = response.data; - return `Scan Summary: ${s.total} vulnerabilities (Critical: ${s.critical}, High: ${s.high}, Medium: ${s.medium}, Low: ${s.low})${s.scannedAt ? ` — Last scanned: ${s.scannedAt}` : ""}`; + return `Scan Summary: ${formatSummary(s.summary)}${s.scanTime ? ` — Last scanned: ${s.scanTime}` : ""}`; }) ); @@ -128,15 +134,18 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, }, toolHandler(async ({ environmentId, imageIds }, client) => { - const response = await client.post<{ data: Record }>( - `/environments/${environmentId}/images/vulnerabilities/summaries`, - { imageIds } - ); + const response = await client.post<{ + data: { summaries: Record }; + }>(`/environments/${environmentId}/images/vulnerabilities/summaries`, { imageIds }); + + const summaries = response.data?.summaries || {}; + if (Object.keys(summaries).length === 0) { + return "No scan summaries available for the given images."; + } - const summaries = response.data; const lines = ["Vulnerability Summaries:\n"]; for (const [id, s] of Object.entries(summaries)) { - lines.push(` ${id}: ${s.total} total (C:${s.critical} H:${s.high} M:${s.medium} L:${s.low})`); + lines.push(` ${id}: [${s.status}] ${formatSummary(s.summary)}`); } return lines.join("\n"); @@ -170,7 +179,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg const response = await client.get<{ data: Vulnerability[]; pagination: { total: number; start: number; limit: number }; - }>(`/environments/${environmentId}/images/${imageId}/vulnerabilities`, { + }>(`/environments/${environmentId}/images/${imageId}/vulnerabilities/list`, { severity, search, sort, order, start, limit, }); @@ -180,12 +189,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg const lines = [`Found ${response.pagination.total} vulnerabilities:\n`]; for (const vuln of response.data) { - const ignored = vuln.ignored ? " [IGNORED]" : ""; - lines.push(`[${vuln.severity.toUpperCase()}]${ignored} ${vuln.id}`); - lines.push(` Package: ${vuln.package} (${vuln.installedVersion})`); - if (vuln.fixedVersion) lines.push(` Fix: ${vuln.fixedVersion}`); - if (vuln.title) lines.push(` ${vuln.title}`); - lines.push(""); + lines.push(...formatVulnerability(vuln)); } return lines.join("\n"); @@ -213,11 +217,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg data: { totalImages: number; scannedImages: number; - totalVulnerabilities: number; - critical: number; - high: number; - medium: number; - low: number; + summary?: SeveritySummary; }; }>(`/environments/${environmentId}/vulnerabilities/summary`); @@ -225,11 +225,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg const lines = [ `Environment Vulnerability Summary:`, ` Images: ${s.scannedImages}/${s.totalImages} scanned`, - ` Total Vulnerabilities: ${s.totalVulnerabilities}`, - ` Critical: ${s.critical}`, - ` High: ${s.high}`, - ` Medium: ${s.medium}`, - ` Low: ${s.low}`, + ` Vulnerabilities: ${formatSummary(s.summary)}`, ]; return lines.join("\n"); @@ -252,14 +248,19 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg environmentId: z.string().describe("Environment ID"), imageId: z.string().describe("Image ID"), vulnerabilityId: z.string().describe("Vulnerability ID (e.g., CVE-2024-12345)"), + pkgName: z.string().describe("Affected package name (as reported by the scanner)"), + installedVersion: z.string().optional().describe("Installed version of the affected package"), reason: z.string().optional().describe("Reason for ignoring"), }, }, - toolHandler(async ({ environmentId, imageId, vulnerabilityId, reason }, client) => { - await client.post( - `/environments/${environmentId}/images/${imageId}/vulnerabilities/${vulnerabilityId}/ignore`, - { reason } - ); + toolHandler(async ({ environmentId, imageId, vulnerabilityId, pkgName, installedVersion, reason }, client) => { + await client.post(`/environments/${environmentId}/vulnerabilities/ignore`, { + imageId, + vulnerabilityId, + pkgName, + installedVersion, + reason, + }); return `Vulnerability ${vulnerabilityId} ignored.`; }) ); @@ -269,7 +270,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg "arcane_vulnerability_unignore", { title: "Unignore vulnerability", - description: "Unignore a previously ignored vulnerability", + description: "Unignore a previously ignored vulnerability (use the ignore entry ID from the ignored list)", annotations: { readOnlyHint: false, destructiveHint: false, @@ -278,15 +279,12 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, inputSchema: { environmentId: z.string().describe("Environment ID"), - imageId: z.string().describe("Image ID"), - vulnerabilityId: z.string().describe("Vulnerability ID"), + ignoreId: z.string().describe("Ignore entry ID (from arcane_vulnerability_list_ignored)"), }, }, - toolHandler(async ({ environmentId, imageId, vulnerabilityId }, client) => { - await client.delete( - `/environments/${environmentId}/images/${imageId}/vulnerabilities/${vulnerabilityId}/ignore` - ); - return `Vulnerability ${vulnerabilityId} unignored.`; + toolHandler(async ({ environmentId, ignoreId }, client) => { + await client.delete(`/environments/${environmentId}/vulnerabilities/ignore/${ignoreId}`); + return `Ignore entry ${ignoreId} removed.`; }) ); @@ -343,7 +341,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg search: z.string().optional().describe("Search query"), start: z.number().optional().default(0).describe("Pagination start index"), limit: z.number().optional().default(20).describe("Items per page"), - }, + }, }, toolHandler(async ({ environmentId, severity, imageName, search, start, limit }, client) => { const response = await client.get<{ @@ -359,12 +357,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg const lines = [`Found ${response.pagination.total} vulnerabilities across environment:\n`]; for (const vuln of response.data) { - const ignored = vuln.ignored ? " [IGNORED]" : ""; - lines.push(`[${vuln.severity.toUpperCase()}]${ignored} ${vuln.id}`); - lines.push(` Package: ${vuln.package} (${vuln.installedVersion})`); - if (vuln.fixedVersion) lines.push(` Fix: ${vuln.fixedVersion}`); - if (vuln.title) lines.push(` ${vuln.title}`); - lines.push(""); + lines.push(...formatVulnerability(vuln)); } return lines.join("\n"); @@ -376,7 +369,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg "arcane_vulnerability_list_ignored", { title: "List ignored vulnerabilities", - description: "List all ignored vulnerabilities in an environment", + description: "List all ignored vulnerabilities in an environment (includes the ignore entry ID needed for unignoring)", annotations: { readOnlyHint: true, destructiveHint: false, @@ -388,7 +381,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ data: Vulnerability[] }>( + const response = await client.get<{ data: IgnoredVulnerability[] }>( `/environments/${environmentId}/vulnerabilities/ignored` ); @@ -398,10 +391,10 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg const lines = [`${response.data.length} ignored vulnerabilities:\n`]; for (const vuln of response.data) { - lines.push(`[${vuln.severity.toUpperCase()}] ${vuln.id}`); - lines.push(` Package: ${vuln.package} (${vuln.installedVersion})`); - if (vuln.fixedVersion) lines.push(` Fix: ${vuln.fixedVersion}`); - if (vuln.title) lines.push(` ${vuln.title}`); + lines.push(`${vuln.vulnerabilityId} (Ignore ID: ${vuln.id})`); + lines.push(` Package: ${vuln.pkgName || "unknown"}${vuln.installedVersion ? ` (${vuln.installedVersion})` : ""}`); + if (vuln.imageId) lines.push(` Image: ${vuln.imageId}`); + if (vuln.reason) lines.push(` Reason: ${vuln.reason}`); lines.push(""); } diff --git a/src/types/arcane-types.ts b/src/types/arcane-types.ts index 7becf7d..193c176 100644 --- a/src/types/arcane-types.ts +++ b/src/types/arcane-types.ts @@ -44,7 +44,6 @@ export interface FileEntry { export interface Backup { id: string; volumeName: string; - filename: string; size: number; createdAt: string; } @@ -79,25 +78,24 @@ export interface Image { // === Image Updates === export interface ImageUpdateResponse { - imageRef: string; + hasUpdate: boolean; + updateType?: string; + currentVersion?: string; + latestVersion?: string; currentDigest?: string; latestDigest?: string; - updateAvailable: boolean; - currentTag?: string; - latestTag?: string; + checkTime?: string; + error?: string; } -export interface BatchImageUpdateResponse { - results: Array; - total: number; - updatesAvailable: number; -} +/** Batch check result: image reference → per-image result */ +export type BatchImageUpdateResponse = Record; export interface ImageUpdateSummary { totalImages: number; - checkedImages: number; - updatesAvailable: number; - lastCheckedAt?: string; + imagesWithUpdates: number; + digestUpdates: number; + errorsCount: number; } // === Networks === @@ -187,21 +185,14 @@ export interface DashboardSnapshot { systemInfo?: { dockerVersion?: string; osType?: string; cpus?: number; memoryBytes?: number }; } -export interface ActionItem { - type: string; - severity: string; - title: string; - description?: string; - resourceId?: string; - resourceName?: string; -} - // === Events === export interface Event { id: string; type: string; - message: string; + title: string; + description?: string; + severity: string; resourceType?: string; resourceId?: string; resourceName?: string; @@ -310,32 +301,46 @@ export interface Template { // === Updater === +export interface UpdaterResourceResult { + resourceId?: string; + resourceName?: string; + resourceType?: string; + status: string; + updateAvailable?: boolean; + updateApplied?: boolean; + oldImages?: Record; + newImages?: Record; + error?: string; +} + export interface UpdaterResult { + checked: number; updated: number; failed: number; skipped: number; - results: Array<{ - containerId: string; - containerName: string; - status: string; - message?: string; - }>; + items: UpdaterResourceResult[]; } export interface UpdaterStatus { - running: boolean; - lastRunAt?: string; - nextRunAt?: string; - schedule?: string; + containerIds: string[]; + projectIds: string[]; + updatingContainers: number; + updatingProjects: number; } export interface UpdateRecord { id: string; - containerName: string; - oldImage: string; - newImage: string; + resourceId?: string; + resourceName?: string; + resourceType?: string; status: string; - updatedAt: string; + updateApplied?: boolean; + oldImageVersions?: Record; + newImageVersions?: Record; + startTime?: string; + endTime?: string; + createdAt: string; + error?: string; } // === Users === @@ -343,35 +348,55 @@ export interface UpdateRecord { export interface User { id: string; username: string; - role: string; + displayName?: string; + email?: string; + isGlobalAdmin?: boolean; createdAt: string; - lastLoginAt?: string; - oidcSubject?: string; + oidcSubjectId?: string; } // === Vulnerabilities === -export interface ScanResult { - imageId: string; - imageRef: string; - scannedAt: string; - status: string; - totalVulnerabilities: number; +export interface SeveritySummary { + total: number; critical: number; high: number; medium: number; low: number; + unknown?: number; +} + +export interface ScanResult { + imageId: string; + imageName?: string; + status: string; + scanPhase?: string; + scanTime?: string; + duration?: number; + error?: string; + summary?: SeveritySummary; } export interface Vulnerability { - id: string; - package: string; - installedVersion: string; + vulnerabilityId: string; + pkgName: string; + installedVersion?: string; fixedVersion?: string; severity: string; title?: string; description?: string; - ignored?: boolean; + imageName?: string; +} + +export interface IgnoredVulnerability { + id: string; + vulnerabilityId: string; + pkgName?: string; + installedVersion?: string; + imageId?: string; + reason?: string; + createdBy?: string; + createdAt?: string; } // === Webhooks === diff --git a/src/types/generated/arcane-api.ts b/src/types/generated/arcane-api.ts index 4b08cee..3d19a0e 100644 --- a/src/types/generated/arcane-api.ts +++ b/src/types/generated/arcane-api.ts @@ -4,6 +4,26 @@ */ export interface paths { + "/activities/stream": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Stream background activities across all environments + * @description Stream background activity updates for the local environment and all enabled remote environments as JSON lines + */ + get: operations["stream-all-activities"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api-keys": { parameters: { query?: never; @@ -236,6 +256,94 @@ export interface paths { patch?: never; trace?: never; }; + "/auth/me/api-keys": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List my API keys + * @description List API keys owned by the current user + */ + get: operations["list-my-api-keys"]; + put?: never; + /** + * Create my API key + * @description Create a new personal API key owned by the current user. Personal keys inherit the owner's role permissions. + */ + post: operations["create-my-api-key"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/me/api-keys/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Delete my API key + * @description Delete one of the current user's own API keys + */ + delete: operations["delete-my-api-key"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/me/avatar": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Upload own avatar + * @description Upload a custom profile picture (PNG, JPEG or WebP). Replaces any existing avatar. + */ + post: operations["upload-my-avatar"]; + /** + * Delete own avatar + * @description Remove the current user's custom profile picture, reverting to the default avatar. + */ + delete: operations["delete-my-avatar"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/me/profile": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** + * Update own profile + * @description Update the current user's display name and email. Forbidden for OIDC-managed accounts. + */ + put: operations["update-my-profile"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/auth/password": { parameters: { query?: never; @@ -276,6 +384,26 @@ export interface paths { patch?: never; trace?: never; }; + "/auth/sessions/logout-all": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Logout all other sessions + * @description Revoke every session for the current user except the one making this request + */ + post: operations["logout-all-other-sessions"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/container-registries": { parameters: { query?: never; @@ -300,6 +428,26 @@ export interface paths { patch?: never; trace?: never; }; + "/container-registries/pull-usage": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get container registry pull usage + * @description Get configured registry pull usage and rate limit visibility + */ + get: operations["getContainerRegistryPullUsage"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/container-registries/sync": { parameters: { query?: never; @@ -520,6 +668,86 @@ export interface paths { patch?: never; trace?: never; }; + "/dashboard/stream": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Stream dashboard snapshots across all environments + * @description Stream dashboard snapshot updates for the local environment and all enabled remote environments as JSON lines + */ + get: operations["stream-all-dashboards"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/diagnostics": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get runtime diagnostics + * @description Returns Go runtime, memory, garbage-collector, and WebSocket connection statistics. + */ + get: operations["get-diagnostics"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/diagnostics/logs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get recent backend logs + * @description Returns the most recent buffered backend log entries (oldest first). + */ + get: operations["get-diagnostics-logs"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/edge-mtls/ca": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Download Arcane-generated edge mTLS CA + * @description Download the Arcane-managed certificate authority used for generated edge mTLS client certificates + */ + get: operations["downloadEdgeMTLSCA"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments": { parameters: { query?: never; @@ -592,6 +820,86 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/activities": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List background activities + * @description Get current and recent background activities for an environment + */ + get: operations["list-activities"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/activities/history": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Clear background activity history + * @description Delete completed background activity history for an environment + */ + delete: operations["clear-activity-history"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/activities/{activityId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get background activity + * @description Get a background activity with its recent output messages + */ + get: operations["get-activity"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/activities/{activityId}/cancel": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Cancel a background activity + * @description Request cancellation of a running or queued background activity + */ + post: operations["cancel-activity"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/agent/pair": { parameters: { query?: never; @@ -792,7 +1100,7 @@ export interface paths { patch?: never; trace?: never; }; - "/environments/{id}/containers/{containerId}/redeploy": { + "/environments/{id}/containers/{containerId}/commit": { parameters: { query?: never; header?: never; @@ -802,17 +1110,17 @@ export interface paths { get?: never; put?: never; /** - * Redeploy container - * @description Pull latest image and recreate container + * Commit container + * @description Create an image from a container */ - post: operations["redeploy-container"]; + post: operations["commit-container"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/environments/{id}/containers/{containerId}/restart": { + "/environments/{id}/containers/{containerId}/kill": { parameters: { query?: never; header?: never; @@ -821,15 +1129,18 @@ export interface paths { }; get?: never; put?: never; - /** Restart container */ - post: operations["restart-container"]; + /** + * Kill container + * @description Send a signal to the container's main process (default SIGKILL) + */ + post: operations["kill-container"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/environments/{id}/containers/{containerId}/start": { + "/environments/{id}/containers/{containerId}/pause": { parameters: { query?: never; header?: never; @@ -838,15 +1149,69 @@ export interface paths { }; get?: never; put?: never; - /** Start container */ - post: operations["start-container"]; + /** Pause container */ + post: operations["pause-container"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/environments/{id}/containers/{containerId}/stop": { + "/environments/{id}/containers/{containerId}/redeploy": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Redeploy container + * @description Pull latest image and recreate container + */ + post: operations["redeploy-container"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/containers/{containerId}/restart": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Restart container */ + post: operations["restart-container"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/containers/{containerId}/start": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Start container */ + post: operations["start-container"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/containers/{containerId}/stop": { parameters: { query?: never; header?: never; @@ -863,6 +1228,23 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/containers/{containerId}/unpause": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Unpause container */ + post: operations["unpause-container"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/containers/{containerId}/update": { parameters: { query?: never; @@ -903,7 +1285,7 @@ export interface paths { patch?: never; trace?: never; }; - "/environments/{id}/dashboard/action-items": { + "/environments/{id}/deployment": { parameters: { query?: never; header?: never; @@ -911,10 +1293,10 @@ export interface paths { cookie?: never; }; /** - * Get dashboard action items - * @description Returns only dashboard action items that currently need attention + * Get deployment snippets + * @description Get Docker run and compose snippets for environment deployment */ - get: operations["get-dashboard-action-items"]; + get: operations["getDeploymentSnippets"]; put?: never; post?: never; delete?: never; @@ -923,7 +1305,7 @@ export interface paths { patch?: never; trace?: never; }; - "/environments/{id}/deployment": { + "/environments/{id}/deployment/mtls/bundle": { parameters: { query?: never; header?: never; @@ -931,10 +1313,30 @@ export interface paths { cookie?: never; }; /** - * Get deployment snippets - * @description Get Docker run and compose snippets for environment deployment + * Download environment mTLS bundle + * @description Download the generated mTLS client certificate bundle for an edge environment */ - get: operations["getDeploymentSnippets"]; + get: operations["downloadEnvironmentMTLSBundle"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/deployment/mtls/{fileName}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Download environment mTLS asset + * @description Download an individual generated mTLS client certificate asset for an edge environment + */ + get: operations["downloadEnvironmentMTLSFile"]; put?: never; post?: never; delete?: never; @@ -1095,6 +1497,23 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/image-updates/by-refs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get persisted update info for image references */ + get: operations["get-update-info-by-refs"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/image-updates/check": { parameters: { query?: never; @@ -1321,6 +1740,26 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/images/search": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Search images + * @description Search Docker Hub images + */ + get: operations["search-images"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/images/upload": { parameters: { query?: never; @@ -1465,6 +1904,86 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/images/{name}/attestations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get image attestations + * @description Get in-toto attestation statements attached to a Docker image + */ + get: operations["get-image-attestations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/images/{name}/export": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export image + * @description Download a Docker image as a tar archive + */ + get: operations["export-image"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/images/{name}/history": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get image history + * @description Get Docker image layer history + */ + get: operations["get-image-history"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/images/{name}/tag": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Tag image + * @description Add a repository tag to an image + */ + post: operations["tag-image"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/job-schedules": { parameters: { query?: never; @@ -1616,41 +2135,6 @@ export interface paths { patch?: never; trace?: never; }; - "/environments/{id}/notifications/apprise": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get Apprise settings */ - get: operations["get-apprise-settings"]; - put?: never; - /** Create or update Apprise settings */ - post: operations["create-or-update-apprise-settings"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/environments/{id}/notifications/apprise/test": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Test Apprise notification */ - post: operations["test-apprise-notification"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; "/environments/{id}/notifications/settings": { parameters: { query?: never; @@ -1789,6 +2273,26 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/projects/{projectId}/archive": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Archive a project + * @description Archive a stopped Docker Compose project + */ + post: operations["archive-project"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/projects/{projectId}/build": { parameters: { query?: never; @@ -1809,6 +2313,26 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/projects/{projectId}/compose": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get project compose details + * @description Get compose content, includes, and service configs for a project + */ + get: operations["get-project-compose"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/projects/{projectId}/destroy": { parameters: { query?: never; @@ -1849,19 +2373,19 @@ export interface paths { patch?: never; trace?: never; }; - "/environments/{id}/projects/{projectId}/includes": { + "/environments/{id}/projects/{projectId}/file": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; /** - * Update project include file - * @description Update an include file within a Docker Compose project + * Get a project file + * @description Get the contents of a single project-related file by relative path */ - put: operations["update-project-include"]; + get: operations["get-project-file"]; + put?: never; post?: never; delete?: never; options?: never; @@ -1869,18 +2393,58 @@ export interface paths { patch?: never; trace?: never; }; - "/environments/{id}/projects/{projectId}/pull": { + "/environments/{id}/projects/{projectId}/files": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; - put?: never; /** - * Pull project images - * @description Pull all images for a Docker Compose project with streaming progress output + * Get project files + * @description Get directory files for a project + */ + get: operations["get-project-files"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/projects/{projectId}/includes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** + * Update project include file + * @description Update an include file within a Docker Compose project + */ + put: operations["update-project-include"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/projects/{projectId}/pull": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Pull project images + * @description Pull all images for a Docker Compose project with streaming progress output */ post: operations["pull-project-images"]; delete?: never; @@ -1929,6 +2493,46 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/projects/{projectId}/runtime": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get project runtime + * @description Get runtime service state for a project + */ + get: operations["get-project-runtime"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/projects/{projectId}/unarchive": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Unarchive a project + * @description Unarchive a Docker Compose project + */ + post: operations["unarchive-project"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/projects/{projectId}/up": { parameters: { query?: never; @@ -1949,6 +2553,46 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/projects/{projectId}/update-services": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Update project services + * @description Pull latest images and recreate the given services (all services when none are specified) + */ + post: operations["update-project-services"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/projects/{projectId}/updates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get project updates + * @description Get image update summary for a project + */ + get: operations["get-project-updates"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/settings": { parameters: { query?: never; @@ -2457,7 +3101,8 @@ export interface paths { }; /** Get swarm stack source */ get: operations["get-swarm-stack-source"]; - put?: never; + /** Update swarm stack source */ + put: operations["update-swarm-stack-source"]; post?: never; delete?: never; options?: never; @@ -2730,6 +3375,46 @@ export interface paths { patch?: never; trace?: never; }; + "/environments/{id}/system/upgrade/all": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Update all environments + * @description Upgrade every Arcane environment, starting with the manager + */ + post: operations["trigger-update-all"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/environments/{id}/system/upgrade/all/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get update-all status + * @description Get the status of the latest update-all-environments job + */ + get: operations["update-all-status"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/environments/{id}/system/upgrade/check": { parameters: { query?: never; @@ -3426,11 +4111,7 @@ export interface paths { */ get: operations["listEvents"]; put?: never; - /** - * Create an event - * @description Create a new system event - */ - post: operations["createEvent"]; + post?: never; delete?: never; options?: never; head?: never; @@ -3477,7 +4158,7 @@ export interface paths { patch?: never; trace?: never; }; - "/fonts/mono": { + "/federated-credentials": { parameters: { query?: never; header?: never; @@ -3485,39 +4166,23 @@ export interface paths { cookie?: never; }; /** - * Get monospace font - * @description Get the application monospace font (Geist Mono) + * List federated credentials + * @description Get a paginated list of workload identity federation trust rules */ - get: operations["get-mono-font"]; + get: operations["list-federated-credentials"]; put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/fonts/sans": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; /** - * Get sans-serif font - * @description Get the application sans-serif font (Geist) + * Create a federated credential + * @description Create a workload identity federation trust rule */ - get: operations["get-sans-font"]; - put?: never; - post?: never; + post: operations["create-federated-credential"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/fonts/serif": { + "/federated-credentials/{id}": { parameters: { query?: never; header?: never; @@ -3525,13 +4190,21 @@ export interface paths { cookie?: never; }; /** - * Get serif font - * @description Get the application serif font (Calistoga) + * Get a federated credential + * @description Get details of a workload identity federation trust rule */ - get: operations["get-serif-font"]; - put?: never; + get: operations["get-federated-credential"]; + /** + * Update a federated credential + * @description Update a workload identity federation trust rule + */ + put: operations["update-federated-credential"]; post?: never; - delete?: never; + /** + * Delete a federated credential + * @description Delete a workload identity federation trust rule and its service user + */ + delete: operations["delete-federated-credential"]; options?: never; head?: never; patch?: never; @@ -3678,6 +4351,45 @@ export interface paths { patch?: never; trace?: never; }; + "/oidc/role-mappings": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List OIDC group → role mappings + * @description Returns every mapping. On each OIDC login the user's group claim is matched against ClaimValue and matching rows become source='oidc' role assignments. + */ + get: operations["list-oidc-role-mappings"]; + put?: never; + /** Create an OIDC role mapping */ + post: operations["create-oidc-role-mapping"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/oidc/role-mappings/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** Update an OIDC role mapping */ + put: operations["update-oidc-role-mapping"]; + post?: never; + /** Delete an OIDC role mapping */ + delete: operations["delete-oidc-role-mapping"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/oidc/status": { parameters: { query?: never; @@ -3718,6 +4430,75 @@ export interface paths { patch?: never; trace?: never; }; + "/roles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List roles + * @description Get a paginated list of roles (built-in + custom) + */ + get: operations["list-roles"]; + put?: never; + /** + * Create a custom role + * @description Built-in roles cannot be created via this endpoint; only custom roles are accepted. Reserved for global admins. + */ + post: operations["create-role"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/roles/available-permissions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the permission manifest + * @description Returns every permission the server recognizes, grouped by resource. Used by permission-picking UIs. + */ + get: operations["get-permissions-manifest"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/roles/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a role */ + get: operations["get-role"]; + /** + * Update a custom role + * @description Built-in roles are read-only and return 403 on update. Reserved for global admins. + */ + put: operations["update-role"]; + post?: never; + /** + * Delete a custom role + * @description Built-in roles are protected; deleting cascades all user assignments. Reserved for global admins. + */ + delete: operations["delete-role"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/settings/categories": { parameters: { query?: never; @@ -4031,7 +4812,7 @@ export interface paths { patch?: never; trace?: never; }; - "/version": { + "/users/{userId}/avatar": { parameters: { query?: never; header?: never; @@ -4039,10 +4820,10 @@ export interface paths { cookie?: never; }; /** - * Get version information - * @description Get application version information and check for updates + * Get user avatar + * @description Get the custom profile picture for a user */ - get: operations["getVersion"]; + get: operations["getUserAvatar"]; put?: never; post?: never; delete?: never; @@ -4051,19 +4832,117 @@ export interface paths { patch?: never; trace?: never; }; -} -export type webhooks = Record; -export interface components { - schemas: { - ApiKeyPaginatedResponse: { - /** - * Format: uri - * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/ApiKeyPaginatedResponse.json - */ - readonly $schema?: string; - data: components["schemas"]["ApikeyApiKey"][] | null; - pagination: components["schemas"]["BasePaginationResponse"]; + "/users/{userId}/role-assignments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List a user's role assignments + * @description Reserved for global admins. + */ + get: operations["list-user-role-assignments"]; + /** + * Replace a user's manual role assignments + * @description Replaces every source='manual' assignment for the user. source='oidc' assignments are not touched. Reserved for global admins; enforces the last-admin guard. + */ + put: operations["set-user-role-assignments"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/version": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get version information + * @description Get application version information and check for updates + */ + get: operations["getVersion"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + ActivityActivity: { + /** Format: date-time */ + createdAt: string; + /** Format: int64 */ + durationMs?: number; + /** Format: date-time */ + endedAt?: string; + environmentId: string; + error?: string; + id: string; + latestMessage?: string; + metadata?: { + [key: string]: unknown; + }; + /** Format: int64 */ + progress?: number; + resourceId?: string; + resourceName?: string; + resourceType?: string; + sourceEnvironmentId?: string; + sourceEnvironmentName?: string; + /** Format: date-time */ + startedAt: string; + startedBy?: components["schemas"]["ActivityStartedBy"]; + status: string; + step?: string; + type: string; + /** Format: date-time */ + updatedAt?: string; + }; + ActivityClearHistoryResult: { + /** Format: int64 */ + deleted: number; + }; + ActivityDetail: { + activity: components["schemas"]["ActivityActivity"]; + messages: components["schemas"]["ActivityMessage"][] | null; + }; + ActivityMessage: { + activityId: string; + /** Format: date-time */ + createdAt: string; + id: string; + level: string; + message: string; + payload?: { + [key: string]: unknown; + }; + }; + ActivityStartedBy: { + displayName?: string; + userId?: string; + username: string; + }; + ApiKeyPaginatedResponse: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/ApiKeyPaginatedResponse.json + */ + readonly $schema?: string; + data: components["schemas"]["ApikeyApiKey"][] | null; + pagination: components["schemas"]["BasePaginationResponse"]; success: boolean; }; "ApiResponseStruct {}DataStruct": Record; @@ -4082,10 +4961,14 @@ export interface components { expiresAt?: string; /** @description Unique identifier of the API key */ id: string; + /** @description Whether the API key is an auto-generated environment bootstrap key (locked from manual edit / delete) */ + isBootstrap: boolean; /** @description Whether the API key is environment-managed and protected from deletion */ isStatic: boolean; /** @description Prefix of the API key for identification */ keyPrefix: string; + /** @description Key kind: 'scoped' keys use their own permission grants, 'personal' keys inherit the owner's role permissions */ + kind: string; /** * Format: date-time * @description Last time the API key was used @@ -4093,13 +4976,15 @@ export interface components { lastUsedAt?: string; /** @description Name of the API key */ name: string; + /** @description Permissions held by this key */ + permissions: components["schemas"]["ApikeyPermissionGrant"][] | null; /** * Format: date-time * @description Last update timestamp */ updatedAt?: string; /** @description ID of the user who owns the API key */ - userId: string; + userId?: string; }; ApikeyApiKeyCreatedDto: { /** @@ -4116,12 +5001,16 @@ export interface components { expiresAt?: string; /** @description Unique identifier of the API key */ id: string; + /** @description Whether the API key is an auto-generated environment bootstrap key (locked from manual edit / delete) */ + isBootstrap: boolean; /** @description Whether the API key is environment-managed and protected from deletion */ isStatic: boolean; /** @description The full API key secret (only shown once) */ key: string; /** @description Prefix of the API key for identification */ keyPrefix: string; + /** @description Key kind: 'scoped' keys use their own permission grants, 'personal' keys inherit the owner's role permissions */ + kind: string; /** * Format: date-time * @description Last time the API key was used @@ -4129,13 +5018,15 @@ export interface components { lastUsedAt?: string; /** @description Name of the API key */ name: string; + /** @description Permissions held by this key */ + permissions: components["schemas"]["ApikeyPermissionGrant"][] | null; /** * Format: date-time * @description Last update timestamp */ updatedAt?: string; /** @description ID of the user who owns the API key */ - userId: string; + userId?: string; }; ApikeyCreateApiKey: { /** @@ -4156,6 +5047,37 @@ export interface components { * @example My API Key */ name: string; + /** @description Permissions granted to this key. Cannot exceed the creator's own permissions. */ + permissions: components["schemas"]["ApikeyPermissionGrant"][] | null; + }; + ApikeyCreateUserApiKey: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/ApikeyCreateUserApiKey.json + */ + readonly $schema?: string; + /** @description Optional description of the API key */ + description?: string; + /** + * Format: date-time + * @description Optional expiration date for the API key + */ + expiresAt?: string; + /** + * @description Name of the API key + * @example My API Key + */ + name: string; + }; + ApikeyPermissionGrant: { + /** @description Environment ID to scope the grant to; omit for a global grant */ + environmentId?: string; + /** + * @description Permission string + * @example containers:list + */ + permission: string; }; ApikeyUpdateApiKey: { /** @@ -4173,6 +5095,8 @@ export interface components { expiresAt?: string; /** @description New name for the API key */ name?: string; + /** @description Replace the key's permission grants. Omit to leave unchanged. Cannot exceed the updater's own permissions. */ + permissions?: components["schemas"]["ApikeyPermissionGrant"][] | null; }; AuthLogin: { /** @@ -4209,6 +5133,7 @@ export interface components { * @example https://arcane.randomsynergy.xyz:3552/api/schemas/AuthOidcAuthUrlRequest.json */ readonly $schema?: string; + mobileRedirectUri?: string; redirectUri: string; }; AuthOidcAuthUrlResponse: { @@ -4228,6 +5153,7 @@ export interface components { */ readonly $schema?: string; code: string; + mobileRedirectUri?: string; state: string; }; AuthOidcCallbackResponse: { @@ -4375,27 +5301,27 @@ export interface components { BackupHasPathResponse: { exists: boolean; }; - BaseApiResponseActionItems: { + BaseApiResponseActionResult: { /** * Format: uri * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActionItems.json + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActionResult.json */ readonly $schema?: string; /** @description Response data */ - data: components["schemas"]["DashboardActionItems"]; + data: components["schemas"]["ContainerActionResult"]; /** @description Whether the request was successful */ success: boolean; }; - BaseApiResponseActionResult: { + BaseApiResponseActivity: { /** * Format: uri * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActionResult.json + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseActivity.json */ readonly $schema?: string; /** @description Response data */ - data: components["schemas"]["ContainerActionResult"]; + data: components["schemas"]["ActivityActivity"]; /** @description Whether the request was successful */ success: boolean; }; @@ -4435,6 +5361,18 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseAttestationList: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseAttestationList.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["ImageAttestationList"]; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseBackupHasPathResponse: { /** * Format: uri @@ -4509,6 +5447,30 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseClearHistoryResult: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseClearHistoryResult.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["ActivityClearHistoryResult"]; + /** @description Whether the request was successful */ + success: boolean; + }; + BaseApiResponseCommitResult: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseCommitResult.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["ContainerCommitResult"]; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseConfig: { /** * Format: uri @@ -4593,6 +5555,18 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseDetail: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDetail.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["ActivityDetail"]; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseDetailSummary: { /** * Format: uri @@ -4617,6 +5591,18 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseDispatchResponse: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseDispatchResponse.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["NotificationDispatchResponse"]; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseEnvironment: { /** * Format: uri @@ -4629,6 +5615,18 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseEnvironmentUpdateJob: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEnvironmentUpdateJob.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["EnvironmentUpdateJob"]; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseEnvironmentVulnerabilitySummary: { /** * Format: uri @@ -4653,15 +5651,15 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; - BaseApiResponseEvent: { + BaseApiResponseFederatedCredential: { /** * Format: uri * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseEvent.json + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseFederatedCredential.json */ readonly $schema?: string; /** @description Response data */ - data: components["schemas"]["EventEvent"]; + data: components["schemas"]["FederatedFederatedCredential"]; /** @description Whether the request was successful */ success: boolean; }; @@ -4725,6 +5723,18 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseIncludeFile: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseIncludeFile.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["ProjectIncludeFile"]; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseInfo: { /** * Format: uri @@ -4749,6 +5759,18 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseListApiKey: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListApiKey.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["ApikeyApiKey"][] | null; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseListAutoUpdateRecord: { /** * Format: uri @@ -4785,6 +5807,42 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseListHistoryItem: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListHistoryItem.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["ImageHistoryItem"][] | null; + /** @description Whether the request was successful */ + success: boolean; + }; + BaseApiResponseListRoleAssignment: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListRoleAssignment.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["RoleRoleAssignment"][] | null; + /** @description Whether the request was successful */ + success: boolean; + }; + BaseApiResponseListSearchResult: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseListSearchResult.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["ImageSearchResult"][] | null; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseListSecretSummary: { /** * Format: uri @@ -4905,6 +5963,20 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseMapStringUpdateInfo: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseMapStringUpdateInfo.json + */ + readonly $schema?: string; + /** @description Response data */ + data: { + [key: string]: components["schemas"]["ImageUpdateInfo"]; + }; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseMessageResponse: { /** * Format: uri @@ -4929,6 +6001,18 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponsePermissionsManifest: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePermissionsManifest.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["RolePermissionsManifest"]; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponsePruneAllResult: { /** * Format: uri @@ -4953,6 +6037,18 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponsePullUsageResponse: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponsePullUsageResponse.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["ContainerregistryPullUsageResponse"]; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseRemoteRegistry: { /** * Format: uri @@ -4989,27 +6085,39 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; - BaseApiResponseRuntimeStatus: { + BaseApiResponseRole: { /** * Format: uri * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRuntimeStatus.json + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRole.json */ readonly $schema?: string; /** @description Response data */ - data: components["schemas"]["SwarmRuntimeStatus"]; + data: components["schemas"]["RoleRole"]; /** @description Whether the request was successful */ success: boolean; }; - BaseApiResponseScanResult: { + BaseApiResponseRuntimeStatus: { /** * Format: uri * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanResult.json + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseRuntimeStatus.json */ readonly $schema?: string; /** @description Response data */ - data: components["schemas"]["VulnerabilityScanResult"]; + data: components["schemas"]["SwarmRuntimeStatus"]; + /** @description Whether the request was successful */ + success: boolean; + }; + BaseApiResponseScanResult: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseScanResult.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["VulnerabilityScanResult"]; /** @description Whether the request was successful */ success: boolean; }; @@ -5349,6 +6457,18 @@ export interface components { /** @description Whether the request was successful */ success: boolean; }; + BaseApiResponseTestResponse: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BaseApiResponseTestResponse.json + */ + readonly $schema?: string; + /** @description Response data */ + data: components["schemas"]["NotificationTestResponse"]; + /** @description Whether the request was successful */ + success: boolean; + }; BaseApiResponseTokenRefreshResponse: { /** * Format: uri @@ -5434,9 +6554,39 @@ export interface components { success: boolean; }; BaseMessageResponse: { + /** @description Background activity ID tracking this action */ + activityId?: string; /** @description Response message */ message: string; }; + BasePaginatedActivity: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedActivity.json + */ + readonly $schema?: string; + /** @description Array of items for the current page */ + data: components["schemas"]["ActivityActivity"][] | null; + /** @description Pagination metadata */ + pagination: components["schemas"]["BasePaginationResponse"]; + /** @description Whether the request was successful */ + success: boolean; + }; + BasePaginatedFederatedCredential: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/BasePaginatedFederatedCredential.json + */ + readonly $schema?: string; + /** @description Array of items for the current page */ + data: components["schemas"]["FederatedFederatedCredential"][] | null; + /** @description Pagination metadata */ + pagination: components["schemas"]["BasePaginationResponse"]; + /** @description Whether the request was successful */ + success: boolean; + }; BasePaginatedIgnoredVulnerability: { /** * Format: uri @@ -5596,12 +6746,36 @@ export interface components { success: boolean; }; ContainerActionResult: { + activityId?: string; errors?: string[] | null; failed?: string[] | null; started?: string[] | null; stopped?: string[] | null; success: boolean; }; + ContainerCommitRequest: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/ContainerCommitRequest.json + */ + readonly $schema?: string; + /** @description Commit author */ + author?: string; + /** @description Dockerfile changes to apply */ + changes?: string[] | null; + /** @description Commit comment */ + comment?: string; + /** @description Do not pause the container during commit */ + noPause?: boolean; + /** @description Target image repository */ + repository?: string; + /** @description Target image tag */ + tag?: string; + }; + ContainerCommitResult: { + id: string; + }; ContainerComposeInfo: { configFiles?: string; projectName: string; @@ -5612,6 +6786,7 @@ export interface components { cmd?: string[] | null; entrypoint?: string[] | null; env?: string[] | null; + healthcheck?: components["schemas"]["ContainerHealthcheck"]; user?: string; workingDir?: string; }; @@ -5680,10 +6855,13 @@ export interface components { success: boolean; }; ContainerDetails: { + activityId?: string; composeInfo?: components["schemas"]["ContainerComposeInfo"]; config: components["schemas"]["ContainerConfig"]; created: string; hostConfig: components["schemas"]["ContainerHostConfig"]; + iconDarkUrl?: string; + iconLightUrl?: string; id: string; image: string; imageId: string; @@ -5694,6 +6872,7 @@ export interface components { name: string; networkSettings: components["schemas"]["ContainerNetworkSettings"]; ports: components["schemas"]["ContainerPort"][] | null; + redeployDisabled?: boolean; state: components["schemas"]["ContainerState"]; }; ContainerDetailsResponse: { @@ -5709,6 +6888,32 @@ export interface components { ContainerEndpointSettingsCreate: { aliases?: string[] | null; }; + ContainerHealth: { + /** Format: int64 */ + failingStreak: number; + log?: components["schemas"]["ContainerHealthLogEntry"][] | null; + status: string; + }; + ContainerHealthLogEntry: { + end?: string; + /** Format: int64 */ + exitCode: number; + output?: string; + start?: string; + }; + ContainerHealthcheck: { + /** Format: int64 */ + interval?: number; + /** Format: int64 */ + retries?: number; + /** Format: int64 */ + startInterval?: number; + /** Format: int64 */ + startPeriod?: number; + test?: string[] | null; + /** Format: int64 */ + timeout?: number; + }; ContainerHostConfig: { autoRemove?: boolean; /** Format: int64 */ @@ -5826,6 +7031,7 @@ export interface components { /** Format: int64 */ exitCode?: number; finishedAt?: string; + health?: components["schemas"]["ContainerHealth"]; running: boolean; startedAt?: string; status: string; @@ -5853,6 +7059,8 @@ export interface components { /** Format: int64 */ created: number; hostConfig: components["schemas"]["ContainerHostConfig"]; + iconDarkUrl?: string; + iconLightUrl?: string; id: string; image: string; imageId: string; @@ -5863,6 +7071,7 @@ export interface components { names: string[] | null; networkSettings: components["schemas"]["ContainerNetworkSettings"]; ports: components["schemas"]["ContainerPort"][] | null; + redeployDisabled?: boolean; state: string; status: string; updateInfo?: components["schemas"]["ImageUpdateInfo"]; @@ -5892,6 +7101,32 @@ export interface components { url: string; username: string; }; + ContainerregistryPullUsage: { + authMethod: string; + authUsername?: string; + /** Format: date-time */ + checkedAt: string; + displayName: string; + error?: string; + /** Format: int64 */ + limit?: number; + /** Format: int64 */ + observedPulls: number; + provider: string; + registry: string; + registryId: string; + /** Format: int64 */ + remaining?: number; + repository?: string; + source?: string; + /** Format: int64 */ + used?: number; + /** Format: int64 */ + windowSeconds?: number; + }; + ContainerregistryPullUsageResponse: { + registries: components["schemas"]["ContainerregistryPullUsage"][] | null; + }; ContainerregistrySync: { awsAccessKeyId?: string; awsRegion?: string; @@ -5953,6 +7188,16 @@ export interface components { url: string; username?: string; }; + CreateOidcRoleMappingOutputBody: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/CreateOidcRoleMappingOutputBody.json + */ + readonly $schema?: string; + data: components["schemas"]["RoleOidcRoleMapping"]; + success: boolean; + }; CredentialSpecConfig: { config?: string; file?: string; @@ -5973,6 +7218,7 @@ export interface components { imageUsageCounts: components["schemas"]["ImageUsageCounts"]; images: components["schemas"]["DashboardSnapshotImages"]; settings: components["schemas"]["DashboardSnapshotSettings"]; + versionInfo?: components["schemas"]["VersionInfo"]; }; DashboardSnapshotContainers: { counts: components["schemas"]["ContainerStatusCounts"]; @@ -5983,8 +7229,16 @@ export interface components { data: components["schemas"]["ImageSummary"][] | null; pagination: components["schemas"]["BasePaginationResponse"]; }; - DashboardSnapshotSettings: { - dockerPruneMode: string; + DashboardSnapshotSettings: Record; + DeleteOidcRoleMappingOutputBody: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/DeleteOidcRoleMappingOutputBody.json + */ + readonly $schema?: string; + message: string; + success: boolean; }; DeployConfig: { endpoint_mode?: string; @@ -6005,6 +7259,32 @@ export interface components { dockerCompose: string; /** @description Docker run command snippet */ dockerRun: string; + /** @description Optional Arcane-generated mTLS deployment assets for edge agents */ + mtls?: components["schemas"]["DeploymentSnippetMTLS"]; + }; + DeploymentSnippetFile: { + /** @description Container mount path expected by the mTLS snippet */ + containerPath: string; + /** @description PEM file contents. Omitted for sensitive files such as private keys; use downloadUrl instead. */ + content?: string; + /** @description Pairing-permission endpoint to download this file when content is withheld */ + downloadUrl?: string; + /** @description Suggested filename */ + name: string; + /** @description Suggested file mode */ + permissions: string; + /** @description True when this file is sensitive and must be fetched via downloadUrl */ + sensitive?: boolean; + }; + DeploymentSnippetMTLS: { + /** @description Docker compose snippet using Arcane-generated mTLS assets */ + dockerCompose: string; + /** @description Docker run snippet using Arcane-generated mTLS assets */ + dockerRun: string; + /** @description Generated PEM files to place on the edge host */ + files: components["schemas"]["DeploymentSnippetFile"][] | null; + /** @description Suggested host directory containing the generated PEM files */ + hostDirHint: string; }; DetailSummaryConfigStruct: { argsEscaped?: boolean; @@ -6558,6 +7838,67 @@ export interface components { [key: string]: string; }; }; + DockerTypesBuildRequest: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/DockerTypesBuildRequest.json + */ + readonly $schema?: string; + /** @description Build arguments */ + buildArgs?: { + [key: string]: string; + }; + /** @description Build cache sources */ + cacheFrom?: string[] | null; + /** @description Build cache targets */ + cacheTo?: string[] | null; + /** @description Build context directory or Git URL */ + contextDir: string; + /** @description Dockerfile path */ + dockerfile?: string; + /** @description Inline Dockerfile content */ + dockerfileInline?: string; + /** @description Build entitlements */ + entitlements?: string[] | null; + /** @description Build extra host mappings */ + extraHosts?: string[] | null; + /** @description Build isolation mode */ + isolation?: string; + /** @description Build labels */ + labels?: { + [key: string]: string; + }; + /** @description Load image into local Docker */ + load?: boolean; + /** @description Build network mode */ + network?: string; + /** @description Disable build cache */ + noCache?: boolean; + /** @description Target platforms */ + platforms?: string[] | null; + /** @description Enable privileged build */ + privileged?: boolean; + /** @description Build provider override */ + provider?: string; + /** @description Always pull referenced base images */ + pull?: boolean; + /** @description Push image */ + push?: boolean; + /** + * Format: int64 + * @description Build shared memory size in bytes + */ + shmSize?: number; + /** @description Image tags */ + tags?: string[] | null; + /** @description Target stage */ + target?: string; + /** @description Build ulimits */ + ulimits?: { + [key: string]: string; + }; + }; DockerTypesDeviceMapping: { permissions?: string; source?: string; @@ -6697,6 +8038,7 @@ export interface components { platform?: string; ports?: components["schemas"]["DockerTypesServicePortConfig"][] | null; post_start?: components["schemas"]["DockerTypesServiceHook"][] | null; + pre_start?: components["schemas"]["DockerTypesServiceHook"][] | null; pre_stop?: components["schemas"]["DockerTypesServiceHook"][] | null; privileged?: boolean; profiles?: string[] | null; @@ -6753,6 +8095,8 @@ export interface components { environment?: { [key: string]: string | null; }; + image?: string; + per_replica?: boolean; privileged?: boolean; user?: string; working_dir?: string; @@ -6935,26 +8279,42 @@ export interface components { readonly $schema?: string; accessToken?: string; apiUrl: string; - bootstrapToken?: string; enabled?: boolean; isEdge?: boolean; name?: string; useApiKey?: boolean; }; + EnvironmentEdgeMTLSCertificate: { + commonName?: string; + /** Format: int64 */ + daysRemaining?: number; + expired: boolean; + /** Format: date-time */ + expiresAt?: string; + expiringSoon: boolean; + }; EnvironmentEnvironment: { apiKey?: string; apiUrl: string; connected?: boolean; /** Format: date-time */ connectedAt?: string; + edgeAgentInstance?: string; + edgeCapabilities?: string[] | null; + edgeMTLSCertificate?: components["schemas"]["EnvironmentEdgeMTLSCertificate"]; + edgeSecurityMode?: string; + edgeSessionId?: string; edgeTransport?: string; enabled: boolean; id: string; isEdge: boolean; + lastEdgeTransport?: string; /** Format: date-time */ lastHeartbeat?: string; /** Format: date-time */ lastPollAt?: string; + /** Format: date-time */ + lastSeen?: string; name?: string; status: string; }; @@ -6991,11 +8351,35 @@ export interface components { readonly $schema?: string; accessToken?: string; apiUrl?: string; - bootstrapToken?: string; enabled?: boolean; name?: string; regenerateApiKey?: boolean; }; + EnvironmentUpdateJob: { + /** Format: date-time */ + completedAt?: string; + /** Format: date-time */ + createdAt: string; + error?: string; + id: string; + managerDigestAtStart: string; + managerTargetVersion: string; + managerVersionAtStart: string; + results?: components["schemas"]["EnvironmentUpdateResult"][] | null; + status: string; + /** Format: date-time */ + updatedAt?: string; + userId: string; + username: string; + }; + EnvironmentUpdateResult: { + environmentId: string; + environmentName: string; + error?: string; + fromVersion?: string; + status: string; + toVersion?: string; + }; EnvironmentWithApiKey: { /** @description API key for pairing (only shown once during creation) */ apiKey?: string; @@ -7003,14 +8387,22 @@ export interface components { connected?: boolean; /** Format: date-time */ connectedAt?: string; + edgeAgentInstance?: string; + edgeCapabilities?: string[] | null; + edgeMTLSCertificate?: components["schemas"]["EnvironmentEdgeMTLSCertificate"]; + edgeSecurityMode?: string; + edgeSessionId?: string; edgeTransport?: string; enabled: boolean; id: string; isEdge: boolean; + lastEdgeTransport?: string; /** Format: date-time */ lastHeartbeat?: string; /** Format: date-time */ lastPollAt?: string; + /** Format: date-time */ + lastSeen?: string; name?: string; status: string; }; @@ -7061,27 +8453,6 @@ export interface components { */ type: string; }; - EventCreateEvent: { - /** - * Format: uri - * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/EventCreateEvent.json - */ - readonly $schema?: string; - description?: string; - environmentId?: string; - metadata?: { - [key: string]: unknown; - }; - resourceId?: string; - resourceName?: string; - resourceType?: string; - severity?: string; - title: string; - type: string; - userId?: string; - username?: string; - }; EventEvent: { /** Format: date-time */ createdAt: string; @@ -7119,62 +8490,210 @@ export interface components { file?: string; service?: string; }; - FileContentResponse: { - content: string; - mimeType: string; - }; - GetSwarmNodeAgentDeploymentInputBody: { + FederatedCreateFederatedCredential: { /** * Format: uri * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/GetSwarmNodeAgentDeploymentInputBody.json + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/FederatedCreateFederatedCredential.json */ readonly $schema?: string; - /** @description Rotate the environment token before generating snippets */ - rotate?: boolean; - }; - GitOpsSyncPaginatedResponse: { + /** @description Allowed external token audiences */ + audiences: string[] | null; + /** @description Optional description */ + description?: string; + /** @description Whether exchanges are allowed */ + enabled: boolean; + /** @description Optional environment scope for the role assignment */ + environmentId?: string; /** - * Format: uri - * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/GitOpsSyncPaginatedResponse.json + * Format: date-time + * @description Optional credential expiration */ - readonly $schema?: string; - counts: components["schemas"]["GitopsSyncCounts"]; - data: components["schemas"]["GitopsGitOpsSync"][] | null; - pagination: components["schemas"]["BasePaginationResponse"]; - success: boolean; - }; - GitRepositoryPaginatedResponse: { + expiresAt?: string; /** * Format: uri - * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/GitRepositoryPaginatedResponse.json + * @description Trusted external OIDC issuer URL */ - readonly $schema?: string; - data: components["schemas"]["GitopsGitRepository"][] | null; - pagination: components["schemas"]["BasePaginationResponse"]; - success: boolean; - }; - GitopsBranchInfo: { - isDefault: boolean; + issuerUrl: string; + /** + * @description Subject match strategy + * @enum {string} + */ + matchType?: "exact" | "glob"; + /** @description Display name */ name: string; + /** @description Mapped role ID */ + roleId: string; + /** @description Claim path to match against; defaults to sub */ + subjectClaim?: string; + /** @description Exact subject or anchored glob pattern */ + subjectMatch: string; + /** + * Format: int64 + * @description Issued token lifetime in seconds + */ + tokenTtlSeconds?: number; }; - GitopsBranchesResponse: { - branches: components["schemas"]["GitopsBranchInfo"][] | null; - }; - GitopsBrowseResponse: { - files: components["schemas"]["GitopsFileTreeNode"][] | null; - path: string; - }; - GitopsCreateSyncRequest: { + FederatedFederatedCredential: { + /** @description Allowed external token audiences */ + audiences: string[] | null; /** - * Format: uri - * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsCreateSyncRequest.json + * Format: date-time + * @description Creation timestamp */ - readonly $schema?: string; - autoSync?: boolean; + createdAt: string; + /** @description Optional description */ + description?: string; + /** @description Whether exchanges are allowed */ + enabled: boolean; + /** @description Optional environment scope for the role assignment */ + environmentId?: string; + /** @description Mapped environment name when scoped */ + environmentName?: string; + /** + * Format: date-time + * @description Optional credential expiration + */ + expiresAt?: string; + /** @description Unique identifier of the federated credential */ + id: string; + /** @description Dedicated service user ID backing issued tokens */ + identityUserId: string; + /** @description Trusted external OIDC issuer URL */ + issuerUrl: string; + /** + * Format: date-time + * @description Last successful token exchange + */ + lastUsedAt?: string; + /** + * @description Subject match strategy + * @enum {string} + */ + matchType: "exact" | "glob"; + /** @description Display name */ + name: string; + /** @description Mapped role ID */ + roleId: string; + /** @description Mapped role name */ + roleName?: string; + /** @description Dedicated service account username */ + serviceUsername?: string; + /** @description Claim path to match against */ + subjectClaim: string; + /** @description Exact subject or anchored glob pattern */ + subjectMatch: string; + /** + * Format: int64 + * @description Issued token lifetime in seconds + */ + tokenTtlSeconds: number; + /** + * Format: date-time + * @description Last update timestamp + */ + updatedAt?: string; + }; + FederatedUpdateFederatedCredential: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/FederatedUpdateFederatedCredential.json + */ + readonly $schema?: string; + /** @description Allowed external token audiences */ + audiences?: string[] | null; + /** @description Optional description */ + description?: string; + /** @description Whether exchanges are allowed */ + enabled?: boolean; + /** @description Optional environment scope for the role assignment */ + environmentId?: string; + /** + * Format: date-time + * @description Optional credential expiration + */ + expiresAt?: string; + /** + * Format: uri + * @description Trusted external OIDC issuer URL + */ + issuerUrl?: string; + /** + * @description Subject match strategy + * @enum {string} + */ + matchType?: "exact" | "glob"; + /** @description Display name */ + name?: string; + /** @description Mapped role ID */ + roleId?: string; + /** @description Claim path to match against */ + subjectClaim?: string; + /** @description Exact subject or anchored glob pattern */ + subjectMatch?: string; + /** + * Format: int64 + * @description Issued token lifetime in seconds + */ + tokenTtlSeconds?: number; + }; + FileContentResponse: { + content: string; + mimeType: string; + }; + GetSwarmNodeAgentDeploymentInputBody: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/GetSwarmNodeAgentDeploymentInputBody.json + */ + readonly $schema?: string; + /** @description Rotate the environment token before generating snippets */ + rotate?: boolean; + }; + GitOpsSyncPaginatedResponse: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/GitOpsSyncPaginatedResponse.json + */ + readonly $schema?: string; + counts: components["schemas"]["GitopsSyncCounts"]; + data: components["schemas"]["GitopsGitOpsSync"][] | null; + pagination: components["schemas"]["BasePaginationResponse"]; + success: boolean; + }; + GitRepositoryPaginatedResponse: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/GitRepositoryPaginatedResponse.json + */ + readonly $schema?: string; + data: components["schemas"]["GitopsGitRepository"][] | null; + pagination: components["schemas"]["BasePaginationResponse"]; + success: boolean; + }; + GitopsBranchInfo: { + isDefault: boolean; + name: string; + }; + GitopsBranchesResponse: { + branches: components["schemas"]["GitopsBranchInfo"][] | null; + }; + GitopsBrowseResponse: { + files: components["schemas"]["GitopsFileTreeNode"][] | null; + path: string; + }; + GitopsCreateSyncRequest: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/GitopsCreateSyncRequest.json + */ + readonly $schema?: string; + autoSync?: boolean; branch: string; composePath: string; /** Format: int64 */ @@ -7184,11 +8703,19 @@ export interface components { /** Format: int64 */ maxSyncTotalSize?: number; name: string; + preDeployEnv?: string; + preDeployExtraMounts?: string; + preDeployNetworkMode?: string; + preDeployRunnerImage?: string; + preDeployScriptPath?: string; + /** Format: int64 */ + preDeployTimeoutSec?: number; projectName?: string; repositoryId: string; syncDirectory?: boolean; /** Format: int64 */ syncInterval?: number; + targetType?: string; }; GitopsFileTreeNode: { children?: components["schemas"]["GitopsFileTreeNode"][] | null; @@ -7218,6 +8745,17 @@ export interface components { /** Format: int64 */ maxSyncTotalSize: number; name: string; + preDeployEnv?: string; + preDeployExtraMounts?: string; + /** Format: date-time */ + preDeployLastRunAt?: string; + preDeployLastRunOutput?: string; + preDeployLastRunStatus?: string; + preDeployNetworkMode: string; + preDeployRunnerImage?: string; + preDeployScriptPath?: string; + /** Format: int64 */ + preDeployTimeoutSec: number; projectId?: string; projectName: string; repository?: components["schemas"]["GitopsGitRepository"]; @@ -7226,6 +8764,7 @@ export interface components { /** Format: int64 */ syncInterval: number; syncedFiles?: string; + targetType: string; /** Format: date-time */ updatedAt: string; }; @@ -7334,11 +8873,19 @@ export interface components { /** Format: int64 */ maxSyncTotalSize?: number; name?: string; + preDeployEnv?: string; + preDeployExtraMounts?: string; + preDeployNetworkMode?: string; + preDeployRunnerImage?: string; + preDeployScriptPath?: string; + /** Format: int64 */ + preDeployTimeoutSec?: number; projectName?: string; repositoryId?: string; syncDirectory?: boolean; /** Format: int64 */ syncInterval?: number; + targetType?: string; }; HealthCheckConfig: { disable?: boolean; @@ -7367,6 +8914,30 @@ export interface components { /** Format: int64 */ Timeout?: number; }; + ImageAttestation: { + artifactType?: string; + digest: string; + mediaType: string; + platform?: string; + predicateType: string; + /** Format: int64 */ + size: number; + statement?: unknown; + statementType?: string; + subject: components["schemas"]["ImageAttestationSubject"][] | null; + }; + ImageAttestationList: { + attestations: components["schemas"]["ImageAttestation"][] | null; + imageRef: string; + platform?: string; + subjectDigest: string; + }; + ImageAttestationSubject: { + digest: { + [key: string]: string; + }; + name: string; + }; ImageBuildPaginatedResponse: { /** * Format: uri @@ -7423,67 +8994,6 @@ export interface components { userId?: string; username?: string; }; - ImageBuildRequest: { - /** - * Format: uri - * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/ImageBuildRequest.json - */ - readonly $schema?: string; - /** @description Build arguments */ - buildArgs?: { - [key: string]: string; - }; - /** @description Build cache sources */ - cacheFrom?: string[] | null; - /** @description Build cache targets */ - cacheTo?: string[] | null; - /** @description Build context directory or Git URL */ - contextDir: string; - /** @description Dockerfile path */ - dockerfile?: string; - /** @description Inline Dockerfile content */ - dockerfileInline?: string; - /** @description Build entitlements */ - entitlements?: string[] | null; - /** @description Build extra host mappings */ - extraHosts?: string[] | null; - /** @description Build isolation mode */ - isolation?: string; - /** @description Build labels */ - labels?: { - [key: string]: string; - }; - /** @description Load image into local Docker */ - load?: boolean; - /** @description Build network mode */ - network?: string; - /** @description Disable build cache */ - noCache?: boolean; - /** @description Target platforms */ - platforms?: string[] | null; - /** @description Enable privileged build */ - privileged?: boolean; - /** @description Build provider override */ - provider?: string; - /** @description Always pull referenced base images */ - pull?: boolean; - /** @description Push image */ - push?: boolean; - /** - * Format: int64 - * @description Build shared memory size in bytes - */ - shmSize?: number; - /** @description Image tags */ - tags?: string[] | null; - /** @description Target stage */ - target?: string; - /** @description Build ulimits */ - ulimits?: { - [key: string]: string; - }; - }; ImageDetailSummary: { architecture: string; author: string; @@ -7501,6 +9011,16 @@ export interface components { /** Format: int64 */ size: number; }; + ImageHistoryItem: { + comment: string; + /** Format: int64 */ + created: number; + createdBy: string; + id: string; + /** Format: int64 */ + size: number; + tags: string[] | null; + }; ImageLoadResult: { stream: string; }; @@ -7534,6 +9054,14 @@ export interface components { /** @description Tag of the image to pull (e.g., latest) */ tag?: string; }; + ImageSearchResult: { + automated: boolean; + description: string; + name: string; + official: boolean; + /** Format: int64 */ + starCount: number; + }; ImageSummary: { /** Format: int64 */ created: number; @@ -7554,6 +9082,18 @@ export interface components { virtualSize: number; vulnerabilityScan?: components["schemas"]["VulnerabilityScanSummary"]; }; + ImageTagRequest: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/ImageTagRequest.json + */ + readonly $schema?: string; + /** @description Target repository name */ + repository: string; + /** @description Target tag */ + tag?: string; + }; ImageUpdateInfo: { authMethod?: string; authRegistry?: string; @@ -7616,6 +9156,7 @@ export interface components { credentials?: components["schemas"]["ContainerregistryCredential"][] | null; }; ImageupdateResponse: { + activityId?: string; authMethod?: string; authRegistry?: string; authUsername?: string; @@ -7651,9 +9192,10 @@ export interface components { readonly $schema?: string; autoHealInterval: string; autoUpdateInterval: string; + dockerClientRefreshInterval: string; environmentHealthInterval: string; eventCleanupInterval: string; - gitopsSyncInterval: string; + expiredSessionsCleanupInterval: string; pollingInterval: string; scheduledPruneInterval: string; vulnerabilityScanInterval: string; @@ -7708,13 +9250,24 @@ export interface components { readonly $schema?: string; autoHealInterval?: string; autoUpdateInterval?: string; + dockerClientRefreshInterval?: string; environmentHealthInterval?: string; eventCleanupInterval?: string; - gitopsSyncInterval?: string; + expiredSessionsCleanupInterval?: string; pollingInterval?: string; scheduledPruneInterval?: string; vulnerabilityScanInterval?: string; }; + ListOidcRoleMappingsOutputBody: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/ListOidcRoleMappingsOutputBody.json + */ + readonly $schema?: string; + data: components["schemas"]["RoleOidcRoleMapping"][] | null; + success: boolean; + }; LoggingConfig: { driver?: string; options?: { @@ -7793,6 +9346,7 @@ export interface components { options: components["schemas"]["NetworkCreateOptions"]; }; NetworkCreateResponse: { + activityId?: string; id: string; warning?: string; }; @@ -7884,6 +9438,7 @@ export interface components { success: boolean; }; NetworkPruneReport: { + activityId?: string; networksDeleted: string[] | null; /** Format: int64 */ spaceReclaimed: number; @@ -7956,32 +9511,6 @@ export interface components { /** Format: int64 */ unused: number; }; - NotificationAppriseResponse: { - /** - * Format: uri - * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationAppriseResponse.json - */ - readonly $schema?: string; - apiUrl: string; - containerUpdateTag: string; - enabled: boolean; - /** Format: int64 */ - id: number; - imageUpdateTag: string; - }; - NotificationAppriseUpdate: { - /** - * Format: uri - * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/NotificationAppriseUpdate.json - */ - readonly $schema?: string; - apiUrl: string; - containerUpdateTag: string; - enabled: boolean; - imageUpdateTag: string; - }; NotificationDispatchAutoHeal: { containerId: string; containerName: string; @@ -8019,6 +9548,11 @@ export interface components { pruneReport?: components["schemas"]["NotificationDispatchPruneReport"]; vulnerabilityFound?: components["schemas"]["NotificationDispatchVulnerabilityFound"]; }; + NotificationDispatchResponse: { + /** Format: int64 */ + delivered: number; + message: string; + }; NotificationDispatchVulnerabilityFound: { cveId: string; cveLink: string; @@ -8043,6 +9577,10 @@ export interface components { id: number; provider: string; }; + NotificationTestResponse: { + message: string; + warning?: string; + }; NotificationUpdate: { /** * Format: uri @@ -8089,12 +9627,17 @@ export interface components { composeContent: string; envContent?: string; name: string; + projectFiles?: components["schemas"]["ProjectProjectFileDraft"][] | null; }; ProjectCreateReponse: { + activityId?: string; + /** Format: date-time */ + archivedAt?: string; createdAt: string; dirName?: string; gitOpsManagedBy?: string; id: string; + isArchived: boolean; name: string; path: string; relativePath?: string; @@ -8115,6 +9658,7 @@ export interface components { readonly $schema?: string; forceRecreate?: boolean; pullPolicy?: string; + removeOrphans?: boolean; }; ProjectDestroy: { /** @@ -8127,20 +9671,30 @@ export interface components { removeVolumes?: boolean; }; ProjectDetails: { + activityId?: string; + /** Format: date-time */ + archivedAt?: string; composeContent?: string; + composeFileName?: string; createdAt: string; dirName?: string; directoryFiles?: components["schemas"]["ProjectIncludeFile"][] | null; envContent?: string; + fileTreeRevision?: string; gitOpsManagedBy?: string; gitRepositoryURL?: string; hasBuildDirective?: boolean; - iconUrl?: string; + iconDarkUrl?: string; + iconLightUrl?: string; id: string; includeFiles?: components["schemas"]["ProjectIncludeFile"][] | null; + isArchived: boolean; + isDiscovered?: boolean; lastSyncCommit?: string; name: string; path: string; + projectFiles?: components["schemas"]["ProjectProjectFile"][] | null; + redeployDisabled?: boolean; relativePath?: string; /** Format: int64 */ runningCount: number; @@ -8150,11 +9704,12 @@ export interface components { services?: components["schemas"]["DockerTypesServiceConfig"][] | null; status: string; statusReason?: string; + updateInfo?: components["schemas"]["ProjectUpdateInfo"]; updatedAt: string; urls?: string[] | null; }; ProjectIncludeFile: { - content: string; + content?: string; path: string; relativePath: string; }; @@ -8169,18 +9724,48 @@ export interface components { pagination: components["schemas"]["BasePaginationResponse"]; success: boolean; }; + ProjectProjectFile: { + content?: string; + isDirectory: boolean; + /** Format: date-time */ + modTime: string; + name: string; + path: string; + protected?: boolean; + relativePath: string; + /** Format: int64 */ + size: number; + }; + ProjectProjectFileChange: { + content?: string; + newName?: string; + newParentPath?: string; + /** @enum {string} */ + operation: "create_file" | "create_folder" | "update_file" | "rename" | "move" | "delete"; + recursive?: boolean; + relativePath: string; + }; + ProjectProjectFileDraft: { + content?: string; + isDirectory: boolean; + relativePath: string; + }; ProjectRuntimeService: { containerId?: string; containerName?: string; health?: string; - iconUrl?: string; + iconDarkUrl?: string; + iconLightUrl?: string; image: string; name: string; ports?: string[] | null; + redeployDisabled?: boolean; serviceConfig?: components["schemas"]["ServiceConfig"]; status: string; }; ProjectStatusCounts: { + /** Format: int64 */ + archivedProjects: number; /** Format: int64 */ runningProjects: number; /** Format: int64 */ @@ -8198,8 +9783,25 @@ export interface components { content: string; relativePath: string; }; - ProjectUpdateProject: { - /** + ProjectUpdateInfo: { + /** Format: int64 */ + checkedImageCount: number; + /** Format: int64 */ + errorCount: number; + errorMessage?: string; + hasUpdate: boolean; + /** Format: int64 */ + imageCount: number; + imageRefs?: string[] | null; + /** Format: int64 */ + imagesWithUpdates: number; + /** Format: date-time */ + lastCheckedAt?: string; + status: string; + updatedImageRefs?: string[] | null; + }; + ProjectUpdateProject: { + /** * Format: uri * @description A URL to the JSON Schema for this object. * @example https://arcane.randomsynergy.xyz:3552/api/schemas/ProjectUpdateProject.json @@ -8207,6 +9809,8 @@ export interface components { readonly $schema?: string; composeContent?: string; envContent?: string; + fileChanges?: components["schemas"]["ProjectProjectFileChange"][] | null; + fileTreeRevision?: string; name?: string; }; PruneImagesInputBody: { @@ -8220,6 +9824,8 @@ export interface components { filters?: { [key: string]: string[] | null; }; + mode?: string; + until?: string; }; Resource: { /** Format: float */ @@ -8250,6 +9856,280 @@ export interface components { /** @description Paths to restore from backup */ paths: string[] | null; }; + RoleAccessSurface: { + /** + * @description How reachability is evaluated + * @enum {string} + */ + accessMode: "permissions" | "any-child"; + /** @description Child surface IDs used by aggregate landing surfaces */ + children?: string[] | null; + /** + * Format: int64 + * @description Positive ordering hint for route fallback selection + */ + fallbackOrder?: number; + /** + * @description Stable surface identifier + * @example settings.category.webhooks + */ + id: string; + /** + * @description Surface type + * @enum {string} + */ + kind: "route" | "settings-category" | "customize-category" | "landing"; + /** + * @description Human-readable surface label + * @example Webhooks + */ + label: string; + /** + * @description How permissions are combined when accessMode is permissions + * @enum {string} + */ + matchMode: "any-of" | "all-of"; + /** @description Permissions used by permission-based surfaces */ + permissions?: string[] | null; + /** + * @description Which effective permission scope is considered + * @enum {string} + */ + scopeMode: "global-only" | "selected-env-plus-global" | "any-effective-scope"; + /** + * @description Route URL or prefix represented by this surface + * @example /settings/webhooks + */ + url?: string; + }; + RoleCreateOidcRoleMapping: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/RoleCreateOidcRoleMapping.json + */ + readonly $schema?: string; + /** @description OIDC claim value to match */ + claimValue: string; + /** @description Environment ID to scope the assignment to; omit for a global assignment */ + environmentId?: string; + /** @description Role to grant */ + roleId: string; + }; + RoleCreateRole: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/RoleCreateRole.json + */ + readonly $schema?: string; + /** @description Optional human description */ + description?: string; + /** + * @description Display name of the role + * @example Deploy Bot + */ + name: string; + /** @description Permission strings granted by this role */ + permissions: string[] | null; + }; + RoleOidcRoleMapping: { + /** + * @description OIDC claim value that triggers this mapping + * @example docker-admins + */ + claimValue: string; + /** Format: date-time */ + createdAt: string; + /** @description Environment ID to scope the assignment to; omit for a global assignment */ + environmentId?: string; + /** @description Unique identifier of the mapping */ + id: string; + /** @description Role to assign when the claim matches */ + roleId: string; + /** + * @description How this mapping was created. 'manual' rows are UI/API-managed and freely editable; 'env' rows are declared via OIDC_ROLE_MAPPINGS and are read-only at runtime. + * @enum {string} + */ + source: "manual" | "env"; + /** Format: date-time */ + updatedAt?: string; + }; + RolePaginatedResponse: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/RolePaginatedResponse.json + */ + readonly $schema?: string; + data: components["schemas"]["RoleRole"][] | null; + pagination: components["schemas"]["BasePaginationResponse"]; + success: boolean; + }; + RolePermissionAction: { + /** @description Optional longer description */ + description?: string; + /** + * @description Action verb + * @example start + */ + key: string; + /** + * @description Human-readable label + * @example Start + */ + label: string; + /** + * @description Fully-qualified permission string used in role definitions + * @example containers:start + */ + permission: string; + /** @description Permissions that should be auto-selected when this permission is chosen in the UI */ + requires?: string[] | null; + }; + RolePermissionPreset: { + /** @description Optional longer description for the preset */ + description?: string; + /** + * @description Stable preset key + * @example editor + */ + key: string; + /** + * @description Human-readable preset label + * @example All permissions (non-admin) + */ + label: string; + /** @description Permissions included when the preset is selected */ + permissions: string[] | null; + }; + RolePermissionResource: { + /** @description Actions available on this resource */ + actions: components["schemas"]["RolePermissionAction"][] | null; + /** + * @description Stable resource key + * @example containers + */ + key: string; + /** + * @description Human-readable label + * @example Containers + */ + label: string; + /** + * @description 'global' for org-level perms; 'env' for per-environment perms + * @enum {string} + */ + scope: "global" | "env"; + }; + RolePermissionsManifest: { + /** @description Backend-owned route, landing, and category access metadata for frontend UX gating */ + accessSurfaces?: components["schemas"]["RoleAccessSurface"][] | null; + /** @description Optional preset permission bundles for bulk selection in the UI */ + presets?: components["schemas"]["RolePermissionPreset"][] | null; + /** @description Resource groups, in display order */ + resources: components["schemas"]["RolePermissionResource"][] | null; + }; + RoleRole: { + /** + * Format: int64 + * @description How many users currently hold an assignment to this role + */ + assignedUserCount: number; + /** @description True for built-in roles (Admin/Editor/Deployer/Viewer); built-ins cannot be edited or deleted */ + builtIn: boolean; + /** + * Format: date-time + * @description Creation timestamp + */ + createdAt: string; + /** @description Optional human description */ + description?: string; + /** + * @description Unique identifier of the role + * @example role_admin + */ + id: string; + /** + * @description Display name of the role + * @example Admin + */ + name: string; + /** + * @description Permission strings granted by this role + * @example [ + * "containers:start", + * "projects:deploy" + * ] + */ + permissions: string[] | null; + /** + * Format: date-time + * @description Last update timestamp + */ + updatedAt?: string; + }; + RoleRoleAssignment: { + /** + * Format: date-time + * @description Creation timestamp + */ + createdAt: string; + /** @description Environment ID this assignment is scoped to; omit for a global assignment */ + environmentId?: string; + /** @description Unique identifier of the assignment */ + id: string; + /** @description ID of the granted role */ + roleId: string; + /** + * @description How the assignment was created + * @enum {string} + */ + source: "manual" | "oidc"; + /** @description ID of the user holding this assignment */ + userId: string; + }; + RoleSetUserAssignments: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/RoleSetUserAssignments.json + */ + readonly $schema?: string; + /** @description Desired manual role assignments for the user */ + assignments: components["schemas"]["RoleUserAssignmentInput"][] | null; + }; + RoleUpdateOidcRoleMapping: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/RoleUpdateOidcRoleMapping.json + */ + readonly $schema?: string; + claimValue: string; + environmentId?: string; + roleId: string; + }; + RoleUpdateRole: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/RoleUpdateRole.json + */ + readonly $schema?: string; + /** @description Optional human description */ + description?: string; + /** @description Display name of the role */ + name: string; + /** @description Permission strings granted by this role */ + permissions: string[] | null; + }; + RoleUserAssignmentInput: { + /** @description Environment ID to scope the assignment to; omit for a global assignment */ + environmentId?: string; + /** @description ID of the role to grant */ + roleId: string; + }; ScannerStatus: { available: boolean; version?: string; @@ -8374,6 +10254,7 @@ export interface components { platform?: string; ports?: components["schemas"]["DockerTypesServicePortConfig"][] | null; post_start?: components["schemas"]["DockerTypesServiceHook"][] | null; + pre_start?: components["schemas"]["DockerTypesServiceHook"][] | null; pre_stop?: components["schemas"]["DockerTypesServiceHook"][] | null; privileged?: boolean; profiles?: string[] | null; @@ -8488,9 +10369,11 @@ export interface components { */ readonly $schema?: string; accentColor?: string; + activityHistoryMaxEntries?: string; + activityHistoryRetentionDays?: string; + animationsEnabled?: string; applicationTheme?: string; authLocalEnabled?: string; - authOidcConfig?: string; authPasswordPolicy?: string; authSessionTimeout?: string; autoHealEnabled?: string; @@ -8502,6 +10385,7 @@ export interface components { autoUpdate?: string; autoUpdateExcludedContainers?: string; autoUpdateInterval?: string; + avatarMaxUploadSizeMb?: string; baseServerUrl?: string; buildProvider?: string; buildTimeout?: string; @@ -8512,9 +10396,9 @@ export interface components { depotToken?: string; diskUsagePath?: string; dockerApiTimeout?: string; + dockerClientRefreshInterval?: string; dockerHost?: string; dockerImagePullTimeout?: string; - dockerPruneMode?: string; enableGravatar?: string; environmentHealthInterval?: string; followProjectSymlinks?: string; @@ -8522,17 +10406,21 @@ export interface components { gitSyncMaxBinarySizeMb?: string; gitSyncMaxFiles?: string; gitSyncMaxTotalSizeMb?: string; + glassEffectsEnabled?: string; httpClientTimeout?: string; + iconCatalog?: string; keyboardShortcutsEnabled?: string; + lifecycleDefaultRunnerImage?: string; + lifecycleEnabled?: string; + lifecycleMaxTimeoutSec?: string; maxImageUploadSize?: string; mobileNavigationMode?: string; mobileNavigationShowLabels?: string; - oidcAdminClaim?: string; - oidcAdminValue?: string; oidcAutoRedirectToProvider?: string; oidcClientId?: string; oidcClientSecret?: string; oidcEnabled?: string; + oidcGroupsClaim?: string; oidcIssuerUrl?: string; oidcMergeAccounts?: string; oidcProviderLogoUrl?: string; @@ -8544,18 +10432,24 @@ export interface components { pollingInterval?: string; projectsDirectory?: string; proxyRequestTimeout?: string; + pruneBuildCacheMode?: string; + pruneBuildCacheUntil?: string; + pruneContainerMode?: string; + pruneContainerUntil?: string; + pruneImageMode?: string; + pruneImageUntil?: string; + pruneNetworkMode?: string; + pruneNetworkUntil?: string; + pruneVolumeMode?: string; registryTimeout?: string; - scheduledPruneBuildCache?: string; - scheduledPruneContainers?: string; scheduledPruneEnabled?: string; - scheduledPruneImages?: string; scheduledPruneInterval?: string; - scheduledPruneNetworks?: string; - scheduledPruneVolumes?: string; sidebarHoverExpansion?: string; swarmStackSourcesDirectory?: string; + templatesDirectory?: string; trivyConcurrentScanContainers?: string; trivyCpuLimit?: string; + trivyIgnoreUnfixed?: string; trivyImage?: string; trivyMemoryLimitMb?: string; trivyNetwork?: string; @@ -8564,6 +10458,10 @@ export interface components { trivyResourceLimitsEnabled?: string; trivyScanTimeout?: string; trivySecurityOpts?: string; + trivyServerEnabled?: string; + trivyServerToken?: string; + trivyServerUrl?: string; + volumeBrowserHelperIdleTimeout?: string; vulnerabilityScanEnabled?: string; vulnerabilityScanInterval?: string; }; @@ -8605,6 +10503,8 @@ export interface components { /** @description Docker run command snippet */ dockerRun: string; environmentId: string; + /** @description Optional Arcane-generated mTLS deployment assets for edge agents */ + mtls?: components["schemas"]["DeploymentSnippetMTLS"]; }; SwarmNodeAgentStatus: { connected?: boolean; @@ -8641,6 +10541,9 @@ export interface components { reachability?: string; role: string; status: string; + systemLabels?: { + [key: string]: string; + }; /** Format: date-time */ updatedAt: string; }; @@ -8890,10 +10793,12 @@ export interface components { readonly $schema?: string; composeContent: string; envContent?: string; + files?: components["schemas"]["SwarmSyncFile"][] | null; name: string; prune?: boolean; resolveImage?: string; withRegistryAuth?: boolean; + workingDir?: string; }; SwarmStackDeployResponse: { name: string; @@ -8932,8 +10837,20 @@ export interface components { SwarmStackSource: { composeContent: string; envContent?: string; + files?: components["schemas"]["SwarmSyncFile"][] | null; name: string; }; + SwarmStackSourceUpdateRequest: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/SwarmStackSourceUpdateRequest.json + */ + readonly $schema?: string; + composeContent: string; + envContent?: string; + files?: components["schemas"]["SwarmSyncFile"][] | null; + }; SwarmStackSummary: { /** Format: date-time */ createdAt: string; @@ -8970,7 +10887,8 @@ export interface components { defaultAddrPool?: string[] | null; forceNewCluster?: boolean; listenAddr?: string; - spec: components["schemas"]["DockerSwarmSpec"]; + /** @description Swarm specification */ + spec: unknown; /** Format: int32 */ subnetSize?: number; }; @@ -9036,10 +10954,15 @@ export interface components { rotateManagerToken?: boolean; rotateManagerUnlockKey?: boolean; rotateWorkerToken?: boolean; - spec: components["schemas"]["DockerSwarmSpec"]; + /** @description Updated swarm specification */ + spec: unknown; /** Format: int64 */ version?: number; }; + SwarmSyncFile: { + content: string; + relativePath: string; + }; SwarmTaskSummary: { containerId?: string; /** Format: date-time */ @@ -9080,6 +11003,29 @@ export interface components { serviceName: string; success: boolean; }; + SystemDiagnostics: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/SystemDiagnostics.json + */ + readonly $schema?: string; + gc: components["schemas"]["SystemGCInfo"]; + memory: components["schemas"]["SystemMemoryInfo"]; + runtime: components["schemas"]["SystemRuntimeInfo"]; + /** Format: date-time */ + timestamp: string; + websocket: components["schemas"]["SystemWebSocketDiagnostics"]; + }; + SystemGCInfo: { + /** Format: date-time */ + lastGc: string; + /** Format: int64 */ + numGc: number; + /** Format: int64 */ + pauseTotalNs: number; + recentPausesNs: number[] | null; + }; SystemHealthResponse: { /** * Format: uri @@ -9089,6 +11035,51 @@ export interface components { readonly $schema?: string; status: string; }; + SystemLogEntry: { + attrs?: { + [key: string]: unknown; + }; + level: string; + message: string; + /** Format: date-time */ + time: string; + }; + SystemMemoryInfo: { + /** Format: int64 */ + alloc: number; + /** Format: double */ + gcCpuFraction: number; + /** Format: int64 */ + heapAlloc: number; + /** Format: int64 */ + heapIdle: number; + /** Format: int64 */ + heapInuse: number; + /** Format: int64 */ + heapObjects: number; + /** Format: int64 */ + heapReleased: number; + /** Format: int64 */ + heapSys: number; + /** Format: int64 */ + mcacheInuse: number; + /** Format: int64 */ + mspanInuse: number; + /** Format: int64 */ + nextGc: number; + /** Format: int32 */ + numForcedGc: number; + /** Format: int32 */ + numGc: number; + /** Format: int64 */ + stackInuse: number; + /** Format: int64 */ + stackSys: number; + /** Format: int64 */ + sys: number; + /** Format: int64 */ + totalAlloc: number; + }; SystemPruneAllRequest: { /** * Format: uri @@ -9096,14 +11087,14 @@ export interface components { * @example https://arcane.randomsynergy.xyz:3552/api/schemas/SystemPruneAllRequest.json */ readonly $schema?: string; - buildCache: boolean; - containers: boolean; - dangling: boolean; - images: boolean; - networks: boolean; - volumes: boolean; + buildCache?: components["schemas"]["SystemPruneBuildCacheOptions"]; + containers?: components["schemas"]["SystemPruneContainersOptions"]; + images?: components["schemas"]["SystemPruneImagesOptions"]; + networks?: components["schemas"]["SystemPruneNetworksOptions"]; + volumes?: components["schemas"]["SystemPruneVolumesOptions"]; }; SystemPruneAllResult: { + activityId?: string; /** Format: int64 */ buildCacheSpaceReclaimed?: number; /** Format: int64 */ @@ -9121,6 +11112,71 @@ export interface components { volumeSpaceReclaimed?: number; volumesDeleted?: string[] | null; }; + SystemPruneBuildCacheOptions: { + mode: string; + until?: string; + }; + SystemPruneContainersOptions: { + mode: string; + until?: string; + }; + SystemPruneImagesOptions: { + mode: string; + until?: string; + }; + SystemPruneNetworksOptions: { + mode: string; + until?: string; + }; + SystemPruneVolumesOptions: { + mode: string; + }; + SystemRuntimeInfo: { + arch: string; + goVersion: string; + /** Format: int64 */ + gomaxprocs: number; + /** Format: int64 */ + goroutines: number; + /** Format: int64 */ + numCgoCall: number; + /** Format: int64 */ + numCpu: number; + os: string; + /** Format: int64 */ + uptimeSeconds: number; + /** Format: int64 */ + wsWorkerGoroutines: number; + }; + SystemWebSocketConnectionInfo: { + clientIp?: string; + envId?: string; + id: string; + kind: string; + resourceId?: string; + /** Format: date-time */ + startedAt: string; + userAgent?: string; + userId?: string; + }; + SystemWebSocketDiagnostics: { + connections: components["schemas"]["SystemWebSocketConnectionInfo"][] | null; + snapshot: components["schemas"]["SystemWebSocketMetricsSnapshot"]; + }; + SystemWebSocketMetricsSnapshot: { + /** Format: int64 */ + containerExec: number; + /** Format: int64 */ + containerLogsActive: number; + /** Format: int64 */ + containerStats: number; + /** Format: int64 */ + projectLogsActive: number; + /** Format: int64 */ + serviceLogsActive: number; + /** Format: int64 */ + systemStats: number; + }; TemplateCreateRegistryRequest: { /** * Format: uri @@ -9215,6 +11271,7 @@ export interface components { description: string; enabled: boolean; id: string; + lastFetchError?: string; name: string; url: string; }; @@ -9304,16 +11361,49 @@ export interface components { url?: string; username?: string; }; - UpdaterOptions: { + UpdateMyProfileInputBody: { /** * Format: uri * @description A URL to the JSON Schema for this object. - * @example https://arcane.randomsynergy.xyz:3552/api/schemas/UpdaterOptions.json + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateMyProfileInputBody.json */ readonly $schema?: string; - dryRun?: boolean; - forceUpdate?: boolean; - resourceIds?: string[] | null; + displayName?: string; + email?: string; + /** Format: int64 */ + fontSize?: number; + locale?: string; + }; + UpdateOidcRoleMappingOutputBody: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateOidcRoleMappingOutputBody.json + */ + readonly $schema?: string; + data: components["schemas"]["RoleOidcRoleMapping"]; + success: boolean; + }; + UpdateProjectServicesInputBody: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/UpdateProjectServicesInputBody.json + */ + readonly $schema?: string; + /** @description Service names to update; empty updates all services */ + services?: string[] | null; + }; + UpdaterOptions: { + /** + * Format: uri + * @description A URL to the JSON Schema for this object. + * @example https://arcane.randomsynergy.xyz:3552/api/schemas/UpdaterOptions.json + */ + readonly $schema?: string; + dryRun?: boolean; + forceUpdate?: boolean; + resourceIds?: string[] | null; type?: string; }; UpdaterResourceResult: { @@ -9335,6 +11425,7 @@ export interface components { updateAvailable?: boolean; }; UpdaterResult: { + activityId?: string; /** Format: int64 */ checked: number; duration: string; @@ -9343,6 +11434,8 @@ export interface components { failed: number; items: components["schemas"]["UpdaterResourceResult"][] | null; /** Format: int64 */ + restarted?: number; + /** Format: int64 */ skipped: number; startTime?: string; success?: boolean; @@ -9392,13 +11485,6 @@ export interface components { locale?: string; /** @description Password of the user */ password: string; - /** - * @description Roles assigned to the user - * @example [ - * "user" - * ] - */ - roles?: string[] | null; /** * @description Username of the user * @example johndoe @@ -9416,6 +11502,17 @@ export interface components { pagination: components["schemas"]["BasePaginationResponse"]; success: boolean; }; + UserRoleAssignmentSummary: { + /** @description Environment ID this assignment is scoped to; omit for a global assignment */ + environmentId?: string; + /** @description Role ID granted by this assignment */ + roleId: string; + /** + * @description How the assignment was created + * @enum {string} + */ + source: "manual" | "oidc"; + }; UserUpdateUser: { /** * Format: uri @@ -9431,12 +11528,12 @@ export interface components { locale?: string; /** @description New password for the user */ password?: string; - /** @description Roles assigned to the user */ - roles?: string[] | null; /** @description Username of the user */ username?: string; }; UserUser: { + /** @description URL to the user's custom avatar image; omitted when using the default profile picture */ + avatarUrl?: string; /** @description Whether the user can currently be deleted */ canDelete: boolean; /** @description Date and time when the user was created */ @@ -9451,11 +11548,19 @@ export interface components { * @example john@example.com */ email?: string; + /** + * Format: int64 + * @description Preferred root UI font size in px + * @example 14 + */ + fontSize?: number; /** * @description Unique identifier of the user * @example 550e8400-e29b-41d4-a716-446655440000 */ id: string; + /** @description Whether the user effectively holds global administrator access */ + isGlobalAdmin: boolean; /** * @description Locale preference of the user * @example en-US @@ -9463,16 +11568,14 @@ export interface components { locale?: string; /** @description OIDC subject identifier for SSO users */ oidcSubjectId?: string; + /** @description Permissions the user effectively holds, keyed by environment ID. The 'global' key holds permissions that apply across every environment (and to org-level endpoints). */ + permissionsByEnv: { + [key: string]: string[] | null; + }; /** @description Whether the user must change their password */ requiresPasswordChange: boolean; - /** - * @description Roles assigned to the user - * @example [ - * "user", - * "admin" - * ] - */ - roles: string[] | null; + /** @description Role assignments held by the user */ + roleAssignments: components["schemas"]["UserRoleAssignmentSummary"][] | null; /** @description Date and time when the user was last updated */ updatedAt?: string; /** @@ -9511,12 +11614,17 @@ export interface components { isSemverVersion: boolean; newestDigest?: string; newestVersion?: string; + nodeVersion: string; + releaseNotes?: string; releaseUrl?: string; + releasedAt?: string; revision: string; shortRevision: string; + svelteKitVersion: string; updateAvailable: boolean; }; VolumeBackup: { + activityId?: string; /** Format: date-time */ createdAt: string; id: string; @@ -9595,6 +11703,7 @@ export interface components { success: boolean; }; VolumePruneReportData: { + activityId?: string; /** Format: int64 */ spaceReclaimed: number; volumesDeleted?: string[] | null; @@ -9619,6 +11728,7 @@ export interface components { inUse: boolean; }; VolumeVolume: { + activityId?: string; containers: string[] | null; createdAt: string; driver: string; @@ -9685,6 +11795,7 @@ export interface components { vulnerabilityId: string; }; VulnerabilityScanResult: { + activityId?: string; /** Format: int64 */ duration?: number; error?: string; @@ -9857,6 +11968,36 @@ export interface components { } export type $defs = Record; export interface operations { + "stream-all-activities": { + parameters: { + query?: { + /** @description Snapshot limit per environment */ + limit?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; "list-api-keys": { parameters: { query?: { @@ -10044,6 +12185,7 @@ export interface operations { headers: { "Cache-Control"?: string; "Content-Type"?: string; + "X-Content-Type-Options"?: string; [name: string]: unknown; }; content: { @@ -10080,6 +12222,7 @@ export interface operations { headers: { "Cache-Control"?: string; "Content-Type"?: string; + "X-Content-Type-Options"?: string; [name: string]: unknown; }; content: { @@ -10111,6 +12254,7 @@ export interface operations { headers: { "Cache-Control"?: string; "Content-Type"?: string; + "X-Content-Type-Options"?: string; [name: string]: unknown; }; content: { @@ -10142,6 +12286,7 @@ export interface operations { headers: { "Cache-Control"?: string; "Content-Type"?: string; + "X-Content-Type-Options"?: string; [name: string]: unknown; }; content: { @@ -10176,6 +12321,7 @@ export interface operations { headers: { "Cache-Control"?: string; "Content-Type"?: string; + "X-Content-Type-Options"?: string; [name: string]: unknown; }; content: { @@ -10225,7 +12371,9 @@ export interface operations { login: { parameters: { query?: never; - header?: never; + header?: { + "User-Agent"?: string; + }; path?: never; cookie?: never; }; @@ -10315,18 +12463,14 @@ export interface operations { }; }; }; - "change-password": { + "list-my-api-keys": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["AuthPasswordChange"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -10334,7 +12478,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseListApiKey"]; }; }; /** @description Error */ @@ -10348,7 +12492,7 @@ export interface operations { }; }; }; - "refresh-token": { + "create-my-api-key": { parameters: { query?: never; header?: never; @@ -10357,18 +12501,17 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["AuthRefresh"]; + "application/json": components["schemas"]["ApikeyCreateUserApiKey"]; }; }; responses: { /** @description OK */ 200: { headers: { - "Set-Cookie"?: string; [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseTokenRefreshResponse"]; + "application/json": components["schemas"]["BaseApiResponseApiKeyCreatedDto"]; }; }; /** @description Error */ @@ -10382,22 +12525,14 @@ export interface operations { }; }; }; - listContainerRegistries: { + "delete-my-api-key": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction */ - order?: string; - /** @description Start index */ - start?: number; - /** @description Items per page */ - limit?: number; - }; + query?: never; header?: never; - path?: never; + path: { + /** @description API key ID */ + id: string; + }; cookie?: never; }; requestBody?: never; @@ -10408,7 +12543,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerRegistryPaginatedResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -10422,7 +12557,7 @@ export interface operations { }; }; }; - createContainerRegistry: { + "upload-my-avatar": { parameters: { query?: never; header?: never; @@ -10431,42 +12566,12 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["CreateContainerRegistryRequest"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["BaseApiResponseContainerRegistry"]; - }; - }; - /** @description Error */ - default: { - headers: { - [name: string]: unknown; - }; - content: { - "application/problem+json": components["schemas"]["ErrorModel"]; + "multipart/form-data": { + /** Format: binary */ + file?: string; }; }; }; - }; - syncContainerRegistries: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ContainerregistrySyncRequest"]; - }; - }; responses: { /** @description OK */ 200: { @@ -10474,7 +12579,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseUser"]; }; }; /** @description Error */ @@ -10488,14 +12593,11 @@ export interface operations { }; }; }; - getContainerRegistry: { + "delete-my-avatar": { parameters: { query?: never; header?: never; - path: { - /** @description Registry ID */ - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -10506,7 +12608,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseContainerRegistry"]; + "application/json": components["schemas"]["BaseApiResponseUser"]; }; }; /** @description Error */ @@ -10520,19 +12622,16 @@ export interface operations { }; }; }; - updateContainerRegistry: { + "update-my-profile": { parameters: { query?: never; header?: never; - path: { - /** @description Registry ID */ - id: string; - }; + path?: never; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["UpdateContainerRegistryRequest"]; + "application/json": components["schemas"]["UpdateMyProfileInputBody"]; }; }; responses: { @@ -10542,7 +12641,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseContainerRegistry"]; + "application/json": components["schemas"]["BaseApiResponseUser"]; }; }; /** @description Error */ @@ -10556,17 +12655,18 @@ export interface operations { }; }; }; - deleteContainerRegistry: { + "change-password": { parameters: { query?: never; header?: never; - path: { - /** @description Registry ID */ - id: string; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AuthPasswordChange"]; + }; + }; responses: { /** @description OK */ 200: { @@ -10588,25 +12688,29 @@ export interface operations { }; }; }; - testContainerRegistry: { + "refresh-token": { parameters: { query?: never; - header?: never; - path: { - /** @description Registry ID */ - id: string; + header?: { + "User-Agent"?: string; }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AuthRefresh"]; + }; + }; responses: { /** @description OK */ 200: { headers: { + "Set-Cookie"?: string; [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseTokenRefreshResponse"]; }; }; /** @description Error */ @@ -10620,7 +12724,7 @@ export interface operations { }; }; }; - "get-customize-categories": { + "logout-all-other-sessions": { parameters: { query?: never; header?: never; @@ -10635,7 +12739,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["CategoryCategory"][] | null; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -10649,7 +12753,7 @@ export interface operations { }; }; }; - listGitRepositories: { + listContainerRegistries: { parameters: { query?: { /** @description Search query */ @@ -10675,7 +12779,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["GitRepositoryPaginatedResponse"]; + "application/json": components["schemas"]["ContainerRegistryPaginatedResponse"]; }; }; /** @description Error */ @@ -10689,7 +12793,7 @@ export interface operations { }; }; }; - createGitRepository: { + createContainerRegistry: { parameters: { query?: never; header?: never; @@ -10698,7 +12802,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["CreateGitRepositoryRequest"]; + "application/json": components["schemas"]["CreateContainerRegistryRequest"]; }; }; responses: { @@ -10708,7 +12812,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseGitRepository"]; + "application/json": components["schemas"]["BaseApiResponseContainerRegistry"]; }; }; /** @description Error */ @@ -10722,14 +12826,11 @@ export interface operations { }; }; }; - getGitRepository: { + getContainerRegistryPullUsage: { parameters: { query?: never; header?: never; - path: { - /** @description Repository ID */ - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -10740,7 +12841,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseGitRepository"]; + "application/json": components["schemas"]["BaseApiResponsePullUsageResponse"]; }; }; /** @description Error */ @@ -10754,19 +12855,16 @@ export interface operations { }; }; }; - updateGitRepository: { + syncContainerRegistries: { parameters: { query?: never; header?: never; - path: { - /** @description Repository ID */ - id: string; - }; + path?: never; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["UpdateGitRepositoryRequest"]; + "application/json": components["schemas"]["ContainerregistrySyncRequest"]; }; }; responses: { @@ -10776,7 +12874,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseGitRepository"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -10790,12 +12888,12 @@ export interface operations { }; }; }; - deleteGitRepository: { + getContainerRegistry: { parameters: { query?: never; header?: never; path: { - /** @description Repository ID */ + /** @description Registry ID */ id: string; }; cookie?: never; @@ -10808,7 +12906,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseContainerRegistry"]; }; }; /** @description Error */ @@ -10822,17 +12920,21 @@ export interface operations { }; }; }; - listGitRepositoryBranches: { + updateContainerRegistry: { parameters: { query?: never; header?: never; path: { - /** @description Repository ID */ + /** @description Registry ID */ id: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateContainerRegistryRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -10840,7 +12942,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseBranchesResponse"]; + "application/json": components["schemas"]["BaseApiResponseContainerRegistry"]; }; }; /** @description Error */ @@ -10854,17 +12956,12 @@ export interface operations { }; }; }; - browseGitRepositoryFiles: { + deleteContainerRegistry: { parameters: { - query?: { - /** @description Branch to browse */ - branch?: string; - /** @description Path within repository (optional) */ - path?: string; - }; + query?: never; header?: never; path: { - /** @description Repository ID */ + /** @description Registry ID */ id: string; }; cookie?: never; @@ -10877,7 +12974,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseBrowseResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -10891,15 +12988,12 @@ export interface operations { }; }; }; - testGitRepository: { + testContainerRegistry: { parameters: { - query?: { - /** @description Branch to test (optional, uses repository default branch when omitted) */ - branch?: string; - }; + query?: never; header?: never; path: { - /** @description Repository ID */ + /** @description Registry ID */ id: string; }; cookie?: never; @@ -10926,18 +13020,14 @@ export interface operations { }; }; }; - "search-customize": { + "get-customize-categories": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SearchRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -10945,7 +13035,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SearchResponse"]; + "application/json": components["schemas"]["CategoryCategory"][] | null; }; }; /** @description Error */ @@ -10959,16 +13049,16 @@ export interface operations { }; }; }; - listEnvironments: { + listGitRepositories: { parameters: { query?: { - /** @description Search query for filtering by name or API URL */ + /** @description Search query */ search?: string; /** @description Column to sort by */ sort?: string; - /** @description Sort direction (asc or desc) */ + /** @description Sort direction */ order?: string; - /** @description Start index for pagination */ + /** @description Start index */ start?: number; /** @description Items per page */ limit?: number; @@ -10985,7 +13075,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["EnvironmentPaginatedResponse"]; + "application/json": components["schemas"]["GitRepositoryPaginatedResponse"]; }; }; /** @description Error */ @@ -10999,7 +13089,7 @@ export interface operations { }; }; }; - createEnvironment: { + createGitRepository: { parameters: { query?: never; header?: never; @@ -11008,7 +13098,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["EnvironmentCreate"]; + "application/json": components["schemas"]["CreateGitRepositoryRequest"]; }; }; responses: { @@ -11018,7 +13108,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseEnvironmentWithApiKey"]; + "application/json": components["schemas"]["BaseApiResponseGitRepository"]; }; }; /** @description Error */ @@ -11032,14 +13122,14 @@ export interface operations { }; }; }; - pairEnvironment: { + getGitRepository: { parameters: { query?: never; - header?: { - /** @description API key for environment pairing */ - "X-API-Key"?: string; + header?: never; + path: { + /** @description Repository ID */ + id: string; }; - path?: never; cookie?: never; }; requestBody?: never; @@ -11050,7 +13140,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseGitRepository"]; }; }; /** @description Error */ @@ -11064,17 +13154,21 @@ export interface operations { }; }; }; - getEnvironment: { + updateGitRepository: { parameters: { query?: never; header?: never; path: { - /** @description Environment ID */ + /** @description Repository ID */ id: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateGitRepositoryRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -11082,7 +13176,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseEnvironment"]; + "application/json": components["schemas"]["BaseApiResponseGitRepository"]; }; }; /** @description Error */ @@ -11096,21 +13190,17 @@ export interface operations { }; }; }; - updateEnvironment: { + deleteGitRepository: { parameters: { query?: never; header?: never; path: { - /** @description Environment ID */ + /** @description Repository ID */ id: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["EnvironmentUpdate"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -11118,7 +13208,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseEnvironment"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -11132,12 +13222,12 @@ export interface operations { }; }; }; - deleteEnvironment: { + listGitRepositoryBranches: { parameters: { query?: never; header?: never; path: { - /** @description Environment ID */ + /** @description Repository ID */ id: string; }; cookie?: never; @@ -11150,7 +13240,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseBranchesResponse"]; }; }; /** @description Error */ @@ -11164,21 +13254,22 @@ export interface operations { }; }; }; - pairAgent: { + browseGitRepositoryFiles: { parameters: { - query?: never; + query?: { + /** @description Branch to browse */ + branch?: string; + /** @description Path within repository (optional) */ + path?: string; + }; header?: never; path: { - /** @description Environment ID (must be 0 for local) */ + /** @description Repository ID */ id: string; }; cookie?: never; }; - requestBody?: { - content: { - "application/json": components["schemas"]["EnvironmentAgentPairRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -11186,7 +13277,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseAgentPairResponse"]; + "application/json": components["schemas"]["BaseApiResponseBrowseResponse"]; }; }; /** @description Error */ @@ -11200,15 +13291,15 @@ export interface operations { }; }; }; - "builds-browse": { + testGitRepository: { parameters: { query?: { - /** @description Directory path to browse */ - path?: string; + /** @description Branch to test (optional, uses repository default branch when omitted) */ + branch?: string; }; header?: never; path: { - /** @description Environment ID */ + /** @description Repository ID */ id: string; }; cookie?: never; @@ -11221,7 +13312,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListFileEntry"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -11235,29 +13326,27 @@ export interface operations { }; }; }; - "builds-browse-delete": { + "search-customize": { parameters: { - query?: { - /** @description File or directory path to delete */ - path?: string; - }; + query?: never; header?: never; - path: { - /** @description Environment ID */ - id: string; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SearchRequest"]; + }; + }; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { - Data?: components["schemas"]["BaseMessageResponse"]; - Success?: boolean; [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["SearchResponse"]; + }; }; /** @description Error */ default: { @@ -11270,19 +13359,14 @@ export interface operations { }; }; }; - "builds-browse-content": { + "stream-all-dashboards": { parameters: { query?: { - /** @description File path */ - path?: string; - /** @description Maximum bytes to read (default 1MB) */ - maxBytes?: number; + /** @description Debug mode: force an empty action item list */ + debugAllGood?: boolean; }; header?: never; - path: { - /** @description Environment ID */ - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -11292,9 +13376,7 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseBuildFileContentResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -11307,17 +13389,11 @@ export interface operations { }; }; }; - "builds-browse-download": { + "get-diagnostics": { parameters: { - query?: { - /** @description File path */ - path?: string; - }; + query?: never; header?: never; - path: { - /** @description Environment ID */ - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -11325,13 +13401,10 @@ export interface operations { /** @description OK */ 200: { headers: { - "Content-Disposition"?: string; - "Content-Length"?: number; - "Content-Type"?: string; [name: string]: unknown; }; content: { - "application/json": unknown; + "application/json": components["schemas"]["SystemDiagnostics"]; }; }; /** @description Error */ @@ -11345,29 +13418,23 @@ export interface operations { }; }; }; - "builds-browse-mkdir": { + "get-diagnostics-logs": { parameters: { - query?: { - /** @description Directory path to create */ - path?: string; - }; + query?: never; header?: never; - path: { - /** @description Environment ID */ - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { - Data?: components["schemas"]["BaseMessageResponse"]; - Success?: boolean; [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["SystemLogEntry"][] | null; + }; }; /** @description Error */ default: { @@ -11380,36 +13447,18 @@ export interface operations { }; }; }; - "builds-browse-upload": { + downloadEdgeMTLSCA: { parameters: { - query?: { - /** @description Destination path */ - path?: string; - }; + query?: never; header?: never; - path: { - /** @description Environment ID */ - id: string; - }; + path?: never; cookie?: never; }; - requestBody: { - content: { - "multipart/form-data": { - /** - * Format: binary - * @description File to upload - */ - file: string; - }; - }; - }; + requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { - Data?: components["schemas"]["BaseMessageResponse"]; - Success?: boolean; [name: string]: unknown; }; content?: never; @@ -11425,31 +13474,24 @@ export interface operations { }; }; }; - "list-containers": { + listEnvironments: { parameters: { query?: { - /** @description Search query */ + /** @description Search query for filtering by name or API URL */ search?: string; /** @description Column to sort by */ sort?: string; - /** @description Sort direction */ + /** @description Sort direction (asc or desc) */ order?: string; - /** @description Start index */ + /** @description Start index for pagination */ start?: number; - /** @description Limit */ + /** @description Items per page */ limit?: number; - /** @description Optional grouping mode (for example: project) */ - groupBy?: string; - /** @description Include internal containers */ - includeInternal?: boolean; - /** @description Filter by update status (has_update, up_to_date, error, unknown) */ - updates?: string; + /** @description Filter by environment type (comma-separated: http,edge,websocket,grpc,polling) */ + type?: string; }; header?: never; - path: { - /** @description Environment ID */ - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -11460,7 +13502,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerPaginatedResponse"]; + "application/json": components["schemas"]["EnvironmentPaginatedResponse"]; }; }; /** @description Error */ @@ -11474,19 +13516,16 @@ export interface operations { }; }; }; - "create-container": { + createEnvironment: { parameters: { query?: never; header?: never; - path: { - /** @description Environment ID */ - id: string; - }; + path?: never; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["ContainerCreate"]; + "application/json": components["schemas"]["EnvironmentCreate"]; }; }; responses: { @@ -11496,7 +13535,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerCreatedResponse"]; + "application/json": components["schemas"]["BaseApiResponseEnvironmentWithApiKey"]; }; }; /** @description Error */ @@ -11510,17 +13549,14 @@ export interface operations { }; }; }; - "container-status-counts": { + pairEnvironment: { parameters: { - query?: { - /** @description Include internal containers */ - includeInternal?: boolean; - }; - header?: never; - path: { - /** @description Environment ID */ - id: string; + query?: never; + header?: { + /** @description API key for environment pairing */ + "X-API-Key"?: string; }; + path?: never; cookie?: never; }; requestBody?: never; @@ -11531,7 +13567,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerStatusCountsResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -11545,15 +13581,13 @@ export interface operations { }; }; }; - "get-container": { + getEnvironment: { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Container ID */ - containerId: string; }; cookie?: never; }; @@ -11565,7 +13599,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerDetailsResponse"]; + "application/json": components["schemas"]["BaseApiResponseEnvironment"]; }; }; /** @description Error */ @@ -11579,24 +13613,21 @@ export interface operations { }; }; }; - "delete-container": { + updateEnvironment: { parameters: { - query?: { - /** @description Force delete running container */ - force?: boolean; - /** @description Remove associated volumes */ - volumes?: boolean; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Container ID */ - containerId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["EnvironmentUpdate"]; + }; + }; responses: { /** @description OK */ 200: { @@ -11604,7 +13635,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerActionResponse"]; + "application/json": components["schemas"]["BaseApiResponseEnvironment"]; }; }; /** @description Error */ @@ -11618,23 +13649,17 @@ export interface operations { }; }; }; - "set-container-auto-update": { + deleteEnvironment: { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Container ID */ - containerId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SetAutoUpdateInputBody"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -11642,7 +13667,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerActionResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -11656,15 +13681,30 @@ export interface operations { }; }; }; - "redeploy-container": { + "list-activities": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction */ + order?: string; + /** @description Start index */ + start?: number; + /** @description Limit */ + limit?: number; + /** @description Filter by activity status */ + status?: string; + /** @description Filter by activity type */ + type?: string; + /** @description Filter by resource type */ + resourceType?: string; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Container ID */ - containerId: string; }; cookie?: never; }; @@ -11676,7 +13716,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerDetailsResponse"]; + "application/json": components["schemas"]["BasePaginatedActivity"]; }; }; /** @description Error */ @@ -11690,15 +13730,13 @@ export interface operations { }; }; }; - "restart-container": { + "clear-activity-history": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Container ID */ - containerId: string; }; cookie?: never; }; @@ -11710,7 +13748,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerActionResponse"]; + "application/json": components["schemas"]["BaseApiResponseClearHistoryResult"]; }; }; /** @description Error */ @@ -11724,15 +13762,18 @@ export interface operations { }; }; }; - "start-container": { + "get-activity": { parameters: { - query?: never; + query?: { + /** @description Maximum messages to return */ + limit?: number; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Container ID */ - containerId: string; + /** @description Activity ID */ + activityId: string; }; cookie?: never; }; @@ -11744,7 +13785,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerActionResponse"]; + "application/json": components["schemas"]["BaseApiResponseDetail"]; }; }; /** @description Error */ @@ -11758,15 +13799,18 @@ export interface operations { }; }; }; - "stop-container": { + "cancel-activity": { parameters: { - query?: never; + query?: { + /** @description Display name to attribute the cancellation to (used when proxying to a remote environment) */ + requestedBy?: string; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Container ID */ - containerId: string; + /** @description Activity ID */ + activityId: string; }; cookie?: never; }; @@ -11778,7 +13822,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ContainerActionResponse"]; + "application/json": components["schemas"]["BaseApiResponseActivity"]; }; }; /** @description Error */ @@ -11792,19 +13836,21 @@ export interface operations { }; }; }; - "update-container": { + pairAgent: { parameters: { query?: never; header?: never; path: { - /** @description Environment ID */ + /** @description Environment ID (must be 0 for local) */ id: string; - /** @description Container ID to update */ - containerId: string; }; cookie?: never; }; - requestBody?: never; + requestBody?: { + content: { + "application/json": components["schemas"]["EnvironmentAgentPairRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -11812,7 +13858,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseResult"]; + "application/json": components["schemas"]["BaseApiResponseAgentPairResponse"]; }; }; /** @description Error */ @@ -11826,11 +13872,11 @@ export interface operations { }; }; }; - "get-dashboard": { + "builds-browse": { parameters: { query?: { - /** @description Debug mode: force an empty action item list */ - debugAllGood?: boolean; + /** @description Directory path to browse */ + path?: string; }; header?: never; path: { @@ -11847,7 +13893,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSnapshot"]; + "application/json": components["schemas"]["BaseApiResponseListFileEntry"]; }; }; /** @description Error */ @@ -11861,11 +13907,11 @@ export interface operations { }; }; }; - "get-dashboard-action-items": { + "builds-browse-delete": { parameters: { query?: { - /** @description Debug mode: force an empty action item list */ - debugAllGood?: boolean; + /** @description File or directory path to delete */ + path?: string; }; header?: never; path: { @@ -11876,14 +13922,14 @@ export interface operations { }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { + Data?: components["schemas"]["BaseMessageResponse"]; + Success?: boolean; [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseActionItems"]; - }; + content?: never; }; /** @description Error */ default: { @@ -11896,9 +13942,14 @@ export interface operations { }; }; }; - getDeploymentSnippets: { + "builds-browse-content": { parameters: { - query?: never; + query?: { + /** @description File path */ + path?: string; + /** @description Maximum bytes to read (default 1MB) */ + maxBytes?: number; + }; header?: never; path: { /** @description Environment ID */ @@ -11914,7 +13965,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseDeploymentSnippet"]; + "application/json": components["schemas"]["BaseApiResponseBuildFileContentResponse"]; }; }; /** @description Error */ @@ -11928,19 +13979,11 @@ export interface operations { }; }; }; - listGitOpsSyncs: { + "builds-browse-download": { parameters: { query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction */ - order?: string; - /** @description Start index */ - start?: number; - /** @description Items per page */ - limit?: number; + /** @description File path */ + path?: string; }; header?: never; path: { @@ -11954,10 +13997,13 @@ export interface operations { /** @description OK */ 200: { headers: { + "Content-Disposition"?: string; + "Content-Length"?: number; + "Content-Type"?: string; [name: string]: unknown; }; content: { - "application/json": components["schemas"]["GitOpsSyncPaginatedResponse"]; + "application/json": unknown; }; }; /** @description Error */ @@ -11971,9 +14017,12 @@ export interface operations { }; }; }; - createGitOpsSync: { + "builds-browse-mkdir": { parameters: { - query?: never; + query?: { + /** @description Directory path to create */ + path?: string; + }; header?: never; path: { /** @description Environment ID */ @@ -11981,20 +14030,16 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["GitopsCreateSyncRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { + Data?: components["schemas"]["BaseMessageResponse"]; + Success?: boolean; [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseGitOpsSync"]; - }; + content?: never; }; /** @description Error */ default: { @@ -12007,9 +14052,12 @@ export interface operations { }; }; }; - importGitOpsSyncs: { + "builds-browse-upload": { parameters: { - query?: never; + query?: { + /** @description Destination path */ + path?: string; + }; header?: never; path: { /** @description Environment ID */ @@ -12019,18 +14067,24 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["GitopsImportGitOpsSyncRequest"][] | null; + "multipart/form-data": { + /** + * Format: binary + * @description File to upload + */ + file: string; + }; }; }; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { + Data?: components["schemas"]["BaseMessageResponse"]; + Success?: boolean; [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseImportGitOpsSyncResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -12043,15 +14097,32 @@ export interface operations { }; }; }; - getGitOpsSync: { + "list-containers": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction */ + order?: string; + /** @description Start index */ + start?: number; + /** @description Limit */ + limit?: number; + /** @description Optional grouping mode (for example: project) */ + groupBy?: string; + /** @description Include internal containers */ + includeInternal?: boolean; + /** @description Filter by update status (has_update, up_to_date, error, unknown) */ + updates?: string; + /** @description Filter standalone containers only (true/false) */ + standalone?: string; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Sync ID */ - syncId: string; }; cookie?: never; }; @@ -12063,7 +14134,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseGitOpsSync"]; + "application/json": components["schemas"]["ContainerPaginatedResponse"]; }; }; /** @description Error */ @@ -12077,21 +14148,19 @@ export interface operations { }; }; }; - updateGitOpsSync: { + "create-container": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Sync ID */ - syncId: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["GitopsUpdateSyncRequest"]; + "application/json": components["schemas"]["ContainerCreate"]; }; }; responses: { @@ -12101,7 +14170,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseGitOpsSync"]; + "application/json": components["schemas"]["ContainerCreatedResponse"]; }; }; /** @description Error */ @@ -12115,15 +14184,16 @@ export interface operations { }; }; }; - deleteGitOpsSync: { + "container-status-counts": { parameters: { - query?: never; + query?: { + /** @description Include internal containers */ + includeInternal?: boolean; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Sync ID */ - syncId: string; }; cookie?: never; }; @@ -12135,7 +14205,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["ContainerStatusCountsResponse"]; }; }; /** @description Error */ @@ -12149,19 +14219,16 @@ export interface operations { }; }; }; - browseGitOpsSyncFiles: { + "get-container": { parameters: { - query?: { - /** @description Path to browse (optional) */ - path?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Sync ID */ - syncId: string; - }; + /** @description Container ID */ + containerId: string; + }; cookie?: never; }; requestBody?: never; @@ -12172,7 +14239,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseBrowseResponse"]; + "application/json": components["schemas"]["ContainerDetailsResponse"]; }; }; /** @description Error */ @@ -12186,15 +14253,20 @@ export interface operations { }; }; }; - getGitOpsSyncStatus: { + "delete-container": { parameters: { - query?: never; + query?: { + /** @description Force delete running container */ + force?: boolean; + /** @description Remove associated volumes */ + volumes?: boolean; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Sync ID */ - syncId: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; @@ -12206,7 +14278,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSyncStatus"]; + "application/json": components["schemas"]["ContainerActionResponse"]; }; }; /** @description Error */ @@ -12220,19 +14292,23 @@ export interface operations { }; }; }; - performGitOpsSync: { + "set-container-auto-update": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Sync ID */ - syncId: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SetAutoUpdateInputBody"]; + }; + }; responses: { /** @description OK */ 200: { @@ -12240,7 +14316,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSyncResult"]; + "application/json": components["schemas"]["ContainerActionResponse"]; }; }; /** @description Error */ @@ -12254,17 +14330,23 @@ export interface operations { }; }; }; - updateHeartbeat: { + "commit-container": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["ContainerCommitRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -12272,7 +14354,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseCommitResult"]; }; }; /** @description Error */ @@ -12286,16 +14368,18 @@ export interface operations { }; }; }; - "check-image-update": { + "kill-container": { parameters: { query?: { - /** @description Image reference */ - imageRef?: string; + /** @description Signal to send (for example SIGTERM, SIGKILL). Defaults to SIGKILL. */ + signal?: string; }; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; @@ -12307,7 +14391,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseResponse"]; + "application/json": components["schemas"]["ContainerActionResponse"]; }; }; /** @description Error */ @@ -12321,21 +14405,19 @@ export interface operations { }; }; }; - "check-all-images": { + "pause-container": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["ImageupdateCheckAllImagesRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -12343,7 +14425,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseBatchResponse"]; + "application/json": components["schemas"]["ContainerActionResponse"]; }; }; /** @description Error */ @@ -12357,21 +14439,19 @@ export interface operations { }; }; }; - "check-multiple-images": { + "redeploy-container": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["ImageupdateBatchImageUpdateRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -12379,7 +14459,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseBatchResponse"]; + "application/json": components["schemas"]["ContainerDetailsResponse"]; }; }; /** @description Error */ @@ -12393,15 +14473,15 @@ export interface operations { }; }; }; - "check-image-update-by-id": { + "restart-container": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Image ID */ - imageId: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; @@ -12413,7 +14493,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseResponse"]; + "application/json": components["schemas"]["ContainerActionResponse"]; }; }; /** @description Error */ @@ -12427,15 +14507,15 @@ export interface operations { }; }; }; - "check-image-update-by-id-post": { + "start-container": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Image ID */ - imageId: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; @@ -12447,7 +14527,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseResponse"]; + "application/json": components["schemas"]["ContainerActionResponse"]; }; }; /** @description Error */ @@ -12461,13 +14541,15 @@ export interface operations { }; }; }; - "get-update-summary": { + "stop-container": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; @@ -12479,7 +14561,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSummary"]; + "application/json": components["schemas"]["ContainerActionResponse"]; }; }; /** @description Error */ @@ -12493,28 +14575,15 @@ export interface operations { }; }; }; - "list-images": { + "unpause-container": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - /** @description Filter by in-use status (true/false) */ - inUse?: string; - /** @description Filter by update availability (true/false) */ - updates?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Container ID */ + containerId: string; }; cookie?: never; }; @@ -12526,7 +14595,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ImagePaginatedResponse"]; + "application/json": components["schemas"]["ContainerActionResponse"]; }; }; /** @description Error */ @@ -12540,28 +14609,28 @@ export interface operations { }; }; }; - "build-image": { + "update-container": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Container ID to update */ + containerId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["ImageBuildRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["BaseApiResponseResult"]; + }; }; /** @description Error */ default: { @@ -12574,23 +14643,11 @@ export interface operations { }; }; }; - "list-image-builds": { + "get-dashboard": { parameters: { query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - /** @description Filter by status */ - status?: string; - /** @description Filter by provider */ - provider?: string; + /** @description Debug mode: force an empty action item list */ + debugAllGood?: boolean; }; header?: never; path: { @@ -12607,7 +14664,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ImageBuildPaginatedResponse"]; + "application/json": components["schemas"]["BaseApiResponseSnapshot"]; }; }; /** @description Error */ @@ -12621,15 +14678,13 @@ export interface operations { }; }; }; - "get-image-build": { + getDeploymentSnippets: { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Build ID */ - buildId: string; }; cookie?: never; }; @@ -12641,7 +14696,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseBuildRecord"]; + "application/json": components["schemas"]["BaseApiResponseDeploymentSnippet"]; }; }; /** @description Error */ @@ -12655,7 +14710,7 @@ export interface operations { }; }; }; - "get-image-usage-counts": { + downloadEnvironmentMTLSBundle: { parameters: { query?: never; header?: never; @@ -12672,9 +14727,7 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["ImageUsageCountsResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -12687,33 +14740,26 @@ export interface operations { }; }; }; - "prune-images": { + downloadEnvironmentMTLSFile: { parameters: { - query?: { - /** @description Only remove dangling images */ - dangling?: boolean; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description mTLS asset filename */ + fileName: string; }; cookie?: never; }; - requestBody?: { - content: { - "application/json": components["schemas"]["PruneImagesInputBody"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponsePruneReport"]; - }; + content?: never; }; /** @description Error */ default: { @@ -12726,9 +14772,20 @@ export interface operations { }; }; }; - "pull-image": { + listGitOpsSyncs: { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction */ + order?: string; + /** @description Start index */ + start?: number; + /** @description Items per page */ + limit?: number; + }; header?: never; path: { /** @description Environment ID */ @@ -12736,18 +14793,16 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["ImagePullOptions"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["GitOpsSyncPaginatedResponse"]; + }; }; /** @description Error */ default: { @@ -12760,7 +14815,7 @@ export interface operations { }; }; }; - "upload-image": { + createGitOpsSync: { parameters: { query?: never; header?: never; @@ -12772,13 +14827,7 @@ export interface operations { }; requestBody: { content: { - "multipart/form-data": { - /** - * Format: binary - * @description Docker image tar archive - */ - file: string; - }; + "application/json": components["schemas"]["GitopsCreateSyncRequest"]; }; }; responses: { @@ -12788,7 +14837,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseLoadResult"]; + "application/json": components["schemas"]["BaseApiResponseGitOpsSync"]; }; }; /** @description Error */ @@ -12802,7 +14851,7 @@ export interface operations { }; }; }; - "get-image-vulnerability-summaries": { + importGitOpsSyncs: { parameters: { query?: never; header?: never; @@ -12814,7 +14863,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["VulnerabilityScanSummariesRequest"]; + "application/json": components["schemas"]["GitopsImportGitOpsSyncRequest"][] | null; }; }; responses: { @@ -12824,7 +14873,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseScanSummariesResponse"]; + "application/json": components["schemas"]["BaseApiResponseImportGitOpsSyncResponse"]; }; }; /** @description Error */ @@ -12838,15 +14887,15 @@ export interface operations { }; }; }; - "get-image": { + getGitOpsSync: { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Image ID */ - imageId: string; + /** @description Sync ID */ + syncId: string; }; cookie?: never; }; @@ -12858,7 +14907,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseDetailSummary"]; + "application/json": components["schemas"]["BaseApiResponseGitOpsSync"]; }; }; /** @description Error */ @@ -12872,22 +14921,23 @@ export interface operations { }; }; }; - "remove-image": { + updateGitOpsSync: { parameters: { - query?: { - /** @description Force removal */ - force?: boolean; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Image ID */ - imageId: string; + /** @description Sync ID */ + syncId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["GitopsUpdateSyncRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -12895,7 +14945,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseGitOpsSync"]; }; }; /** @description Error */ @@ -12909,15 +14959,15 @@ export interface operations { }; }; }; - "get-image-vulnerabilities": { + deleteGitOpsSync: { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Image ID */ - imageId: string; + /** @description Sync ID */ + syncId: string; }; cookie?: never; }; @@ -12929,7 +14979,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseScanResult"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -12943,30 +14993,18 @@ export interface operations { }; }; }; - "list-image-vulnerabilities": { + browseGitOpsSyncFiles: { parameters: { query?: { - /** @description Search query */ - search?: string; - /** @description Sort field */ - sort?: string; - /** @description Sort order */ - order?: string; - /** @description Start offset */ - start?: number; - /** @description Limit */ - limit?: number; - /** @description Page number */ - page?: number; - /** @description Comma-separated severity filter */ - severity?: string; + /** @description Path to browse (optional) */ + path?: string; }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Image ID */ - imageId: string; + /** @description Sync ID */ + syncId: string; }; cookie?: never; }; @@ -12978,7 +15016,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BasePaginatedVulnerability"]; + "application/json": components["schemas"]["BaseApiResponseBrowseResponse"]; }; }; /** @description Error */ @@ -12992,15 +15030,15 @@ export interface operations { }; }; }; - "scan-image-vulnerabilities": { + getGitOpsSyncStatus: { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Image ID to scan */ - imageId: string; + /** @description Sync ID */ + syncId: string; }; cookie?: never; }; @@ -13012,7 +15050,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseScanResult"]; + "application/json": components["schemas"]["BaseApiResponseSyncStatus"]; }; }; /** @description Error */ @@ -13026,15 +15064,15 @@ export interface operations { }; }; }; - "get-image-vulnerability-summary": { + performGitOpsSync: { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Image ID */ - imageId: string; + /** @description Sync ID */ + syncId: string; }; cookie?: never; }; @@ -13046,7 +15084,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseScanSummary"]; + "application/json": components["schemas"]["BaseApiResponseSyncResult"]; }; }; /** @description Error */ @@ -13060,7 +15098,7 @@ export interface operations { }; }; }; - "get-job-schedules": { + updateHeartbeat: { parameters: { query?: never; header?: never; @@ -13078,7 +15116,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["JobscheduleConfig"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -13092,9 +15130,12 @@ export interface operations { }; }; }; - "update-job-schedules": { + "get-update-info-by-refs": { parameters: { - query?: never; + query?: { + /** @description Comma-separated image references */ + imageRefs?: string; + }; header?: never; path: { /** @description Environment ID */ @@ -13102,11 +15143,7 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["JobscheduleUpdate"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -13114,7 +15151,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseConfig"]; + "application/json": components["schemas"]["BaseApiResponseMapStringUpdateInfo"]; }; }; /** @description Error */ @@ -13128,9 +15165,12 @@ export interface operations { }; }; }; - "list-jobs": { + "check-image-update": { parameters: { - query?: never; + query?: { + /** @description Image reference */ + imageRef?: string; + }; header?: never; path: { /** @description Environment ID */ @@ -13146,7 +15186,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["JobscheduleJobListResponse"]; + "application/json": components["schemas"]["BaseApiResponseResponse"]; }; }; /** @description Error */ @@ -13160,64 +15200,21 @@ export interface operations { }; }; }; - "run-job": { + "check-all-images": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Job ID to run */ - jobId: string; }; cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["JobscheduleJobRunResponse"]; - }; - }; - /** @description Error */ - default: { - headers: { - [name: string]: unknown; - }; - content: { - "application/problem+json": components["schemas"]["ErrorModel"]; - }; - }; - }; - }; - "list-networks": { - parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - /** @description Filter by in-use status (true/false) */ - inUse?: string; - }; - header?: never; - path: { - /** @description Environment ID */ - id: string; + requestBody: { + content: { + "application/json": components["schemas"]["ImageupdateCheckAllImagesRequest"]; }; - cookie?: never; }; - requestBody?: never; responses: { /** @description OK */ 200: { @@ -13225,7 +15222,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NetworkPaginatedResponse"]; + "application/json": components["schemas"]["BaseApiResponseBatchResponse"]; }; }; /** @description Error */ @@ -13239,7 +15236,7 @@ export interface operations { }; }; }; - "create-network": { + "check-multiple-images": { parameters: { query?: never; header?: never; @@ -13251,7 +15248,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["NetworkCreateRequest"]; + "application/json": components["schemas"]["ImageupdateBatchImageUpdateRequest"]; }; }; responses: { @@ -13261,7 +15258,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NetworkCreatedApiResponse"]; + "application/json": components["schemas"]["BaseApiResponseBatchResponse"]; }; }; /** @description Error */ @@ -13275,13 +15272,15 @@ export interface operations { }; }; }; - "network-counts": { + "check-image-update-by-id": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Image ID */ + imageId: string; }; cookie?: never; }; @@ -13293,7 +15292,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NetworkCountsApiResponse"]; + "application/json": components["schemas"]["BaseApiResponseResponse"]; }; }; /** @description Error */ @@ -13307,13 +15306,15 @@ export interface operations { }; }; }; - "prune-networks": { + "check-image-update-by-id-post": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Image ID */ + imageId: string; }; cookie?: never; }; @@ -13325,7 +15326,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NetworkPruneResponse"]; + "application/json": components["schemas"]["BaseApiResponseResponse"]; }; }; /** @description Error */ @@ -13339,7 +15340,7 @@ export interface operations { }; }; }; - "get-network-topology": { + "get-update-summary": { parameters: { query?: never; header?: never; @@ -13357,7 +15358,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NetworkTopologyApiResponse"]; + "application/json": components["schemas"]["BaseApiResponseSummary"]; }; }; /** @description Error */ @@ -13371,18 +15372,28 @@ export interface operations { }; }; }; - "get-network": { + "list-images": { parameters: { query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ sort?: string; + /** @description Sort direction (asc or desc) */ order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + /** @description Filter by in-use status (true/false) */ + inUse?: string; + /** @description Filter by update availability (true/false) */ + updates?: string; }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Network ID */ - networkId: string; }; cookie?: never; }; @@ -13394,7 +15405,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NetworkInspectApiResponse"]; + "application/json": components["schemas"]["ImagePaginatedResponse"]; }; }; /** @description Error */ @@ -13408,28 +15419,28 @@ export interface operations { }; }; }; - "delete-network": { + "build-image": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Network ID */ - networkId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["DockerTypesBuildRequest"]; + }; + }; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["NetworkMessageApiResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -13442,9 +15453,24 @@ export interface operations { }; }; }; - "get-apprise-settings": { + "list-image-builds": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + /** @description Filter by status */ + status?: string; + /** @description Filter by provider */ + provider?: string; + }; header?: never; path: { /** @description Environment ID */ @@ -13460,7 +15486,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NotificationAppriseResponse"]; + "application/json": components["schemas"]["ImageBuildPaginatedResponse"]; }; }; /** @description Error */ @@ -13474,21 +15500,19 @@ export interface operations { }; }; }; - "create-or-update-apprise-settings": { + "get-image-build": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Build ID */ + buildId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["NotificationAppriseUpdate"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -13496,7 +15520,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NotificationAppriseResponse"]; + "application/json": components["schemas"]["BaseApiResponseBuildRecord"]; }; }; /** @description Error */ @@ -13510,11 +15534,9 @@ export interface operations { }; }; }; - "test-apprise-notification": { + "get-image-usage-counts": { parameters: { - query?: { - type?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ @@ -13530,7 +15552,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["ImageUsageCountsResponse"]; }; }; /** @description Error */ @@ -13544,9 +15566,12 @@ export interface operations { }; }; }; - "get-all-notification-settings": { + "prune-images": { parameters: { - query?: never; + query?: { + /** @description Only remove dangling images */ + dangling?: boolean; + }; header?: never; path: { /** @description Environment ID */ @@ -13554,7 +15579,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody?: { + content: { + "application/json": components["schemas"]["PruneImagesInputBody"]; + }; + }; responses: { /** @description OK */ 200: { @@ -13562,7 +15591,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NotificationResponse"][] | null; + "application/json": components["schemas"]["BaseApiResponsePruneReport"]; }; }; /** @description Error */ @@ -13576,7 +15605,7 @@ export interface operations { }; }; }; - "create-or-update-notification-settings": { + "pull-image": { parameters: { query?: never; header?: never; @@ -13588,7 +15617,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["NotificationUpdate"]; + "application/json": components["schemas"]["ImagePullOptions"]; }; }; responses: { @@ -13597,9 +15626,7 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["NotificationResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -13612,15 +15639,16 @@ export interface operations { }; }; }; - "get-notification-settings": { + "search-images": { parameters: { - query?: never; + query?: { + /** @description Search term */ + term?: string; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Provider */ - provider: string; }; cookie?: never; }; @@ -13632,7 +15660,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["NotificationResponse"]; + "application/json": components["schemas"]["BaseApiResponseListSearchResult"]; }; }; /** @description Error */ @@ -13646,19 +15674,27 @@ export interface operations { }; }; }; - "delete-notification-settings": { + "upload-image": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Provider */ - provider: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "multipart/form-data": { + /** + * Format: binary + * @description Docker image tar archive + */ + file: string; + }; + }; + }; responses: { /** @description OK */ 200: { @@ -13666,7 +15702,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseLoadResult"]; }; }; /** @description Error */ @@ -13680,21 +15716,21 @@ export interface operations { }; }; }; - "test-notification": { + "get-image-vulnerability-summaries": { parameters: { - query?: { - type?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Provider */ - provider: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["VulnerabilityScanSummariesRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -13702,7 +15738,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseScanSummariesResponse"]; }; }; /** @description Error */ @@ -13716,24 +15752,15 @@ export interface operations { }; }; }; - "list-ports": { + "get-image": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Image ID */ + imageId: string; }; cookie?: never; }; @@ -13745,7 +15772,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["PortPaginatedResponse"]; + "application/json": components["schemas"]["BaseApiResponseDetailSummary"]; }; }; /** @description Error */ @@ -13759,26 +15786,18 @@ export interface operations { }; }; }; - "list-projects": { + "remove-image": { parameters: { query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - /** @description Filter by status (comma-separated: running,stopped,partially running) */ - status?: string; + /** @description Force removal */ + force?: boolean; }; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Image ID */ + imageId: string; }; cookie?: never; }; @@ -13790,7 +15809,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ProjectPaginatedResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -13804,21 +15823,19 @@ export interface operations { }; }; }; - "create-project": { + "get-image-vulnerabilities": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Image ID */ + imageId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["ProjectCreateProject"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -13826,7 +15843,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseCreateReponse"]; + "application/json": components["schemas"]["BaseApiResponseScanResult"]; }; }; /** @description Error */ @@ -13840,13 +15857,28 @@ export interface operations { }; }; }; - "get-project-status-counts": { + "list-image-vulnerabilities": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Sort field */ + sort?: string; + /** @description Sort order */ + order?: string; + /** @description Start offset */ + start?: number; + /** @description Limit */ + limit?: number; + /** @description Comma-separated severity filter */ + severity?: string; + }; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Image ID */ + imageId: string; }; cookie?: never; }; @@ -13858,7 +15890,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseStatusCounts"]; + "application/json": components["schemas"]["BasePaginatedVulnerability"]; }; }; /** @description Error */ @@ -13872,15 +15904,15 @@ export interface operations { }; }; }; - "get-project": { + "scan-image-vulnerabilities": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; + /** @description Image ID to scan */ + imageId: string; }; cookie?: never; }; @@ -13892,7 +15924,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseDetails"]; + "application/json": components["schemas"]["BaseApiResponseScanResult"]; }; }; /** @description Error */ @@ -13906,23 +15938,19 @@ export interface operations { }; }; }; - "update-project": { + "get-image-vulnerability-summary": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; + /** @description Image ID */ + imageId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["ProjectUpdateProject"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -13930,7 +15958,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseDetails"]; + "application/json": components["schemas"]["BaseApiResponseScanSummary"]; }; }; /** @description Error */ @@ -13944,30 +15972,35 @@ export interface operations { }; }; }; - "build-project-images": { + "get-image-attestations": { parameters: { - query?: never; + query?: { + /** @description OCI platform selector, for example linux/amd64 */ + platform?: string; + /** @description Exact in-toto predicate type URI to include */ + predicateType?: string; + /** @description Include verbatim statement JSON bodies */ + statement?: boolean; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; + /** @description Image ID or image reference */ + name: string; }; cookie?: never; }; - requestBody?: { - content: { - "application/json": components["schemas"]["BuildProjectInputBody"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["BaseApiResponseAttestationList"]; + }; }; /** @description Error */ default: { @@ -13980,32 +16013,26 @@ export interface operations { }; }; }; - "destroy-project": { + "export-image": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; + /** @description Image ID or image reference */ + name: string; }; cookie?: never; }; - requestBody?: { - content: { - "application/json": components["schemas"]["ProjectDestroy"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -14018,15 +16045,15 @@ export interface operations { }; }; }; - "down-project": { + "get-image-history": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; + /** @description Image ID or image reference */ + name: string; }; cookie?: never; }; @@ -14038,7 +16065,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseListHistoryItem"]; }; }; /** @description Error */ @@ -14052,21 +16079,21 @@ export interface operations { }; }; }; - "update-project-include": { + "tag-image": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; + /** @description Image ID or image reference */ + name: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["ProjectUpdateIncludeFile"]; + "application/json": components["schemas"]["ImageTagRequest"]; }; }; responses: { @@ -14076,7 +16103,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseDetails"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -14090,15 +16117,13 @@ export interface operations { }; }; }; - "pull-project-images": { + "get-job-schedules": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; }; cookie?: never; }; @@ -14109,7 +16134,9 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["JobscheduleConfig"]; + }; }; /** @description Error */ default: { @@ -14122,19 +16149,21 @@ export interface operations { }; }; }; - "redeploy-project": { + "update-job-schedules": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["JobscheduleUpdate"]; + }; + }; responses: { /** @description OK */ 200: { @@ -14142,7 +16171,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseConfig"]; }; }; /** @description Error */ @@ -14156,15 +16185,13 @@ export interface operations { }; }; }; - "restart-project": { + "list-jobs": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; }; cookie?: never; }; @@ -14176,7 +16203,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["JobscheduleJobListResponse"]; }; }; /** @description Error */ @@ -14190,30 +16217,28 @@ export interface operations { }; }; }; - "deploy-project": { + "run-job": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Project ID */ - projectId: string; + /** @description Job ID to run */ + jobId: string; }; cookie?: never; }; - requestBody?: { - content: { - "application/json": components["schemas"]["ProjectDeployOptions"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["JobscheduleJobRunResponse"]; + }; }; /** @description Error */ default: { @@ -14226,9 +16251,22 @@ export interface operations { }; }; }; - "get-settings": { + "list-networks": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + /** @description Filter by in-use status (true/false) */ + inUse?: string; + }; header?: never; path: { /** @description Environment ID */ @@ -14244,7 +16282,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SettingsPublicSetting"][] | null; + "application/json": components["schemas"]["NetworkPaginatedResponse"]; }; }; /** @description Error */ @@ -14258,7 +16296,7 @@ export interface operations { }; }; }; - "update-settings": { + "create-network": { parameters: { query?: never; header?: never; @@ -14270,7 +16308,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["SettingsUpdate"]; + "application/json": components["schemas"]["NetworkCreateRequest"]; }; }; responses: { @@ -14280,7 +16318,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListSettingDto"]; + "application/json": components["schemas"]["NetworkCreatedApiResponse"]; }; }; /** @description Error */ @@ -14294,7 +16332,7 @@ export interface operations { }; }; }; - "get-public-settings": { + "network-counts": { parameters: { query?: never; header?: never; @@ -14312,7 +16350,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SettingsPublicSetting"][] | null; + "application/json": components["schemas"]["NetworkCountsApiResponse"]; }; }; /** @description Error */ @@ -14326,7 +16364,7 @@ export interface operations { }; }; }; - "list-swarm-configs": { + "prune-networks": { parameters: { query?: never; header?: never; @@ -14344,7 +16382,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListConfigSummary"]; + "application/json": components["schemas"]["NetworkPruneResponse"]; }; }; /** @description Error */ @@ -14358,7 +16396,7 @@ export interface operations { }; }; }; - "create-swarm-config": { + "get-network-topology": { parameters: { query?: never; header?: never; @@ -14368,11 +16406,7 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmConfigCreateRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -14380,7 +16414,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseConfigSummary"]; + "application/json": components["schemas"]["NetworkTopologyApiResponse"]; }; }; /** @description Error */ @@ -14394,15 +16428,18 @@ export interface operations { }; }; }; - "get-swarm-config": { + "get-network": { parameters: { - query?: never; + query?: { + sort?: string; + order?: string; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Config ID */ - configId: string; + /** @description Network ID */ + networkId: string; }; cookie?: never; }; @@ -14414,7 +16451,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseConfigSummary"]; + "application/json": components["schemas"]["NetworkInspectApiResponse"]; }; }; /** @description Error */ @@ -14428,23 +16465,19 @@ export interface operations { }; }; }; - "update-swarm-config": { + "delete-network": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Config ID */ - configId: string; + /** @description Network ID */ + networkId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmConfigUpdateRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -14452,7 +16485,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseConfigSummary"]; + "application/json": components["schemas"]["NetworkMessageApiResponse"]; }; }; /** @description Error */ @@ -14466,15 +16499,13 @@ export interface operations { }; }; }; - "delete-swarm-config": { + "get-all-notification-settings": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Config ID */ - configId: string; }; cookie?: never; }; @@ -14486,7 +16517,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["NotificationResponse"][] | null; }; }; /** @description Error */ @@ -14500,7 +16531,7 @@ export interface operations { }; }; }; - "get-swarm-info": { + "create-or-update-notification-settings": { parameters: { query?: never; header?: never; @@ -14510,7 +16541,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["NotificationUpdate"]; + }; + }; responses: { /** @description OK */ 200: { @@ -14518,7 +16553,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSwarmInfo"]; + "application/json": components["schemas"]["NotificationResponse"]; }; }; /** @description Error */ @@ -14532,21 +16567,19 @@ export interface operations { }; }; }; - "init-swarm": { + "get-notification-settings": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Provider */ + provider: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmSwarmInitRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -14554,7 +16587,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSwarmInitResponse"]; + "application/json": components["schemas"]["NotificationResponse"]; }; }; /** @description Error */ @@ -14568,21 +16601,19 @@ export interface operations { }; }; }; - "join-swarm": { + "delete-notification-settings": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Provider */ + provider: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmSwarmJoinRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -14604,13 +16635,17 @@ export interface operations { }; }; }; - "get-swarm-join-tokens": { + "test-notification": { parameters: { - query?: never; + query?: { + type?: string; + }; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Provider */ + provider: string; }; cookie?: never; }; @@ -14622,7 +16657,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSwarmJoinTokensResponse"]; + "application/json": components["schemas"]["BaseApiResponseTestResponse"]; }; }; /** @description Error */ @@ -14636,9 +16671,20 @@ export interface operations { }; }; }; - "rotate-swarm-join-tokens": { + "list-ports": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + }; header?: never; path: { /** @description Environment ID */ @@ -14646,11 +16692,7 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmSwarmRotateJoinTokensRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -14658,7 +16700,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["PortPaginatedResponse"]; }; }; /** @description Error */ @@ -14672,9 +16714,26 @@ export interface operations { }; }; }; - "leave-swarm": { + "list-projects": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + /** @description Filter by status (comma-separated: running,stopped,partially running) */ + status?: string; + /** @description Filter by update status (has_update, up_to_date, error, unknown) */ + updates?: string; + /** @description Archived filter: 'true' (only archived), 'all' (include archived). Default excludes archived. */ + archived?: string; + }; header?: never; path: { /** @description Environment ID */ @@ -14682,11 +16741,7 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmSwarmLeaveRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -14694,7 +16749,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["ProjectPaginatedResponse"]; }; }; /** @description Error */ @@ -14708,20 +16763,9 @@ export interface operations { }; }; }; - "list-swarm-nodes": { + "create-project": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ @@ -14729,7 +16773,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["ProjectCreateProject"]; + }; + }; responses: { /** @description OK */ 200: { @@ -14737,7 +16785,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SwarmPaginatedResponseNodeSummary"]; + "application/json": components["schemas"]["BaseApiResponseCreateReponse"]; }; }; /** @description Error */ @@ -14751,15 +16799,13 @@ export interface operations { }; }; }; - "get-swarm-node": { + "get-project-status-counts": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Node ID */ - nodeId: string; }; cookie?: never; }; @@ -14771,7 +16817,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseNodeSummary"]; + "application/json": components["schemas"]["BaseApiResponseStatusCounts"]; }; }; /** @description Error */ @@ -14785,18 +16831,15 @@ export interface operations { }; }; }; - "delete-swarm-node": { + "get-project": { parameters: { - query?: { - /** @description Force node removal */ - force?: boolean; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Node ID */ - nodeId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; @@ -14808,7 +16851,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseDetails"]; }; }; /** @description Error */ @@ -14822,21 +16865,21 @@ export interface operations { }; }; }; - "update-swarm-node": { + "update-project": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Node ID */ - nodeId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["SwarmNodeUpdateRequest"]; + "application/json": components["schemas"]["ProjectUpdateProject"]; }; }; responses: { @@ -14846,7 +16889,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseDetails"]; }; }; /** @description Error */ @@ -14860,23 +16903,19 @@ export interface operations { }; }; }; - "get-swarm-node-agent-deployment": { + "archive-project": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Node ID */ - nodeId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["GetSwarmNodeAgentDeploymentInputBody"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -14884,7 +16923,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSwarmNodeAgentDeployment"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -14898,28 +16937,30 @@ export interface operations { }; }; }; - "demote-swarm-node": { + "build-project-images": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Node ID */ - nodeId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody?: never; + requestBody?: { + content: { + "application/json": components["schemas"]["BuildProjectInputBody"]; + }; + }; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -14932,15 +16973,15 @@ export interface operations { }; }; }; - "promote-swarm-node": { + "get-project-compose": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Node ID */ - nodeId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; @@ -14952,7 +16993,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseDetails"]; }; }; /** @description Error */ @@ -14966,30 +17007,23 @@ export interface operations { }; }; }; - "list-swarm-node-tasks": { + "destroy-project": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Node ID */ - nodeId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody?: never; + requestBody?: { + content: { + "application/json": components["schemas"]["ProjectDestroy"]; + }; + }; responses: { /** @description OK */ 200: { @@ -14997,7 +17031,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SwarmPaginatedResponseTaskSummary"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -15011,13 +17045,15 @@ export interface operations { }; }; }; - "list-swarm-secrets": { + "down-project": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; @@ -15029,7 +17065,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListSecretSummary"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -15043,21 +17079,22 @@ export interface operations { }; }; }; - "create-swarm-secret": { + "get-project-file": { parameters: { - query?: never; + query?: { + /** @description Path to the file relative to the project */ + relativePath?: string; + }; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmSecretCreateRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -15065,7 +17102,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSecretSummary"]; + "application/json": components["schemas"]["BaseApiResponseIncludeFile"]; }; }; /** @description Error */ @@ -15079,15 +17116,15 @@ export interface operations { }; }; }; - "get-swarm-secret": { + "get-project-files": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Secret ID */ - secretId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; @@ -15099,7 +17136,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSecretSummary"]; + "application/json": components["schemas"]["BaseApiResponseDetails"]; }; }; /** @description Error */ @@ -15113,21 +17150,21 @@ export interface operations { }; }; }; - "update-swarm-secret": { + "update-project-include": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Secret ID */ - secretId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["SwarmSecretUpdateRequest"]; + "application/json": components["schemas"]["ProjectUpdateIncludeFile"]; }; }; responses: { @@ -15137,7 +17174,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSecretSummary"]; + "application/json": components["schemas"]["BaseApiResponseDetails"]; }; }; /** @description Error */ @@ -15151,15 +17188,15 @@ export interface operations { }; }; }; - "delete-swarm-secret": { + "pull-project-images": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Secret ID */ - secretId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; @@ -15170,9 +17207,7 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -15185,28 +17220,23 @@ export interface operations { }; }; }; - "list-swarm-services": { + "redeploy-project": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody?: never; + requestBody?: { + content: { + "application/json": components["schemas"]["ProjectDeployOptions"]; + }; + }; responses: { /** @description OK */ 200: { @@ -15214,7 +17244,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SwarmPaginatedResponseServiceSummary"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -15228,21 +17258,19 @@ export interface operations { }; }; }; - "create-swarm-service": { + "restart-project": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmServiceCreateRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -15250,7 +17278,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseServiceCreateResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -15264,15 +17292,15 @@ export interface operations { }; }; }; - "get-swarm-service": { + "get-project-runtime": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Service ID */ - serviceId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; @@ -15284,7 +17312,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseServiceInspect"]; + "application/json": components["schemas"]["BaseApiResponseDetails"]; }; }; /** @description Error */ @@ -15298,23 +17326,19 @@ export interface operations { }; }; }; - "update-swarm-service": { + "unarchive-project": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Service ID */ - serviceId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmServiceUpdateRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -15322,7 +17346,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseServiceUpdateResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -15336,28 +17360,30 @@ export interface operations { }; }; }; - "delete-swarm-service": { + "deploy-project": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Service ID */ - serviceId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody?: never; + requestBody?: { + content: { + "application/json": components["schemas"]["ProjectDeployOptions"]; + }; + }; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -15370,19 +17396,23 @@ export interface operations { }; }; }; - "rollback-swarm-service": { + "update-project-services": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Service ID */ - serviceId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody?: never; + requestBody?: { + content: { + "application/json": components["schemas"]["UpdateProjectServicesInputBody"]; + }; + }; responses: { /** @description OK */ 200: { @@ -15390,7 +17420,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseServiceUpdateResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -15404,23 +17434,19 @@ export interface operations { }; }; }; - "scale-swarm-service": { + "get-project-updates": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Service ID */ - serviceId: string; + /** @description Project ID */ + projectId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmServiceScaleRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -15428,7 +17454,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseServiceUpdateResponse"]; + "application/json": components["schemas"]["BaseApiResponseDetails"]; }; }; /** @description Error */ @@ -15442,26 +17468,13 @@ export interface operations { }; }; }; - "list-swarm-service-tasks": { + "get-settings": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Service ID */ - serviceId: string; }; cookie?: never; }; @@ -15473,7 +17486,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SwarmPaginatedResponseTaskSummary"]; + "application/json": components["schemas"]["SettingsPublicSetting"][] | null; }; }; /** @description Error */ @@ -15487,7 +17500,7 @@ export interface operations { }; }; }; - "update-swarm-spec": { + "update-settings": { parameters: { query?: never; header?: never; @@ -15499,7 +17512,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["SwarmSwarmUpdateRequest"]; + "application/json": components["schemas"]["SettingsUpdate"]; }; }; responses: { @@ -15509,7 +17522,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseListSettingDto"]; }; }; /** @description Error */ @@ -15523,20 +17536,9 @@ export interface operations { }; }; }; - "list-swarm-stacks": { + "get-public-settings": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ @@ -15552,7 +17554,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SwarmPaginatedResponseStackSummary"]; + "application/json": components["schemas"]["SettingsPublicSetting"][] | null; }; }; /** @description Error */ @@ -15566,7 +17568,7 @@ export interface operations { }; }; }; - "deploy-swarm-stack": { + "list-swarm-configs": { parameters: { query?: never; header?: never; @@ -15576,11 +17578,7 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SwarmStackDeployRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -15588,7 +17586,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseStackDeployResponse"]; + "application/json": components["schemas"]["BaseApiResponseListConfigSummary"]; }; }; /** @description Error */ @@ -15602,7 +17600,7 @@ export interface operations { }; }; }; - "render-swarm-stack-config": { + "create-swarm-config": { parameters: { query?: never; header?: never; @@ -15614,7 +17612,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["SwarmStackRenderConfigRequest"]; + "application/json": components["schemas"]["SwarmConfigCreateRequest"]; }; }; responses: { @@ -15624,7 +17622,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseStackRenderConfigResponse"]; + "application/json": components["schemas"]["BaseApiResponseConfigSummary"]; }; }; /** @description Error */ @@ -15638,15 +17636,15 @@ export interface operations { }; }; }; - "get-swarm-stack": { + "get-swarm-config": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Stack name */ - name: string; + /** @description Config ID */ + configId: string; }; cookie?: never; }; @@ -15658,7 +17656,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseStackInspect"]; + "application/json": components["schemas"]["BaseApiResponseConfigSummary"]; }; }; /** @description Error */ @@ -15672,28 +17670,30 @@ export interface operations { }; }; }; - "delete-swarm-stack": { + "update-swarm-config": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Stack name */ - name: string; + /** @description Config ID */ + configId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmConfigUpdateRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -15706,26 +17706,15 @@ export interface operations { }; }; }; - "list-swarm-stack-services": { + "delete-swarm-config": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Stack name */ - name: string; + /** @description Config ID */ + configId: string; }; cookie?: never; }; @@ -15737,7 +17726,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SwarmPaginatedResponseServiceSummary"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -15751,15 +17740,13 @@ export interface operations { }; }; }; - "get-swarm-stack-source": { + "get-swarm-info": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Stack name */ - name: string; }; cookie?: never; }; @@ -15771,7 +17758,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseStackSource"]; + "application/json": components["schemas"]["BaseApiResponseSwarmInfo"]; }; }; /** @description Error */ @@ -15785,30 +17772,21 @@ export interface operations { }; }; }; - "list-swarm-stack-tasks": { + "init-swarm": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Stack name */ - name: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmSwarmInitRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -15816,7 +17794,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SwarmPaginatedResponseTaskSummary"]; + "application/json": components["schemas"]["BaseApiResponseSwarmInitResponse"]; }; }; /** @description Error */ @@ -15830,7 +17808,7 @@ export interface operations { }; }; }; - "get-swarm-status": { + "join-swarm": { parameters: { query?: never; header?: never; @@ -15840,7 +17818,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmSwarmJoinRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -15848,7 +17830,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseRuntimeStatus"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -15862,20 +17844,9 @@ export interface operations { }; }; }; - "list-swarm-tasks": { + "get-swarm-join-tokens": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ @@ -15891,7 +17862,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SwarmPaginatedResponseTaskSummary"]; + "application/json": components["schemas"]["BaseApiResponseSwarmJoinTokensResponse"]; }; }; /** @description Error */ @@ -15905,7 +17876,7 @@ export interface operations { }; }; }; - "unlock-swarm": { + "rotate-swarm-join-tokens": { parameters: { query?: never; header?: never; @@ -15917,7 +17888,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["SwarmSwarmUnlockRequest"]; + "application/json": components["schemas"]["SwarmSwarmRotateJoinTokensRequest"]; }; }; responses: { @@ -15941,7 +17912,7 @@ export interface operations { }; }; }; - "get-swarm-unlock-key": { + "leave-swarm": { parameters: { query?: never; header?: never; @@ -15951,7 +17922,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmSwarmLeaveRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -15959,7 +17934,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseSwarmUnlockKeyResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -15973,9 +17948,20 @@ export interface operations { }; }; }; - syncEnvironment: { + "list-swarm-nodes": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + }; header?: never; path: { /** @description Environment ID */ @@ -15991,7 +17977,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["SwarmPaginatedResponseNodeSummary"]; }; }; /** @description Error */ @@ -16005,13 +17991,15 @@ export interface operations { }; }; }; - "start-all-containers": { + "get-swarm-node": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Node ID */ + nodeId: string; }; cookie?: never; }; @@ -16023,7 +18011,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseActionResult"]; + "application/json": components["schemas"]["BaseApiResponseNodeSummary"]; }; }; /** @description Error */ @@ -16037,13 +18025,18 @@ export interface operations { }; }; }; - "start-all-stopped-containers": { + "delete-swarm-node": { parameters: { - query?: never; + query?: { + /** @description Force node removal */ + force?: boolean; + }; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Node ID */ + nodeId: string; }; cookie?: never; }; @@ -16055,7 +18048,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseActionResult"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -16069,17 +18062,23 @@ export interface operations { }; }; }; - "stop-all-containers": { + "update-swarm-node": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Node ID */ + nodeId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmNodeUpdateRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -16087,7 +18086,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseActionResult"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -16101,19 +18100,21 @@ export interface operations { }; }; }; - "convert-docker-run": { + "get-swarm-node-agent-deployment": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Node ID */ + nodeId: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["SystemConvertDockerRunRequest"]; + "application/json": components["schemas"]["GetSwarmNodeAgentDeploymentInputBody"]; }; }; responses: { @@ -16123,7 +18124,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SystemConvertDockerRunResponse"]; + "application/json": components["schemas"]["BaseApiResponseSwarmNodeAgentDeployment"]; }; }; /** @description Error */ @@ -16137,13 +18138,15 @@ export interface operations { }; }; }; - "get-docker-info": { + "demote-swarm-node": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Node ID */ + nodeId: string; }; cookie?: never; }; @@ -16155,7 +18158,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["DockerinfoInfo"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -16169,13 +18172,15 @@ export interface operations { }; }; }; - "system-health": { + "promote-swarm-node": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Node ID */ + nodeId: string; }; cookie?: never; }; @@ -16186,7 +18191,9 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; }; /** @description Error */ default: { @@ -16199,21 +18206,30 @@ export interface operations { }; }; }; - "prune-all": { + "list-swarm-node-tasks": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + }; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Node ID */ + nodeId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SystemPruneAllRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -16221,7 +18237,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponsePruneAllResult"]; + "application/json": components["schemas"]["SwarmPaginatedResponseTaskSummary"]; }; }; /** @description Error */ @@ -16235,7 +18251,7 @@ export interface operations { }; }; }; - "trigger-upgrade": { + "list-swarm-secrets": { parameters: { query?: never; header?: never; @@ -16247,13 +18263,13 @@ export interface operations { }; requestBody?: never; responses: { - /** @description Accepted */ - 202: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseListSecretSummary"]; }; }; /** @description Error */ @@ -16267,7 +18283,7 @@ export interface operations { }; }; }; - "check-upgrade": { + "create-swarm-secret": { parameters: { query?: never; header?: never; @@ -16277,7 +18293,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmSecretCreateRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -16285,7 +18305,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["UpgradeCheckResultData"]; + "application/json": components["schemas"]["BaseApiResponseSecretSummary"]; }; }; /** @description Error */ @@ -16299,13 +18319,15 @@ export interface operations { }; }; }; - getGlobalVariables: { + "get-swarm-secret": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Secret ID */ + secretId: string; }; cookie?: never; }; @@ -16317,7 +18339,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListVariable"]; + "application/json": components["schemas"]["BaseApiResponseSecretSummary"]; }; }; /** @description Error */ @@ -16331,30 +18353,30 @@ export interface operations { }; }; }; - updateGlobalVariables: { + "update-swarm-secret": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Secret ID */ + secretId: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["EnvSummary"]; + "application/json": components["schemas"]["SwarmSecretUpdateRequest"]; }; }; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; - }; + content?: never; }; /** @description Error */ default: { @@ -16367,21 +18389,19 @@ export interface operations { }; }; }; - testConnection: { + "delete-swarm-secret": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Secret ID */ + secretId: string; }; cookie?: never; }; - requestBody?: { - content: { - "application/json": components["schemas"]["EnvironmentTestConnectionRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -16389,7 +18409,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseTest"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -16403,10 +18423,18 @@ export interface operations { }; }; }; - "get-updater-history": { + "list-swarm-services": { parameters: { query?: { - /** @description Number of history entries to return */ + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ limit?: number; }; header?: never; @@ -16424,7 +18452,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListAutoUpdateRecord"]; + "application/json": components["schemas"]["SwarmPaginatedResponseServiceSummary"]; }; }; /** @description Error */ @@ -16438,7 +18466,7 @@ export interface operations { }; }; }; - "run-updater": { + "create-swarm-service": { parameters: { query?: never; header?: never; @@ -16448,9 +18476,9 @@ export interface operations { }; cookie?: never; }; - requestBody?: { + requestBody: { content: { - "application/json": components["schemas"]["UpdaterOptions"]; + "application/json": components["schemas"]["SwarmServiceCreateRequest"]; }; }; responses: { @@ -16460,7 +18488,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseResult"]; + "application/json": components["schemas"]["BaseApiResponseServiceCreateResponse"]; }; }; /** @description Error */ @@ -16474,13 +18502,15 @@ export interface operations { }; }; }; - "get-updater-status": { + "get-swarm-service": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Service ID */ + serviceId: string; }; cookie?: never; }; @@ -16492,7 +18522,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseStatus"]; + "application/json": components["schemas"]["BaseApiResponseServiceInspect"]; }; }; /** @description Error */ @@ -16506,17 +18536,23 @@ export interface operations { }; }; }; - getEnvironmentVersion: { + "update-swarm-service": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Service ID */ + serviceId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmServiceUpdateRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -16524,7 +18560,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseInfo"]; + "application/json": components["schemas"]["BaseApiResponseServiceUpdateResponse"]; }; }; /** @description Error */ @@ -16538,28 +18574,15 @@ export interface operations { }; }; }; - "list-volumes": { + "delete-swarm-service": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction (asc or desc) */ - order?: string; - /** @description Start index for pagination */ - start?: number; - /** @description Number of items per page */ - limit?: number; - /** @description Filter by in-use status (true/false) */ - inUse?: string; - /** @description Include internal volumes */ - includeInternal?: boolean; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Service ID */ + serviceId: string; }; cookie?: never; }; @@ -16571,7 +18594,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["VolumePaginatedResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -16585,21 +18608,19 @@ export interface operations { }; }; }; - "create-volume": { + "rollback-swarm-service": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; + /** @description Service ID */ + serviceId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["VolumeCreate"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -16607,7 +18628,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseVolume"]; + "application/json": components["schemas"]["BaseApiResponseServiceUpdateResponse"]; }; }; /** @description Error */ @@ -16621,19 +18642,23 @@ export interface operations { }; }; }; - "delete-volume-backup": { + "scale-swarm-service": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Backup ID */ - backupId: string; + /** @description Service ID */ + serviceId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmServiceScaleRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -16641,7 +18666,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseServiceUpdateResponse"]; }; }; /** @description Error */ @@ -16655,47 +18680,26 @@ export interface operations { }; }; }; - "download-volume-backup": { + "list-swarm-service-tasks": { parameters: { - query?: never; - header?: never; - path: { - /** @description Environment ID */ - id: string; - /** @description Backup ID */ - backupId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Error */ - default: { - headers: { - [name: string]: unknown; - }; - content: { - "application/problem+json": components["schemas"]["ErrorModel"]; - }; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; }; - }; - }; - "list-backup-files": { - parameters: { - query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Backup ID */ - backupId: string; + /** @description Service ID */ + serviceId: string; }; cookie?: never; }; @@ -16707,7 +18711,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListString"]; + "application/json": components["schemas"]["SwarmPaginatedResponseTaskSummary"]; }; }; /** @description Error */ @@ -16721,22 +18725,21 @@ export interface operations { }; }; }; - "backup-has-path": { + "update-swarm-spec": { parameters: { - query?: { - /** @description Path to check */ - path?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Backup ID */ - backupId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmSwarmUpdateRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -16744,7 +18747,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseBackupHasPathResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -16758,11 +18761,19 @@ export interface operations { }; }; }; - "get-volume-usage-counts": { + "list-swarm-stacks": { parameters: { query?: { - /** @description Include internal volumes */ - includeInternal?: boolean; + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; }; header?: never; path: { @@ -16779,7 +18790,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseVolumeUsageCountsData"]; + "application/json": components["schemas"]["SwarmPaginatedResponseStackSummary"]; }; }; /** @description Error */ @@ -16793,7 +18804,7 @@ export interface operations { }; }; }; - "prune-volumes": { + "deploy-swarm-stack": { parameters: { query?: never; header?: never; @@ -16803,7 +18814,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmStackDeployRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -16811,7 +18826,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseVolumePruneReportData"]; + "application/json": components["schemas"]["BaseApiResponseStackDeployResponse"]; }; }; /** @description Error */ @@ -16825,7 +18840,7 @@ export interface operations { }; }; }; - "get-volume-sizes": { + "render-swarm-stack-config": { parameters: { query?: never; header?: never; @@ -16835,7 +18850,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmStackRenderConfigRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -16843,7 +18862,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListVolumeSizeInfo"]; + "application/json": components["schemas"]["BaseApiResponseStackRenderConfigResponse"]; }; }; /** @description Error */ @@ -16857,15 +18876,15 @@ export interface operations { }; }; }; - "get-volume": { + "get-swarm-stack": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; + /** @description Stack name */ + name: string; }; cookie?: never; }; @@ -16877,7 +18896,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseVolume"]; + "application/json": components["schemas"]["BaseApiResponseStackInspect"]; }; }; /** @description Error */ @@ -16891,18 +18910,15 @@ export interface operations { }; }; }; - "remove-volume": { + "delete-swarm-stack": { parameters: { - query?: { - /** @description Force removal */ - force?: boolean; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; + /** @description Stack name */ + name: string; }; cookie?: never; }; @@ -16928,26 +18944,26 @@ export interface operations { }; }; }; - "list-volume-backups": { + "list-swarm-stack-services": { parameters: { query?: { /** @description Search query */ search?: string; /** @description Column to sort by */ sort?: string; - /** @description Sort direction */ + /** @description Sort direction (asc or desc) */ order?: string; - /** @description Start index */ + /** @description Start index for pagination */ start?: number; - /** @description Limit */ + /** @description Number of items per page */ limit?: number; }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; + /** @description Stack name */ + name: string; }; cookie?: never; }; @@ -16959,7 +18975,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["VolumeBackupPaginatedResponse"]; + "application/json": components["schemas"]["SwarmPaginatedResponseServiceSummary"]; }; }; /** @description Error */ @@ -16973,15 +18989,15 @@ export interface operations { }; }; }; - "create-volume-backup": { + "get-swarm-stack-source": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; + /** @description Stack name */ + name: string; }; cookie?: never; }; @@ -16993,7 +19009,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseVolumeBackup"]; + "application/json": components["schemas"]["BaseApiResponseStackSource"]; }; }; /** @description Error */ @@ -17007,27 +19023,21 @@ export interface operations { }; }; }; - "upload-volume-backup": { + "update-swarm-stack-source": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; + /** @description Stack name */ + name: string; }; cookie?: never; }; requestBody: { content: { - "multipart/form-data": { - /** - * Format: binary - * @description Backup archive (tar.gz) - */ - file: string; - }; + "application/json": components["schemas"]["SwarmStackSourceUpdateRequest"]; }; }; responses: { @@ -17037,7 +19047,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseStackSource"]; }; }; /** @description Error */ @@ -17051,17 +19061,26 @@ export interface operations { }; }; }; - "restore-volume-backup": { + "list-swarm-stack-tasks": { parameters: { - query?: never; + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; - /** @description Backup ID */ - backupId: string; + /** @description Stack name */ + name: string; }; cookie?: never; }; @@ -17073,7 +19092,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["SwarmPaginatedResponseTaskSummary"]; }; }; /** @description Error */ @@ -17087,25 +19106,17 @@ export interface operations { }; }; }; - "restore-volume-backup-files": { + "get-swarm-status": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; - /** @description Backup ID */ - backupId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["RestoreBackupFilesInputBody"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -17113,7 +19124,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["BaseApiResponseRuntimeStatus"]; }; }; /** @description Error */ @@ -17127,18 +19138,24 @@ export interface operations { }; }; }; - "browse-volume-directory": { + "list-swarm-tasks": { parameters: { query?: { - /** @description Directory path to browse */ - path?: string; + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; }; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; }; cookie?: never; }; @@ -17150,7 +19167,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListFileEntry"]; + "application/json": components["schemas"]["SwarmPaginatedResponseTaskSummary"]; }; }; /** @description Error */ @@ -17164,31 +19181,30 @@ export interface operations { }; }; }; - "delete-volume-file": { + "unlock-swarm": { parameters: { - query?: { - /** @description File or directory path to delete */ - path?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SwarmSwarmUnlockRequest"]; + }; + }; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { - Data?: components["schemas"]["BaseMessageResponse"]; - Success?: boolean; [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; }; /** @description Error */ default: { @@ -17201,20 +19217,13 @@ export interface operations { }; }; }; - "get-volume-file-content": { + "get-swarm-unlock-key": { parameters: { - query?: { - /** @description File path */ - path?: string; - /** @description Maximum bytes to read (default 1MB) */ - maxBytes?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; }; cookie?: never; }; @@ -17226,7 +19235,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseFileContentResponse"]; + "application/json": components["schemas"]["BaseApiResponseSwarmUnlockKeyResponse"]; }; }; /** @description Error */ @@ -17240,18 +19249,13 @@ export interface operations { }; }; }; - "download-volume-file": { + syncEnvironment: { parameters: { - query?: { - /** @description File path */ - path?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; }; cookie?: never; }; @@ -17262,7 +19266,9 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; }; /** @description Error */ default: { @@ -17275,31 +19281,26 @@ export interface operations { }; }; }; - "create-volume-directory": { + "start-all-containers": { parameters: { - query?: { - /** @description Directory path to create */ - path?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { - Data?: components["schemas"]["BaseMessageResponse"]; - Success?: boolean; [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["BaseApiResponseActionResult"]; + }; }; /** @description Error */ default: { @@ -17312,41 +19313,26 @@ export interface operations { }; }; }; - "upload-volume-file": { + "start-all-stopped-containers": { parameters: { - query?: { - /** @description Destination path */ - path?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; }; cookie?: never; }; - requestBody: { - content: { - "multipart/form-data": { - /** - * Format: binary - * @description File to upload - */ - file: string; - }; - }; - }; + requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { - Data?: components["schemas"]["BaseMessageResponse"]; - Success?: boolean; [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["BaseApiResponseActionResult"]; + }; }; /** @description Error */ default: { @@ -17359,15 +19345,13 @@ export interface operations { }; }; }; - "get-volume-usage": { + "stop-all-containers": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Volume name */ - volumeName: string; }; cookie?: never; }; @@ -17379,7 +19363,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseVolumeUsageResponse"]; + "application/json": components["schemas"]["BaseApiResponseActionResult"]; }; }; /** @description Error */ @@ -17393,26 +19377,9 @@ export interface operations { }; }; }; - "list-environment-vulnerabilities": { + "convert-docker-run": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Sort field */ - sort?: string; - /** @description Sort order */ - order?: string; - /** @description Start offset */ - start?: number; - /** @description Limit */ - limit?: number; - /** @description Page number */ - page?: number; - /** @description Comma-separated severity filter */ - severity?: string; - /** @description Filter by image/repo name (substring) */ - imageName?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ @@ -17420,7 +19387,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SystemConvertDockerRunRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -17428,7 +19399,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BasePaginatedVulnerabilityWithImage"]; + "application/json": components["schemas"]["SystemConvertDockerRunResponse"]; }; }; /** @description Error */ @@ -17442,7 +19413,7 @@ export interface operations { }; }; }; - "ignore-vulnerability": { + "get-docker-info": { parameters: { query?: never; header?: never; @@ -17452,11 +19423,7 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["VulnerabilityIgnorePayload"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -17464,7 +19431,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseIgnoredVulnerability"]; + "application/json": components["schemas"]["DockerinfoInfo"]; }; }; /** @description Error */ @@ -17478,15 +19445,13 @@ export interface operations { }; }; }; - "unignore-vulnerability": { + "system-health": { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Ignore record ID */ - ignoreId: string; }; cookie?: never; }; @@ -17497,9 +19462,7 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["BaseApiResponseStruct {}"]; - }; + content?: never; }; /** @description Error */ default: { @@ -17512,22 +19475,9 @@ export interface operations { }; }; }; - "list-ignored-vulnerabilities": { + "prune-all": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Sort field */ - sort?: string; - /** @description Sort order */ - order?: string; - /** @description Start offset */ - start?: number; - /** @description Limit */ - limit?: number; - /** @description Page number */ - page?: number; - }; + query?: never; header?: never; path: { /** @description Environment ID */ @@ -17535,7 +19485,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SystemPruneAllRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -17543,7 +19497,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BasePaginatedIgnoredVulnerability"]; + "application/json": components["schemas"]["BaseApiResponsePruneAllResult"]; }; }; /** @description Error */ @@ -17557,12 +19511,9 @@ export interface operations { }; }; }; - "list-environment-vulnerability-image-options": { + "trigger-upgrade": { parameters: { - query?: { - /** @description Comma-separated severity filter */ - severity?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ @@ -17572,13 +19523,13 @@ export interface operations { }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description Accepted */ + 202: { headers: { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListString"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -17592,7 +19543,7 @@ export interface operations { }; }; }; - "get-vulnerability-scanner-status": { + "trigger-update-all": { parameters: { query?: never; header?: never; @@ -17604,13 +19555,13 @@ export interface operations { }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description Accepted */ + 202: { headers: { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseScannerStatus"]; + "application/json": components["schemas"]["BaseApiResponseEnvironmentUpdateJob"]; }; }; /** @description Error */ @@ -17624,7 +19575,7 @@ export interface operations { }; }; }; - "get-environment-vulnerability-summary": { + "update-all-status": { parameters: { query?: never; header?: never; @@ -17642,7 +19593,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseEnvironmentVulnerabilitySummary"]; + "application/json": components["schemas"]["BaseApiResponseEnvironmentUpdateJob"]; }; }; /** @description Error */ @@ -17656,7 +19607,7 @@ export interface operations { }; }; }; - "list-webhooks": { + "check-upgrade": { parameters: { query?: never; header?: never; @@ -17674,7 +19625,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseListSummary"]; + "application/json": components["schemas"]["UpgradeCheckResultData"]; }; }; /** @description Error */ @@ -17688,7 +19639,7 @@ export interface operations { }; }; }; - "create-webhook": { + getGlobalVariables: { parameters: { query?: never; header?: never; @@ -17698,11 +19649,7 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["WebhookCreateInput"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -17710,7 +19657,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseCreated"]; + "application/json": components["schemas"]["BaseApiResponseListVariable"]; }; }; /** @description Error */ @@ -17724,19 +19671,21 @@ export interface operations { }; }; }; - "delete-webhook": { + updateGlobalVariables: { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Webhook ID */ - webhookId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["EnvSummary"]; + }; + }; responses: { /** @description OK */ 200: { @@ -17744,7 +19693,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseInterface {}"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -17758,21 +19707,19 @@ export interface operations { }; }; }; - "update-webhook": { + testConnection: { parameters: { query?: never; header?: never; path: { /** @description Environment ID */ id: string; - /** @description Webhook ID */ - webhookId: string; }; cookie?: never; }; - requestBody: { + requestBody?: { content: { - "application/json": components["schemas"]["WebhookUpdateInput"]; + "application/json": components["schemas"]["EnvironmentTestConnectionRequest"]; }; }; responses: { @@ -17782,7 +19729,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseInterface {}"]; + "application/json": components["schemas"]["BaseApiResponseTest"]; }; }; /** @description Error */ @@ -17796,26 +19743,17 @@ export interface operations { }; }; }; - listEvents: { + "get-updater-history": { parameters: { query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction */ - order?: string; - /** @description Start index */ - start?: number; - /** @description Limit */ + /** @description Number of history entries to return */ limit?: number; - /** @description Filter by severity */ - severity?: string; - /** @description Filter by event type */ - type?: string; }; header?: never; - path?: never; + path: { + /** @description Environment ID */ + id: string; + }; cookie?: never; }; requestBody?: never; @@ -17826,7 +19764,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["EventPaginatedResponse"]; + "application/json": components["schemas"]["BaseApiResponseListAutoUpdateRecord"]; }; }; /** @description Error */ @@ -17840,19 +19778,19 @@ export interface operations { }; }; }; - createEvent: { + "run-updater": { parameters: { query?: never; - header?: { - /** @description API key for environment-scoped event forwarding */ - "X-API-Key"?: string; + header?: never; + path: { + /** @description Environment ID */ + id: string; }; - path?: never; cookie?: never; }; - requestBody: { + requestBody?: { content: { - "application/json": components["schemas"]["EventCreateEvent"]; + "application/json": components["schemas"]["UpdaterOptions"]; }; }; responses: { @@ -17862,7 +19800,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseEvent"]; + "application/json": components["schemas"]["BaseApiResponseResult"]; }; }; /** @description Error */ @@ -17876,28 +19814,13 @@ export interface operations { }; }; }; - getEventsByEnvironment: { + "get-updater-status": { parameters: { - query?: { - /** @description Search query */ - search?: string; - /** @description Column to sort by */ - sort?: string; - /** @description Sort direction */ - order?: string; - /** @description Start index */ - start?: number; - /** @description Limit */ - limit?: number; - /** @description Filter by severity */ - severity?: string; - /** @description Filter by event type */ - type?: string; - }; + query?: never; header?: never; path: { /** @description Environment ID */ - environmentId: string; + id: string; }; cookie?: never; }; @@ -17909,7 +19832,1792 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["EventPaginatedResponse"]; + "application/json": components["schemas"]["BaseApiResponseStatus"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + getEnvironmentVersion: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseInfo"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "list-volumes": { + parameters: { + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + /** @description Filter by in-use status (true/false) */ + inUse?: string; + /** @description Include internal volumes */ + includeInternal?: boolean; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VolumePaginatedResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "create-volume": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["VolumeCreate"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseVolume"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "delete-volume-backup": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Backup ID */ + backupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "download-volume-backup": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Backup ID */ + backupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "list-backup-files": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Backup ID */ + backupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseListString"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "backup-has-path": { + parameters: { + query?: { + /** @description Path to check */ + path?: string; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Backup ID */ + backupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseBackupHasPathResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "get-volume-usage-counts": { + parameters: { + query?: { + /** @description Include internal volumes */ + includeInternal?: boolean; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseVolumeUsageCountsData"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "prune-volumes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseVolumePruneReportData"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "get-volume-sizes": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseListVolumeSizeInfo"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "get-volume": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseVolume"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "remove-volume": { + parameters: { + query?: { + /** @description Force removal */ + force?: boolean; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "list-volume-backups": { + parameters: { + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction */ + order?: string; + /** @description Start index */ + start?: number; + /** @description Limit */ + limit?: number; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VolumeBackupPaginatedResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "create-volume-backup": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseVolumeBackup"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "upload-volume-backup": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": { + /** + * Format: binary + * @description Backup archive (tar.gz) + */ + file: string; + }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "restore-volume-backup": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + /** @description Backup ID */ + backupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "restore-volume-backup-files": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + /** @description Backup ID */ + backupId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RestoreBackupFilesInputBody"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "browse-volume-directory": { + parameters: { + query?: { + /** @description Directory path to browse */ + path?: string; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseListFileEntry"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "delete-volume-file": { + parameters: { + query?: { + /** @description File or directory path to delete */ + path?: string; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + Data?: components["schemas"]["BaseMessageResponse"]; + Success?: boolean; + [name: string]: unknown; + }; + content?: never; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "get-volume-file-content": { + parameters: { + query?: { + /** @description File path */ + path?: string; + /** @description Maximum bytes to read (default 1MB) */ + maxBytes?: number; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseFileContentResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "download-volume-file": { + parameters: { + query?: { + /** @description File path */ + path?: string; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "create-volume-directory": { + parameters: { + query?: { + /** @description Directory path to create */ + path?: string; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + Data?: components["schemas"]["BaseMessageResponse"]; + Success?: boolean; + [name: string]: unknown; + }; + content?: never; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "upload-volume-file": { + parameters: { + query?: { + /** @description Destination path */ + path?: string; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": { + /** + * Format: binary + * @description File to upload + */ + file: string; + }; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + Data?: components["schemas"]["BaseMessageResponse"]; + Success?: boolean; + [name: string]: unknown; + }; + content?: never; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "get-volume-usage": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Volume name */ + volumeName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseVolumeUsageResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "list-environment-vulnerabilities": { + parameters: { + query?: { + /** @description Search query */ + search?: string; + /** @description Sort field */ + sort?: string; + /** @description Sort order */ + order?: string; + /** @description Start offset */ + start?: number; + /** @description Limit */ + limit?: number; + /** @description Comma-separated severity filter */ + severity?: string; + /** @description Filter by image/repo name (substring) */ + imageName?: string; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BasePaginatedVulnerabilityWithImage"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "ignore-vulnerability": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["VulnerabilityIgnorePayload"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseIgnoredVulnerability"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "unignore-vulnerability": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Ignore record ID */ + ignoreId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseStruct {}"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "list-ignored-vulnerabilities": { + parameters: { + query?: { + /** @description Search query */ + search?: string; + /** @description Sort field */ + sort?: string; + /** @description Sort order */ + order?: string; + /** @description Start offset */ + start?: number; + /** @description Limit */ + limit?: number; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BasePaginatedIgnoredVulnerability"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "list-environment-vulnerability-image-options": { + parameters: { + query?: { + /** @description Comma-separated severity filter */ + severity?: string; + }; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseListString"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "get-vulnerability-scanner-status": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseScannerStatus"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "get-environment-vulnerability-summary": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseEnvironmentVulnerabilitySummary"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "list-webhooks": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseListSummary"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "create-webhook": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["WebhookCreateInput"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseCreated"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "delete-webhook": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Webhook ID */ + webhookId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseInterface {}"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "update-webhook": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Environment ID */ + id: string; + /** @description Webhook ID */ + webhookId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["WebhookUpdateInput"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseInterface {}"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + listEvents: { + parameters: { + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction */ + order?: string; + /** @description Start index */ + start?: number; + /** @description Limit */ + limit?: number; + /** @description Filter by severity */ + severity?: string; + /** @description Filter by event type */ + type?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["EventPaginatedResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + getEventsByEnvironment: { + parameters: { + query?: { + /** @description Search query */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction */ + order?: string; + /** @description Start index */ + start?: number; + /** @description Limit */ + limit?: number; + /** @description Filter by severity */ + severity?: string; + /** @description Filter by event type */ + type?: string; + }; + header?: never; + path: { + /** @description Environment ID */ + environmentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["EventPaginatedResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + deleteEvent: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Event ID */ + eventId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "list-federated-credentials": { + parameters: { + query?: { + /** @description Search query for filtering by name, issuer, or subject */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Number of items per page */ + limit?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BasePaginatedFederatedCredential"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "create-federated-credential": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["FederatedCreateFederatedCredential"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseFederatedCredential"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "get-federated-credential": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Federated credential ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseFederatedCredential"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "update-federated-credential": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Federated credential ID */ + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["FederatedUpdateFederatedCredential"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseFederatedCredential"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "delete-federated-credential": { + parameters: { + query?: never; + header?: never; + path: { + /** @description Federated credential ID */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + syncGitRepositories: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["GitopsRepositorySyncRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "health-check": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SystemHealthResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "health-check-head": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "dispatch-notification": { + parameters: { + query?: never; + header?: { + /** @description Remote environment access token */ + "X-API-Key"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["NotificationDispatchRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseDispatchResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "handle-oidc-callback": { + parameters: { + query?: never; + header?: { + Origin?: string; + "X-Forwarded-Host"?: string; + "X-Forwarded-Proto"?: string; + Host?: string; + "User-Agent"?: string; + }; + path?: never; + cookie?: { + /** @description OIDC state cookie from auth URL request */ + oidc_state?: string; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AuthOidcCallbackRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "Set-Cookie"?: string; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthOidcCallbackResponse"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "get-oidc-config": { + parameters: { + query?: never; + header?: { + Origin?: string; + "X-Forwarded-Host"?: string; + "X-Forwarded-Proto"?: string; + Host?: string; + "User-Agent"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthOidcConfigResponse"]; }; }; /** @description Error */ @@ -17923,14 +21631,11 @@ export interface operations { }; }; }; - deleteEvent: { + "initiate-oidc-device-auth": { parameters: { query?: never; header?: never; - path: { - /** @description Event ID */ - eventId: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -17941,7 +21646,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["AuthOidcDeviceAuthResponse"]; }; }; /** @description Error */ @@ -17955,24 +21660,29 @@ export interface operations { }; }; }; - "get-mono-font": { + "exchange-oidc-device-token": { parameters: { query?: never; - header?: never; + header?: { + "User-Agent"?: string; + }; path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AuthOidcDeviceTokenRequest"]; + }; + }; responses: { /** @description OK */ 200: { headers: { - "Cache-Control"?: string; - "Content-Type"?: string; + "Set-Cookie"?: string; [name: string]: unknown; }; content: { - "application/json": string; + "application/json": components["schemas"]["AuthOidcDeviceTokenResponse"]; }; }; /** @description Error */ @@ -17986,7 +21696,7 @@ export interface operations { }; }; }; - "get-sans-font": { + "list-oidc-role-mappings": { parameters: { query?: never; header?: never; @@ -17998,12 +21708,10 @@ export interface operations { /** @description OK */ 200: { headers: { - "Cache-Control"?: string; - "Content-Type"?: string; [name: string]: unknown; }; content: { - "application/json": string; + "application/json": components["schemas"]["ListOidcRoleMappingsOutputBody"]; }; }; /** @description Error */ @@ -18017,24 +21725,26 @@ export interface operations { }; }; }; - "get-serif-font": { + "create-oidc-role-mapping": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["RoleCreateOidcRoleMapping"]; + }; + }; responses: { /** @description OK */ 200: { headers: { - "Cache-Control"?: string; - "Content-Type"?: string; [name: string]: unknown; }; content: { - "application/json": string; + "application/json": components["schemas"]["CreateOidcRoleMappingOutputBody"]; }; }; /** @description Error */ @@ -18048,16 +21758,19 @@ export interface operations { }; }; }; - syncGitRepositories: { + "update-oidc-role-mapping": { parameters: { query?: never; header?: never; - path?: never; + path: { + /** @description Mapping ID */ + id: string; + }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["GitopsRepositorySyncRequest"]; + "application/json": components["schemas"]["RoleUpdateOidcRoleMapping"]; }; }; responses: { @@ -18067,7 +21780,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["UpdateOidcRoleMappingOutputBody"]; }; }; /** @description Error */ @@ -18081,11 +21794,14 @@ export interface operations { }; }; }; - "health-check": { + "delete-oidc-role-mapping": { parameters: { query?: never; header?: never; - path?: never; + path: { + /** @description Mapping ID */ + id: string; + }; cookie?: never; }; requestBody?: never; @@ -18096,7 +21812,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["SystemHealthResponse"]; + "application/json": components["schemas"]["DeleteOidcRoleMappingOutputBody"]; }; }; /** @description Error */ @@ -18110,7 +21826,7 @@ export interface operations { }; }; }; - "health-check-head": { + "get-oidc-status": { parameters: { query?: never; header?: never; @@ -18124,7 +21840,9 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["AuthOidcStatusInfo"]; + }; }; /** @description Error */ default: { @@ -18137,29 +21855,33 @@ export interface operations { }; }; }; - "dispatch-notification": { + "get-oidc-auth-url": { parameters: { query?: never; header?: { - /** @description Remote environment access token */ - "X-API-Key"?: string; + Origin?: string; + "X-Forwarded-Host"?: string; + "X-Forwarded-Proto"?: string; + Host?: string; + "User-Agent"?: string; }; path?: never; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["NotificationDispatchRequest"]; + "application/json": components["schemas"]["AuthOidcAuthUrlRequest"]; }; }; responses: { /** @description OK */ 200: { headers: { + "Set-Cookie"?: string; [name: string]: unknown; }; content: { - "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; + "application/json": components["schemas"]["AuthOidcAuthUrlResponse"]; }; }; /** @description Error */ @@ -18173,35 +21895,33 @@ export interface operations { }; }; }; - "handle-oidc-callback": { + "list-roles": { parameters: { - query?: never; - header?: { - Origin?: string; - "X-Forwarded-Host"?: string; - "X-Forwarded-Proto"?: string; - Host?: string; + query?: { + /** @description Search by role name or description */ + search?: string; + /** @description Column to sort by */ + sort?: string; + /** @description Sort direction (asc or desc) */ + order?: string; + /** @description Start index for pagination */ + start?: number; + /** @description Items per page */ + limit?: number; }; + header?: never; path?: never; - cookie?: { - /** @description OIDC state cookie from auth URL request */ - oidc_state?: string; - }; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AuthOidcCallbackRequest"]; - }; + cookie?: never; }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { - "Set-Cookie"?: string; [name: string]: unknown; }; content: { - "application/json": components["schemas"]["AuthOidcCallbackResponse"]; + "application/json": components["schemas"]["RolePaginatedResponse"]; }; }; /** @description Error */ @@ -18215,19 +21935,18 @@ export interface operations { }; }; }; - "get-oidc-config": { + "create-role": { parameters: { query?: never; - header?: { - Origin?: string; - "X-Forwarded-Host"?: string; - "X-Forwarded-Proto"?: string; - Host?: string; - }; + header?: never; path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["RoleCreateRole"]; + }; + }; responses: { /** @description OK */ 200: { @@ -18235,7 +21954,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["AuthOidcConfigResponse"]; + "application/json": components["schemas"]["BaseApiResponseRole"]; }; }; /** @description Error */ @@ -18249,7 +21968,7 @@ export interface operations { }; }; }; - "initiate-oidc-device-auth": { + "get-permissions-manifest": { parameters: { query?: never; header?: never; @@ -18264,7 +21983,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["AuthOidcDeviceAuthResponse"]; + "application/json": components["schemas"]["BaseApiResponsePermissionsManifest"]; }; }; /** @description Error */ @@ -18278,27 +21997,25 @@ export interface operations { }; }; }; - "exchange-oidc-device-token": { + "get-role": { parameters: { query?: never; header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AuthOidcDeviceTokenRequest"]; + path: { + /** @description Role ID */ + id: string; }; + cookie?: never; }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { - "Set-Cookie"?: string; [name: string]: unknown; }; content: { - "application/json": components["schemas"]["AuthOidcDeviceTokenResponse"]; + "application/json": components["schemas"]["BaseApiResponseRole"]; }; }; /** @description Error */ @@ -18312,14 +22029,21 @@ export interface operations { }; }; }; - "get-oidc-status": { + "update-role": { parameters: { query?: never; header?: never; - path?: never; + path: { + /** @description Role ID */ + id: string; + }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["RoleUpdateRole"]; + }; + }; responses: { /** @description OK */ 200: { @@ -18327,7 +22051,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["AuthOidcStatusInfo"]; + "application/json": components["schemas"]["BaseApiResponseRole"]; }; }; /** @description Error */ @@ -18341,32 +22065,25 @@ export interface operations { }; }; }; - "get-oidc-auth-url": { + "delete-role": { parameters: { query?: never; - header?: { - Origin?: string; - "X-Forwarded-Host"?: string; - "X-Forwarded-Proto"?: string; - Host?: string; + header?: never; + path: { + /** @description Role ID */ + id: string; }; - path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["AuthOidcAuthUrlRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { - "Set-Cookie"?: string; [name: string]: unknown; }; content: { - "application/json": components["schemas"]["AuthOidcAuthUrlResponse"]; + "application/json": components["schemas"]["BaseApiResponseMessageResponse"]; }; }; /** @description Error */ @@ -18484,6 +22201,8 @@ export interface operations { start?: number; /** @description Items per page */ limit?: number; + /** @description Filter by template type (comma-separated: false,true) */ + type?: string; }; header?: never; path?: never; @@ -19134,6 +22853,109 @@ export interface operations { }; }; }; + getUserAvatar: { + parameters: { + query?: never; + header?: never; + path: { + /** @description User ID */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "Cache-Control"?: string; + "Content-Type"?: string; + "X-Content-Type-Options"?: string; + [name: string]: unknown; + }; + content: { + "application/json": string; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "list-user-role-assignments": { + parameters: { + query?: never; + header?: never; + path: { + /** @description User ID */ + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseListRoleAssignment"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; + "set-user-role-assignments": { + parameters: { + query?: never; + header?: never; + path: { + /** @description User ID */ + userId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RoleSetUserAssignments"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BaseApiResponseListRoleAssignment"]; + }; + }; + /** @description Error */ + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/problem+json": components["schemas"]["ErrorModel"]; + }; + }; + }; + }; getVersion: { parameters: { query?: { From 46bb83022523976bd0299560a41eb6a35a7a47ec Mon Sep 17 00:00:00 2001 From: Xitee <59659167+Xitee1@users.noreply.github.com> Date: Sat, 11 Jul 2026 21:24:21 +0200 Subject: [PATCH 2/8] fix: v2 pagination field names, image timestamps, and blocking check-all MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tested against a live v2.3.2 instance: - All paginated list tools printed "Found undefined": v2 renamed pagination.total to pagination.totalItems (16 modules updated) - Image `created` is a Unix timestamp in v2 — format as ISO date - check-all image updates blocked until every image was checked, hitting the MCP timeout; the client's timeout retry then started duplicate server-side checks. Fire the check in the background instead (new no-retry postInBackground helper) and return immediately - Add arcane_activity_list / arcane_activity_get so progress of background operations can be tracked (176 tools, 26 modules) Co-Authored-By: Claude Fable 5 --- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 8 +- CLAUDE.md | 6 +- README.md | 18 +-- commands/configure.md | 6 +- .../integration/tool-filtering.test.ts | 4 +- src/client/arcane-client.ts | 21 ++- src/constants.ts | 3 + src/prompts/index.ts | 6 +- src/resources/__tests__/resources.test.ts | 2 +- src/resources/index.ts | 2 +- src/tools/__tests__/container-tools.test.ts | 4 +- src/tools/activity-tools.ts | 122 ++++++++++++++++++ src/tools/build-tools.ts | 4 +- src/tools/container-tools.ts | 4 +- src/tools/environment-tools.ts | 4 +- src/tools/event-tools.ts | 8 +- src/tools/gitops-tools.ts | 8 +- src/tools/image-tools.ts | 32 ++--- src/tools/image-update-tools.ts | 13 +- src/tools/index.ts | 2 + src/tools/network-tools.ts | 4 +- src/tools/port-tools.ts | 4 +- src/tools/project-tools.ts | 4 +- src/tools/registry-tools.ts | 4 +- src/tools/settings-tools.ts | 4 +- src/tools/swarm-tools.ts | 4 +- src/tools/template-tools.ts | 4 +- src/tools/user-tools.ts | 4 +- src/tools/volume-tools.ts | 4 +- src/tools/vulnerability-tools.ts | 8 +- src/types/arcane-types.ts | 4 +- src/utils/format.ts | 10 ++ 33 files changed, 246 insertions(+), 91 deletions(-) create mode 100644 src/tools/activity-tools.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 36c7ad6..d098f5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: # so we count those instead of the former `server.registerTool(`. TOTAL=$(grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}') echo "Found $TOTAL tool registrations" - if [ "$TOTAL" -lt 174 ]; then echo "FAIL: Expected 174+"; exit 1; fi + if [ "$TOTAL" -lt 176 ]; then echo "FAIL: Expected 176+"; exit 1; fi - name: Audit production dependencies run: npm audit --audit-level=high --omit=dev diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a865d1..789f4a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [3.0.0] - 2026-07-11 -Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec refreshed from v1.17.0). Tool count changes from 180 to **174**. No v1 compatibility shims — installs running Arcane v1.x should stay on `2.x` of this server. +Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec refreshed from v1.17.0). Tool count changes from 180 to **176** (removed tools whose endpoints no longer exist, added notification-delete and activity-tracking tools). No v1 compatibility shims — installs running Arcane v1.x should stay on `2.x` of this server. ### Removed (endpoints gone in Arcane v2) - `arcane_dashboard_get_action_items` — `/dashboard/action-items` no longer exists. @@ -18,6 +18,12 @@ Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec ref ### Added - `arcane_notification_delete_settings` — delete a provider's notification settings (`DELETE /notifications/settings/{provider}`). +- `arcane_activity_list` / `arcane_activity_get` — track Arcane v2's background activities (image update checks, updater runs, prunes, scans), including progress and messages. + +### Fixed (after testing against a live v2.3.2 instance) +- Paginated list tools printed `Found undefined …`: v2 renamed `pagination.total` to `pagination.totalItems` — updated all 16 list modules. +- Image `created` is a Unix timestamp in v2 and was printed raw — now formatted as an ISO date. +- `arcane_image_update_check_all` / `arcane_image_check_updates_all` blocked until every image was checked, which hit the MCP request timeout — and the client's timeout retry then started duplicate server-side checks. Both tools now fire the check in the background (via a new no-retry `postInBackground` client helper) and return immediately, pointing at `arcane_activity_list` / the update summary for results. ### Changed (breaking, follows Arcane v2 API) - **Notifications** rebuilt on the provider model (`discord`, `email`, `telegram`, `signal`, `slack`, `ntfy`, `pushover`, `matrix`, `generic`): `get_settings` lists providers (or one via `provider`), `update_settings` takes `provider` + `enabled` + `config`, `test` now requires a `provider`. diff --git a/CLAUDE.md b/CLAUDE.md index 94bf20c..b12fc9e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ # Arcane MCP Server -MCP server for Docker management via the Arcane platform. 174 tools, 2 resources, 4 prompts, companion skill, Claude Code plugin. +MCP server for Docker management via the Arcane platform. 176 tools, 2 resources, 4 prompts, companion skill, Claude Code plugin. **Not affiliated with the Arcane project.** @@ -25,7 +25,7 @@ npm run update-api-spec # Refresh OpenAPI spec from live instance - `src/config.ts` — Config from env vars > config file > defaults - `src/constants.ts` — All shared constants (timeouts, limits, versions) -### Tools (174 across 25 modules in `src/tools/`) +### Tools (176 across 26 modules in `src/tools/`) All tools use `server.registerTool()` with: - `title` — human-readable name @@ -41,7 +41,7 @@ All tools use `server.registerTool()` with: 3. Classify annotations: list/get = readOnly, delete/prune = destructive, external calls = openWorld 4. Use `toolHandler()` wrapper — return a plain string, it handles the MCP response envelope 5. Register in `src/tools/index.ts` -6. Verify: `npm run build && grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}'` (expect 174) +6. Verify: `npm run build && grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}'` (expect 176) ### Resources & Prompts diff --git a/README.md b/README.md index 89de592..e9be3ef 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

Manage your entire Docker infrastructure through natural language.
- 174 tools. One MCP server. Zero context switching. + 176 tools. One MCP server. Zero context switching.

@@ -21,7 +21,7 @@ Tool FilteringWhat Can It DoCompanion Skill • - All Tools • + All ToolsInteractive Installer

@@ -35,7 +35,7 @@ Arcane MCP Server is a complete AI-powered Docker management bundle — an **MCP server**, a **Claude Code plugin**, and a **companion skill**, all in one package. -- The **MCP server** gives your AI assistant 174 tools to control your [Arcane](https://github.com/getarcaneapp/arcane) Docker platform — containers, images, stacks, Swarm clusters, security scans, and more. Filter that set down to a preset ([see Tool Filtering](#tool-filtering)) if all 174 is more than your context window can spare. +- The **MCP server** gives your AI assistant 176 tools to control your [Arcane](https://github.com/getarcaneapp/arcane) Docker platform — containers, images, stacks, Swarm clusters, security scans, and more. Filter that set down to a preset ([see Tool Filtering](#tool-filtering)) if all 176 is more than your context window can spare. - The **plugin** wraps everything into a single install with guided configuration — no manual env vars or config files. - The **companion skill** teaches your AI *how* to use those tools — safe deployment workflows, troubleshooting patterns, and guardrails so it doesn't accidentally nuke your volumes. @@ -71,7 +71,7 @@ Every tool carries **safety annotations** so your AI knows which operations are ## Tool Filtering -Exposing all 174 tools to Claude every turn chews through your context window. Pick a **preset** to trim the active tool set — only the tools in that preset appear in `tools/list`: +Exposing all 176 tools to Claude every turn chews through your context window. Pick a **preset** to trim the active tool set — only the tools in that preset appear in `tools/list`: | Preset | Scope | Tools | |---|---|---| @@ -79,7 +79,7 @@ Exposing all 174 tools to Claude every turn chews through your context window. P | `read-only` | every `*_list` / `*_get` / `*_inspect` / `*_stats` across all modules | ~60 | | `minimal` | dashboard + container list / get / counts | 5 | | `deploy` | projects, gitops, templates, registries, environments, build | ~40 | -| `full` *(default if never configured)* | everything | 174 | +| `full` *(default if never configured)* | everything | 176 | | `custom` | your own module + per-tool picks | variable | **Configure interactively** in Claude Code: @@ -271,7 +271,7 @@ And a Claude Code slash command: --- -## All 174 Tools +## All 176 Tools ### Containers (11) @@ -395,7 +395,7 @@ And a Claude Code slash command:
-GitOps, Webhooks, Auto-Updater & Dashboard (21 tools) +GitOps, Webhooks, Auto-Updater, Dashboard & Activities (23 tools) | Tool | Description | |------|-------------| @@ -420,6 +420,8 @@ And a Claude Code slash command: | `arcane_updater_get_status` | Get updater schedule | | `arcane_updater_get_history` | Get update history | | `arcane_dashboard_get` | Get dashboard snapshot | +| `arcane_activity_list` | List background activities (update checks, prunes, scans) | +| `arcane_activity_get` | Get activity progress and messages |
@@ -512,7 +514,7 @@ src/ arcane-client.ts # HTTP client (retry, SSL, size limits) auth/ auth-manager.ts # JWT auto-refresh + API key auth - tools/ # 25 modules, 174 tools + tools/ # 26 modules, 176 tools registry.ts # ToolRegistry — captures RegisteredTool handles, applies filter presets.ts # commonly-used / read-only / minimal / deploy / full / custom resources/ # 4 MCP Resources diff --git a/commands/configure.md b/commands/configure.md index 5c4a441..f483f31 100644 --- a/commands/configure.md +++ b/commands/configure.md @@ -5,7 +5,7 @@ allowed-tools: [Read, Write, AskUserQuestion, Bash, ReadMcpResourceTool] # /arcane:configure — Tool filter setup -Use this slash command to trim which Arcane MCP tools are exposed to Claude Code. The full server registers 174 tools; surfacing all of them in `tools/list` bloats the context window. This command writes a `tools` block to `~/.arcane/config.json` that selects a preset, module allowlist, and per-tool overrides. The Arcane MCP server picks up changes live when its config watcher is attached. +Use this slash command to trim which Arcane MCP tools are exposed to Claude Code. The full server registers 176 tools; surfacing all of them in `tools/list` bloats the context window. This command writes a `tools` block to `~/.arcane/config.json` that selects a preset, module allowlist, and per-tool overrides. The Arcane MCP server picks up changes live when its config watcher is attached. ## Workflow @@ -14,7 +14,7 @@ Use this slash command to trim which Arcane MCP tools are exposed to Claude Code - `read-only` — every `*_list` / `*_get` / `*_inspect` / `*_stats` / `*_status` / `*_summary` tool (~60 tools) - `minimal` — dashboard + container list/get/counts (5 tools) - `deploy` — project, gitops, template, registry, environment, build (~40 tools) - - `full` — all 174 tools (current default if the user has never configured this) + - `full` — all 176 tools (current default if the user has never configured this) - `custom` — fine-tune modules and individual tools 2. **If the user picks `custom`** (or says they want to fine-tune after picking another preset): @@ -60,6 +60,6 @@ Use this slash command to trim which Arcane MCP tools are exposed to Claude Code ## Notes -- Keep the conversation tight. Do not dump the full 174-tool list — summarise the chosen preset and let the user opt into fine-tuning. +- Keep the conversation tight. Do not dump the full 176-tool list — summarise the chosen preset and let the user opt into fine-tuning. - Never remove other keys from `~/.arcane/config.json`. A malformed file will brick the server. - For Claude Desktop and other MCP clients without slash commands, the same flow is available via the `arcane_configure_tools` prompt — this slash command is a Claude Code shortcut to the same outcome. diff --git a/src/__tests__/integration/tool-filtering.test.ts b/src/__tests__/integration/tool-filtering.test.ts index 2436bca..8e207e7 100644 --- a/src/__tests__/integration/tool-filtering.test.ts +++ b/src/__tests__/integration/tool-filtering.test.ts @@ -59,7 +59,7 @@ describe("integration: boot-per-preset", () => { expect(enabled).toBe(registry.allToolNames().length); expect(disabled).toBe(0); // And the registry captured the full module inventory - expect(registry.allModules().length).toBe(25); + expect(registry.allModules().length).toBe(26); }); it("undefined config falls back to full (backwards-compatible)", () => { @@ -296,7 +296,7 @@ describe("integration: upgrade notice lifecycle", () => { // Unconfigured state → explicit call to /arcane:configure const handler = handlers.get("arcane-tools-config-notice")!; const result = await handler(new URL("arcane://tools-config-notice")); - expect(result.contents[0].text).toContain("174 tools"); + expect(result.contents[0].text).toContain("176 tools"); expect(result.contents[0].text).toContain("/arcane:configure"); // Flip to configured — body should swap diff --git a/src/client/arcane-client.ts b/src/client/arcane-client.ts index 5bcce8a..e3f8d2e 100644 --- a/src/client/arcane-client.ts +++ b/src/client/arcane-client.ts @@ -11,6 +11,7 @@ import { RETRY_BASE_DELAY_MS, MAX_RESPONSE_SIZE, RETRYABLE_STATUS_CODES, + BACKGROUND_REQUEST_TIMEOUT_MS, } from "../constants.js"; export interface RequestOptions { @@ -30,9 +31,10 @@ export interface PaginatedResponse { success: boolean; data: T[]; pagination: { - total: number; - start: number; - limit: number; + totalItems: number; + totalPages: number; + currentPage: number; + itemsPerPage: number; }; } @@ -259,6 +261,19 @@ export class ArcaneClient { return this.request(path, { method: "DELETE", params, body }); } + /** + * Fire a long-running POST without awaiting its completion. + * Uses a generous timeout so the built-in timeout retry never re-triggers + * the operation on the server (e.g. duplicate image-update checks). + * Errors are logged instead of thrown — callers respond immediately. + */ + postInBackground(path: string, body?: unknown): void { + this.request(path, { method: "POST", body, timeout: BACKGROUND_REQUEST_TIMEOUT_MS }).catch((error) => { + const message = error instanceof Error ? error.message : String(error); + logger.warn(`Background request POST ${path} failed: ${message}`); + }); + } + /** * Get the base URL */ diff --git a/src/constants.ts b/src/constants.ts index 7ead50d..f81c77a 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -10,6 +10,9 @@ export const TOKEN_REFRESH_BUFFER_MS = 60 * 1000; /** Default HTTP request timeout */ export const DEFAULT_REQUEST_TIMEOUT_MS = 30000; +/** Timeout for fire-and-forget background requests (long-running server-side operations) */ +export const BACKGROUND_REQUEST_TIMEOUT_MS = 10 * 60 * 1000; + /** Session timeout - 30 minutes of inactivity */ export const SESSION_TIMEOUT_MS = 30 * 60 * 1000; diff --git a/src/prompts/index.ts b/src/prompts/index.ts index a3387af..7b94cc3 100644 --- a/src/prompts/index.ts +++ b/src/prompts/index.ts @@ -188,7 +188,7 @@ export function registerPrompts(server: McpServer): void { "Help the user configure which Arcane MCP tools are active.", "", "Context:", - "- Arcane registers 174 tools by default, which bloats the tool-list context window.", + "- Arcane registers 176 tools by default, which bloats the tool-list context window.", "- The server supports a `tools` config in `~/.arcane/config.json` (or env vars ARCANE_TOOL_PRESET / ARCANE_ENABLED_MODULES / ARCANE_ENABLED_TOOLS / ARCANE_DISABLED_TOOLS).", "- Hot reload: changes to `~/.arcane/config.json` apply live via `notifications/tools/list_changed`.", "- If the watcher isn't attached (e.g., missing file or HTTP-only setup), the user must reconnect the MCP server for changes to take effect.", @@ -198,7 +198,7 @@ export function registerPrompts(server: McpServer): void { "- read-only: every *_list / *_get / *_inspect / *_stats / *_status / *_summary tool (~60 tools)", "- minimal: dashboard + container list/get/counts (5 tools)", "- deploy: project, gitops, template, registry, environment, build (~40 tools)", - "- full: all 174 (default on upgrade)", + "- full: all 176 (default on upgrade)", "- custom: fine-grained modules + per-tool overrides only", "", "Flow:", @@ -216,7 +216,7 @@ export function registerPrompts(server: McpServer): void { "network, network-topology, notification, port, project, registry, settings, swarm, system,", "template, updater, user, volume, vulnerability, webhook", "", - "Keep the conversation short — don't re-print the full 174-tool list. Confirm the chosen preset and summarise the tools/modules set before writing.", + "Keep the conversation short — don't re-print the full 176-tool list. Confirm the chosen preset and summarise the tools/modules set before writing.", ].join("\n"), }, }, diff --git a/src/resources/__tests__/resources.test.ts b/src/resources/__tests__/resources.test.ts index fcdc4e5..c754ed2 100644 --- a/src/resources/__tests__/resources.test.ts +++ b/src/resources/__tests__/resources.test.ts @@ -131,7 +131,7 @@ describe("resources", () => { const result = await handler(new URL("arcane://tools-config-notice")); const text = result.contents[0].text; - expect(text).toContain("174 tools"); + expect(text).toContain("176 tools"); expect(text).toContain("/arcane:configure"); expect(text).toContain("commonly-used"); }); diff --git a/src/resources/index.ts b/src/resources/index.ts index 626737b..63970a7 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -186,7 +186,7 @@ export function registerResources(server: McpServer): void { const lines: string[] = []; if (unconfigured) { - lines.push("Arcane MCP Server is currently exposing all 174 tools."); + lines.push("Arcane MCP Server is currently exposing all 176 tools."); lines.push(""); lines.push("You can reduce context bloat by picking a preset:"); lines.push(" - commonly-used — containers, images, projects, volumes, networks (~52 tools)"); diff --git a/src/tools/__tests__/container-tools.test.ts b/src/tools/__tests__/container-tools.test.ts index f5222b4..55b89c1 100644 --- a/src/tools/__tests__/container-tools.test.ts +++ b/src/tools/__tests__/container-tools.test.ts @@ -90,7 +90,7 @@ describe("container-tools", () => { ports: [], }, ], - pagination: { total: 2, start: 0, limit: 20 }, + pagination: { totalItems: 2, totalPages: 1, currentPage: 1, itemsPerPage: 20 }, }); const handler = server.tools.get("arcane_container_list")!; @@ -114,7 +114,7 @@ describe("container-tools", () => { it("returns 'No containers found' when empty", async () => { mockClient.get.mockResolvedValueOnce({ data: [], - pagination: { total: 0, start: 0, limit: 20 }, + pagination: { totalItems: 0, totalPages: 0, currentPage: 1, itemsPerPage: 20 }, }); const handler = server.tools.get("arcane_container_list")!; diff --git a/src/tools/activity-tools.ts b/src/tools/activity-tools.ts new file mode 100644 index 0000000..4818fd2 --- /dev/null +++ b/src/tools/activity-tools.ts @@ -0,0 +1,122 @@ +/** + * Activity tracking tools for Arcane MCP Server + * + * Arcane v2 runs long operations (image update checks, updater runs, prunes, + * vulnerability scans) as background activities. These tools let clients + * track that progress without waiting on the original request. + */ + +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { z } from "zod"; +import { toolHandler } from "../utils/tool-helpers.js"; +import { moduleRegistrar, type ToolRegistry } from "./registry.js"; + +interface Activity { + id: string; + type: string; + status: string; + progress?: number; + step?: string; + latestMessage?: string; + resourceType?: string; + resourceName?: string; + error?: string; + startedAt?: string; + endedAt?: string; + durationMs?: number; + createdAt: string; +} + +function formatActivity(a: Activity): string[] { + const progress = a.progress !== undefined ? ` ${a.progress}%` : ""; + const lines = [`[${a.status.toUpperCase()}${progress}] ${a.type} (ID: ${a.id})`]; + if (a.resourceName) lines.push(` Resource: ${a.resourceType ? `${a.resourceType}/` : ""}${a.resourceName}`); + if (a.latestMessage) lines.push(` ${a.latestMessage}`); + if (a.error) lines.push(` Error: ${a.error}`); + lines.push(` Started: ${a.startedAt || a.createdAt}${a.endedAt ? ` — Ended: ${a.endedAt}` : ""}`); + lines.push(""); + return lines; +} + +export function registerActivityTools(server: McpServer, registry?: ToolRegistry): void { + const register = moduleRegistrar(server, registry, "activity"); + + // arcane_activity_list + register( + "arcane_activity_list", + { + title: "List activities", + description: "List background activities (image update checks, updater runs, prunes, scans) for an environment. Use this to track long-running operations.", + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false, + }, + inputSchema: { + environmentId: z.string().describe("Environment ID"), + status: z.string().optional().describe("Filter by status (e.g., running, completed, failed)"), + type: z.string().optional().describe("Filter by activity type"), + start: z.number().optional().default(0).describe("Pagination start"), + limit: z.number().optional().default(20).describe("Items per page"), + }, + }, + toolHandler(async ({ environmentId, status, type, start, limit }, client) => { + const response = await client.get<{ + data: Activity[]; + pagination: { totalItems: number }; + }>(`/environments/${environmentId}/activities`, { status, type, start, limit }); + + if (!response.data || response.data.length === 0) { + return "No activities found."; + } + + const lines = [`Found ${response.pagination.totalItems} activities:\n`]; + for (const activity of response.data) { + lines.push(...formatActivity(activity)); + } + + return lines.join("\n"); + }) + ); + + // arcane_activity_get + register( + "arcane_activity_get", + { + title: "Get activity details", + description: "Get details and progress messages of a background activity", + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false, + }, + inputSchema: { + environmentId: z.string().describe("Environment ID"), + activityId: z.string().describe("Activity ID"), + limit: z.number().optional().default(20).describe("Number of progress messages to return"), + }, + }, + toolHandler(async ({ environmentId, activityId, limit }, client) => { + const response = await client.get<{ + data: { + activity: Activity; + messages?: Array<{ createdAt: string; level: string; message: string }>; + }; + }>(`/environments/${environmentId}/activities/${activityId}`, { limit }); + + const lines = formatActivity(response.data.activity); + + if (response.data.messages && response.data.messages.length > 0) { + lines.push("Messages:"); + for (const msg of response.data.messages) { + lines.push(` [${msg.createdAt}] [${msg.level.toUpperCase()}] ${msg.message}`); + } + } + + return lines.join("\n"); + }) + ); + +} diff --git a/src/tools/build-tools.ts b/src/tools/build-tools.ts index 9dee058..b313276 100644 --- a/src/tools/build-tools.ts +++ b/src/tools/build-tools.ts @@ -72,7 +72,7 @@ export function registerBuildTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, status, search, start, limit }, client) => { const response = await client.get<{ data: Build[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/images/builds`, { status, search, start, limit, }); @@ -81,7 +81,7 @@ export function registerBuildTools(server: McpServer, registry?: ToolRegistry): return "No builds found."; } - const lines = [`Found ${response.pagination.total} builds:\n`]; + const lines = [`Found ${response.pagination.totalItems} builds:\n`]; for (const build of response.data) { lines.push(`[${build.status.toUpperCase()}] ${build.tag || build.id}`); lines.push(` Build ID: ${build.id}`); diff --git a/src/tools/container-tools.ts b/src/tools/container-tools.ts index 2a53a28..d3e3487 100644 --- a/src/tools/container-tools.ts +++ b/src/tools/container-tools.ts @@ -37,14 +37,14 @@ export function registerContainerTools(server: McpServer, registry?: ToolRegistr toolHandler(async ({ environmentId, search, sort, order, start, limit, includeInternal }, client) => { const response = await client.get<{ data: Container[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/containers`, { search, sort, order, start, limit, includeInternal }); if (!response.data || response.data.length === 0) { return "No containers found."; } - const lines = [`Found ${response.pagination.total} containers:\n`]; + const lines = [`Found ${response.pagination.totalItems} containers:\n`]; for (const container of response.data) { const status = container.state === "running" ? "[RUNNING]" : "[STOPPED]"; lines.push(`${status} ${container.name}`); diff --git a/src/tools/environment-tools.ts b/src/tools/environment-tools.ts index aca7cdd..4256add 100644 --- a/src/tools/environment-tools.ts +++ b/src/tools/environment-tools.ts @@ -34,14 +34,14 @@ export function registerEnvironmentTools(server: McpServer, registry?: ToolRegis toolHandler(async ({ search, sort, order, start, limit }, client) => { const response = await client.get<{ data: Environment[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>("/environments", { search, sort, order, start, limit }); if (!response.data || response.data.length === 0) { return "No environments found."; } - const lines = [`Found ${response.pagination.total} environments:\n`]; + const lines = [`Found ${response.pagination.totalItems} environments:\n`]; for (const env of response.data) { const status = env.status || "unknown"; lines.push(`[${status.toUpperCase()}] ${env.name} (ID: ${env.id})`); diff --git a/src/tools/event-tools.ts b/src/tools/event-tools.ts index c658031..2f4cce5 100644 --- a/src/tools/event-tools.ts +++ b/src/tools/event-tools.ts @@ -34,14 +34,14 @@ export function registerEventTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ type, severity, start, limit }, client) => { const response = await client.get<{ data: Event[]; - pagination: { total: number }; + pagination: { totalItems: number }; }>("/events", { type, severity, start, limit }); if (!response.data || response.data.length === 0) { return "No events found."; } - const lines = [`Found ${response.pagination.total} events:\n`]; + const lines = [`Found ${response.pagination.totalItems} events:\n`]; for (const event of response.data.slice(0, MAX_DISPLAY_EVENTS)) { const time = new Date(event.createdAt).toLocaleString(); lines.push(`[${time}] [${event.severity.toUpperCase()}] ${event.type}`); @@ -85,14 +85,14 @@ export function registerEventTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, type, start, limit }, client) => { const response = await client.get<{ data: Event[]; - pagination: { total: number }; + pagination: { totalItems: number }; }>(`/events/environment/${environmentId}`, { type, start, limit }); if (!response.data || response.data.length === 0) { return "No events found for this environment."; } - const lines = [`Found ${response.pagination.total} events:\n`]; + const lines = [`Found ${response.pagination.totalItems} events:\n`]; for (const event of response.data.slice(0, MAX_DISPLAY_EVENTS)) { const time = new Date(event.createdAt).toLocaleString(); lines.push(`[${time}] [${event.severity.toUpperCase()}] ${event.type}`); diff --git a/src/tools/gitops-tools.ts b/src/tools/gitops-tools.ts index 405b7c5..fbb3b33 100644 --- a/src/tools/gitops-tools.ts +++ b/src/tools/gitops-tools.ts @@ -36,14 +36,14 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, search, start, limit }, client) => { const response = await client.get<{ data: GitOpsSync[]; - pagination: { total: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/gitops-syncs`, { search, start, limit }); if (!response.data || response.data.length === 0) { return "No GitOps syncs configured."; } - const lines = [`Found ${response.pagination.total} GitOps syncs:\n`]; + const lines = [`Found ${response.pagination.totalItems} GitOps syncs:\n`]; for (const sync of response.data) { const status = sync.lastSyncStatus || "never synced"; lines.push(`${sync.name}`); @@ -278,14 +278,14 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ search, start, limit }, client) => { const response = await client.get<{ data: GitRepository[]; - pagination: { total: number }; + pagination: { totalItems: number }; }>("/customize/git-repositories", { search, start, limit }); if (!response.data || response.data.length === 0) { return "No Git repositories configured."; } - const lines = [`Found ${response.pagination.total} repositories:\n`]; + const lines = [`Found ${response.pagination.totalItems} repositories:\n`]; for (const repo of response.data) { lines.push(`${repo.name}`); lines.push(` ID: ${repo.id}`); diff --git a/src/tools/image-tools.ts b/src/tools/image-tools.ts index 122ae11..fd7acd6 100644 --- a/src/tools/image-tools.ts +++ b/src/tools/image-tools.ts @@ -6,7 +6,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; -import { formatSize, formatSizeMB, formatSizeGB } from "../utils/format.js"; +import { formatSize, formatSizeMB, formatSizeGB, formatUnixTimestamp } from "../utils/format.js"; import { DOCKER_DIGEST_PREFIX_LENGTH, DOCKER_SHORT_ID_LENGTH } from "../constants.js"; import type { Image } from "../types/arcane-types.js"; @@ -36,20 +36,20 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, search, sort, order, start, limit }, client) => { const response = await client.get<{ data: Image[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/images`, { search, sort, order, start, limit }); if (!response.data || response.data.length === 0) { return "No images found."; } - const lines = [`Found ${response.pagination.total} images:\n`]; + const lines = [`Found ${response.pagination.totalItems} images:\n`]; for (const img of response.data) { const tags = img.repoTags?.join(", ") || ""; lines.push(`${tags}`); lines.push(` ID: ${img.id.substring(DOCKER_DIGEST_PREFIX_LENGTH, DOCKER_DIGEST_PREFIX_LENGTH + DOCKER_SHORT_ID_LENGTH)}`); lines.push(` Size: ${formatSize(img.size)}`); - lines.push(` Created: ${img.created}`); + lines.push(` Created: ${formatUnixTimestamp(img.created)}`); lines.push(""); } @@ -86,7 +86,7 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): ` ID: ${img.id}`, ` Tags: ${img.repoTags?.join(", ") || "none"}`, ` Size: ${formatSizeMB(img.size)}`, - ` Created: ${img.created}`, + ` Created: ${formatUnixTimestamp(img.created)}`, ]; if (img.repoDigests && img.repoDigests.length > 0) { @@ -258,7 +258,7 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): "arcane_image_check_updates_all", { title: "Check all image updates", - description: "Check for updates on all images in an environment", + description: "Start an update check for all images in an environment. The check runs in the background (can take several minutes) — track progress with arcane_activity_list and read the results with arcane_image_get_update_summary.", annotations: { readOnlyHint: true, destructiveHint: false, @@ -270,21 +270,13 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.post<{ - data: Record; - }>(`/environments/${environmentId}/image-updates/check-all`, {}); + client.postInBackground(`/environments/${environmentId}/image-updates/check-all`, {}); - const updates = Object.entries(response.data || {}).filter(([, r]) => r.hasUpdate); - if (updates.length === 0) { - return "All images are up to date."; - } - - const lines = [`Found ${updates.length} images with updates:\n`]; - for (const [imageRef] of updates) { - lines.push(` - ${imageRef}`); - } - - return lines.join("\n"); + return [ + "Update check for all images started in the background (this can take several minutes).", + "Track progress with arcane_activity_list (it also appears in Arcane's Activity Center).", + "Once finished, read the results with arcane_image_get_update_summary.", + ].join("\n"); }) ); diff --git a/src/tools/image-update-tools.ts b/src/tools/image-update-tools.ts index 0387f51..b4c4d98 100644 --- a/src/tools/image-update-tools.ts +++ b/src/tools/image-update-tools.ts @@ -129,7 +129,7 @@ export function registerImageUpdateTools(server: McpServer, registry?: ToolRegis "arcane_image_update_check_all", { title: "Check all image updates", - description: "Check all images in an environment for available updates", + description: "Start an update check for all images in an environment. The check runs in the background (can take several minutes) — track progress with arcane_activity_list and read the results with arcane_image_update_get_summary.", annotations: { readOnlyHint: true, destructiveHint: false, @@ -141,12 +141,13 @@ export function registerImageUpdateTools(server: McpServer, registry?: ToolRegis }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.post<{ data: BatchImageUpdateResponse }>( - `/environments/${environmentId}/image-updates/check-all`, - {} - ); + client.postInBackground(`/environments/${environmentId}/image-updates/check-all`, {}); - return formatBatchResults(response.data || {}); + return [ + "Update check for all images started in the background (this can take several minutes).", + "Track progress with arcane_activity_list (it also appears in Arcane's Activity Center).", + "Once finished, read the results with arcane_image_update_get_summary or arcane_image_update_check_multiple for specific images.", + ].join("\n"); }) ); diff --git a/src/tools/index.ts b/src/tools/index.ts index 1f6ee11..5d68d95 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -32,6 +32,7 @@ import { registerImageUpdateTools } from "./image-update-tools.js"; import { registerBuildTools } from "./build-tools.js"; import { registerNetworkTopologyTools } from "./network-topology-tools.js"; import { registerDashboardTools } from "./dashboard-tools.js"; +import { registerActivityTools } from "./activity-tools.js"; import { registerPortTools } from "./port-tools.js"; import { registerUpdaterTools } from "./updater-tools.js"; @@ -70,6 +71,7 @@ export function registerAllTools(server: McpServer, toolsConfig?: ToolsConfig): registerBuildTools(server, registry); registerNetworkTopologyTools(server, registry); registerDashboardTools(server, registry); + registerActivityTools(server, registry); registerPortTools(server, registry); registerUpdaterTools(server, registry); diff --git a/src/tools/network-tools.ts b/src/tools/network-tools.ts index 5b991d9..0d10d47 100644 --- a/src/tools/network-tools.ts +++ b/src/tools/network-tools.ts @@ -36,14 +36,14 @@ export function registerNetworkTools(server: McpServer, registry?: ToolRegistry) toolHandler(async ({ environmentId, search, sort, order, start, limit }, client) => { const response = await client.get<{ data: Network[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/networks`, { search, sort, order, start, limit }); if (!response.data || response.data.length === 0) { return "No networks found."; } - const lines = [`Found ${response.pagination.total} networks:\n`]; + const lines = [`Found ${response.pagination.totalItems} networks:\n`]; for (const net of response.data) { lines.push(`${net.name}`); lines.push(` ID: ${net.id.substring(0, DOCKER_SHORT_ID_LENGTH)}`); diff --git a/src/tools/port-tools.ts b/src/tools/port-tools.ts index b4c09c3..a4706fa 100644 --- a/src/tools/port-tools.ts +++ b/src/tools/port-tools.ts @@ -35,14 +35,14 @@ export function registerPortTools(server: McpServer, registry?: ToolRegistry): v toolHandler(async ({ environmentId, search, sort, order, start, limit }, client) => { const response = await client.get<{ data: PortMapping[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/ports`, { search, sort, order, start, limit }); if (!response.data || response.data.length === 0) { return "No port mappings found."; } - const lines = [`Found ${response.pagination.total} port mappings:\n`]; + const lines = [`Found ${response.pagination.totalItems} port mappings:\n`]; for (const port of response.data) { const binding = port.publicPort ? `${port.ip || "0.0.0.0"}:${port.publicPort} -> ${port.privatePort}/${port.protocol}` diff --git a/src/tools/project-tools.ts b/src/tools/project-tools.ts index a1878a7..5270a44 100644 --- a/src/tools/project-tools.ts +++ b/src/tools/project-tools.ts @@ -36,14 +36,14 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) toolHandler(async ({ environmentId, search, sort, order, start, limit }, client) => { const response = await client.get<{ data: Project[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/projects`, { search, sort, order, start, limit }); if (!response.data || response.data.length === 0) { return "No projects found."; } - const lines = [`Found ${response.pagination.total} projects:\n`]; + const lines = [`Found ${response.pagination.totalItems} projects:\n`]; for (const project of response.data) { const status = project.status === "running" ? "[RUNNING]" : "[STOPPED]"; lines.push(`${status} ${project.name}`); diff --git a/src/tools/registry-tools.ts b/src/tools/registry-tools.ts index 9a9fe71..369fbf8 100644 --- a/src/tools/registry-tools.ts +++ b/src/tools/registry-tools.ts @@ -31,14 +31,14 @@ export function registerRegistryTools(server: McpServer, registry?: ToolRegistry toolHandler(async ({ search, start, limit }, client) => { const response = await client.get<{ data: ContainerRegistry[]; - pagination: { total: number }; + pagination: { totalItems: number }; }>("/container-registries", { search, start, limit }); if (!response.data || response.data.length === 0) { return "No container registries configured."; } - const lines = [`Found ${response.pagination.total} registries:\n`]; + const lines = [`Found ${response.pagination.totalItems} registries:\n`]; for (const reg of response.data) { const status = reg.lastTestStatus || "untested"; lines.push(`${reg.name}`); diff --git a/src/tools/settings-tools.ts b/src/tools/settings-tools.ts index d8afacb..e73ce62 100644 --- a/src/tools/settings-tools.ts +++ b/src/tools/settings-tools.ts @@ -205,14 +205,14 @@ export function registerSettingsTools(server: McpServer, registry?: ToolRegistry lastUsedAt?: string; expiresAt?: string; }>; - pagination: { total: number }; + pagination: { totalItems: number }; }>("/api-keys", { start, limit }); if (!response.data || response.data.length === 0) { return "No API keys found."; } - const lines = [`Found ${response.pagination.total} API keys:\n`]; + const lines = [`Found ${response.pagination.totalItems} API keys:\n`]; for (const key of response.data) { lines.push(`${key.name}`); lines.push(` ID: ${key.id}`); diff --git a/src/tools/swarm-tools.ts b/src/tools/swarm-tools.ts index e8a19b8..44a2973 100644 --- a/src/tools/swarm-tools.ts +++ b/src/tools/swarm-tools.ts @@ -35,14 +35,14 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, search, sort, order, start, limit }, client) => { const response = await client.get<{ data: SwarmService[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/swarm/services`, { search, sort, order, start, limit }); if (!response.data || response.data.length === 0) { return "No swarm services found."; } - const lines = [`Found ${response.pagination.total} swarm services:\n`]; + const lines = [`Found ${response.pagination.totalItems} swarm services:\n`]; for (const svc of response.data) { lines.push(`${svc.name}`); lines.push(` ID: ${svc.id}`); diff --git a/src/tools/template-tools.ts b/src/tools/template-tools.ts index 6083afe..6ad6e5a 100644 --- a/src/tools/template-tools.ts +++ b/src/tools/template-tools.ts @@ -32,14 +32,14 @@ export function registerTemplateTools(server: McpServer, registry?: ToolRegistry toolHandler(async ({ search, category, start, limit }, client) => { const response = await client.get<{ data: Template[]; - pagination: { total: number }; + pagination: { totalItems: number }; }>("/templates", { search, category, start, limit }); if (!response.data || response.data.length === 0) { return "No templates found."; } - const lines = [`Found ${response.pagination.total} templates:\n`]; + const lines = [`Found ${response.pagination.totalItems} templates:\n`]; for (const tmpl of response.data) { lines.push(`${tmpl.name}`); lines.push(` ID: ${tmpl.id}`); diff --git a/src/tools/user-tools.ts b/src/tools/user-tools.ts index 9ecf2b5..5a48ab3 100644 --- a/src/tools/user-tools.ts +++ b/src/tools/user-tools.ts @@ -31,14 +31,14 @@ export function registerUserTools(server: McpServer, registry?: ToolRegistry): v toolHandler(async ({ search, start, limit }, client) => { const response = await client.get<{ data: User[]; - pagination: { total: number }; + pagination: { totalItems: number }; }>("/users", { search, start, limit }); if (!response.data || response.data.length === 0) { return "No users found."; } - const lines = [`Found ${response.pagination.total} users:\n`]; + const lines = [`Found ${response.pagination.totalItems} users:\n`]; for (const user of response.data) { lines.push(`${user.username}${user.displayName ? ` (${user.displayName})` : ""}`); lines.push(` ID: ${user.id}`); diff --git a/src/tools/volume-tools.ts b/src/tools/volume-tools.ts index 083b53e..bc3d3a3 100644 --- a/src/tools/volume-tools.ts +++ b/src/tools/volume-tools.ts @@ -38,14 +38,14 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, search, sort, order, start, limit }, client) => { const response = await client.get<{ data: Volume[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/volumes`, { search, sort, order, start, limit }); if (!response.data || response.data.length === 0) { return "No volumes found."; } - const lines = [`Found ${response.pagination.total} volumes:\n`]; + const lines = [`Found ${response.pagination.totalItems} volumes:\n`]; for (const vol of response.data) { lines.push(`${vol.name}`); lines.push(` Driver: ${vol.driver}`); diff --git a/src/tools/vulnerability-tools.ts b/src/tools/vulnerability-tools.ts index c614a71..199c8f8 100644 --- a/src/tools/vulnerability-tools.ts +++ b/src/tools/vulnerability-tools.ts @@ -178,7 +178,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg toolHandler(async ({ environmentId, imageId, severity, search, sort, order, start, limit }, client) => { const response = await client.get<{ data: Vulnerability[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/images/${imageId}/vulnerabilities/list`, { severity, search, sort, order, start, limit, }); @@ -187,7 +187,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg return "No vulnerabilities found matching criteria."; } - const lines = [`Found ${response.pagination.total} vulnerabilities:\n`]; + const lines = [`Found ${response.pagination.totalItems} vulnerabilities:\n`]; for (const vuln of response.data) { lines.push(...formatVulnerability(vuln)); } @@ -346,7 +346,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg toolHandler(async ({ environmentId, severity, imageName, search, start, limit }, client) => { const response = await client.get<{ data: Vulnerability[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/vulnerabilities/all`, { severity, imageName, search, start, limit, }); @@ -355,7 +355,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg return "No vulnerabilities found matching criteria."; } - const lines = [`Found ${response.pagination.total} vulnerabilities across environment:\n`]; + const lines = [`Found ${response.pagination.totalItems} vulnerabilities across environment:\n`]; for (const vuln of response.data) { lines.push(...formatVulnerability(vuln)); } diff --git a/src/types/arcane-types.ts b/src/types/arcane-types.ts index 193c176..0e2561b 100644 --- a/src/types/arcane-types.ts +++ b/src/types/arcane-types.ts @@ -70,9 +70,11 @@ export interface Image { id: string; repoTags: string[]; repoDigests?: string[]; - created: string; + /** Unix timestamp (seconds) */ + created: number; size: number; virtualSize?: number; + inUse?: boolean; } // === Image Updates === diff --git a/src/utils/format.ts b/src/utils/format.ts index 25b1172..b435f47 100644 --- a/src/utils/format.ts +++ b/src/utils/format.ts @@ -50,6 +50,16 @@ export function formatSizeGB(bytes: number): string { return `${(bytes / BYTES_PER_GB).toFixed(2)} GB`; } +/** + * Format a Unix timestamp (seconds) as an ISO date string. + * + * Example: "2026-07-11T19:03:39.000Z" + */ +export function formatUnixTimestamp(seconds: number | undefined | null): string { + if (!seconds) return "unknown"; + return new Date(seconds * 1000).toISOString(); +} + /** * Validate a file path parameter to prevent path traversal attacks. * Rejects paths containing ".." sequences. From a3b15d3b0d532d82c962ee10f9f88b9dac6d5959 Mon Sep 17 00:00:00 2001 From: Xitee <59659167+Xitee1@users.noreply.github.com> Date: Sat, 11 Jul 2026 21:30:40 +0200 Subject: [PATCH 3/8] fix: resolve image names to IDs and correct created-timestamp handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - The v2 API only accepts image IDs in path params — names like amir20/dozzle:latest 404 (slash breaks the route). Add resolveImageId which looks names up via the image list; used by image get/delete and the vulnerability scan/result/summary/list tools - arcane_image_get threw "Invalid time value": the detail endpoint returns created as an ISO string while the list uses a Unix timestamp; format each accordingly and make formatUnixTimestamp defensive Verified against a live v2.3.2 instance (name resolution, detail fetch, short-ID passthrough). Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 2 ++ src/tools/image-tools.ts | 29 ++++++++++++----- src/tools/vulnerability-tools.ts | 22 +++++++------ src/utils/format.ts | 2 +- src/utils/image-resolver.ts | 53 ++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 src/utils/image-resolver.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 789f4a8..0b9d247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec ref - Paginated list tools printed `Found undefined …`: v2 renamed `pagination.total` to `pagination.totalItems` — updated all 16 list modules. - Image `created` is a Unix timestamp in v2 and was printed raw — now formatted as an ISO date. - `arcane_image_update_check_all` / `arcane_image_check_updates_all` blocked until every image was checked, which hit the MCP request timeout — and the client's timeout retry then started duplicate server-side checks. Both tools now fire the check in the background (via a new no-retry `postInBackground` client helper) and return immediately, pointing at `arcane_activity_list` / the update summary for results. +- Image tools 404'd when given a name like `amir20/dozzle:latest` — the v2 API only accepts image IDs in paths (a `/` in the name breaks the route). Tools taking an `imageId` (`arcane_image_get`, `arcane_image_delete`, vulnerability scan/result/summary/list) now resolve names to IDs via the image list. +- `arcane_image_get` crashed with `Invalid time value`: the detail endpoint returns `created` as an ISO string (the list returns a Unix timestamp) — each is now formatted correctly. ### Changed (breaking, follows Arcane v2 API) - **Notifications** rebuilt on the provider model (`discord`, `email`, `telegram`, `signal`, `slack`, `ntfy`, `pushover`, `matrix`, `generic`): `get_settings` lists providers (or one via `provider`), `update_settings` takes `provider` + `enabled` + `config`, `test` now requires a `provider`. diff --git a/src/tools/image-tools.ts b/src/tools/image-tools.ts index fd7acd6..4beea51 100644 --- a/src/tools/image-tools.ts +++ b/src/tools/image-tools.ts @@ -7,6 +7,7 @@ import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; import { formatSize, formatSizeMB, formatSizeGB, formatUnixTimestamp } from "../utils/format.js"; +import { resolveImageId } from "../utils/image-resolver.js"; import { DOCKER_DIGEST_PREFIX_LENGTH, DOCKER_SHORT_ID_LENGTH } from "../constants.js"; import type { Image } from "../types/arcane-types.js"; @@ -71,13 +72,23 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): }, inputSchema: { environmentId: z.string().describe("Environment ID"), - imageId: z.string().describe("Image ID or tag"), + imageId: z.string().describe("Image ID or name:tag (names are resolved via the image list)"), }, }, toolHandler(async ({ environmentId, imageId }, client) => { - const response = await client.get<{ data: Image & { config?: Record } }>( - `/environments/${environmentId}/images/${imageId}` - ); + const resolvedId = await resolveImageId(client, environmentId, imageId); + // Unlike the list endpoint, the detail endpoint returns `created` as an ISO string + const response = await client.get<{ + data: { + id: string; + repoTags?: string[] | null; + repoDigests?: string[] | null; + created: string; + size: number; + architecture?: string; + os?: string; + }; + }>(`/environments/${environmentId}/images/${resolvedId}`); const img = response.data; @@ -86,9 +97,12 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): ` ID: ${img.id}`, ` Tags: ${img.repoTags?.join(", ") || "none"}`, ` Size: ${formatSizeMB(img.size)}`, - ` Created: ${formatUnixTimestamp(img.created)}`, + ` Created: ${img.created || "unknown"}`, ]; + if (img.architecture || img.os) { + lines.push(` Platform: ${[img.os, img.architecture].filter(Boolean).join("/")}`); + } if (img.repoDigests && img.repoDigests.length > 0) { lines.push(` Digests: ${img.repoDigests[0]}`); } @@ -140,13 +154,14 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): }, inputSchema: { environmentId: z.string().describe("Environment ID"), - imageId: z.string().describe("Image ID or tag to delete"), + imageId: z.string().describe("Image ID or name:tag to delete (names are resolved via the image list)"), force: z.boolean().optional().default(false).describe("Force removal even if in use"), pruneChildren: z.boolean().optional().default(false).describe("Also remove child images"), }, }, toolHandler(async ({ environmentId, imageId, force, pruneChildren }, client) => { - await client.delete(`/environments/${environmentId}/images/${imageId}`, { force, pruneChildren }); + const resolvedId = await resolveImageId(client, environmentId, imageId); + await client.delete(`/environments/${environmentId}/images/${resolvedId}`, { force, pruneChildren }); return `Image ${imageId} removed successfully.`; }) ); diff --git a/src/tools/vulnerability-tools.ts b/src/tools/vulnerability-tools.ts index 199c8f8..c534644 100644 --- a/src/tools/vulnerability-tools.ts +++ b/src/tools/vulnerability-tools.ts @@ -6,6 +6,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; +import { resolveImageId } from "../utils/image-resolver.js"; import type { IgnoredVulnerability, ScanResult, SeveritySummary, Vulnerability } from "../types/arcane-types.js"; function formatSummary(s?: SeveritySummary): string { @@ -51,12 +52,13 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, inputSchema: { environmentId: z.string().describe("Environment ID"), - imageId: z.string().describe("Image ID to scan"), + imageId: z.string().describe("Image ID or name:tag to scan (names are resolved via the image list)"), }, }, toolHandler(async ({ environmentId, imageId }, client) => { + const resolvedId = await resolveImageId(client, environmentId, imageId); const response = await client.post<{ data: ScanResult }>( - `/environments/${environmentId}/images/${imageId}/vulnerabilities/scan` + `/environments/${environmentId}/images/${resolvedId}/vulnerabilities/scan` ); return `Vulnerability scan initiated.\n${formatScanResult(response.data)}`; @@ -77,12 +79,13 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, inputSchema: { environmentId: z.string().describe("Environment ID"), - imageId: z.string().describe("Image ID"), + imageId: z.string().describe("Image ID or name:tag (names are resolved via the image list)"), }, }, toolHandler(async ({ environmentId, imageId }, client) => { + const resolvedId = await resolveImageId(client, environmentId, imageId); const response = await client.get<{ data: ScanResult }>( - `/environments/${environmentId}/images/${imageId}/vulnerabilities` + `/environments/${environmentId}/images/${resolvedId}/vulnerabilities` ); return formatScanResult(response.data); @@ -103,13 +106,14 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, inputSchema: { environmentId: z.string().describe("Environment ID"), - imageId: z.string().describe("Image ID"), + imageId: z.string().describe("Image ID or name:tag (names are resolved via the image list)"), }, }, toolHandler(async ({ environmentId, imageId }, client) => { + const resolvedId = await resolveImageId(client, environmentId, imageId); const response = await client.get<{ data: { status: string; scanPhase?: string; scanTime?: string; summary?: SeveritySummary }; - }>(`/environments/${environmentId}/images/${imageId}/vulnerabilities/summary`); + }>(`/environments/${environmentId}/images/${resolvedId}/vulnerabilities/summary`); const s = response.data; return `Scan Summary: ${formatSummary(s.summary)}${s.scanTime ? ` — Last scanned: ${s.scanTime}` : ""}`; @@ -166,7 +170,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, inputSchema: { environmentId: z.string().describe("Environment ID"), - imageId: z.string().describe("Image ID"), + imageId: z.string().describe("Image ID or name:tag (names are resolved via the image list)"), severity: z.string().optional().describe("Comma-separated severity filter (e.g., 'critical,high')"), search: z.string().optional().describe("Search query"), sort: z.string().optional().describe("Sort field"), @@ -179,7 +183,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg const response = await client.get<{ data: Vulnerability[]; pagination: { totalItems: number }; - }>(`/environments/${environmentId}/images/${imageId}/vulnerabilities/list`, { + }>(`/environments/${environmentId}/images/${await resolveImageId(client, environmentId, imageId)}/vulnerabilities/list`, { severity, search, sort, order, start, limit, }); @@ -246,7 +250,7 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, inputSchema: { environmentId: z.string().describe("Environment ID"), - imageId: z.string().describe("Image ID"), + imageId: z.string().describe("Image ID or name:tag (names are resolved via the image list)"), vulnerabilityId: z.string().describe("Vulnerability ID (e.g., CVE-2024-12345)"), pkgName: z.string().describe("Affected package name (as reported by the scanner)"), installedVersion: z.string().optional().describe("Installed version of the affected package"), diff --git a/src/utils/format.ts b/src/utils/format.ts index b435f47..5720a92 100644 --- a/src/utils/format.ts +++ b/src/utils/format.ts @@ -56,7 +56,7 @@ export function formatSizeGB(bytes: number): string { * Example: "2026-07-11T19:03:39.000Z" */ export function formatUnixTimestamp(seconds: number | undefined | null): string { - if (!seconds) return "unknown"; + if (!seconds || !Number.isFinite(seconds)) return "unknown"; return new Date(seconds * 1000).toISOString(); } diff --git a/src/utils/image-resolver.ts b/src/utils/image-resolver.ts new file mode 100644 index 0000000..888794a --- /dev/null +++ b/src/utils/image-resolver.ts @@ -0,0 +1,53 @@ +/** + * Resolve image references (name:tag) to image IDs. + * + * The Arcane v2 API only accepts image IDs in path parameters — a name like + * "amir20/dozzle:latest" 404s (the slash breaks the route). Clients often + * pass names anyway, so tools resolve them via the image list first. + */ + +import type { ArcaneClient } from "../client/arcane-client.js"; + +const IMAGE_ID_PATTERN = /^(sha256:)?[0-9a-fA-F]{12,64}$/; + +interface ImageListEntry { + id: string; + repoTags?: string[] | null; +} + +/** + * Return the image ID for an ID or name reference. + * IDs pass through untouched; names are looked up in the environment's + * image list ("name" without a tag matches "name:latest" first, then any tag). + */ +export async function resolveImageId( + client: ArcaneClient, + environmentId: string, + imageIdOrName: string +): Promise { + if (IMAGE_ID_PATTERN.test(imageIdOrName)) { + return imageIdOrName; + } + + const searchTerm = imageIdOrName.split(":")[0]; + const response = await client.get<{ data: ImageListEntry[] }>( + `/environments/${environmentId}/images`, + { search: searchTerm, limit: 100 } + ); + + const images = response.data || []; + const hasTag = imageIdOrName.includes(":"); + const exactRef = hasTag ? imageIdOrName : `${imageIdOrName}:latest`; + + const match = + images.find((img) => img.repoTags?.includes(exactRef)) ?? + (hasTag ? undefined : images.find((img) => img.repoTags?.some((t) => t.startsWith(`${imageIdOrName}:`)))); + + if (!match) { + throw new Error( + `No image found matching "${imageIdOrName}". Use arcane_image_list to look up the image ID.` + ); + } + + return match.id; +} From 15466ecede8fbbd489641ee7d4d9bb6327180daf Mon Sep 17 00:00:00 2001 From: Xitee <59659167+Xitee1@users.noreply.github.com> Date: Sat, 11 Jul 2026 21:38:24 +0200 Subject: [PATCH 4/8] feat: surface project update overview (updates filter + updateInfo) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit arcane_project_list now supports the v2 updates filter (has_update / up_to_date / error / unknown) and a status filter, and renders each project's updateInfo — including exactly which image refs are outdated. arcane_project_get shows the same. This is the dashboard's update overview; the skill now points Claude at it instead of checking images one by one. Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 1 + skills/arcane-mcp-server/SKILL.md | 22 ++++++++++++------- src/tools/project-tools.ts | 36 +++++++++++++++++++++++-------- src/types/arcane-types.ts | 13 +++++++++++ 4 files changed, 55 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b9d247..96cb889 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec ref ### Added - `arcane_notification_delete_settings` — delete a provider's notification settings (`DELETE /notifications/settings/{provider}`). - `arcane_activity_list` / `arcane_activity_get` — track Arcane v2's background activities (image update checks, updater runs, prunes, scans), including progress and messages. +- `arcane_project_list` supports v2's `updates` filter (`has_update`, `up_to_date`, `error`, `unknown`) plus a `status` filter, and shows per-project update info including exactly which image refs are outdated (same data as the dashboard's update overview). `arcane_project_get` shows it too. ### Fixed (after testing against a live v2.3.2 instance) - Paginated list tools printed `Found undefined …`: v2 renamed `pagination.total` to `pagination.totalItems` — updated all 16 list modules. diff --git a/skills/arcane-mcp-server/SKILL.md b/skills/arcane-mcp-server/SKILL.md index b9f30eb..59dc42f 100644 --- a/skills/arcane-mcp-server/SKILL.md +++ b/skills/arcane-mcp-server/SKILL.md @@ -34,7 +34,8 @@ When the user says something general, map it to the right tool sequence: | "What's running?" / "Show me my containers" | `arcane_container_list` | | "How's everything looking?" / "Status" | `arcane_dashboard_get` | | "Deploy this compose file" | `arcane_project_create` then `arcane_project_up` | -| "Update everything" | `arcane_image_update_check_all` then `arcane_updater_run` (with `dryRun: true` first) | +| "Update everything" | `arcane_project_list` with `updates: "has_update"`, then `arcane_updater_run` (with `dryRun: true` first) | +| "Which projects/stacks have updates?" | `arcane_project_list` with `updates: "has_update"` — shows exactly which image refs are outdated. Do NOT check images one by one | | "What needs attention?" | `arcane_dashboard_get` then `arcane_event_list` (severity filter) | | "Is anything vulnerable?" | `arcane_vulnerability_get_environment_summary` | | "Set up a new stack" | `arcane_project_create` with compose YAML | @@ -108,15 +109,20 @@ For Docker Swarm clusters: 4. **Monitor** — `arcane_swarm_list_services` + `arcane_swarm_get_service` for task status 5. **Tasks** — `arcane_swarm_get_service` for task status when debugging -### Auto-Update Management +### Update Overview & Auto-Update Management -Set up hands-off container updates: +To see what has pending updates, use the cached results — do not check images individually: -1. `arcane_updater_get_status` — check current schedule -2. `arcane_container_set_auto_update` — enable per-container -3. `arcane_updater_run` with `dryRun: true` — preview what would update -4. `arcane_updater_run` — execute updates -5. `arcane_updater_get_history` — review what was updated +1. `arcane_project_list` with `updates: "has_update"` — compose projects with outdated images (lists the exact image refs) +2. `arcane_image_update_get_summary` — environment-wide counts +3. `arcane_image_update_check_all` — refresh the cache in the background if results are stale (track via `arcane_activity_list`) + +Then update: + +1. `arcane_updater_run` with `dryRun: true` — preview what would update +2. `arcane_updater_run` — execute updates (optionally scoped via `resourceIds`) +3. `arcane_updater_get_history` — review what was updated +4. `arcane_container_set_auto_update` — enable hands-off updates per container ## Safety Rules diff --git a/src/tools/project-tools.ts b/src/tools/project-tools.ts index 5270a44..5612e6a 100644 --- a/src/tools/project-tools.ts +++ b/src/tools/project-tools.ts @@ -17,7 +17,7 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) "arcane_project_list", { title: "List projects", - description: "List Docker Compose projects/stacks in an environment", + description: "List Docker Compose projects/stacks in an environment. Use the `updates` filter (e.g. 'has_update') to list projects with pending image updates, including which images are outdated.", annotations: { readOnlyHint: true, destructiveHint: false, @@ -27,26 +27,29 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) inputSchema: { environmentId: z.string().describe("Environment ID"), search: z.string().optional().describe("Search query to filter projects"), + status: z.string().optional().describe("Filter by status (comma-separated: running,stopped,partially running)"), + updates: z.enum(["has_update", "up_to_date", "error", "unknown"]).optional().describe("Filter by image update status — 'has_update' lists only projects with pending updates"), sort: z.string().optional().describe("Column to sort by"), order: z.enum(["asc", "desc"]).optional().default("asc").describe("Sort direction"), start: z.number().optional().default(0).describe("Pagination start index"), - limit: z.number().optional().default(20).describe("Items per page"), + limit: z.number().optional().default(20).describe("Items per page (-1 for all)"), }, }, - toolHandler(async ({ environmentId, search, sort, order, start, limit }, client) => { + toolHandler(async ({ environmentId, search, status, updates, sort, order, start, limit }, client) => { const response = await client.get<{ data: Project[]; pagination: { totalItems: number }; - }>(`/environments/${environmentId}/projects`, { search, sort, order, start, limit }); + }>(`/environments/${environmentId}/projects`, { search, status, updates, sort, order, start, limit }); if (!response.data || response.data.length === 0) { - return "No projects found."; + return updates ? `No projects with update status "${updates}" found.` : "No projects found."; } const lines = [`Found ${response.pagination.totalItems} projects:\n`]; for (const project of response.data) { - const status = project.status === "running" ? "[RUNNING]" : "[STOPPED]"; - lines.push(`${status} ${project.name}`); + const projectStatus = project.status === "running" ? "[RUNNING]" : "[STOPPED]"; + const updateFlag = project.updateInfo?.hasUpdate ? " [UPDATES AVAILABLE]" : ""; + lines.push(`${projectStatus}${updateFlag} ${project.name}`); lines.push(` ID: ${project.id}`); lines.push(` Services: ${project.services?.length || 0}`); if (project.services && project.services.length > 0) { @@ -57,6 +60,14 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) lines.push(` ... and ${project.services.length - MAX_DISPLAY_SERVICES} more`); } } + const u = project.updateInfo; + if (u?.hasUpdate) { + const refs = u.updatedImageRefs?.length ? u.updatedImageRefs.join(", ") : `${u.imagesWithUpdates ?? "?"} of ${u.imageCount ?? "?"} images`; + lines.push(` Updates: ${refs}`); + if (u.lastCheckedAt) lines.push(` Last checked: ${u.lastCheckedAt}`); + } else if (u?.status === "error" && u.errorMessage) { + lines.push(` Update check error: ${u.errorMessage}`); + } lines.push(""); } @@ -94,10 +105,17 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) ` Path: ${proj.path || "N/A"}`, ` Created: ${proj.createdAt || "N/A"}`, ` Updated: ${proj.updatedAt || "N/A"}`, - "", - "Services:", ]; + const u = proj.updateInfo; + if (u?.hasUpdate) { + const refs = u.updatedImageRefs?.length ? u.updatedImageRefs.join(", ") : `${u.imagesWithUpdates ?? "?"} of ${u.imageCount ?? "?"} images`; + lines.push(` Image updates available: ${refs}`); + } else if (u) { + lines.push(` Image updates: ${u.status}${u.errorMessage ? ` (${u.errorMessage})` : ""}`); + } + + lines.push("", "Services:"); for (const svc of proj.services || []) { lines.push(` - ${svc.name}: ${svc.status} (${svc.containerCount || 0} containers)`); } diff --git a/src/types/arcane-types.ts b/src/types/arcane-types.ts index 0e2561b..ad8ffd8 100644 --- a/src/types/arcane-types.ts +++ b/src/types/arcane-types.ts @@ -50,6 +50,18 @@ export interface Backup { // === Projects === +export interface ProjectUpdateInfo { + status: string; + hasUpdate: boolean; + imageCount?: number; + checkedImageCount?: number; + imagesWithUpdates?: number; + updatedImageRefs?: string[] | null; + errorCount?: number; + errorMessage?: string; + lastCheckedAt?: string; +} + export interface Project { id: string; name: string; @@ -60,6 +72,7 @@ export interface Project { status: string; containerCount?: number; }>; + updateInfo?: ProjectUpdateInfo; createdAt?: string; updatedAt?: string; } From a79e49a8803f603c75cea503b47edd016b7b2201 Mon Sep 17 00:00:00 2001 From: Xitee <59659167+Xitee1@users.noreply.github.com> Date: Sat, 11 Jul 2026 22:00:33 +0200 Subject: [PATCH 5/8] feat: add arcane_project_update_services (dedicated project update) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit POST /projects/{id}/update-services is the update action behind the projects:update permission — it pulls latest images and recreates the given services (all when unspecified). The manual pull + redeploy route requires projects:deploy instead, which restricted API keys may lack. The backend handler blocks until the update completes, so the tool starts it via postInBackground and points at the activity tools for progress. Skill guidance now prefers this per-project update for compose stacks. 177 tools. Co-Authored-By: Claude Fable 5 --- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 3 +- CLAUDE.md | 6 ++-- README.md | 17 +++++----- commands/configure.md | 6 ++-- skills/arcane-mcp-server/SKILL.md | 6 ++-- .../integration/tool-filtering.test.ts | 2 +- src/prompts/index.ts | 6 ++-- src/resources/__tests__/resources.test.ts | 2 +- src/resources/index.ts | 2 +- src/tools/project-tools.ts | 32 +++++++++++++++++++ 11 files changed, 59 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d098f5a..070a797 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: # so we count those instead of the former `server.registerTool(`. TOTAL=$(grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}') echo "Found $TOTAL tool registrations" - if [ "$TOTAL" -lt 176 ]; then echo "FAIL: Expected 176+"; exit 1; fi + if [ "$TOTAL" -lt 177 ]; then echo "FAIL: Expected 177+"; exit 1; fi - name: Audit production dependencies run: npm audit --audit-level=high --omit=dev diff --git a/CHANGELOG.md b/CHANGELOG.md index 96cb889..1e7a84c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [3.0.0] - 2026-07-11 -Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec refreshed from v1.17.0). Tool count changes from 180 to **176** (removed tools whose endpoints no longer exist, added notification-delete and activity-tracking tools). No v1 compatibility shims — installs running Arcane v1.x should stay on `2.x` of this server. +Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec refreshed from v1.17.0). Tool count changes from 180 to **177** (removed tools whose endpoints no longer exist, added notification-delete and activity-tracking tools). No v1 compatibility shims — installs running Arcane v1.x should stay on `2.x` of this server. ### Removed (endpoints gone in Arcane v2) - `arcane_dashboard_get_action_items` — `/dashboard/action-items` no longer exists. @@ -19,6 +19,7 @@ Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec ref ### Added - `arcane_notification_delete_settings` — delete a provider's notification settings (`DELETE /notifications/settings/{provider}`). - `arcane_activity_list` / `arcane_activity_get` — track Arcane v2's background activities (image update checks, updater runs, prunes, scans), including progress and messages. +- `arcane_project_update_services` — the dedicated project update action (`POST /projects/{id}/update-services`, permission `projects:update`): pulls latest images and recreates services (optionally a subset). Runs in the background; track via the activity tools. Preferred over manual pull + redeploy, which require `projects:deploy`. - `arcane_project_list` supports v2's `updates` filter (`has_update`, `up_to_date`, `error`, `unknown`) plus a `status` filter, and shows per-project update info including exactly which image refs are outdated (same data as the dashboard's update overview). `arcane_project_get` shows it too. ### Fixed (after testing against a live v2.3.2 instance) diff --git a/CLAUDE.md b/CLAUDE.md index b12fc9e..db59761 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ # Arcane MCP Server -MCP server for Docker management via the Arcane platform. 176 tools, 2 resources, 4 prompts, companion skill, Claude Code plugin. +MCP server for Docker management via the Arcane platform. 177 tools, 2 resources, 4 prompts, companion skill, Claude Code plugin. **Not affiliated with the Arcane project.** @@ -25,7 +25,7 @@ npm run update-api-spec # Refresh OpenAPI spec from live instance - `src/config.ts` — Config from env vars > config file > defaults - `src/constants.ts` — All shared constants (timeouts, limits, versions) -### Tools (176 across 26 modules in `src/tools/`) +### Tools (177 across 26 modules in `src/tools/`) All tools use `server.registerTool()` with: - `title` — human-readable name @@ -41,7 +41,7 @@ All tools use `server.registerTool()` with: 3. Classify annotations: list/get = readOnly, delete/prune = destructive, external calls = openWorld 4. Use `toolHandler()` wrapper — return a plain string, it handles the MCP response envelope 5. Register in `src/tools/index.ts` -6. Verify: `npm run build && grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}'` (expect 176) +6. Verify: `npm run build && grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}'` (expect 177) ### Resources & Prompts diff --git a/README.md b/README.md index e9be3ef..1ccf58d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

Manage your entire Docker infrastructure through natural language.
- 176 tools. One MCP server. Zero context switching. + 177 tools. One MCP server. Zero context switching.

@@ -21,7 +21,7 @@ Tool FilteringWhat Can It DoCompanion Skill • - All Tools • + All ToolsInteractive Installer

@@ -35,7 +35,7 @@ Arcane MCP Server is a complete AI-powered Docker management bundle — an **MCP server**, a **Claude Code plugin**, and a **companion skill**, all in one package. -- The **MCP server** gives your AI assistant 176 tools to control your [Arcane](https://github.com/getarcaneapp/arcane) Docker platform — containers, images, stacks, Swarm clusters, security scans, and more. Filter that set down to a preset ([see Tool Filtering](#tool-filtering)) if all 176 is more than your context window can spare. +- The **MCP server** gives your AI assistant 177 tools to control your [Arcane](https://github.com/getarcaneapp/arcane) Docker platform — containers, images, stacks, Swarm clusters, security scans, and more. Filter that set down to a preset ([see Tool Filtering](#tool-filtering)) if all 177 is more than your context window can spare. - The **plugin** wraps everything into a single install with guided configuration — no manual env vars or config files. - The **companion skill** teaches your AI *how* to use those tools — safe deployment workflows, troubleshooting patterns, and guardrails so it doesn't accidentally nuke your volumes. @@ -71,7 +71,7 @@ Every tool carries **safety annotations** so your AI knows which operations are ## Tool Filtering -Exposing all 176 tools to Claude every turn chews through your context window. Pick a **preset** to trim the active tool set — only the tools in that preset appear in `tools/list`: +Exposing all 177 tools to Claude every turn chews through your context window. Pick a **preset** to trim the active tool set — only the tools in that preset appear in `tools/list`: | Preset | Scope | Tools | |---|---|---| @@ -79,7 +79,7 @@ Exposing all 176 tools to Claude every turn chews through your context window. P | `read-only` | every `*_list` / `*_get` / `*_inspect` / `*_stats` across all modules | ~60 | | `minimal` | dashboard + container list / get / counts | 5 | | `deploy` | projects, gitops, templates, registries, environments, build | ~40 | -| `full` *(default if never configured)* | everything | 176 | +| `full` *(default if never configured)* | everything | 177 | | `custom` | your own module + per-tool picks | variable | **Configure interactively** in Claude Code: @@ -271,7 +271,7 @@ And a Claude Code slash command: --- -## All 176 Tools +## All 177 Tools ### Containers (11) @@ -321,7 +321,7 @@ And a Claude Code slash command: | `arcane_vulnerability_list_ignored` | List ignored vulnerabilities | | `arcane_vulnerability_get_image_options` | List scannable images | -### Projects / Docker Compose (12) +### Projects / Docker Compose (13) | Tool | Description | |------|-------------| @@ -333,6 +333,7 @@ And a Claude Code slash command: | `arcane_project_down` | Stop and remove containers | | `arcane_project_restart` | Restart all services | | `arcane_project_redeploy` | Redeploy (down + up) | +| `arcane_project_update_services` | Pull latest images + recreate services (the dedicated update action) | | `arcane_project_destroy` | Destroy project and volumes | | `arcane_project_pull_images` | Pull latest images | | `arcane_project_get_counts` | Get status counts | @@ -514,7 +515,7 @@ src/ arcane-client.ts # HTTP client (retry, SSL, size limits) auth/ auth-manager.ts # JWT auto-refresh + API key auth - tools/ # 26 modules, 176 tools + tools/ # 26 modules, 177 tools registry.ts # ToolRegistry — captures RegisteredTool handles, applies filter presets.ts # commonly-used / read-only / minimal / deploy / full / custom resources/ # 4 MCP Resources diff --git a/commands/configure.md b/commands/configure.md index f483f31..27b5ad7 100644 --- a/commands/configure.md +++ b/commands/configure.md @@ -5,7 +5,7 @@ allowed-tools: [Read, Write, AskUserQuestion, Bash, ReadMcpResourceTool] # /arcane:configure — Tool filter setup -Use this slash command to trim which Arcane MCP tools are exposed to Claude Code. The full server registers 176 tools; surfacing all of them in `tools/list` bloats the context window. This command writes a `tools` block to `~/.arcane/config.json` that selects a preset, module allowlist, and per-tool overrides. The Arcane MCP server picks up changes live when its config watcher is attached. +Use this slash command to trim which Arcane MCP tools are exposed to Claude Code. The full server registers 177 tools; surfacing all of them in `tools/list` bloats the context window. This command writes a `tools` block to `~/.arcane/config.json` that selects a preset, module allowlist, and per-tool overrides. The Arcane MCP server picks up changes live when its config watcher is attached. ## Workflow @@ -14,7 +14,7 @@ Use this slash command to trim which Arcane MCP tools are exposed to Claude Code - `read-only` — every `*_list` / `*_get` / `*_inspect` / `*_stats` / `*_status` / `*_summary` tool (~60 tools) - `minimal` — dashboard + container list/get/counts (5 tools) - `deploy` — project, gitops, template, registry, environment, build (~40 tools) - - `full` — all 176 tools (current default if the user has never configured this) + - `full` — all 177 tools (current default if the user has never configured this) - `custom` — fine-tune modules and individual tools 2. **If the user picks `custom`** (or says they want to fine-tune after picking another preset): @@ -60,6 +60,6 @@ Use this slash command to trim which Arcane MCP tools are exposed to Claude Code ## Notes -- Keep the conversation tight. Do not dump the full 176-tool list — summarise the chosen preset and let the user opt into fine-tuning. +- Keep the conversation tight. Do not dump the full 177-tool list — summarise the chosen preset and let the user opt into fine-tuning. - Never remove other keys from `~/.arcane/config.json`. A malformed file will brick the server. - For Claude Desktop and other MCP clients without slash commands, the same flow is available via the `arcane_configure_tools` prompt — this slash command is a Claude Code shortcut to the same outcome. diff --git a/skills/arcane-mcp-server/SKILL.md b/skills/arcane-mcp-server/SKILL.md index 59dc42f..780627f 100644 --- a/skills/arcane-mcp-server/SKILL.md +++ b/skills/arcane-mcp-server/SKILL.md @@ -34,7 +34,7 @@ When the user says something general, map it to the right tool sequence: | "What's running?" / "Show me my containers" | `arcane_container_list` | | "How's everything looking?" / "Status" | `arcane_dashboard_get` | | "Deploy this compose file" | `arcane_project_create` then `arcane_project_up` | -| "Update everything" | `arcane_project_list` with `updates: "has_update"`, then `arcane_updater_run` (with `dryRun: true` first) | +| "Update everything" / "Update this stack" | `arcane_project_list` with `updates: "has_update"`, then `arcane_project_update_services` per project (needs only `projects:update`) | | "Which projects/stacks have updates?" | `arcane_project_list` with `updates: "has_update"` — shows exactly which image refs are outdated. Do NOT check images one by one | | "What needs attention?" | `arcane_dashboard_get` then `arcane_event_list` (severity filter) | | "Is anything vulnerable?" | `arcane_vulnerability_get_environment_summary` | @@ -119,8 +119,8 @@ To see what has pending updates, use the cached results — do not check images Then update: -1. `arcane_updater_run` with `dryRun: true` — preview what would update -2. `arcane_updater_run` — execute updates (optionally scoped via `resourceIds`) +1. `arcane_project_update_services` — the dedicated per-project update (pull + recreate; runs in the background, track via `arcane_activity_list`). Preferred for compose projects — needs only the `projects:update` permission, unlike pull/redeploy (`projects:deploy`) +2. Alternatively `arcane_updater_run` with `dryRun: true` first, then for real (optionally scoped via `resourceIds`) 3. `arcane_updater_get_history` — review what was updated 4. `arcane_container_set_auto_update` — enable hands-off updates per container diff --git a/src/__tests__/integration/tool-filtering.test.ts b/src/__tests__/integration/tool-filtering.test.ts index 8e207e7..3d932c2 100644 --- a/src/__tests__/integration/tool-filtering.test.ts +++ b/src/__tests__/integration/tool-filtering.test.ts @@ -296,7 +296,7 @@ describe("integration: upgrade notice lifecycle", () => { // Unconfigured state → explicit call to /arcane:configure const handler = handlers.get("arcane-tools-config-notice")!; const result = await handler(new URL("arcane://tools-config-notice")); - expect(result.contents[0].text).toContain("176 tools"); + expect(result.contents[0].text).toContain("177 tools"); expect(result.contents[0].text).toContain("/arcane:configure"); // Flip to configured — body should swap diff --git a/src/prompts/index.ts b/src/prompts/index.ts index 7b94cc3..9f3872c 100644 --- a/src/prompts/index.ts +++ b/src/prompts/index.ts @@ -188,7 +188,7 @@ export function registerPrompts(server: McpServer): void { "Help the user configure which Arcane MCP tools are active.", "", "Context:", - "- Arcane registers 176 tools by default, which bloats the tool-list context window.", + "- Arcane registers 177 tools by default, which bloats the tool-list context window.", "- The server supports a `tools` config in `~/.arcane/config.json` (or env vars ARCANE_TOOL_PRESET / ARCANE_ENABLED_MODULES / ARCANE_ENABLED_TOOLS / ARCANE_DISABLED_TOOLS).", "- Hot reload: changes to `~/.arcane/config.json` apply live via `notifications/tools/list_changed`.", "- If the watcher isn't attached (e.g., missing file or HTTP-only setup), the user must reconnect the MCP server for changes to take effect.", @@ -198,7 +198,7 @@ export function registerPrompts(server: McpServer): void { "- read-only: every *_list / *_get / *_inspect / *_stats / *_status / *_summary tool (~60 tools)", "- minimal: dashboard + container list/get/counts (5 tools)", "- deploy: project, gitops, template, registry, environment, build (~40 tools)", - "- full: all 176 (default on upgrade)", + "- full: all 177 (default on upgrade)", "- custom: fine-grained modules + per-tool overrides only", "", "Flow:", @@ -216,7 +216,7 @@ export function registerPrompts(server: McpServer): void { "network, network-topology, notification, port, project, registry, settings, swarm, system,", "template, updater, user, volume, vulnerability, webhook", "", - "Keep the conversation short — don't re-print the full 176-tool list. Confirm the chosen preset and summarise the tools/modules set before writing.", + "Keep the conversation short — don't re-print the full 177-tool list. Confirm the chosen preset and summarise the tools/modules set before writing.", ].join("\n"), }, }, diff --git a/src/resources/__tests__/resources.test.ts b/src/resources/__tests__/resources.test.ts index c754ed2..7e39428 100644 --- a/src/resources/__tests__/resources.test.ts +++ b/src/resources/__tests__/resources.test.ts @@ -131,7 +131,7 @@ describe("resources", () => { const result = await handler(new URL("arcane://tools-config-notice")); const text = result.contents[0].text; - expect(text).toContain("176 tools"); + expect(text).toContain("177 tools"); expect(text).toContain("/arcane:configure"); expect(text).toContain("commonly-used"); }); diff --git a/src/resources/index.ts b/src/resources/index.ts index 63970a7..008e695 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -186,7 +186,7 @@ export function registerResources(server: McpServer): void { const lines: string[] = []; if (unconfigured) { - lines.push("Arcane MCP Server is currently exposing all 176 tools."); + lines.push("Arcane MCP Server is currently exposing all 177 tools."); lines.push(""); lines.push("You can reduce context bloat by picking a preset:"); lines.push(" - commonly-used — containers, images, projects, volumes, networks (~52 tools)"); diff --git a/src/tools/project-tools.ts b/src/tools/project-tools.ts index 5612e6a..fdf19dd 100644 --- a/src/tools/project-tools.ts +++ b/src/tools/project-tools.ts @@ -275,6 +275,38 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) }) ); + // arcane_project_update_services + register( + "arcane_project_update_services", + { + title: "Update project services", + description: "Pull the latest images and recreate services of a Compose project (all services when none are given). This is the dedicated update action (permission projects:update) — prefer it over manual pull + redeploy. Runs in the background; track progress with arcane_activity_list.", + annotations: { + readOnlyHint: false, + destructiveHint: false, + idempotentHint: false, + openWorldHint: true, + }, + inputSchema: { + environmentId: z.string().describe("Environment ID"), + projectId: z.string().describe("Project ID"), + services: z.array(z.string()).optional().describe("Service names to update; omit to update all services"), + }, + }, + toolHandler(async ({ environmentId, projectId, services }, client) => { + client.postInBackground( + `/environments/${environmentId}/projects/${projectId}/update-services`, + services && services.length > 0 ? { services } : {} + ); + + const scope = services && services.length > 0 ? `services ${services.join(", ")}` : "all services"; + return [ + `Update of ${scope} in project ${projectId} started in the background (pulls latest images and recreates the services).`, + "Track progress with arcane_activity_list / arcane_activity_get; verify afterwards with arcane_project_get.", + ].join("\n"); + }) + ); + // arcane_project_destroy register( "arcane_project_destroy", From b5a6f1178d2160e33f15443ccb20ca1a1d2ca26f Mon Sep 17 00:00:00 2001 From: Xitee <59659167+Xitee1@users.noreply.github.com> Date: Sat, 11 Jul 2026 22:33:48 +0200 Subject: [PATCH 6/8] fix: full v2 response-shape audit across all 26 modules + live smoke test Systematic pass instead of case-by-case fixes: every tool's response field access and request payload was audited against the v2.3.2 spec (three parallel audits covering all 26 modules), and every read-only tool is now exercised against a live instance by scripts/live-smoke.mjs, which flags undefined/[object Object]/NaN/Invalid Date in output and tool errors (403s from restricted API keys count as skips). Fixes ~60 mismatches, highlights: - containers: list uses `names[]`, detail `state` is an object (health, exit code shown); counts use totalContainers/running/stopped - dashboard: rewritten for the v2 snapshot (incl. aggregated action items and version info) - ports: hostPort/containerPort/hostIp/isPublished field names - auth: wrapped login/me/refresh responses, isGlobalAdmin instead of role - jobs: `jobs` array + flat JobscheduleConfig (schedule get/update) - webhooks: actionType/targetType/targetId model (spec has no events) - environments: test/pair-token/version/create field fixes - networks: create nests options, counts/prune unwrapped from data, containersList; topology metadata fields - volumes: Docker-cased usageData, isDirectory, mkdir path as query - gitops: composePath, lastSync* status fields, branches/files shapes, git repo token auth - registries: registryType/description/token model - templates: type filter, required envContent - swarm: raw Docker ServiceSpec for create/update (with version index), runningReplicas, tasks/nodes fetched from their own endpoints - vulnerabilities: scanner status `available`, image options string list - builds: tags/platforms/errorMessage/output fields, multipart workspace upload (new client.postMultipart) - images: pull relies on server-side registry credentials, delete drops unsupported pruneChildren - projects: runtimeServices for per-service status, counts field names - version endpoint: currentVersion/newestVersion - OIDC config reports "not configured" instead of a server 500 Live smoke: 30 ok, 0 failed on both local and remote-agent environments. Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 2 + CLAUDE.md | 1 + scripts/live-smoke.mjs | 166 ++++++++++++++++++++ src/client/arcane-client.ts | 30 ++++ src/tools/__tests__/container-tools.test.ts | 15 +- src/tools/__tests__/dashboard-tools.test.ts | 40 ++--- src/tools/auth-tools.ts | 50 +++--- src/tools/build-tools.ts | 33 ++-- src/tools/container-tools.ts | 42 +++-- src/tools/dashboard-tools.ts | 45 +++--- src/tools/environment-tools.ts | 30 ++-- src/tools/gitops-tools.ts | 70 +++++---- src/tools/image-tools.ts | 14 +- src/tools/job-tools.ts | 72 +++++---- src/tools/network-tools.ts | 40 ++--- src/tools/network-topology-tools.ts | 6 +- src/tools/port-tools.ts | 6 +- src/tools/project-tools.ts | 34 ++-- src/tools/registry-tools.ts | 57 ++++--- src/tools/settings-tools.ts | 49 +++--- src/tools/swarm-tools.ts | 147 +++++++++++++---- src/tools/system-tools.ts | 18 ++- src/tools/template-tools.ts | 25 +-- src/tools/volume-tools.ts | 32 ++-- src/tools/vulnerability-tools.ts | 20 ++- src/tools/webhook-tools.ts | 64 ++++---- src/types/arcane-types.ts | 162 ++++++++++++------- 27 files changed, 842 insertions(+), 428 deletions(-) create mode 100644 scripts/live-smoke.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e7a84c..c2bd0c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec ref - `arcane_image_update_check_all` / `arcane_image_check_updates_all` blocked until every image was checked, which hit the MCP request timeout — and the client's timeout retry then started duplicate server-side checks. Both tools now fire the check in the background (via a new no-retry `postInBackground` client helper) and return immediately, pointing at `arcane_activity_list` / the update summary for results. - Image tools 404'd when given a name like `amir20/dozzle:latest` — the v2 API only accepts image IDs in paths (a `/` in the name breaks the route). Tools taking an `imageId` (`arcane_image_get`, `arcane_image_delete`, vulnerability scan/result/summary/list) now resolve names to IDs via the image list. - `arcane_image_get` crashed with `Invalid time value`: the detail endpoint returns `created` as an ISO string (the list returns a Unix timestamp) — each is now formatted correctly. +- **Full response-shape audit** of all 26 modules against the v2 spec plus a live smoke test of every read-only tool (`scripts/live-smoke.mjs`). This fixed ~60 further v2 field/wrapper mismatches, including: container list `names`/detail `state` object ("undefined"/"[object Object]" output), dashboard snapshot (new v2 structure incl. aggregated action items), port mappings (`hostPort`/`containerPort`/`isPublished`), container/project counts (`totalContainers`/`totalProjects` etc.), `/version` (`currentVersion`), auth login/me/refresh (wrapped responses, `isGlobalAdmin`), jobs (flat `JobscheduleConfig`, `jobs` array), webhooks (actionType/target model instead of events), environments (test/pair/version/create fields), networks (create `options` nesting, counts/prune wrappers, `containersList`), volumes (Docker-cased `usageData`, `isDirectory`, mkdir query param), gitops (`composePath`, `lastSync*` fields, branches/files shapes), registries (`registryType`/`token`/`description` model), templates (`type` filter, required `envContent`), swarm (Docker `ServiceSpec` create/update with version index, `runningReplicas`, tasks/nodes endpoints), vulnerability scanner status (`available`) and image options (string list), builds (`tags`/`platforms`/`errorMessage`/`output`, multipart workspace upload), image pull (server-side registry credentials), settings categories/search shapes. +- `arcane_oidc_get_config` reports "OIDC is not configured" instead of a server 500 on instances without OIDC. ### Changed (breaking, follows Arcane v2 API) - **Notifications** rebuilt on the provider model (`discord`, `email`, `telegram`, `signal`, `slack`, `ntfy`, `pushover`, `matrix`, `generic`): `get_settings` lists providers (or one via `provider`), `update_settings` takes `provider` + `enabled` + `config`, `test` now requires a `provider`. diff --git a/CLAUDE.md b/CLAUDE.md index db59761..e6f42b9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,6 +13,7 @@ npm test # vitest (50 tests) npm run dev # stdio mode npm run dev:tcp # HTTP mode npm run update-api-spec # Refresh OpenAPI spec from live instance +ARCANE_BASE_URL=… ARCANE_API_KEY=… node scripts/live-smoke.mjs [envId] # Run every read-only tool against a live instance; flags undefined/[object Object]/NaN in output ``` ## Architecture diff --git a/scripts/live-smoke.mjs b/scripts/live-smoke.mjs new file mode 100644 index 0000000..b8cb691 --- /dev/null +++ b/scripts/live-smoke.mjs @@ -0,0 +1,166 @@ +#!/usr/bin/env node +/** + * Live smoke test: runs every read-only tool against a real Arcane instance + * and flags rendering bugs (undefined, [object Object], NaN, Invalid Date) + * plus tool errors. + * + * Usage: + * npm run build + * ARCANE_BASE_URL=… ARCANE_API_KEY=… node scripts/live-smoke.mjs [environmentId] + * + * Only tools with readOnlyHint (minus explicit exclusions that trigger + * server-side work) are invoked. Tools whose required params cannot be + * resolved from live data are reported as SKIPPED. + */ + +const { registerAllTools } = await import("../dist/tools/index.js"); +const { getArcaneClient } = await import("../dist/client/arcane-client.js"); + +// Read-only by annotation, but they kick off server-side background work +const EXCLUDE = new Set([ + "arcane_image_update_check_all", + "arcane_image_check_updates_all", +]); + +// Patterns that indicate a rendering bug in the tool output +const BAD_PATTERNS = [/\bundefined\b/, /\[object Object\]/, /\bNaN\b/, /Invalid Date/, /Invalid time/]; + +const tools = new Map(); +const fakeServer = { + registerTool(name, config, handler) { + tools.set(name, { config, handler }); + return { enabled: true, enable() {}, disable() {}, remove() {}, update() {} }; + }, + sendToolListChanged() {}, +}; + +registerAllTools(fakeServer, { preset: "full" }); + +const client = getArcaneClient(); +const envId = process.argv[2] || "0"; + +// ---- Discover real IDs to fill tool params with ---- +async function tryGet(path, params) { + try { + return await client.get(path, params); + } catch { + return undefined; + } +} + +const containers = (await tryGet(`/environments/${envId}/containers`, { limit: 5 }))?.data || []; +const images = (await tryGet(`/environments/${envId}/images`, { limit: 5 }))?.data || []; +const projects = (await tryGet(`/environments/${envId}/projects`, { limit: 5 }))?.data || []; +const volumes = (await tryGet(`/environments/${envId}/volumes`, { limit: 5 }))?.data || []; +const networks = (await tryGet(`/environments/${envId}/networks`, { limit: 5 }))?.data || []; +const activities = (await tryGet(`/environments/${envId}/activities`, { limit: 5 }))?.data || []; +const events = (await tryGet(`/events`, { limit: 5 }))?.data || []; +const users = (await tryGet(`/users`, { limit: 5 }))?.data || []; +const templates = (await tryGet(`/templates`, { limit: 5 }))?.data || []; +const registries = (await tryGet(`/container-registries`, { limit: 5 }))?.data || []; +const gitRepos = (await tryGet(`/customize/git-repositories`, { limit: 5 }))?.data || []; +const gitopsSyncs = (await tryGet(`/environments/${envId}/gitops-syncs`, { limit: 5 }))?.data || []; +const webhooks = (await tryGet(`/environments/${envId}/webhooks`, { limit: 5 }))?.data || []; +const jobs = (await tryGet(`/environments/${envId}/jobs`, { limit: 5 }))?.data || []; +const swarmServices = (await tryGet(`/environments/${envId}/swarm/services`, { limit: 5 }))?.data || []; +const backups = volumes[0] + ? (await tryGet(`/environments/${envId}/volumes/${volumes[0].name}/backups`))?.data || [] + : []; + +const PARAM_VALUES = { + environmentId: envId, + containerId: containers[0]?.id, + imageId: images[0]?.id, + imageRef: images.find((i) => i.repoTags?.length)?.repoTags?.[0], + imageRefs: images.filter((i) => i.repoTags?.length).slice(0, 2).map((i) => i.repoTags[0]), + imageIds: images.slice(0, 2).map((i) => i.id), + image: images.find((i) => i.repoTags?.length)?.repoTags?.[0], + projectId: projects[0]?.id, + volumeName: volumes[0]?.name, + networkId: networks[0]?.id, + activityId: activities[0]?.id, + eventId: events[0]?.id, + userId: users[0]?.id, + templateId: templates[0]?.id, + registryId: registries[0]?.id, + repositoryId: gitRepos[0]?.id, + syncId: gitopsSyncs[0]?.id, + webhookId: webhooks[0]?.id, + jobId: jobs[0]?.id, + serviceId: swarmServices[0]?.id, + backupId: backups[0]?.id, + vulnerabilityId: undefined, + ignoreId: undefined, + buildId: undefined, + keyId: undefined, + path: "/", + query: "docker", +}; + +function fillParams(zodShape) { + const params = {}; + for (const [key, schema] of Object.entries(zodShape || {})) { + const optional = schema.isOptional?.() ?? false; + if (key in PARAM_VALUES) { + if (PARAM_VALUES[key] === undefined && !optional) return { missing: key }; + if (PARAM_VALUES[key] !== undefined) params[key] = PARAM_VALUES[key]; + } else if (!optional) { + return { missing: key }; + } + } + return { params }; +} + +// ---- Run ---- +let pass = 0, fail = 0, skip = 0; +const failures = []; + +for (const [name, { config, handler }] of tools) { + if (!config.annotations?.readOnlyHint || EXCLUDE.has(name)) continue; + + const filled = fillParams(config.inputSchema); + if (filled.missing) { + skip++; + console.log(`SKIP ${name} (no value for required param "${filled.missing}")`); + continue; + } + + try { + const result = await handler(filled.params); + const text = (result.content || []).map((c) => c.text).join("\n"); + if (result.isError) { + // 403 = the API key lacks the permission — not a rendering bug + if (/HTTP 403/.test(text)) { + skip++; + console.log(`SKIP ${name} (API key lacks permission)`); + continue; + } + fail++; + failures.push([name, `tool error: ${text.substring(0, 200)}`]); + console.log(`FAIL ${name} — ${text.substring(0, 120).replace(/\n/g, " | ")}`); + continue; + } + const bad = BAD_PATTERNS.filter((p) => p.test(text)); + if (bad.length > 0) { + fail++; + const badLines = text.split("\n").filter((l) => bad.some((p) => p.test(l))).slice(0, 3); + failures.push([name, badLines.join(" | ")]); + console.log(`FAIL ${name} — ${bad.map(String).join(",")}\n ${badLines.join("\n ")}`); + } else { + pass++; + console.log(`ok ${name}`); + } + } catch (error) { + fail++; + const msg = error instanceof Error ? error.message : String(error); + failures.push([name, `threw: ${msg}`]); + console.log(`FAIL ${name} — threw: ${msg.substring(0, 150)}`); + } +} + +console.log(`\n${pass} ok, ${fail} failed, ${skip} skipped`); +if (failures.length) { + console.log("\nFailures:"); + for (const [n, why] of failures) console.log(` - ${n}: ${why}`); + process.exit(1); +} diff --git a/src/client/arcane-client.ts b/src/client/arcane-client.ts index e3f8d2e..e61cf25 100644 --- a/src/client/arcane-client.ts +++ b/src/client/arcane-client.ts @@ -261,6 +261,36 @@ export class ArcaneClient { return this.request(path, { method: "DELETE", params, body }); } + /** + * POST a single file as multipart/form-data (e.g. build workspace uploads). + */ + async postMultipart( + path: string, + params: Record | undefined, + fileName: string, + content: string + ): Promise { + const url = this.buildUrl(`/api${path}`, params); + const authHeaders = await this.authManager.getAuthHeaders(); + + const form = new FormData(); + form.append("file", new Blob([content]), fileName); + + // Content-Type (with boundary) is set by fetch from the FormData body + const response = await fetch(url, { + method: "POST", + headers: { Accept: "application/json", ...authHeaders }, + body: form, + }); + + if (!response.ok) { + throw await parseApiError(response, path); + } + + const text = await response.text(); + return (text ? JSON.parse(text) : undefined) as T; + } + /** * Fire a long-running POST without awaiting its completion. * Uses a generous timeout so the built-in timeout retry never re-triggers diff --git a/src/tools/__tests__/container-tools.test.ts b/src/tools/__tests__/container-tools.test.ts index 55b89c1..1b75b93 100644 --- a/src/tools/__tests__/container-tools.test.ts +++ b/src/tools/__tests__/container-tools.test.ts @@ -73,20 +73,20 @@ describe("container-tools", () => { data: [ { id: "abc123def456ghi789", - name: "my-app", + names: ["/my-app"], image: "nginx:latest", status: "Up 2 hours", state: "running", - created: "2024-01-01T00:00:00Z", + created: 1704067200, ports: [{ privatePort: 80, publicPort: 8080, type: "tcp" }], }, { id: "xyz987wvu654tsr321", - name: "my-db", + names: ["/my-db"], image: "postgres:16", status: "Exited (0) 1 hour ago", state: "stopped", - created: "2024-01-01T00:00:00Z", + created: 1704067200, ports: [], }, ], @@ -135,10 +135,9 @@ describe("container-tools", () => { mockClient.get.mockResolvedValueOnce({ data: { id: "abc123def456ghi789", - name: "my-app", + name: "/my-app", image: "nginx:latest", - state: "running", - status: "Up 2 hours", + state: { status: "running", running: true, health: { status: "healthy" } }, created: "2024-01-01T00:00:00Z", ports: [{ privatePort: 80, publicPort: 8080, type: "tcp" }], labels: { "com.docker.compose.project": "myproject" }, @@ -153,7 +152,7 @@ describe("container-tools", () => { const text = result.content[0].text; expect(text).toContain("Container: my-app"); - expect(text).toContain("State: running"); + expect(text).toContain("State: running (healthy)"); expect(text).toContain("8080:80/tcp"); expect(text).toContain("com.docker.compose.project: myproject"); }); diff --git a/src/tools/__tests__/dashboard-tools.test.ts b/src/tools/__tests__/dashboard-tools.test.ts index f804102..fd0080c 100644 --- a/src/tools/__tests__/dashboard-tools.test.ts +++ b/src/tools/__tests__/dashboard-tools.test.ts @@ -63,20 +63,15 @@ describe("dashboard-tools", () => { }); describe("arcane_dashboard_get", () => { - it("returns snapshot with container/project/image counts", async () => { + it("returns snapshot with container/image counts and action items", async () => { mockClient.get.mockResolvedValueOnce({ data: { - containers: { total: 10, running: 7, stopped: 3 }, - projects: { total: 4, running: 3, stopped: 1 }, - images: { total: 15, updatesAvailable: 2 }, - volumes: { total: 8, totalSize: "12.5 GB" }, - networks: { total: 5 }, - systemInfo: { - dockerVersion: "24.0.7", - osType: "linux", - cpus: 4, - memoryBytes: 8e9, + containers: { + counts: { totalContainers: 10, runningContainers: 7, stoppedContainers: 3 }, }, + imageUsageCounts: { totalImages: 15, totalImageSize: 5e9, imagesInuse: 12, imagesUnused: 3 }, + actionItems: { items: [{ kind: "image_updates", severity: "info", count: 2 }] }, + versionInfo: { currentVersion: "v2.3.2", newestVersion: "v2.4.0" }, }, }); @@ -85,24 +80,19 @@ describe("dashboard-tools", () => { const text = result.content[0].text; expect(text).toContain("Containers: 10 total (7 running, 3 stopped)"); - expect(text).toContain("Projects: 4 total (3 running, 1 stopped)"); - expect(text).toContain("Images: 15 total (2 updates available)"); - expect(text).toContain("Volumes: 8 (12.5 GB)"); - expect(text).toContain("Networks: 5"); - expect(text).toContain("Docker: 24.0.7"); - expect(text).toContain("CPUs: 4"); - expect(text).toContain("8.0 GB"); + expect(text).toContain("Images: 15 total (12 in use, 3 unused"); + expect(text).toContain("[INFO] image_updates: 2"); + expect(text).toContain("Arcane: v2.3.2 (update available: v2.4.0)"); expect(result.isError).toBeUndefined(); }); - it("handles missing system info", async () => { + it("handles missing action items", async () => { mockClient.get.mockResolvedValueOnce({ data: { - containers: { total: 1, running: 1, stopped: 0 }, - projects: { total: 0, running: 0, stopped: 0 }, - images: { total: 1, updatesAvailable: 0 }, - volumes: { total: 0 }, - networks: { total: 1 }, + containers: { + counts: { totalContainers: 1, runningContainers: 1, stoppedContainers: 0 }, + }, + actionItems: { items: [] }, }, }); @@ -111,7 +101,7 @@ describe("dashboard-tools", () => { const text = result.content[0].text; expect(text).toContain("Containers: 1 total"); - expect(text).not.toContain("System:"); + expect(text).toContain("Action Items: none"); }); it("returns isError when client throws", async () => { diff --git a/src/tools/auth-tools.ts b/src/tools/auth-tools.ts index f5d387c..93de381 100644 --- a/src/tools/auth-tools.ts +++ b/src/tools/auth-tools.ts @@ -28,13 +28,16 @@ export function registerAuthTools(server: McpServer, registry?: ToolRegistry): v }, toolHandler(async ({ username, password }, client) => { const response = await client.post<{ - token: string; - refreshToken: string; - expiresAt: string; - user: { id: string; username: string; role: string }; + data: { + token: string; + refreshToken: string; + expiresAt: string; + user: { id: string; username: string; isGlobalAdmin?: boolean }; + }; }>("/auth/login", { username, password }); - return `Login successful!\nUser: ${response.user.username}\nRole: ${response.user.role}\nToken expires: ${response.expiresAt}`; + const login = response.data; + return `Login successful!\nUser: ${login.user.username}\nGlobal Admin: ${login.user.isGlobalAdmin ? "Yes" : "No"}\nToken expires: ${login.expiresAt}`; }) ); @@ -72,11 +75,11 @@ export function registerAuthTools(server: McpServer, registry?: ToolRegistry): v }, toolHandler(async (_params, client) => { const response = await client.get<{ - data: { id: string; username: string; role: string; createdAt: string }; + data: { id: string; username: string; displayName?: string; email?: string; isGlobalAdmin?: boolean; createdAt: string }; }>("/auth/me"); const user = response.data; - return `Current User:\n ID: ${user.id}\n Username: ${user.username}\n Role: ${user.role}\n Created: ${user.createdAt}`; + return `Current User:\n ID: ${user.id}\n Username: ${user.username}\n Display Name: ${user.displayName || "N/A"}\n Global Admin: ${user.isGlobalAdmin ? "Yes" : "No"}\n Created: ${user.createdAt}`; }) ); @@ -98,12 +101,10 @@ export function registerAuthTools(server: McpServer, registry?: ToolRegistry): v }, toolHandler(async ({ refreshToken }, client) => { const response = await client.post<{ - token: string; - refreshToken: string; - expiresAt: string; + data: { token: string; refreshToken: string; expiresAt: string }; }>("/auth/refresh", { refreshToken }); - return `Token refreshed successfully!\nNew token expires: ${response.expiresAt}`; + return `Token refreshed successfully!\nNew token expires: ${response.data.expiresAt}`; }) ); @@ -179,14 +180,25 @@ export function registerAuthTools(server: McpServer, registry?: ToolRegistry): v }, }, toolHandler(async (_params, client) => { - const response = await client.get<{ - clientId: string; - redirectUri: string; - issuerUrl: string; - scopes: string; - }>("/oidc/config"); - - return `OIDC Configuration:\n Client ID: ${response.clientId}\n Issuer: ${response.issuerUrl}\n Redirect URI: ${response.redirectUri}\n Scopes: ${response.scopes}`; + try { + const response = await client.get<{ + clientId: string; + redirectUri: string; + issuerUrl: string; + scopes: string; + }>("/oidc/config"); + + return `OIDC Configuration:\n Client ID: ${response.clientId}\n Issuer: ${response.issuerUrl}\n Redirect URI: ${response.redirectUri}\n Scopes: ${response.scopes}`; + } catch (error) { + // Arcane returns a 500 when OIDC is not set up — report that clearly + const status = await client + .get<{ envConfigured: boolean }>("/oidc/status") + .catch(() => undefined); + if (status && !status.envConfigured) { + return "OIDC is not configured on this instance."; + } + throw error; + } }) ); diff --git a/src/tools/build-tools.ts b/src/tools/build-tools.ts index b313276..771c280 100644 --- a/src/tools/build-tools.ts +++ b/src/tools/build-tools.ts @@ -83,12 +83,12 @@ export function registerBuildTools(server: McpServer, registry?: ToolRegistry): const lines = [`Found ${response.pagination.totalItems} builds:\n`]; for (const build of response.data) { - lines.push(`[${build.status.toUpperCase()}] ${build.tag || build.id}`); + lines.push(`[${build.status.toUpperCase()}] ${build.tags?.join(", ") || build.id}`); lines.push(` Build ID: ${build.id}`); if (build.provider) lines.push(` Provider: ${build.provider}`); - if (build.startedAt) lines.push(` Started: ${build.startedAt}`); + if (build.createdAt) lines.push(` Created: ${build.createdAt}`); if (build.completedAt) lines.push(` Completed: ${build.completedAt}`); - if (build.error) lines.push(` Error: ${build.error}`); + if (build.errorMessage) lines.push(` Error: ${build.errorMessage}`); lines.push(""); } @@ -123,23 +123,22 @@ export function registerBuildTools(server: McpServer, registry?: ToolRegistry): `Build Details:`, ` Build ID: ${build.id}`, ` Status: ${build.status}`, - ` Tag: ${build.tag || "N/A"}`, - ` Platform: ${build.platform || "default"}`, + ` Tags: ${build.tags?.join(", ") || "N/A"}`, + ` Platforms: ${build.platforms?.join(", ") || "default"}`, ]; - if (build.gitUrl) lines.push(` Git URL: ${build.gitUrl}`); - if (build.startedAt) lines.push(` Started: ${build.startedAt}`); + if (build.createdAt) lines.push(` Created: ${build.createdAt}`); if (build.completedAt) lines.push(` Completed: ${build.completedAt}`); - if (build.error) lines.push(` Error: ${build.error}`); + if (build.errorMessage) lines.push(` Error: ${build.errorMessage}`); if (build.buildArgs && Object.keys(build.buildArgs).length > 0) { lines.push(` Build Args:`); for (const [key, value] of Object.entries(build.buildArgs)) { lines.push(` ${key}=${value}`); } } - if (build.logs) { + if (build.output) { lines.push(""); - lines.push("Build Logs:"); - lines.push(build.logs); + lines.push(`Build Output${build.outputTruncated ? " (truncated)" : ""}:`); + lines.push(build.output); } return lines.join("\n"); @@ -206,12 +205,12 @@ export function registerBuildTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, path }, client) => { validatePath(path); - const response = await client.get<{ data: { content: string; path: string } }>( + const response = await client.get<{ data: { content: string; mimeType?: string } }>( `/environments/${environmentId}/builds/browse/content`, { path } ); - return `File: ${response.data.path}\n\n${response.data.content}`; + return `File: ${path}\n\n${response.data.content}`; }) ); @@ -236,9 +235,13 @@ export function registerBuildTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, path, content }, client) => { validatePath(path); - await client.post( + // The API expects multipart/form-data with the destination path as a query param + const fileName = path.split("/").pop() || "file"; + await client.postMultipart( `/environments/${environmentId}/builds/browse/upload`, - { path, content } + { path }, + fileName, + content ); return `File uploaded to workspace: ${path}`; diff --git a/src/tools/container-tools.ts b/src/tools/container-tools.ts index d3e3487..c3a8f67 100644 --- a/src/tools/container-tools.ts +++ b/src/tools/container-tools.ts @@ -47,7 +47,10 @@ export function registerContainerTools(server: McpServer, registry?: ToolRegistr const lines = [`Found ${response.pagination.totalItems} containers:\n`]; for (const container of response.data) { const status = container.state === "running" ? "[RUNNING]" : "[STOPPED]"; - lines.push(`${status} ${container.name}`); + // The list returns Docker-style `names` (leading slash), not `name` + const name = container.names?.[0]?.replace(/^\//, "") || container.id.substring(0, DOCKER_SHORT_ID_LENGTH); + const updateFlag = container.updateInfo?.hasUpdate ? " [UPDATE AVAILABLE]" : ""; + lines.push(`${status}${updateFlag} ${name}`); lines.push(` ID: ${container.id.substring(0, DOCKER_SHORT_ID_LENGTH)}`); lines.push(` Image: ${container.image}`); lines.push(` Status: ${container.status}`); @@ -83,19 +86,32 @@ export function registerContainerTools(server: McpServer, registry?: ToolRegistr }, }, toolHandler(async ({ environmentId, containerId }, client) => { - const response = await client.get<{ data: Container & { config?: Record } }>( - `/environments/${environmentId}/containers/${containerId}` - ); + // Unlike the list, the detail endpoint has `name` (no `names`) and `state` is an object + const response = await client.get<{ + data: { + id: string; + name: string; + image: string; + created: string; + state?: { status?: string; running?: boolean; exitCode?: number; startedAt?: string; health?: { status?: string } }; + ports?: Array<{ privatePort: number; publicPort?: number; type: string }>; + labels?: Record; + }; + }>(`/environments/${environmentId}/containers/${containerId}`); const c = response.data; + const stateStatus = c.state?.status || (c.state?.running ? "running" : "unknown"); + const health = c.state?.health?.status ? ` (${c.state.health.status})` : ""; const lines = [ - `Container: ${c.name}`, + `Container: ${c.name?.replace(/^\//, "")}`, ` ID: ${c.id}`, ` Image: ${c.image}`, - ` State: ${c.state}`, - ` Status: ${c.status}`, + ` State: ${stateStatus}${health}`, ` Created: ${c.created}`, ]; + if (c.state?.running === false && c.state?.exitCode !== undefined) { + lines.push(` Exit Code: ${c.state.exitCode}`); + } if (c.ports && c.ports.length > 0) { lines.push(" Ports:"); @@ -343,13 +359,15 @@ export function registerContainerTools(server: McpServer, registry?: ToolRegistr }, toolHandler(async ({ environmentId, includeInternal }, client) => { const response = await client.get<{ - running: number; - stopped: number; - paused: number; - total: number; + data: { + totalContainers: number; + runningContainers: number; + stoppedContainers: number; + }; }>(`/environments/${environmentId}/containers/counts`, { includeInternal }); - return `Container Counts:\n Total: ${response.total}\n Running: ${response.running}\n Stopped: ${response.stopped}\n Paused: ${response.paused || 0}`; + const c = response.data; + return `Container Counts:\n Total: ${c.totalContainers}\n Running: ${c.runningContainers}\n Stopped: ${c.stoppedContainers}`; }) ); diff --git a/src/tools/dashboard-tools.ts b/src/tools/dashboard-tools.ts index 42b6e78..fcbd225 100644 --- a/src/tools/dashboard-tools.ts +++ b/src/tools/dashboard-tools.ts @@ -6,6 +6,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; +import { formatSizeGB } from "../utils/format.js"; import type { DashboardSnapshot } from "../types/arcane-types.js"; export function registerDashboardTools(server: McpServer, registry?: ToolRegistry): void { @@ -33,26 +34,32 @@ export function registerDashboardTools(server: McpServer, registry?: ToolRegistr ); const d = response.data; - const lines = [ - `Dashboard Snapshot:`, - ``, - `Containers: ${d.containers.total} total (${d.containers.running} running, ${d.containers.stopped} stopped)`, - `Projects: ${d.projects.total} total (${d.projects.running} running, ${d.projects.stopped} stopped)`, - `Images: ${d.images.total} total (${d.images.updatesAvailable} updates available)`, - `Volumes: ${d.volumes.total}${d.volumes.totalSize ? ` (${d.volumes.totalSize})` : ""}`, - `Networks: ${d.networks.total}`, - ]; - - if (d.systemInfo) { - lines.push(""); - lines.push("System:"); - if (d.systemInfo.dockerVersion) lines.push(` Docker: ${d.systemInfo.dockerVersion}`); - if (d.systemInfo.osType) lines.push(` OS: ${d.systemInfo.osType}`); - if (d.systemInfo.cpus) lines.push(` CPUs: ${d.systemInfo.cpus}`); - if (d.systemInfo.memoryBytes) { - const memGB = (d.systemInfo.memoryBytes / 1e9).toFixed(1); - lines.push(` Memory: ${memGB} GB`); + const lines = [`Dashboard Snapshot:`, ``]; + + const counts = d.containers?.counts; + if (counts) { + lines.push(`Containers: ${counts.totalContainers} total (${counts.runningContainers} running, ${counts.stoppedContainers} stopped)`); + } + + const img = d.imageUsageCounts; + if (img) { + lines.push(`Images: ${img.totalImages} total (${img.imagesInuse} in use, ${img.imagesUnused} unused, ${formatSizeGB(img.totalImageSize)})`); + } + + const items = d.actionItems?.items; + if (items && items.length > 0) { + lines.push("", "Action Items:"); + for (const item of items) { + lines.push(` [${(item.severity || "info").toUpperCase()}] ${item.kind}: ${item.count}`); } + } else { + lines.push("", "Action Items: none — everything looks good."); + } + + const v = d.versionInfo; + if (v?.currentVersion) { + const update = v.newestVersion && v.newestVersion !== v.currentVersion ? ` (update available: ${v.newestVersion})` : ""; + lines.push("", `Arcane: ${v.currentVersion}${update}`); } return lines.join("\n"); diff --git a/src/tools/environment-tools.ts b/src/tools/environment-tools.ts index 4256add..0c97e0e 100644 --- a/src/tools/environment-tools.ts +++ b/src/tools/environment-tools.ts @@ -77,9 +77,12 @@ export function registerEnvironmentTools(server: McpServer, registry?: ToolRegis ` ID: ${env.id}`, ` Status: ${env.status || "unknown"}`, ` API URL: ${env.apiUrl || "N/A"}`, - ` Created: ${env.createdAt || "N/A"}`, - ` Updated: ${env.updatedAt || "N/A"}`, + ` Enabled: ${env.enabled ? "yes" : "no"}`, + ` Connected: ${env.connected ? "yes" : "no"}`, + ` Edge Agent: ${env.isEdge ? "yes" : "no"}`, ]; + if (env.connectedAt) lines.push(` Connected At: ${env.connectedAt}`); + if (env.lastSeen) lines.push(` Last Seen: ${env.lastSeen}`); return lines.join("\n"); }) @@ -100,14 +103,16 @@ export function registerEnvironmentTools(server: McpServer, registry?: ToolRegis inputSchema: { name: z.string().describe("Name for the environment"), apiUrl: z.string().optional().describe("API URL for the Docker host"), - tlsEnabled: z.boolean().optional().default(false).describe("Enable TLS for Docker API"), + isEdge: z.boolean().optional().describe("Register as an edge agent environment"), + accessToken: z.string().optional().describe("Access token for connecting to the environment's agent"), }, }, - toolHandler(async ({ name, apiUrl, tlsEnabled }, client) => { + toolHandler(async ({ name, apiUrl, isEdge, accessToken }, client) => { const response = await client.post<{ data: Environment & { apiKey?: string } }>("/environments", { name, apiUrl, - tlsEnabled, + isEdge, + accessToken, }); const env = response.data; @@ -187,8 +192,11 @@ export function registerEnvironmentTools(server: McpServer, registry?: ToolRegis }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.post<{ message: string }>(`/environments/${environmentId}/test`); - return `Connection test: ${response.message || "Success"}`; + const response = await client.post<{ data: { status: string; message?: string } }>( + `/environments/${environmentId}/test` + ); + const { status, message } = response.data; + return `Connection test: ${status}${message ? ` - ${message}` : ""}`; }) ); @@ -210,12 +218,12 @@ export function registerEnvironmentTools(server: McpServer, registry?: ToolRegis }, }, toolHandler(async ({ environmentId, rotate }, client) => { - const response = await client.post<{ data: { apiKey: string; expiresAt: string } }>( + const response = await client.post<{ data: { token: string } }>( `/environments/${environmentId}/agent/pair`, { rotate } ); - return `Agent pairing token generated:\n Token: ${response.data.apiKey}\n Expires: ${response.data.expiresAt}`; + return `Agent pairing token generated:\n Token: ${response.data.token}`; }) ); @@ -236,11 +244,11 @@ export function registerEnvironmentTools(server: McpServer, registry?: ToolRegis }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ data: { version: string; buildTime?: string } }>( + const response = await client.get<{ data: { currentVersion: string; buildTime?: string } }>( `/environments/${environmentId}/version` ); - return `Agent Version: ${response.data.version}${response.data.buildTime ? `\nBuild Time: ${response.data.buildTime}` : ""}`; + return `Agent Version: ${response.data.currentVersion}${response.data.buildTime ? `\nBuild Time: ${response.data.buildTime}` : ""}`; }) ); diff --git a/src/tools/gitops-tools.ts b/src/tools/gitops-tools.ts index fbb3b33..0a39532 100644 --- a/src/tools/gitops-tools.ts +++ b/src/tools/gitops-tools.ts @@ -49,7 +49,7 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): lines.push(`${sync.name}`); lines.push(` ID: ${sync.id}`); lines.push(` Branch: ${sync.branch}`); - lines.push(` Path: ${sync.path}`); + lines.push(` Path: ${sync.composePath}`); lines.push(` Auto-sync: ${sync.autoSync ? "Yes" : "No"}`); lines.push(` Last sync: ${sync.lastSyncAt || "Never"} (${status})`); lines.push(""); @@ -87,8 +87,8 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): ` ID: ${sync.id}`, ` Repository ID: ${sync.repositoryId}`, ` Branch: ${sync.branch}`, - ` Path: ${sync.path}`, - ` Target Project: ${sync.targetProjectId || "N/A"}`, + ` Path: ${sync.composePath}`, + ` Target Project: ${sync.projectName || sync.projectId || "N/A"}`, ` Auto-sync: ${sync.autoSync ? `Yes (every ${sync.syncInterval}s)` : "No"}`, ` Last Sync: ${sync.lastSyncAt || "Never"}`, ` Last Status: ${sync.lastSyncStatus || "N/A"}`, @@ -115,16 +115,16 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): name: z.string().describe("Name for the sync"), repositoryId: z.string().describe("Git repository ID"), branch: z.string().describe("Branch to sync from"), - path: z.string().describe("Path to compose files in repo"), - folders: z.array(z.string()).optional().describe("Specific folders to sync (for folder-level sync)"), + composePath: z.string().describe("Path to the compose file in the repo"), + syncDirectory: z.boolean().optional().describe("Sync the entire directory containing the compose file"), autoSync: z.boolean().optional().default(false).describe("Enable automatic syncing"), syncInterval: z.number().optional().describe("Sync interval in seconds (for auto-sync)"), }, }, - toolHandler(async ({ environmentId, name, repositoryId, branch, path, folders, autoSync, syncInterval }, client) => { + toolHandler(async ({ environmentId, name, repositoryId, branch, composePath, syncDirectory, autoSync, syncInterval }, client) => { const response = await client.post<{ data: { id: string; name: string } }>( `/environments/${environmentId}/gitops-syncs`, - { name, repositoryId, branch, path, folders, autoSync, syncInterval } + { name, repositoryId, branch, composePath, syncDirectory, autoSync, syncInterval } ); return `GitOps sync created: ${response.data.name} (ID: ${response.data.id})`; @@ -148,18 +148,18 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): syncId: z.string().describe("GitOps sync ID"), name: z.string().optional().describe("New name"), branch: z.string().optional().describe("New branch"), - path: z.string().optional().describe("New path"), - folders: z.array(z.string()).optional().describe("Updated folders to sync"), + composePath: z.string().optional().describe("New path to the compose file in the repo"), + syncDirectory: z.boolean().optional().describe("Sync the entire directory containing the compose file"), autoSync: z.boolean().optional().describe("Enable/disable auto-sync"), syncInterval: z.number().optional().describe("New sync interval"), }, }, - toolHandler(async ({ environmentId, syncId, name, branch, path, folders, autoSync, syncInterval }, client) => { + toolHandler(async ({ environmentId, syncId, name, branch, composePath, syncDirectory, autoSync, syncInterval }, client) => { const body: Record = {}; if (name) body.name = name; if (branch) body.branch = branch; - if (path) body.path = path; - if (folders) body.folders = folders; + if (composePath) body.composePath = composePath; + if (syncDirectory !== undefined) body.syncDirectory = syncDirectory; if (autoSync !== undefined) body.autoSync = autoSync; if (syncInterval !== undefined) body.syncInterval = syncInterval; @@ -234,21 +234,21 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, syncId }, client) => { const response = await client.get<{ data: { - status: string; + lastSyncStatus?: string; lastSyncAt?: string; - lastCommit?: string; - error?: string; + lastSyncCommit?: string; + lastSyncError?: string; }; }>(`/environments/${environmentId}/gitops-syncs/${syncId}/status`); const status = response.data; const lines = [ - `Sync Status: ${status.status}`, + `Sync Status: ${status.lastSyncStatus || "never synced"}`, ` Last Sync: ${status.lastSyncAt || "Never"}`, - ` Last Commit: ${status.lastCommit || "N/A"}`, + ` Last Commit: ${status.lastSyncCommit || "N/A"}`, ]; - if (status.error) { - lines.push(` Error: ${status.error}`); + if (status.lastSyncError) { + lines.push(` Error: ${status.lastSyncError}`); } return lines.join("\n"); @@ -290,7 +290,6 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): lines.push(`${repo.name}`); lines.push(` ID: ${repo.id}`); lines.push(` URL: ${repo.url}`); - lines.push(` Branch: ${repo.branch}`); lines.push(` Auth: ${repo.authType}`); lines.push(""); } @@ -314,17 +313,16 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): inputSchema: { name: z.string().describe("Repository name"), url: z.string().describe("Repository URL"), - branch: z.string().optional().default("main").describe("Default branch"), authType: z.enum(["none", "basic", "ssh", "token"]).optional().default("none").describe("Authentication type"), username: z.string().optional().describe("Username (for basic auth)"), - password: z.string().optional().describe("Password or token"), + token: z.string().optional().describe("Access token / password for HTTPS auth"), sshKey: z.string().optional().describe("SSH private key"), }, }, - toolHandler(async ({ name, url, branch, authType, username, password, sshKey }, client) => { + toolHandler(async ({ name, url, authType, username, token, sshKey }, client) => { const response = await client.post<{ data: { id: string; name: string } }>( "/customize/git-repositories", - { name, url, branch, authType, username, password, sshKey } + { name, url, authType, username, token, sshKey } ); return `Git repository added: ${response.data.name} (ID: ${response.data.id})`; @@ -349,12 +347,12 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ repositoryId, branch }, client) => { - const response = await client.post<{ message: string }>( + const response = await client.post<{ data: { message?: string } }>( `/customize/git-repositories/${repositoryId}/test`, undefined, { branch } ); - return response.message || "Connection successful!"; + return response.data?.message || "Connection successful!"; }) ); @@ -376,13 +374,16 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): }, toolHandler(async ({ repositoryId }, client) => { const response = await client.get<{ - data: { branches: string[]; defaultBranch?: string }; + data: { branches: Array<{ name: string; isDefault: boolean }> | null }; }>(`/customize/git-repositories/${repositoryId}/branches`); - const lines = [`Branches (default: ${response.data.defaultBranch || "unknown"}):\n`]; + if (!response.data.branches || response.data.branches.length === 0) { + return "No branches found."; + } + + const lines = ["Branches:\n"]; for (const branch of response.data.branches) { - const isDefault = branch === response.data.defaultBranch ? " (default)" : ""; - lines.push(` - ${branch}${isDefault}`); + lines.push(` - ${branch.name}${branch.isDefault ? " (default)" : ""}`); } return lines.join("\n"); @@ -411,15 +412,18 @@ export function registerGitopsTools(server: McpServer, registry?: ToolRegistry): if (path) validatePath(path); const response = await client.get<{ - data: Array<{ name: string; type: string; path: string }>; + data: { + path: string; + files: Array<{ name: string; path: string; type: string; size?: number }> | null; + }; }>(`/customize/git-repositories/${repositoryId}/files`, { branch, path }); - if (!response.data || response.data.length === 0) { + if (!response.data.files || response.data.files.length === 0) { return `No files found at path: ${path || "/"}`; } const lines = [`Files at ${path || "/"}:\n`]; - for (const file of response.data) { + for (const file of response.data.files) { const type = file.type === "dir" ? "DIR " : "FILE"; lines.push(`${type} ${file.name}`); } diff --git a/src/tools/image-tools.ts b/src/tools/image-tools.ts index 4beea51..56ea631 100644 --- a/src/tools/image-tools.ts +++ b/src/tools/image-tools.ts @@ -127,15 +127,12 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): environmentId: z.string().describe("Environment ID"), imageName: z.string().describe("Image name (e.g., nginx, library/ubuntu, ghcr.io/owner/repo)"), tag: z.string().describe("Image tag (e.g., latest, v1.0, alpine) — required"), - registryId: z.string().optional().describe("Container registry ID for private images (credentials will be fetched automatically)"), }, }, - toolHandler(async ({ environmentId, imageName, tag, registryId }, client) => { - const body: Record = { imageName, tag }; - if (registryId) body.registryId = registryId; - + toolHandler(async ({ environmentId, imageName, tag }, client) => { + // Credentials of registries configured in Arcane are applied automatically by the server const displayName = tag ? `${imageName}:${tag}` : imageName; - await client.post(`/environments/${environmentId}/images/pull`, body); + await client.post(`/environments/${environmentId}/images/pull`, { imageName, tag }); return `Image ${displayName} pulled successfully.`; }) ); @@ -156,12 +153,11 @@ export function registerImageTools(server: McpServer, registry?: ToolRegistry): environmentId: z.string().describe("Environment ID"), imageId: z.string().describe("Image ID or name:tag to delete (names are resolved via the image list)"), force: z.boolean().optional().default(false).describe("Force removal even if in use"), - pruneChildren: z.boolean().optional().default(false).describe("Also remove child images"), }, }, - toolHandler(async ({ environmentId, imageId, force, pruneChildren }, client) => { + toolHandler(async ({ environmentId, imageId, force }, client) => { const resolvedId = await resolveImageId(client, environmentId, imageId); - await client.delete(`/environments/${environmentId}/images/${resolvedId}`, { force, pruneChildren }); + await client.delete(`/environments/${environmentId}/images/${resolvedId}`, { force }); return `Image ${imageId} removed successfully.`; }) ); diff --git a/src/tools/job-tools.ts b/src/tools/job-tools.ts index f88afed..039f336 100644 --- a/src/tools/job-tools.ts +++ b/src/tools/job-tools.ts @@ -27,23 +27,24 @@ export function registerJobTools(server: McpServer, registry?: ToolRegistry): vo }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ data: Job[] }>( + const response = await client.get<{ isAgent: boolean; jobs: Job[] | null }>( `/environments/${environmentId}/jobs` ); - if (!response.data || response.data.length === 0) { + if (!response.jobs || response.jobs.length === 0) { return "No jobs found."; } const lines = [`Jobs:\n`]; - for (const job of response.data) { + for (const job of response.jobs) { const status = job.enabled ? "[ENABLED]" : "[DISABLED]"; lines.push(`${status} ${job.name}`); lines.push(` ID: ${job.id}`); - lines.push(` Type: ${job.type}`); - lines.push(` Schedule: ${job.schedule || "manual"}`); - lines.push(` Last Run: ${job.lastRunAt || "never"}`); - lines.push(` Next Run: ${job.nextRunAt || "N/A"}`); + lines.push(` Category: ${job.category}`); + if (job.description) lines.push(` Description: ${job.description}`); + lines.push(` Schedule: ${job.isContinuous ? "continuous" : job.schedule || "manual"}`); + lines.push(` Next Run: ${job.nextRun || "N/A"}`); + lines.push(` Can Run Manually: ${job.canRunManually ? "yes" : "no"}`); lines.push(""); } @@ -79,7 +80,7 @@ export function registerJobTools(server: McpServer, registry?: ToolRegistry): vo "arcane_job_schedule_get", { title: "Get job schedules", - description: "Get job schedules for an environment", + description: "Get the configured job schedule intervals for an environment", annotations: { readOnlyHint: true, destructiveHint: false, @@ -91,23 +92,21 @@ export function registerJobTools(server: McpServer, registry?: ToolRegistry): vo }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ - data: Array<{ - jobId: string; - jobName: string; - schedule: string; - enabled: boolean; - }>; - }>(`/environments/${environmentId}/job-schedules`); + const config = await client.get>( + `/environments/${environmentId}/job-schedules` + ); + + const entries = Object.entries(config).filter( + ([key, value]) => key !== "$schema" && typeof value === "string" + ); - if (!response.data || response.data.length === 0) { - return "No job schedules configured."; + if (entries.length === 0) { + return "No job schedule configuration found."; } - const lines = ["Job Schedules:\n"]; - for (const schedule of response.data) { - const status = schedule.enabled ? "[ON]" : "[OFF]"; - lines.push(`${status} ${schedule.jobName}: ${schedule.schedule}`); + const lines = ["Job Schedule Intervals:\n"]; + for (const [key, value] of entries) { + lines.push(` ${key}: ${value}`); } return lines.join("\n"); @@ -119,7 +118,7 @@ export function registerJobTools(server: McpServer, registry?: ToolRegistry): vo "arcane_job_schedule_update", { title: "Update job schedules", - description: "Update job schedules for an environment", + description: "Update job schedule intervals for an environment. Only the provided intervals are changed.", annotations: { readOnlyHint: false, destructiveHint: false, @@ -128,15 +127,28 @@ export function registerJobTools(server: McpServer, registry?: ToolRegistry): vo }, inputSchema: { environmentId: z.string().describe("Environment ID"), - schedules: z.array(z.object({ - jobId: z.string().describe("Job ID"), - schedule: z.string().optional().describe("Cron schedule expression"), - enabled: z.boolean().optional().describe("Enable or disable"), - })).describe("Schedule updates"), + autoHealInterval: z.string().optional().describe("Interval for the auto-heal job"), + autoUpdateInterval: z.string().optional().describe("Interval for the auto-update job"), + dockerClientRefreshInterval: z.string().optional().describe("Interval for refreshing the Docker client"), + environmentHealthInterval: z.string().optional().describe("Interval for environment health checks"), + eventCleanupInterval: z.string().optional().describe("Interval for event cleanup"), + expiredSessionsCleanupInterval: z.string().optional().describe("Interval for expired session cleanup"), + pollingInterval: z.string().optional().describe("Interval for polling"), + scheduledPruneInterval: z.string().optional().describe("Interval for scheduled prune"), + vulnerabilityScanInterval: z.string().optional().describe("Interval for vulnerability scans"), }, }, - toolHandler(async ({ environmentId, schedules }, client) => { - await client.put(`/environments/${environmentId}/job-schedules`, { schedules }); + toolHandler(async ({ environmentId, ...intervals }, client) => { + const body: Record = {}; + for (const [key, value] of Object.entries(intervals)) { + if (value !== undefined) body[key] = value; + } + + if (Object.keys(body).length === 0) { + return "No intervals provided - nothing to update."; + } + + await client.put(`/environments/${environmentId}/job-schedules`, body); return "Job schedules updated."; }) ); diff --git a/src/tools/network-tools.ts b/src/tools/network-tools.ts index 0d10d47..2c949d1 100644 --- a/src/tools/network-tools.ts +++ b/src/tools/network-tools.ts @@ -49,8 +49,9 @@ export function registerNetworkTools(server: McpServer, registry?: ToolRegistry) lines.push(` ID: ${net.id.substring(0, DOCKER_SHORT_ID_LENGTH)}`); lines.push(` Driver: ${net.driver}`); lines.push(` Scope: ${net.scope}`); - if (net.ipam?.config?.[0]?.subnet) { - lines.push(` Subnet: ${net.ipam.config[0].subnet}`); + lines.push(` In Use: ${net.inUse ? "Yes" : "No"}`); + if (net.isDefault) { + lines.push(` Default: Yes`); } lines.push(""); } @@ -97,9 +98,9 @@ export function registerNetworkTools(server: McpServer, registry?: ToolRegistry) if (config.gateway) lines.push(` Gateway: ${config.gateway}`); } - if (net.containers && Object.keys(net.containers).length > 0) { + if (net.containersList && net.containersList.length > 0) { lines.push(" Connected Containers:"); - for (const [_id, container] of Object.entries(net.containers)) { + for (const container of net.containersList) { lines.push(` - ${container.name} (${container.ipv4Address || "no IP"})`); } } @@ -132,21 +133,25 @@ export function registerNetworkTools(server: McpServer, registry?: ToolRegistry) }, }, toolHandler(async ({ environmentId, name, driver, internal, attachable, subnet, gateway, ipRange }, client) => { - const body: Record = { name, driver, internal, attachable }; + const options: Record = { driver, internal, attachable }; if (subnet || gateway || ipRange) { - body.ipam = { + options.ipam = { driver: "default", config: [{ subnet, gateway, ipRange }], }; } - const response = await client.post<{ data: { id: string; name: string } }>( + const response = await client.post<{ data: { id: string; warning?: string } }>( `/environments/${environmentId}/networks`, - body + { name, options } ); - return `Network created successfully!\n Name: ${response.data.name}\n ID: ${response.data.id}`; + const lines = [`Network created successfully!`, ` Name: ${name}`, ` ID: ${response.data.id}`]; + if (response.data.warning) { + lines.push(` Warning: ${response.data.warning}`); + } + return lines.join("\n"); }) ); @@ -190,13 +195,13 @@ export function registerNetworkTools(server: McpServer, registry?: ToolRegistry) }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.post<{ networksDeleted?: string[] }>( - `/environments/${environmentId}/networks/prune` - ); + const response = await client.post<{ + data: { networksDeleted?: string[] | null; spaceReclaimed?: number }; + }>(`/environments/${environmentId}/networks/prune`); - const deleted = response.networksDeleted?.length || 0; + const deleted = response.data.networksDeleted?.length || 0; return deleted > 0 - ? `Pruned ${deleted} unused networks: ${response.networksDeleted?.join(", ")}` + ? `Pruned ${deleted} unused networks: ${response.data.networksDeleted?.join(", ")}` : "No unused networks to prune."; }) ); @@ -219,13 +224,10 @@ export function registerNetworkTools(server: McpServer, registry?: ToolRegistry) }, toolHandler(async ({ environmentId }, client) => { const response = await client.get<{ - total: number; - bridge: number; - overlay: number; - other: number; + data: { total: number; inuse: number; unused: number }; }>(`/environments/${environmentId}/networks/counts`); - return `Network Counts:\n Total: ${response.total}\n Bridge: ${response.bridge || 0}\n Overlay: ${response.overlay || 0}\n Other: ${response.other || 0}`; + return `Network Counts:\n Total: ${response.data.total}\n In Use: ${response.data.inuse || 0}\n Unused: ${response.data.unused || 0}`; }) ); diff --git a/src/tools/network-topology-tools.ts b/src/tools/network-topology-tools.ts index c42ac89..e6a40b3 100644 --- a/src/tools/network-topology-tools.ts +++ b/src/tools/network-topology-tools.ts @@ -42,7 +42,7 @@ export function registerNetworkTopologyTools(server: McpServer, registry?: ToolR ]; for (const node of topology.nodes) { - const status = node.status ? ` [${node.status.toUpperCase()}]` : ""; + const status = node.metadata?.status ? ` [${node.metadata.status.toUpperCase()}]` : ""; lines.push(` [${node.type.toUpperCase()}] ${node.name}${status} (${node.id})`); } @@ -50,8 +50,8 @@ export function registerNetworkTopologyTools(server: McpServer, registry?: ToolR lines.push(""); lines.push("Connections:"); for (const edge of topology.edges) { - const type = edge.type ? ` (${edge.type})` : ""; - lines.push(` ${edge.source} -> ${edge.target}${type}`); + const ip = edge.ipv4Address ? ` (${edge.ipv4Address})` : ""; + lines.push(` ${edge.source} -> ${edge.target}${ip}`); } } diff --git a/src/tools/port-tools.ts b/src/tools/port-tools.ts index a4706fa..98004ed 100644 --- a/src/tools/port-tools.ts +++ b/src/tools/port-tools.ts @@ -44,9 +44,9 @@ export function registerPortTools(server: McpServer, registry?: ToolRegistry): v const lines = [`Found ${response.pagination.totalItems} port mappings:\n`]; for (const port of response.data) { - const binding = port.publicPort - ? `${port.ip || "0.0.0.0"}:${port.publicPort} -> ${port.privatePort}/${port.protocol}` - : `${port.privatePort}/${port.protocol} (not published)`; + const binding = port.isPublished && port.hostPort + ? `${port.hostIp || "0.0.0.0"}:${port.hostPort} -> ${port.containerPort}/${port.protocol}` + : `${port.containerPort}/${port.protocol} (not published)`; lines.push(`${port.containerName}: ${binding}`); } diff --git a/src/tools/project-tools.ts b/src/tools/project-tools.ts index fdf19dd..abd8402 100644 --- a/src/tools/project-tools.ts +++ b/src/tools/project-tools.ts @@ -51,13 +51,13 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) const updateFlag = project.updateInfo?.hasUpdate ? " [UPDATES AVAILABLE]" : ""; lines.push(`${projectStatus}${updateFlag} ${project.name}`); lines.push(` ID: ${project.id}`); - lines.push(` Services: ${project.services?.length || 0}`); - if (project.services && project.services.length > 0) { - for (const svc of project.services.slice(0, MAX_DISPLAY_SERVICES)) { - lines.push(` - ${svc.name}: ${svc.status}`); + lines.push(` Services: ${project.serviceCount ?? project.runtimeServices?.length ?? 0}`); + if (project.runtimeServices && project.runtimeServices.length > 0) { + for (const svc of project.runtimeServices.slice(0, MAX_DISPLAY_SERVICES)) { + lines.push(` - ${svc.name}: ${svc.status}${svc.health ? ` (${svc.health})` : ""}`); } - if (project.services.length > MAX_DISPLAY_SERVICES) { - lines.push(` ... and ${project.services.length - MAX_DISPLAY_SERVICES} more`); + if (project.runtimeServices.length > MAX_DISPLAY_SERVICES) { + lines.push(` ... and ${project.runtimeServices.length - MAX_DISPLAY_SERVICES} more`); } } const u = project.updateInfo; @@ -116,8 +116,8 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) } lines.push("", "Services:"); - for (const svc of proj.services || []) { - lines.push(` - ${svc.name}: ${svc.status} (${svc.containerCount || 0} containers)`); + for (const svc of proj.runtimeServices || []) { + lines.push(` - ${svc.name}: ${svc.status}${svc.health ? ` (${svc.health})` : ""}${svc.containerName ? ` [${svc.containerName}]` : ""}`); } return lines.join("\n"); @@ -141,13 +141,12 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) name: z.string().describe("Project name"), composeContent: z.string().describe("Docker Compose YAML content"), envContent: z.string().optional().describe("Environment variables content (.env format)"), - directory: z.string().optional().describe("Project directory path (supports nested and symlinked directories)"), }, }, - toolHandler(async ({ environmentId, name, composeContent, envContent, directory }, client) => { + toolHandler(async ({ environmentId, name, composeContent, envContent }, client) => { const response = await client.post<{ data: { id: string; name: string } }>( `/environments/${environmentId}/projects`, - { name, composeContent, envContent, directory } + { name, composeContent, envContent } ); return `Project created successfully!\n Name: ${response.data.name}\n ID: ${response.data.id}`; @@ -377,13 +376,16 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) }, toolHandler(async ({ environmentId }, client) => { const response = await client.get<{ - total: number; - running: number; - stopped: number; - partial: number; + data: { + totalProjects: number; + runningProjects: number; + stoppedProjects: number; + archivedProjects?: number; + }; }>(`/environments/${environmentId}/projects/counts`); - return `Project Counts:\n Total: ${response.total}\n Running: ${response.running || 0}\n Stopped: ${response.stopped || 0}\n Partial: ${response.partial || 0}`; + const c = response.data; + return `Project Counts:\n Total: ${c.totalProjects}\n Running: ${c.runningProjects || 0}\n Stopped: ${c.stoppedProjects || 0}\n Archived: ${c.archivedProjects || 0}`; }) ); diff --git a/src/tools/registry-tools.ts b/src/tools/registry-tools.ts index 369fbf8..f974d5b 100644 --- a/src/tools/registry-tools.ts +++ b/src/tools/registry-tools.ts @@ -40,12 +40,11 @@ export function registerRegistryTools(server: McpServer, registry?: ToolRegistry const lines = [`Found ${response.pagination.totalItems} registries:\n`]; for (const reg of response.data) { - const status = reg.lastTestStatus || "untested"; - lines.push(`${reg.name}`); + lines.push(`${reg.description || reg.url}`); lines.push(` ID: ${reg.id}`); lines.push(` URL: ${reg.url}`); - lines.push(` Type: ${reg.type}`); - lines.push(` Status: ${status}`); + lines.push(` Type: ${reg.registryType}`); + lines.push(` Enabled: ${reg.enabled ? "Yes" : "No"}`); lines.push(""); } @@ -76,13 +75,14 @@ export function registerRegistryTools(server: McpServer, registry?: ToolRegistry const reg = response.data; const lines = [ - `Registry: ${reg.name}`, + `Registry: ${reg.description || reg.url}`, ` ID: ${reg.id}`, ` URL: ${reg.url}`, - ` Type: ${reg.type}`, + ` Type: ${reg.registryType}`, ` Username: ${reg.username || "N/A"}`, + ` Enabled: ${reg.enabled ? "Yes" : "No"}`, + ` Insecure: ${reg.insecure ? "Yes" : "No"}`, ` Created: ${reg.createdAt || "N/A"}`, - ` Last Test: ${reg.lastTestAt || "Never"} (${reg.lastTestStatus || "N/A"})`, ]; return lines.join("\n"); @@ -102,23 +102,36 @@ export function registerRegistryTools(server: McpServer, registry?: ToolRegistry openWorldHint: false, }, inputSchema: { - name: z.string().describe("Registry name"), + description: z.string().describe("Registry description (display label)"), url: z.string().describe("Registry URL (e.g., docker.io, ghcr.io)"), - type: z.enum(["dockerhub", "gcr", "ecr", "acr", "ghcr", "custom"]).describe("Registry type"), + registryType: z.enum(["dockerhub", "gcr", "ecr", "acr", "ghcr", "custom"]).describe("Registry type"), username: z.string().optional().describe("Username for authentication"), - password: z.string().optional().describe("Password or token"), + token: z.string().optional().describe("Access token / password for authentication"), + insecure: z.boolean().optional().default(false).describe("Allow insecure (non-TLS) connections"), + enabled: z.boolean().optional().default(true).describe("Whether the registry is enabled"), awsRegion: z.string().optional().describe("AWS region (required for ECR registries)"), awsAccessKeyId: z.string().optional().describe("AWS access key ID (for ECR registries)"), awsSecretAccessKey: z.string().optional().describe("AWS secret access key (for ECR registries)"), }, }, - toolHandler(async ({ name, url, type, username, password, awsRegion, awsAccessKeyId, awsSecretAccessKey }, client) => { - const response = await client.post<{ data: { id: string; name: string } }>( + toolHandler(async ({ description, url, registryType, username, token, insecure, enabled, awsRegion, awsAccessKeyId, awsSecretAccessKey }, client) => { + const response = await client.post<{ data: { id: string } }>( "/container-registries", - { name, url, type, username, password, awsRegion, awsAccessKeyId, awsSecretAccessKey } + { + description, + url, + registryType, + username: username ?? "", + token: token ?? "", + insecure, + enabled, + awsRegion: awsRegion ?? "", + awsAccessKeyId: awsAccessKeyId ?? "", + awsSecretAccessKey: awsSecretAccessKey ?? "", + } ); - return `Registry created: ${response.data.name} (ID: ${response.data.id})`; + return `Registry created: ${description} (ID: ${response.data.id})`; }) ); @@ -136,18 +149,18 @@ export function registerRegistryTools(server: McpServer, registry?: ToolRegistry }, inputSchema: { registryId: z.string().describe("Registry ID"), - name: z.string().optional().describe("New name"), + description: z.string().optional().describe("New description (display label)"), url: z.string().optional().describe("New URL"), username: z.string().optional().describe("New username"), - password: z.string().optional().describe("New password"), + token: z.string().optional().describe("New access token / password"), }, }, - toolHandler(async ({ registryId, name, url, username, password }, client) => { + toolHandler(async ({ registryId, description, url, username, token }, client) => { const body: Record = {}; - if (name) body.name = name; + if (description) body.description = description; if (url) body.url = url; if (username) body.username = username; - if (password) body.password = password; + if (token) body.token = token; await client.put(`/container-registries/${registryId}`, body); return `Registry ${registryId} updated.`; @@ -193,10 +206,10 @@ export function registerRegistryTools(server: McpServer, registry?: ToolRegistry }, }, toolHandler(async ({ registryId }, client) => { - const response = await client.post<{ message: string }>( + const response = await client.post<{ data: { message?: string } }>( `/container-registries/${registryId}/test` ); - return response.message || "Connection successful!"; + return response.data?.message || "Connection successful!"; }) ); @@ -214,7 +227,7 @@ export function registerRegistryTools(server: McpServer, registry?: ToolRegistry }, }, toolHandler(async (_params, client) => { - await client.post("/container-registries/sync"); + await client.post("/container-registries/sync", { registries: [] }); return "Registry sync initiated."; }) ); diff --git a/src/tools/settings-tools.ts b/src/tools/settings-tools.ts index e73ce62..f84dbff 100644 --- a/src/tools/settings-tools.ts +++ b/src/tools/settings-tools.ts @@ -57,7 +57,7 @@ export function registerSettingsTools(server: McpServer, registry?: ToolRegistry }, inputSchema: { environmentId: z.string().describe("Environment ID"), - settings: z.record(z.unknown()).describe("Settings to update (key-value pairs)"), + settings: z.record(z.string()).describe("Settings to update (key-value pairs; all values must be strings, e.g. \"true\", \"30\")"), }, }, toolHandler(async ({ environmentId, settings }, client) => { @@ -114,17 +114,17 @@ export function registerSettingsTools(server: McpServer, registry?: ToolRegistry }, }, toolHandler(async (_params, client) => { - const response = await client.get<{ - data: Array<{ id: string; name: string; description?: string }>; - }>("/customize/categories"); + const categories = await client.get< + Array<{ id: string; title: string; description?: string }> + >("/customize/categories"); - if (!response.data || response.data.length === 0) { + if (!categories || categories.length === 0) { return "No settings categories found."; } const lines = ["Settings Categories:\n"]; - for (const cat of response.data) { - lines.push(`${cat.name} (${cat.id})`); + for (const cat of categories) { + lines.push(`${cat.title} (${cat.id})`); if (cat.description) { lines.push(` ${cat.description}`); } @@ -152,24 +152,35 @@ export function registerSettingsTools(server: McpServer, registry?: ToolRegistry }, toolHandler(async ({ query }, client) => { const response = await client.post<{ - data: Array<{ - category: string; - key: string; - value: unknown; + query: string; + count: number; + results: Array<{ + id: string; + title: string; description?: string; - }>; + matchingSettings?: Array<{ + key: string; + label: string; + type: string; + description?: string; + }> | null; + }> | null; }>("/customize/search", { query }); - if (!response.data || response.data.length === 0) { + if (!response.results || response.results.length === 0) { return `No settings matching "${query}" found.`; } - const lines = [`Search results for "${query}":\n`]; - for (const result of response.data) { - lines.push(`${result.category}/${result.key}`); - lines.push(` Value: ${JSON.stringify(result.value)}`); - if (result.description) { - lines.push(` Description: ${result.description}`); + const lines = [`Search results for "${query}" (${response.count} matches):\n`]; + for (const result of response.results) { + lines.push(`${result.title}`); + if (result.matchingSettings && result.matchingSettings.length > 0) { + for (const setting of result.matchingSettings) { + lines.push(` ${setting.key}: ${setting.label}`); + if (setting.description) { + lines.push(` ${setting.description}`); + } + } } lines.push(""); } diff --git a/src/tools/swarm-tools.ts b/src/tools/swarm-tools.ts index 44a2973..600d989 100644 --- a/src/tools/swarm-tools.ts +++ b/src/tools/swarm-tools.ts @@ -47,7 +47,7 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): lines.push(`${svc.name}`); lines.push(` ID: ${svc.id}`); lines.push(` Image: ${svc.image}`); - lines.push(` Replicas: ${svc.replicas}/${svc.desiredReplicas}`); + lines.push(` Replicas: ${svc.runningReplicas}/${svc.replicas}`); if (svc.mode) lines.push(` Mode: ${svc.mode}`); if (svc.ports && svc.ports.length > 0) { const portStr = svc.ports.map(p => `${p.publishedPort}:${p.targetPort}/${p.protocol}`).join(", "); @@ -78,31 +78,53 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ environmentId, serviceId }, client) => { - const response = await client.get<{ data: SwarmService & { tasks?: Array<{ id: string; status: string; node?: string }> } }>( - `/environments/${environmentId}/swarm/services/${serviceId}` - ); + // Detail endpoint returns the raw Docker service object (Docker-cased spec) + const response = await client.get<{ + data: { + id: string; + updatedAt?: string; + version?: { Index?: number }; + spec?: { + Name?: string; + Mode?: { Replicated?: { Replicas?: number }; Global?: object }; + TaskTemplate?: { ContainerSpec?: { Image?: string } }; + EndpointSpec?: { Ports?: Array<{ Protocol?: string; TargetPort?: number; PublishedPort?: number }> }; + }; + endpoint?: { Ports?: Array<{ Protocol?: string; TargetPort?: number; PublishedPort?: number }> }; + }; + }>(`/environments/${environmentId}/swarm/services/${serviceId}`); const svc = response.data; + const spec = svc.spec || {}; + const mode = spec.Mode?.Global ? "global" : "replicated"; + const replicas = spec.Mode?.Replicated?.Replicas; const lines = [ - `Swarm Service: ${svc.name}`, + `Swarm Service: ${spec.Name || svc.id}`, ` ID: ${svc.id}`, - ` Image: ${svc.image}`, - ` Replicas: ${svc.replicas}/${svc.desiredReplicas}`, - ` Mode: ${svc.mode || "replicated"}`, + ` Image: ${spec.TaskTemplate?.ContainerSpec?.Image || "unknown"}`, + ` Mode: ${mode}${replicas !== undefined ? ` (${replicas} replicas)` : ""}`, ` Updated: ${svc.updatedAt || "N/A"}`, ]; - if (svc.ports && svc.ports.length > 0) { + const ports = svc.endpoint?.Ports || spec.EndpointSpec?.Ports; + if (ports && ports.length > 0) { lines.push(" Ports:"); - for (const port of svc.ports) { - lines.push(` - ${port.publishedPort}:${port.targetPort}/${port.protocol}`); + for (const port of ports) { + lines.push(` - ${port.PublishedPort}:${port.TargetPort}/${port.Protocol}`); } } - if (svc.tasks && svc.tasks.length > 0) { + // Tasks live on their own endpoint + const tasks = await client + .get<{ data: Array<{ id: string; currentState: string; desiredState: string; nodeName?: string; error?: string }> }>( + `/environments/${environmentId}/swarm/services/${serviceId}/tasks`, + { limit: 20 } + ) + .catch(() => undefined); + if (tasks?.data && tasks.data.length > 0) { lines.push(" Tasks:"); - for (const task of svc.tasks) { - lines.push(` - ${task.id}: ${task.status}${task.node ? ` (node: ${task.node})` : ""}`); + for (const task of tasks.data) { + lines.push(` - ${task.id}: ${task.currentState} (desired: ${task.desiredState})${task.nodeName ? ` on ${task.nodeName}` : ""}${task.error ? ` — ${task.error}` : ""}`); } } @@ -138,12 +160,39 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ environmentId, name, image, replicas, ports, env, networks, command }, client) => { - const response = await client.post<{ data: { id: string; name: string } }>( + // The API takes a raw Docker ServiceSpec + const spec: Record = { + Name: name, + Mode: { Replicated: { Replicas: replicas } }, + TaskTemplate: { + ContainerSpec: { + Image: image, + ...(env ? { Env: Object.entries(env).map(([k, v]) => `${k}=${v}`) } : {}), + ...(command ? { Command: command } : {}), + }, + ...(networks ? { Networks: networks.map((target) => ({ Target: target })) } : {}), + }, + ...(ports + ? { + EndpointSpec: { + Ports: ports.map((p) => ({ + Protocol: p.protocol, + TargetPort: p.targetPort, + PublishedPort: p.publishedPort, + })), + }, + } + : {}), + }; + + const response = await client.post<{ data: { id: string; warnings?: string[] | null } }>( `/environments/${environmentId}/swarm/services`, - { name, image, replicas, ports, env, networks, command } + { spec } ); - return `Swarm service created: ${response.data.name} (ID: ${response.data.id})`; + let text = `Swarm service created: ${name} (ID: ${response.data.id})`; + if (response.data.warnings?.length) text += `\nWarnings: ${response.data.warnings.join("; ")}`; + return text; }) ); @@ -169,13 +218,36 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ environmentId, serviceId, image, replicas, env, command }, client) => { - const body: Record = {}; - if (image) body.image = image; - if (replicas !== undefined) body.replicas = replicas; - if (env) body.env = env; - if (command) body.command = command; + // Updates require the full current spec plus the swarm version index + const current = await client.get<{ + data: { + version?: { Index?: number }; + spec?: { + Mode?: { Replicated?: { Replicas?: number } }; + TaskTemplate?: { ContainerSpec?: Record }; + } & Record; + }; + }>(`/environments/${environmentId}/swarm/services/${serviceId}`); + + const spec = (current.data.spec || {}) as Record & { + Mode?: { Replicated?: { Replicas?: number } }; + TaskTemplate?: { ContainerSpec?: Record }; + }; + const version = current.data.version?.Index; + if (version === undefined) { + throw new Error("Could not determine the service version required for updates."); + } + + spec.TaskTemplate = spec.TaskTemplate || {}; + spec.TaskTemplate.ContainerSpec = spec.TaskTemplate.ContainerSpec || {}; + if (image) spec.TaskTemplate.ContainerSpec.Image = image; + if (env) spec.TaskTemplate.ContainerSpec.Env = Object.entries(env).map(([k, v]) => `${k}=${v}`); + if (command) spec.TaskTemplate.ContainerSpec.Command = command; + if (replicas !== undefined) { + spec.Mode = { Replicated: { Replicas: replicas } }; + } - await client.put(`/environments/${environmentId}/swarm/services/${serviceId}`, body); + await client.put(`/environments/${environmentId}/swarm/services/${serviceId}`, { spec, version }); return `Swarm service ${serviceId} updated.`; }) ); @@ -247,20 +319,16 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ environmentId, advertiseAddr, listenAddr, forceNewCluster }, client) => { - const response = await client.post<{ data: { nodeId: string; joinToken?: string } }>( + const response = await client.post<{ data: { nodeId: string } }>( `/environments/${environmentId}/swarm/init`, - { advertiseAddr, listenAddr, forceNewCluster } + { advertiseAddr, listenAddr, forceNewCluster, spec: {} } ); - const lines = [ + return [ "Swarm cluster initialized!", ` Node ID: ${response.data.nodeId}`, - ]; - if (response.data.joinToken) { - lines.push(` Join Token: ${response.data.joinToken}`); - } - - return lines.join("\n"); + "Use the join-tokens endpoint in Arcane to retrieve worker/manager join tokens.", + ].join("\n"); }) ); @@ -340,12 +408,23 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): const lines = [ `Swarm Cluster Info:`, ` Cluster ID: ${info.id}`, - ` Version: ${info.version}`, ` Created: ${info.createdAt}`, ` Updated: ${info.updatedAt}`, - ` Nodes: ${info.nodeCount} (${info.managerCount} managers, ${info.workerCount} workers)`, ]; + // Node counts come from the nodes endpoint + const nodes = await client + .get<{ data: Array<{ role: string; status: string }> }>( + `/environments/${environmentId}/swarm/nodes`, + { limit: 100 } + ) + .catch(() => undefined); + if (nodes?.data) { + const managers = nodes.data.filter((n) => n.role === "manager").length; + const workers = nodes.data.length - managers; + lines.push(` Nodes: ${nodes.data.length} (${managers} managers, ${workers} workers)`); + } + return lines.join("\n"); }) ); diff --git a/src/tools/system-tools.ts b/src/tools/system-tools.ts index 2207d3f..d31c728 100644 --- a/src/tools/system-tools.ts +++ b/src/tools/system-tools.ts @@ -284,16 +284,18 @@ export function registerSystemTools(server: McpServer, registry?: ToolRegistry): }, toolHandler(async (_params, client) => { const response = await client.get<{ - version: string; - buildTime?: string; - gitCommit?: string; + currentVersion: string; + newestVersion?: string; + updateAvailable?: boolean; + releaseUrl?: string; }>("/version"); - const lines = [ - `Arcane Version: ${response.version}`, - ` Build Time: ${response.buildTime || "unknown"}`, - ` Git Commit: ${response.gitCommit || "unknown"}`, - ]; + const lines = [`Arcane Version: ${response.currentVersion}`]; + if (response.updateAvailable && response.newestVersion) { + lines.push(` Update available: ${response.newestVersion}${response.releaseUrl ? ` (${response.releaseUrl})` : ""}`); + } else { + lines.push(" Up to date."); + } return lines.join("\n"); }) diff --git a/src/tools/template-tools.ts b/src/tools/template-tools.ts index 6ad6e5a..37d3b8f 100644 --- a/src/tools/template-tools.ts +++ b/src/tools/template-tools.ts @@ -24,16 +24,16 @@ export function registerTemplateTools(server: McpServer, registry?: ToolRegistry }, inputSchema: { search: z.string().optional().describe("Search query"), - category: z.string().optional().describe("Filter by category"), + type: z.string().optional().describe("Filter by template type"), start: z.number().optional().default(0).describe("Pagination start"), limit: z.number().optional().default(20).describe("Items per page"), }, }, - toolHandler(async ({ search, category, start, limit }, client) => { + toolHandler(async ({ search, type, start, limit }, client) => { const response = await client.get<{ data: Template[]; pagination: { totalItems: number }; - }>("/templates", { search, category, start, limit }); + }>("/templates", { search, type, start, limit }); if (!response.data || response.data.length === 0) { return "No templates found."; @@ -43,7 +43,7 @@ export function registerTemplateTools(server: McpServer, registry?: ToolRegistry for (const tmpl of response.data) { lines.push(`${tmpl.name}`); lines.push(` ID: ${tmpl.id}`); - if (tmpl.category) lines.push(` Category: ${tmpl.category}`); + if (tmpl.registry?.name) lines.push(` Registry: ${tmpl.registry.name}`); if (tmpl.description) lines.push(` Description: ${tmpl.description.substring(0, 80)}...`); lines.push(""); } @@ -75,8 +75,9 @@ export function registerTemplateTools(server: McpServer, registry?: ToolRegistry const lines = [ `Template: ${tmpl.name}`, ` ID: ${tmpl.id}`, - ` Category: ${tmpl.category || "N/A"}`, - ` Source: ${tmpl.source || "N/A"}`, + ` Remote: ${tmpl.isRemote ? "Yes" : "No"}`, + ` Custom: ${tmpl.isCustom ? "Yes" : "No"}`, + ` Registry: ${tmpl.registry?.name || "N/A"}`, ` Description: ${tmpl.description || "N/A"}`, ]; @@ -124,14 +125,14 @@ export function registerTemplateTools(server: McpServer, registry?: ToolRegistry inputSchema: { name: z.string().describe("Template name"), description: z.string().optional().describe("Template description"), - category: z.string().optional().describe("Category"), content: z.string().describe("Docker Compose YAML content"), + envContent: z.string().optional().describe("Environment file (.env) content"), }, }, - toolHandler(async ({ name, description, category, content }, client) => { + toolHandler(async ({ name, description, content, envContent }, client) => { const response = await client.post<{ data: { id: string; name: string } }>( "/templates", - { name, description, category, content } + { name, description: description ?? "", content, envContent: envContent ?? "" } ); return `Template created: ${response.data.name} (ID: ${response.data.id})`; @@ -154,16 +155,16 @@ export function registerTemplateTools(server: McpServer, registry?: ToolRegistry templateId: z.string().describe("Template ID"), name: z.string().optional().describe("New name"), description: z.string().optional().describe("New description"), - category: z.string().optional().describe("New category"), content: z.string().optional().describe("New YAML content"), + envContent: z.string().optional().describe("New environment file (.env) content"), }, }, - toolHandler(async ({ templateId, name, description, category, content }, client) => { + toolHandler(async ({ templateId, name, description, content, envContent }, client) => { const body: Record = {}; if (name) body.name = name; if (description) body.description = description; - if (category) body.category = category; if (content) body.content = content; + if (envContent) body.envContent = envContent; await client.put(`/templates/${templateId}`, body); return `Template ${templateId} updated.`; diff --git a/src/tools/volume-tools.ts b/src/tools/volume-tools.ts index bc3d3a3..8ab65a2 100644 --- a/src/tools/volume-tools.ts +++ b/src/tools/volume-tools.ts @@ -51,8 +51,8 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): lines.push(` Driver: ${vol.driver}`); lines.push(` Mountpoint: ${vol.mountpoint}`); if (vol.usageData) { - lines.push(` Size: ${formatSize(vol.usageData.size, true)}`); - lines.push(` Containers: ${vol.usageData.refCount}`); + lines.push(` Size: ${formatSize(vol.usageData.Size, true)}`); + lines.push(` Containers: ${vol.usageData.RefCount}`); } lines.push(""); } @@ -93,8 +93,8 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): ]; if (vol.usageData) { - lines.push(` Size: ${formatSizeMB(vol.usageData.size)}`); - lines.push(` Container Refs: ${vol.usageData.refCount}`); + lines.push(` Size: ${formatSizeMB(vol.usageData.Size)}`); + lines.push(` Container Refs: ${vol.usageData.RefCount}`); } if (vol.labels && Object.keys(vol.labels).length > 0) { @@ -179,13 +179,13 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.post<{ volumesDeleted?: string[]; spaceReclaimed?: number }>( - `/environments/${environmentId}/volumes/prune` - ); + const response = await client.post<{ + data: { volumesDeleted?: string[] | null; spaceReclaimed?: number }; + }>(`/environments/${environmentId}/volumes/prune`); - const deleted = response.volumesDeleted?.length || 0; - const space = response.spaceReclaimed - ? formatSize(response.spaceReclaimed) + const deleted = response.data.volumesDeleted?.length || 0; + const space = response.data.spaceReclaimed + ? formatSize(response.data.spaceReclaimed) : "unknown"; return `Pruned ${deleted} volumes, reclaimed ${space} of disk space.`; @@ -210,12 +210,10 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): }, toolHandler(async ({ environmentId }, client) => { const response = await client.get<{ - total: number; - inUse: number; - unused: number; + data: { total: number; inuse: number; unused: number }; }>(`/environments/${environmentId}/volumes/counts`); - return `Volume Counts:\n Total: ${response.total}\n In Use: ${response.inUse || 0}\n Unused: ${response.unused || 0}`; + return `Volume Counts:\n Total: ${response.data.total}\n In Use: ${response.data.inuse || 0}\n Unused: ${response.data.unused || 0}`; }) ); @@ -253,8 +251,8 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): const lines = [`Contents of ${path}:\n`]; for (const entry of response.data) { - const type = entry.isDir ? "DIR " : "FILE"; - const size = entry.isDir ? "-" : formatSizeCompact(entry.size); + const type = entry.isDirectory ? "DIR " : "FILE"; + const size = entry.isDirectory ? "-" : formatSizeCompact(entry.size); lines.push(`${type} ${size.padEnd(8)} ${entry.name}`); } @@ -313,7 +311,7 @@ export function registerVolumeTools(server: McpServer, registry?: ToolRegistry): toolHandler(async ({ environmentId, volumeName, path }, client) => { validatePath(path); - await client.post(`/environments/${environmentId}/volumes/${volumeName}/browse/mkdir`, { path }); + await client.post(`/environments/${environmentId}/volumes/${volumeName}/browse/mkdir`, undefined, { path }); return `Directory created: ${path}`; }) ); diff --git a/src/tools/vulnerability-tools.ts b/src/tools/vulnerability-tools.ts index c534644..d46895b 100644 --- a/src/tools/vulnerability-tools.ts +++ b/src/tools/vulnerability-tools.ts @@ -258,8 +258,9 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, }, toolHandler(async ({ environmentId, imageId, vulnerabilityId, pkgName, installedVersion, reason }, client) => { + const resolvedId = await resolveImageId(client, environmentId, imageId); await client.post(`/environments/${environmentId}/vulnerabilities/ignore`, { - imageId, + imageId: resolvedId, vulnerabilityId, pkgName, installedVersion, @@ -310,17 +311,15 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, toolHandler(async ({ environmentId }, client) => { const response = await client.get<{ - data: { enabled: boolean; version?: string; lastUpdate?: string; status: string }; + data: { available: boolean; version?: string }; }>(`/environments/${environmentId}/vulnerabilities/scanner-status`); const s = response.data; const lines = [ `Trivy Scanner Status:`, - ` Enabled: ${s.enabled ? "Yes" : "No"}`, - ` Status: ${s.status}`, + ` Available: ${s.available ? "Yes" : "No"}`, ]; if (s.version) lines.push(` Version: ${s.version}`); - if (s.lastUpdate) lines.push(` Last DB Update: ${s.lastUpdate}`); return lines.join("\n"); }) @@ -423,18 +422,17 @@ export function registerVulnerabilityTools(server: McpServer, registry?: ToolReg }, }, toolHandler(async ({ environmentId }, client) => { - const response = await client.get<{ - data: Array<{ id: string; name: string; tag?: string }>; - }>(`/environments/${environmentId}/vulnerabilities/image-options`); + const response = await client.get<{ data: string[] }>( + `/environments/${environmentId}/vulnerabilities/image-options` + ); if (!response.data || response.data.length === 0) { return "No scannable images found."; } const lines = [`${response.data.length} scannable images:\n`]; - for (const img of response.data) { - const tag = img.tag ? `:${img.tag}` : ""; - lines.push(` ${img.name}${tag} (ID: ${img.id})`); + for (const imageRef of response.data) { + lines.push(` ${imageRef}`); } return lines.join("\n"); diff --git a/src/tools/webhook-tools.ts b/src/tools/webhook-tools.ts index dad9699..e56e3c2 100644 --- a/src/tools/webhook-tools.ts +++ b/src/tools/webhook-tools.ts @@ -41,9 +41,9 @@ export function registerWebhookTools(server: McpServer, registry?: ToolRegistry) const status = wh.enabled ? "[ENABLED]" : "[DISABLED]"; lines.push(`${status} ${wh.name}`); lines.push(` ID: ${wh.id}`); - if (wh.events && wh.events.length > 0) { - lines.push(` Events: ${wh.events.join(", ")}`); - } + lines.push(` Action: ${wh.actionType || "unknown"}`); + const target = wh.targetName || wh.targetId; + lines.push(` Target: ${wh.targetType || "unknown"}${target ? ` (${target})` : ""}`); lines.push(` Last Triggered: ${wh.lastTriggeredAt || "Never"}`); lines.push(""); } @@ -67,27 +67,42 @@ export function registerWebhookTools(server: McpServer, registry?: ToolRegistry) inputSchema: { environmentId: z.string().describe("Environment ID"), name: z.string().describe("Webhook name"), - events: z.array(z.string()).optional().describe("Event types to trigger on"), - enabled: z.boolean().optional().default(true).describe("Enable the webhook"), + actionType: z + .enum(["update", "start", "stop", "restart", "redeploy", "up", "down", "run", "sync"]) + .describe( + "Action to run when triggered. Supported values depend on targetType (e.g. start/stop/restart for containers, up/down/redeploy for projects, run for updater, sync for gitops)" + ), + targetType: z + .enum(["container", "project", "updater", "gitops"]) + .describe("Resource type this webhook targets: 'container', 'project', 'updater', or 'gitops'"), + targetId: z + .string() + .describe("Container ID, project ID, or GitOps sync ID to target. Use an empty string for 'updater' webhooks"), }, }, - toolHandler(async ({ environmentId, name, events, enabled }, client) => { - const response = await client.post<{ data: Webhook }>( - `/environments/${environmentId}/webhooks`, - { name, events, enabled } - ); + toolHandler(async ({ environmentId, name, actionType, targetType, targetId }, client) => { + const response = await client.post<{ + data: { + id: string; + name: string; + actionType: string; + targetType: string; + targetId: string; + token: string; + createdAt: string; + }; + }>(`/environments/${environmentId}/webhooks`, { name, actionType, targetType, targetId }); const wh = response.data; const lines = [ `Webhook created: ${wh.name}`, ` ID: ${wh.id}`, + ` Action: ${wh.actionType}`, + ` Target: ${wh.targetType}${wh.targetId ? ` (${wh.targetId})` : ""}`, + ` Token: ${wh.token}`, + "", + "⚠️ Save this token now - it won't be shown again!", ]; - if (wh.token) { - lines.push(` Token: ${wh.token}`); - } - if (wh.url) { - lines.push(` URL: ${wh.url}`); - } return lines.join("\n"); }) @@ -98,7 +113,7 @@ export function registerWebhookTools(server: McpServer, registry?: ToolRegistry) "arcane_webhook_update", { title: "Update webhook", - description: "Update a webhook configuration", + description: "Enable or disable a webhook", annotations: { readOnlyHint: false, destructiveHint: false, @@ -108,19 +123,12 @@ export function registerWebhookTools(server: McpServer, registry?: ToolRegistry) inputSchema: { environmentId: z.string().describe("Environment ID"), webhookId: z.string().describe("Webhook ID"), - name: z.string().optional().describe("New name"), - events: z.array(z.string()).optional().describe("Updated event types"), - enabled: z.boolean().optional().describe("Enable/disable the webhook"), + enabled: z.boolean().describe("Enable (true) or disable (false) the webhook"), }, }, - toolHandler(async ({ environmentId, webhookId, name, events, enabled }, client) => { - const body: Record = {}; - if (name) body.name = name; - if (events) body.events = events; - if (enabled !== undefined) body.enabled = enabled; - - await client.patch(`/environments/${environmentId}/webhooks/${webhookId}`, body); - return `Webhook ${webhookId} updated.`; + toolHandler(async ({ environmentId, webhookId, enabled }, client) => { + await client.patch(`/environments/${environmentId}/webhooks/${webhookId}`, { enabled }); + return `Webhook ${webhookId} ${enabled ? "enabled" : "disabled"}.`; }) ); diff --git a/src/types/arcane-types.ts b/src/types/arcane-types.ts index ad8ffd8..044e845 100644 --- a/src/types/arcane-types.ts +++ b/src/types/arcane-types.ts @@ -8,15 +8,18 @@ // === Containers === +/** Container list entry (Docker-style summary: `names` array, `state` string) */ export interface Container { id: string; - name: string; + names?: string[] | null; image: string; status: string; state: string; - created: string; + /** Unix timestamp (seconds) */ + created: number; ports?: Array<{ privatePort: number; publicPort?: number; type: string }>; labels?: Record; + updateInfo?: { hasUpdate?: boolean }; } // === Volumes === @@ -29,14 +32,15 @@ export interface Volume { createdAt: string; labels?: Record; options?: Record; - usageData?: { size: number; refCount: number }; + /** Docker-cased keys (DockerVolumeUsageData) */ + usageData?: { Size: number; RefCount: number }; } export interface FileEntry { name: string; path: string; size: number; - isDir: boolean; + isDirectory: boolean; modTime: string; mode: string; } @@ -67,11 +71,16 @@ export interface Project { name: string; status: string; path?: string; - services: Array<{ + serviceCount?: number; + runningCount?: number; + /** Runtime state per service (the `services` field holds raw compose configs) */ + runtimeServices?: Array<{ name: string; status: string; - containerCount?: number; - }>; + health?: string; + image?: string; + containerName?: string; + }> | null; updateInfo?: ProjectUpdateInfo; createdAt?: string; updatedAt?: string; @@ -122,11 +131,13 @@ export interface Network { scope: string; internal: boolean; attachable: boolean; + inUse?: boolean; + isDefault?: boolean; ipam?: { driver: string; config?: Array<{ subnet?: string; gateway?: string }>; }; - containers?: Record; + containersList?: Array<{ name: string; ipv4Address?: string; ipv6Address?: string }> | null; created?: string; } @@ -136,13 +147,21 @@ export interface TopologyNode { id: string; type: string; name: string; - status?: string; + metadata?: { + status?: string; + driver?: string; + image?: string; + isDefault?: boolean; + scope?: string; + }; } export interface TopologyEdge { + id?: string; source: string; target: string; - type?: string; + ipv4Address?: string; + ipv6Address?: string; } export interface NetworkTopology { @@ -157,8 +176,11 @@ export interface Environment { name: string; apiUrl?: string; status?: string; - createdAt?: string; - updatedAt?: string; + enabled?: boolean; + connected?: boolean; + connectedAt?: string; + isEdge?: boolean; + lastSeen?: string; } // === Builds === @@ -166,19 +188,19 @@ export interface Environment { export interface Build { id: string; status: string; - tag?: string; - platform?: string; + tags?: string[] | null; + platforms?: string[] | null; provider?: string; - startedAt?: string; + createdAt?: string; completedAt?: string; - error?: string; + errorMessage?: string; } export interface BuildDetails extends Build { dockerfile?: string; - gitUrl?: string; buildArgs?: Record; - logs?: string; + output?: string; + outputTruncated?: boolean; } export interface WorkspaceFile { @@ -192,12 +214,23 @@ export interface WorkspaceFile { // === Dashboard === export interface DashboardSnapshot { - containers: { total: number; running: number; stopped: number }; - projects: { total: number; running: number; stopped: number }; - images: { total: number; updatesAvailable: number }; - volumes: { total: number; totalSize?: string }; - networks: { total: number }; - systemInfo?: { dockerVersion?: string; osType?: string; cpus?: number; memoryBytes?: number }; + containers?: { + counts?: { totalContainers: number; runningContainers: number; stoppedContainers: number }; + }; + imageUsageCounts?: { + totalImages: number; + totalImageSize: number; + imagesInuse: number; + imagesUnused: number; + }; + actionItems?: { + items?: Array<{ kind: string; severity?: string; count: number }> | null; + }; + versionInfo?: { + currentVersion?: string; + newestVersion?: string; + releaseUrl?: string; + }; } // === Events === @@ -224,11 +257,15 @@ export interface GitOpsSync { name: string; repositoryId: string; branch: string; - path: string; - targetProjectId?: string; + composePath: string; + projectId?: string; + projectName?: string; lastSyncAt?: string; lastSyncStatus?: string; + lastSyncCommit?: string; + lastSyncError?: string; autoSync: boolean; + syncDirectory?: boolean; syncInterval?: number; } @@ -236,10 +273,12 @@ export interface GitRepository { id: string; name: string; url: string; - branch: string; authType: string; - lastTestAt?: string; - lastTestStatus?: string; + description?: string; + username?: string; + enabled?: boolean; + createdAt?: string; + updatedAt?: string; } // === Jobs === @@ -247,36 +286,42 @@ export interface GitRepository { export interface Job { id: string; name: string; - type: string; - status: string; - lastRunAt?: string; - nextRunAt?: string; - schedule?: string; + description?: string; + category: string; enabled: boolean; + schedule?: string; + nextRun?: string; + canRunManually?: boolean; + isContinuous?: boolean; } // === Ports === export interface PortMapping { + id: string; containerName: string; containerId: string; - privatePort: number; - publicPort?: number; + containerPort: number; + hostPort?: number; + hostIp?: string; protocol: string; - ip?: string; + isPublished?: boolean; } // === Registries === export interface ContainerRegistry { id: string; - name: string; url: string; - type: string; + registryType: string; + description?: string; username?: string; + insecure?: boolean; + enabled?: boolean; + awsAccessKeyId?: string; + awsRegion?: string; createdAt?: string; - lastTestAt?: string; - lastTestStatus?: string; + updatedAt?: string; } // === Swarm === @@ -285,21 +330,22 @@ export interface SwarmService { id: string; name: string; image: string; + mode?: string; + /** Desired replica count */ replicas: number; - desiredReplicas: number; - ports?: Array<{ publishedPort: number; targetPort: number; protocol: string }>; + /** Currently running replicas */ + runningReplicas: number; + ports?: Array<{ publishedPort: number; targetPort: number; protocol: string }> | null; + stackName?: string; + createdAt?: string; updatedAt?: string; - mode?: string; } export interface SwarmClusterInfo { id: string; - version: string; createdAt: string; updatedAt: string; - nodeCount: number; - managerCount: number; - workerCount: number; + rootRotationInProgress?: boolean; } // === Templates === @@ -308,10 +354,13 @@ export interface Template { id: string; name: string; description?: string; - category?: string; - logo?: string; - source?: string; - createdAt?: string; + content?: string; + envContent?: string; + isCustom?: boolean; + isRemote?: boolean; + registryId?: string; + registry?: { id: string; name: string; url?: string; description?: string; enabled?: boolean }; + metadata?: Record; } // === Updater === @@ -419,10 +468,13 @@ export interface IgnoredVulnerability { export interface Webhook { id: string; name: string; - url?: string; - token?: string; enabled: boolean; - events?: string[]; + actionType?: string; + targetType?: string; + targetId?: string; + targetName?: string; + tokenPrefix?: string; + environmentId?: string; createdAt?: string; lastTriggeredAt?: string; } From 2f018bd1481b5bc6a8d395ec7eed820212457c36 Mon Sep 17 00:00:00 2001 From: Xitee <59659167+Xitee1@users.noreply.github.com> Date: Sat, 11 Jul 2026 22:42:09 +0200 Subject: [PATCH 7/8] feat: container/project/swarm log tools via WebSocket streams MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arcane v2 serves logs over WebSocket only (no REST endpoints), so the client gains fetchLogs(): it connects with follow=false and X-API-Key auth on the upgrade request, collects the backlog, and stops on server close, a 2s idle gap, a 15s hard cap, or the maxLines limit. ANSI color codes and CR are stripped. New tools (180 total): arcane_container_get_logs, arcane_project_get_logs, and arcane_swarm_get_service_logs (revived — it was removed when the REST route disappeared). Each supports tail, since, timestamps (default on), and a maxLines cap so the context window stays manageable; live following works by passing the newest seen timestamp as `since` on the next call, returning only new lines. Verified against the live instance: container logs, project logs through the remote-agent proxy, and the incremental since pattern. Live smoke: 32 ok, 0 failed. Co-Authored-By: Claude Fable 5 --- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 3 +- CLAUDE.md | 6 +- README.md | 23 +++--- commands/configure.md | 6 +- package-lock.json | 33 ++++++++ package.json | 2 + skills/arcane-mcp-server/SKILL.md | 7 +- .../integration/tool-filtering.test.ts | 2 +- src/client/arcane-client.ts | 81 +++++++++++++++++++ src/constants.ts | 12 +++ src/prompts/index.ts | 6 +- src/resources/__tests__/resources.test.ts | 2 +- src/resources/index.ts | 2 +- src/tools/container-tools.ts | 35 +++++++- src/tools/project-tools.ts | 35 +++++++- src/tools/swarm-tools.ts | 34 ++++++++ src/utils/log-format.ts | 30 +++++++ 18 files changed, 292 insertions(+), 29 deletions(-) create mode 100644 src/utils/log-format.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 070a797..b856f5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: # so we count those instead of the former `server.registerTool(`. TOTAL=$(grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}') echo "Found $TOTAL tool registrations" - if [ "$TOTAL" -lt 177 ]; then echo "FAIL: Expected 177+"; exit 1; fi + if [ "$TOTAL" -lt 180 ]; then echo "FAIL: Expected 180+"; exit 1; fi - name: Audit production dependencies run: npm audit --audit-level=high --omit=dev diff --git a/CHANGELOG.md b/CHANGELOG.md index c2bd0c3..fcb62e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [3.0.0] - 2026-07-11 -Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec refreshed from v1.17.0). Tool count changes from 180 to **177** (removed tools whose endpoints no longer exist, added notification-delete and activity-tracking tools). No v1 compatibility shims — installs running Arcane v1.x should stay on `2.x` of this server. +Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec refreshed from v1.17.0). Tool count stays at **180** (removed tools whose endpoints no longer exist, added notification-delete and activity-tracking tools). No v1 compatibility shims — installs running Arcane v1.x should stay on `2.x` of this server. ### Removed (endpoints gone in Arcane v2) - `arcane_dashboard_get_action_items` — `/dashboard/action-items` no longer exists. @@ -19,6 +19,7 @@ Compatibility release for **Arcane v2** (tested against v2.3.2, OpenAPI spec ref ### Added - `arcane_notification_delete_settings` — delete a provider's notification settings (`DELETE /notifications/settings/{provider}`). - `arcane_activity_list` / `arcane_activity_get` — track Arcane v2's background activities (image update checks, updater runs, prunes, scans), including progress and messages. +- `arcane_container_get_logs` / `arcane_project_get_logs` / `arcane_swarm_get_service_logs` — log access via Arcane's WebSocket log streams (v2 has no REST log endpoints). Fetch-and-close semantics with `tail`, `since`, `timestamps`, and a `maxLines` cap; live following works incrementally by passing the newest seen timestamp as `since` on the next call. Adds the `ws` dependency (custom auth headers on the upgrade request); ANSI color codes are stripped. - `arcane_project_update_services` — the dedicated project update action (`POST /projects/{id}/update-services`, permission `projects:update`): pulls latest images and recreates services (optionally a subset). Runs in the background; track via the activity tools. Preferred over manual pull + redeploy, which require `projects:deploy`. - `arcane_project_list` supports v2's `updates` filter (`has_update`, `up_to_date`, `error`, `unknown`) plus a `status` filter, and shows per-project update info including exactly which image refs are outdated (same data as the dashboard's update overview). `arcane_project_get` shows it too. diff --git a/CLAUDE.md b/CLAUDE.md index e6f42b9..e901992 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ # Arcane MCP Server -MCP server for Docker management via the Arcane platform. 177 tools, 2 resources, 4 prompts, companion skill, Claude Code plugin. +MCP server for Docker management via the Arcane platform. 180 tools, 2 resources, 4 prompts, companion skill, Claude Code plugin. **Not affiliated with the Arcane project.** @@ -26,7 +26,7 @@ ARCANE_BASE_URL=… ARCANE_API_KEY=… node scripts/live-smoke.mjs [envId] # Ru - `src/config.ts` — Config from env vars > config file > defaults - `src/constants.ts` — All shared constants (timeouts, limits, versions) -### Tools (177 across 26 modules in `src/tools/`) +### Tools (180 across 26 modules in `src/tools/`) All tools use `server.registerTool()` with: - `title` — human-readable name @@ -42,7 +42,7 @@ All tools use `server.registerTool()` with: 3. Classify annotations: list/get = readOnly, delete/prune = destructive, external calls = openWorld 4. Use `toolHandler()` wrapper — return a plain string, it handles the MCP response envelope 5. Register in `src/tools/index.ts` -6. Verify: `npm run build && grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}'` (expect 177) +6. Verify: `npm run build && grep -rc 'register("arcane_' dist/tools/*.js | awk -F: '{sum+=$2} END {print sum}'` (expect 180) ### Resources & Prompts diff --git a/README.md b/README.md index 1ccf58d..51ebc5c 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

Manage your entire Docker infrastructure through natural language.
- 177 tools. One MCP server. Zero context switching. + 180 tools. One MCP server. Zero context switching.

@@ -21,7 +21,7 @@ Tool FilteringWhat Can It DoCompanion Skill • - All Tools • + All ToolsInteractive Installer

@@ -35,7 +35,7 @@ Arcane MCP Server is a complete AI-powered Docker management bundle — an **MCP server**, a **Claude Code plugin**, and a **companion skill**, all in one package. -- The **MCP server** gives your AI assistant 177 tools to control your [Arcane](https://github.com/getarcaneapp/arcane) Docker platform — containers, images, stacks, Swarm clusters, security scans, and more. Filter that set down to a preset ([see Tool Filtering](#tool-filtering)) if all 177 is more than your context window can spare. +- The **MCP server** gives your AI assistant 180 tools to control your [Arcane](https://github.com/getarcaneapp/arcane) Docker platform — containers, images, stacks, Swarm clusters, security scans, and more. Filter that set down to a preset ([see Tool Filtering](#tool-filtering)) if all 180 is more than your context window can spare. - The **plugin** wraps everything into a single install with guided configuration — no manual env vars or config files. - The **companion skill** teaches your AI *how* to use those tools — safe deployment workflows, troubleshooting patterns, and guardrails so it doesn't accidentally nuke your volumes. @@ -71,7 +71,7 @@ Every tool carries **safety annotations** so your AI knows which operations are ## Tool Filtering -Exposing all 177 tools to Claude every turn chews through your context window. Pick a **preset** to trim the active tool set — only the tools in that preset appear in `tools/list`: +Exposing all 180 tools to Claude every turn chews through your context window. Pick a **preset** to trim the active tool set — only the tools in that preset appear in `tools/list`: | Preset | Scope | Tools | |---|---|---| @@ -79,7 +79,7 @@ Exposing all 177 tools to Claude every turn chews through your context window. P | `read-only` | every `*_list` / `*_get` / `*_inspect` / `*_stats` across all modules | ~60 | | `minimal` | dashboard + container list / get / counts | 5 | | `deploy` | projects, gitops, templates, registries, environments, build | ~40 | -| `full` *(default if never configured)* | everything | 177 | +| `full` *(default if never configured)* | everything | 180 | | `custom` | your own module + per-tool picks | variable | **Configure interactively** in Claude Code: @@ -271,14 +271,15 @@ And a Claude Code slash command: --- -## All 177 Tools +## All 180 Tools -### Containers (11) +### Containers (12) | Tool | Description | |------|-------------| | `arcane_container_list` | List containers with filtering and pagination | | `arcane_container_get` | Get detailed container information | +| `arcane_container_get_logs` | Fetch container logs (incremental follow via `since`) | | `arcane_container_create` | Create a new container | | `arcane_container_start` | Start a stopped container | | `arcane_container_stop` | Stop a running container | @@ -289,7 +290,7 @@ And a Claude Code slash command: | `arcane_container_delete` | Delete a container | | `arcane_container_get_counts` | Get running/stopped counts | -### Docker Swarm (10) +### Docker Swarm (11) | Tool | Description | |------|-------------| @@ -299,6 +300,7 @@ And a Claude Code slash command: | `arcane_swarm_update_service` | Update service configuration | | `arcane_swarm_delete_service` | Delete a swarm service | | `arcane_swarm_scale_service` | Scale service replicas | +| `arcane_swarm_get_service_logs` | Fetch service logs (incremental follow via `since`) | | `arcane_swarm_init_cluster` | Initialize a new swarm cluster | | `arcane_swarm_join_cluster` | Join an existing cluster | | `arcane_swarm_leave_cluster` | Leave the swarm cluster | @@ -321,12 +323,13 @@ And a Claude Code slash command: | `arcane_vulnerability_list_ignored` | List ignored vulnerabilities | | `arcane_vulnerability_get_image_options` | List scannable images | -### Projects / Docker Compose (13) +### Projects / Docker Compose (14) | Tool | Description | |------|-------------| | `arcane_project_list` | List Docker Compose projects | | `arcane_project_get` | Get project details | +| `arcane_project_get_logs` | Fetch stack logs (incremental follow via `since`) | | `arcane_project_create` | Create from compose YAML | | `arcane_project_update` | Update project configuration | | `arcane_project_up` | Deploy a project | @@ -515,7 +518,7 @@ src/ arcane-client.ts # HTTP client (retry, SSL, size limits) auth/ auth-manager.ts # JWT auto-refresh + API key auth - tools/ # 26 modules, 177 tools + tools/ # 26 modules, 180 tools registry.ts # ToolRegistry — captures RegisteredTool handles, applies filter presets.ts # commonly-used / read-only / minimal / deploy / full / custom resources/ # 4 MCP Resources diff --git a/commands/configure.md b/commands/configure.md index 27b5ad7..76f8e4d 100644 --- a/commands/configure.md +++ b/commands/configure.md @@ -5,7 +5,7 @@ allowed-tools: [Read, Write, AskUserQuestion, Bash, ReadMcpResourceTool] # /arcane:configure — Tool filter setup -Use this slash command to trim which Arcane MCP tools are exposed to Claude Code. The full server registers 177 tools; surfacing all of them in `tools/list` bloats the context window. This command writes a `tools` block to `~/.arcane/config.json` that selects a preset, module allowlist, and per-tool overrides. The Arcane MCP server picks up changes live when its config watcher is attached. +Use this slash command to trim which Arcane MCP tools are exposed to Claude Code. The full server registers 180 tools; surfacing all of them in `tools/list` bloats the context window. This command writes a `tools` block to `~/.arcane/config.json` that selects a preset, module allowlist, and per-tool overrides. The Arcane MCP server picks up changes live when its config watcher is attached. ## Workflow @@ -14,7 +14,7 @@ Use this slash command to trim which Arcane MCP tools are exposed to Claude Code - `read-only` — every `*_list` / `*_get` / `*_inspect` / `*_stats` / `*_status` / `*_summary` tool (~60 tools) - `minimal` — dashboard + container list/get/counts (5 tools) - `deploy` — project, gitops, template, registry, environment, build (~40 tools) - - `full` — all 177 tools (current default if the user has never configured this) + - `full` — all 180 tools (current default if the user has never configured this) - `custom` — fine-tune modules and individual tools 2. **If the user picks `custom`** (or says they want to fine-tune after picking another preset): @@ -60,6 +60,6 @@ Use this slash command to trim which Arcane MCP tools are exposed to Claude Code ## Notes -- Keep the conversation tight. Do not dump the full 177-tool list — summarise the chosen preset and let the user opt into fine-tuning. +- Keep the conversation tight. Do not dump the full 180-tool list — summarise the chosen preset and let the user opt into fine-tuning. - Never remove other keys from `~/.arcane/config.json`. A malformed file will brick the server. - For Claude Desktop and other MCP clients without slash commands, the same flow is available via the `arcane_configure_tools` prompt — this slash command is a Claude Code shortcut to the same outcome. diff --git a/package-lock.json b/package-lock.json index e03c655..07a68f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@modelcontextprotocol/sdk": "^1.12.0", "express": "^4.21.2", + "ws": "^8.21.0", "zod": "^3.24.0" }, "bin": { @@ -19,6 +20,7 @@ "devDependencies": { "@types/express": "^4.17.21", "@types/node": "^20.11.0", + "@types/ws": "^8.18.1", "openapi-typescript": "^7.4.0", "tsx": "^4.19.0", "typescript": "^5.5.0", @@ -1399,6 +1401,16 @@ "@types/node": "*" } }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@vitest/expect": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", @@ -3955,6 +3967,27 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/yaml-ast-parser": { "version": "0.0.43", "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", diff --git a/package.json b/package.json index 2749c2c..ed65368 100644 --- a/package.json +++ b/package.json @@ -55,11 +55,13 @@ "dependencies": { "@modelcontextprotocol/sdk": "^1.12.0", "express": "^4.21.2", + "ws": "^8.21.0", "zod": "^3.24.0" }, "devDependencies": { "@types/express": "^4.17.21", "@types/node": "^20.11.0", + "@types/ws": "^8.18.1", "openapi-typescript": "^7.4.0", "tsx": "^4.19.0", "typescript": "^5.5.0", diff --git a/skills/arcane-mcp-server/SKILL.md b/skills/arcane-mcp-server/SKILL.md index 780627f..a498763 100644 --- a/skills/arcane-mcp-server/SKILL.md +++ b/skills/arcane-mcp-server/SKILL.md @@ -77,8 +77,9 @@ When something is broken, investigate systematically: 1. **Dashboard first** — `arcane_dashboard_get` 2. **Container state** — `arcane_container_list` to find stopped/unhealthy containers 3. **Container detail** — `arcane_container_get` on the suspect container -4. **Port conflicts** — `arcane_port_list` if networking issues suspected -5. **Vulnerability check** — `arcane_vulnerability_get_environment_summary` if security related +4. **Logs** — `arcane_container_get_logs` (or `arcane_project_get_logs` for a whole stack); to follow live, call again with `since` set to the newest timestamp +5. **Port conflicts** — `arcane_port_list` if networking issues suspected +6. **Vulnerability check** — `arcane_vulnerability_get_environment_summary` if security related ### Cleanup @@ -107,7 +108,7 @@ For Docker Swarm clusters: 2. **Deploy services** — `arcane_swarm_create_service` with replicas, ports, networks 3. **Scale** — `arcane_swarm_scale_service` to adjust replica count 4. **Monitor** — `arcane_swarm_list_services` + `arcane_swarm_get_service` for task status -5. **Tasks** — `arcane_swarm_get_service` for task status when debugging +5. **Logs** — `arcane_swarm_get_service_logs` for debugging (incremental via `since`) ### Update Overview & Auto-Update Management diff --git a/src/__tests__/integration/tool-filtering.test.ts b/src/__tests__/integration/tool-filtering.test.ts index 3d932c2..25438be 100644 --- a/src/__tests__/integration/tool-filtering.test.ts +++ b/src/__tests__/integration/tool-filtering.test.ts @@ -296,7 +296,7 @@ describe("integration: upgrade notice lifecycle", () => { // Unconfigured state → explicit call to /arcane:configure const handler = handlers.get("arcane-tools-config-notice")!; const result = await handler(new URL("arcane://tools-config-notice")); - expect(result.contents[0].text).toContain("177 tools"); + expect(result.contents[0].text).toContain("180 tools"); expect(result.contents[0].text).toContain("/arcane:configure"); // Flip to configured — body should swap diff --git a/src/client/arcane-client.ts b/src/client/arcane-client.ts index e61cf25..8280ca3 100644 --- a/src/client/arcane-client.ts +++ b/src/client/arcane-client.ts @@ -12,6 +12,8 @@ import { MAX_RESPONSE_SIZE, RETRYABLE_STATUS_CODES, BACKGROUND_REQUEST_TIMEOUT_MS, + LOG_STREAM_IDLE_TIMEOUT_MS, + LOG_STREAM_MAX_DURATION_MS, } from "../constants.js"; export interface RequestOptions { @@ -291,6 +293,85 @@ export class ArcaneClient { return (text ? JSON.parse(text) : undefined) as T; } + /** + * Fetch log lines from one of Arcane's WebSocket log endpoints. + * + * Connects with follow=false so the server sends the requested backlog; + * collection ends when the server closes, no line arrives for + * LOG_STREAM_IDLE_TIMEOUT_MS, the hard duration cap hits, or maxLines + * is reached (whichever comes first). + */ + async fetchLogs( + path: string, + params: Record, + maxLines: number + ): Promise<{ lines: string[]; truncated: boolean }> { + const { default: WebSocket } = await import("ws"); + + const url = this.buildUrl(`/api${path}`, params).replace(/^http/, "ws"); + const authHeaders = await this.authManager.getAuthHeaders(); + + return new Promise((resolve, reject) => { + const lines: string[] = []; + let truncated = false; + let settled = false; + let idleTimer: NodeJS.Timeout | undefined; + + const ws = new WebSocket(url, { + headers: authHeaders, + rejectUnauthorized: !this.config.skipSslVerify, + }); + + const finish = () => { + if (settled) return; + settled = true; + clearTimeout(idleTimer); + clearTimeout(maxTimer); + try { + ws.terminate(); + } catch { + // already closed + } + resolve({ lines, truncated }); + }; + + const resetIdle = () => { + clearTimeout(idleTimer); + idleTimer = setTimeout(finish, LOG_STREAM_IDLE_TIMEOUT_MS); + }; + + const maxTimer = setTimeout(finish, LOG_STREAM_MAX_DURATION_MS); + + ws.on("open", resetIdle); + ws.on("message", (data: Buffer | string) => { + for (const raw of data.toString().split("\n")) { + // Strip trailing CR and ANSI color codes (compose/agent logs are colored) + const line = raw.replace(/\r$/, "").replace(/\x1b\[[0-9;]*m/g, ""); + if (!line) continue; + if (lines.length >= maxLines) { + truncated = true; + finish(); + return; + } + lines.push(line); + } + resetIdle(); + }); + ws.on("close", finish); + ws.on("error", (error: Error) => { + if (settled) return; + if (lines.length > 0) { + finish(); + return; + } + settled = true; + clearTimeout(idleTimer); + clearTimeout(maxTimer); + reject(new NetworkError(`Log stream failed: ${error.message}`)); + }); + }); + } + /** * Fire a long-running POST without awaiting its completion. * Uses a generous timeout so the built-in timeout retry never re-triggers diff --git a/src/constants.ts b/src/constants.ts index f81c77a..f2877a2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -13,6 +13,18 @@ export const DEFAULT_REQUEST_TIMEOUT_MS = 30000; /** Timeout for fire-and-forget background requests (long-running server-side operations) */ export const BACKGROUND_REQUEST_TIMEOUT_MS = 10 * 60 * 1000; +/** Log streaming (WebSocket): stop collecting when no new line arrived for this long */ +export const LOG_STREAM_IDLE_TIMEOUT_MS = 2000; + +/** Log streaming (WebSocket): hard cap on how long a single fetch may run */ +export const LOG_STREAM_MAX_DURATION_MS = 15000; + +/** Log streaming: default number of backlog lines to request */ +export const DEFAULT_LOG_TAIL = 100; + +/** Log streaming: hard cap on returned lines per call (protects the context window) */ +export const MAX_LOG_LINES = 500; + /** Session timeout - 30 minutes of inactivity */ export const SESSION_TIMEOUT_MS = 30 * 60 * 1000; diff --git a/src/prompts/index.ts b/src/prompts/index.ts index 9f3872c..f78cf7d 100644 --- a/src/prompts/index.ts +++ b/src/prompts/index.ts @@ -188,7 +188,7 @@ export function registerPrompts(server: McpServer): void { "Help the user configure which Arcane MCP tools are active.", "", "Context:", - "- Arcane registers 177 tools by default, which bloats the tool-list context window.", + "- Arcane registers 180 tools by default, which bloats the tool-list context window.", "- The server supports a `tools` config in `~/.arcane/config.json` (or env vars ARCANE_TOOL_PRESET / ARCANE_ENABLED_MODULES / ARCANE_ENABLED_TOOLS / ARCANE_DISABLED_TOOLS).", "- Hot reload: changes to `~/.arcane/config.json` apply live via `notifications/tools/list_changed`.", "- If the watcher isn't attached (e.g., missing file or HTTP-only setup), the user must reconnect the MCP server for changes to take effect.", @@ -198,7 +198,7 @@ export function registerPrompts(server: McpServer): void { "- read-only: every *_list / *_get / *_inspect / *_stats / *_status / *_summary tool (~60 tools)", "- minimal: dashboard + container list/get/counts (5 tools)", "- deploy: project, gitops, template, registry, environment, build (~40 tools)", - "- full: all 177 (default on upgrade)", + "- full: all 180 (default on upgrade)", "- custom: fine-grained modules + per-tool overrides only", "", "Flow:", @@ -216,7 +216,7 @@ export function registerPrompts(server: McpServer): void { "network, network-topology, notification, port, project, registry, settings, swarm, system,", "template, updater, user, volume, vulnerability, webhook", "", - "Keep the conversation short — don't re-print the full 177-tool list. Confirm the chosen preset and summarise the tools/modules set before writing.", + "Keep the conversation short — don't re-print the full 180-tool list. Confirm the chosen preset and summarise the tools/modules set before writing.", ].join("\n"), }, }, diff --git a/src/resources/__tests__/resources.test.ts b/src/resources/__tests__/resources.test.ts index 7e39428..9981188 100644 --- a/src/resources/__tests__/resources.test.ts +++ b/src/resources/__tests__/resources.test.ts @@ -131,7 +131,7 @@ describe("resources", () => { const result = await handler(new URL("arcane://tools-config-notice")); const text = result.contents[0].text; - expect(text).toContain("177 tools"); + expect(text).toContain("180 tools"); expect(text).toContain("/arcane:configure"); expect(text).toContain("commonly-used"); }); diff --git a/src/resources/index.ts b/src/resources/index.ts index 008e695..277f510 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -186,7 +186,7 @@ export function registerResources(server: McpServer): void { const lines: string[] = []; if (unconfigured) { - lines.push("Arcane MCP Server is currently exposing all 177 tools."); + lines.push("Arcane MCP Server is currently exposing all 180 tools."); lines.push(""); lines.push("You can reduce context bloat by picking a preset:"); lines.push(" - commonly-used — containers, images, projects, volumes, networks (~52 tools)"); diff --git a/src/tools/container-tools.ts b/src/tools/container-tools.ts index c3a8f67..1798849 100644 --- a/src/tools/container-tools.ts +++ b/src/tools/container-tools.ts @@ -6,7 +6,8 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; -import { DOCKER_SHORT_ID_LENGTH, MAX_DISPLAY_LABELS, DEFAULT_PAGINATION_START, DEFAULT_PAGINATION_LIMIT } from "../constants.js"; +import { DOCKER_SHORT_ID_LENGTH, MAX_DISPLAY_LABELS, DEFAULT_PAGINATION_START, DEFAULT_PAGINATION_LIMIT, DEFAULT_LOG_TAIL, MAX_LOG_LINES } from "../constants.js"; +import { formatLogResult } from "../utils/log-format.js"; import type { Container } from "../types/arcane-types.js"; export function registerContainerTools(server: McpServer, registry?: ToolRegistry): void { @@ -134,6 +135,38 @@ export function registerContainerTools(server: McpServer, registry?: ToolRegistr }) ); + // arcane_container_get_logs + register( + "arcane_container_get_logs", + { + title: "Get container logs", + description: "Fetch recent log lines of a container. For live following, call repeatedly with 'since' set to the newest timestamp seen — each call then returns only new lines.", + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false, + }, + inputSchema: { + environmentId: z.string().describe("Environment ID"), + containerId: z.string().describe("Container ID or name"), + tail: z.number().optional().default(DEFAULT_LOG_TAIL).describe("Number of most recent lines to return initially"), + since: z.string().optional().describe("Only return lines after this time — RFC3339 timestamp (from a previous call) or relative duration like '5m'"), + timestamps: z.boolean().optional().default(true).describe("Prefix each line with its timestamp (needed for incremental follow-up via 'since')"), + maxLines: z.number().optional().default(200).describe(`Hard cap on returned lines to protect the context window (max ${MAX_LOG_LINES})`), + }, + }, + toolHandler(async ({ environmentId, containerId, tail, since, timestamps, maxLines }, client) => { + const result = await client.fetchLogs( + `/environments/${environmentId}/ws/containers/${containerId}/logs`, + { follow: false, tail, since, timestamps }, + Math.min(maxLines, MAX_LOG_LINES) + ); + + return formatLogResult(`container ${containerId}`, result, timestamps); + }) + ); + // arcane_container_create register( "arcane_container_create", diff --git a/src/tools/project-tools.ts b/src/tools/project-tools.ts index abd8402..2be624d 100644 --- a/src/tools/project-tools.ts +++ b/src/tools/project-tools.ts @@ -6,7 +6,8 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; -import { MAX_DISPLAY_SERVICES } from "../constants.js"; +import { MAX_DISPLAY_SERVICES, DEFAULT_LOG_TAIL, MAX_LOG_LINES } from "../constants.js"; +import { formatLogResult } from "../utils/log-format.js"; import type { Project } from "../types/arcane-types.js"; export function registerProjectTools(server: McpServer, registry?: ToolRegistry): void { @@ -124,6 +125,38 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) }) ); + // arcane_project_get_logs + register( + "arcane_project_get_logs", + { + title: "Get project logs", + description: "Fetch recent log lines of all services in a Compose project (lines are prefixed with the service name). For live following, call repeatedly with 'since' set to the newest timestamp seen — each call then returns only new lines.", + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false, + }, + inputSchema: { + environmentId: z.string().describe("Environment ID"), + projectId: z.string().describe("Project ID"), + tail: z.number().optional().default(DEFAULT_LOG_TAIL).describe("Number of most recent lines to return initially"), + since: z.string().optional().describe("Only return lines after this time — RFC3339 timestamp (from a previous call) or relative duration like '5m'"), + timestamps: z.boolean().optional().default(true).describe("Prefix each line with its timestamp (needed for incremental follow-up via 'since')"), + maxLines: z.number().optional().default(200).describe(`Hard cap on returned lines to protect the context window (max ${MAX_LOG_LINES})`), + }, + }, + toolHandler(async ({ environmentId, projectId, tail, since, timestamps, maxLines }, client) => { + const result = await client.fetchLogs( + `/environments/${environmentId}/ws/projects/${projectId}/logs`, + { follow: false, tail, since, timestamps }, + Math.min(maxLines, MAX_LOG_LINES) + ); + + return formatLogResult(`project ${projectId}`, result, timestamps); + }) + ); + // arcane_project_create register( "arcane_project_create", diff --git a/src/tools/swarm-tools.ts b/src/tools/swarm-tools.ts index 600d989..1bd84f6 100644 --- a/src/tools/swarm-tools.ts +++ b/src/tools/swarm-tools.ts @@ -6,6 +6,8 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { toolHandler } from "../utils/tool-helpers.js"; import { moduleRegistrar, type ToolRegistry } from "./registry.js"; +import { DEFAULT_LOG_TAIL, MAX_LOG_LINES } from "../constants.js"; +import { formatLogResult } from "../utils/log-format.js"; import type { SwarmService, SwarmClusterInfo } from "../types/arcane-types.js"; export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): void { @@ -299,6 +301,38 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): }) ); + // arcane_swarm_get_service_logs + register( + "arcane_swarm_get_service_logs", + { + title: "Get Swarm service logs", + description: "Fetch recent log lines of a Swarm service. For live following, call repeatedly with 'since' set to the newest timestamp seen — each call then returns only new lines.", + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false, + }, + inputSchema: { + environmentId: z.string().describe("Environment ID"), + serviceId: z.string().describe("Swarm service ID"), + tail: z.number().optional().default(DEFAULT_LOG_TAIL).describe("Number of most recent lines to return initially"), + since: z.string().optional().describe("Only return lines after this time — RFC3339 timestamp (from a previous call) or relative duration like '5m'"), + timestamps: z.boolean().optional().default(true).describe("Prefix each line with its timestamp (needed for incremental follow-up via 'since')"), + maxLines: z.number().optional().default(200).describe(`Hard cap on returned lines to protect the context window (max ${MAX_LOG_LINES})`), + }, + }, + toolHandler(async ({ environmentId, serviceId, tail, since, timestamps, maxLines }, client) => { + const result = await client.fetchLogs( + `/environments/${environmentId}/ws/swarm/services/${serviceId}/logs`, + { follow: false, tail, since, timestamps }, + Math.min(maxLines, MAX_LOG_LINES) + ); + + return formatLogResult(`service ${serviceId}`, result, timestamps); + }) + ); + // arcane_swarm_init_cluster register( "arcane_swarm_init_cluster", diff --git a/src/utils/log-format.ts b/src/utils/log-format.ts new file mode 100644 index 0000000..a9c9a3f --- /dev/null +++ b/src/utils/log-format.ts @@ -0,0 +1,30 @@ +/** + * Shared formatting for the WebSocket-based log tools. + */ + +/** Zod-independent shape shared by all log tools */ +export interface LogFetchResult { + lines: string[]; + truncated: boolean; +} + +export function formatLogResult(label: string, result: LogFetchResult, timestamps: boolean): string { + if (result.lines.length === 0) { + return `No log output for ${label}. (Try a larger "tail" or an earlier "since".)`; + } + + const out = [ + `Logs for ${label} (${result.lines.length} lines${result.truncated ? ", truncated at the line limit" : ""}):`, + "", + ...result.lines, + "", + ]; + + if (timestamps) { + out.push('To follow the logs, call again with "since" set to the timestamp of the newest line — only newer lines are returned.'); + } else { + out.push('Tip: set timestamps=true to enable incremental follow-up calls via "since".'); + } + + return out.join("\n"); +} From adac5624f5a8fe09853e010243eb11d1967f5fe1 Mon Sep 17 00:00:00 2001 From: Xitee <59659167+Xitee1@users.noreply.github.com> Date: Sat, 11 Jul 2026 23:26:34 +0200 Subject: [PATCH 8/8] docs: clarify digest-update wording in image update checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arcane's checker only compares digests within the pinned tag and never resolves newer version tags (UpdateTypeTag exists in the models but is never produced by the service as of v2.3.2) — label digest updates accordingly so the output doesn't look like missing data. Co-Authored-By: Claude Fable 5 --- src/tools/image-update-tools.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/tools/image-update-tools.ts b/src/tools/image-update-tools.ts index b4c4d98..afe5119 100644 --- a/src/tools/image-update-tools.ts +++ b/src/tools/image-update-tools.ts @@ -13,9 +13,12 @@ function formatUpdateCheck(imageRef: string, u: ImageUpdateResponse): string { return `Check failed for ${imageRef}: ${u.error}`; } if (u.hasUpdate) { - const current = u.currentVersion || u.currentDigest?.substring(0, 12) || "unknown"; - const latest = u.latestVersion || u.latestDigest?.substring(0, 12) || "unknown"; - return `Update available for ${imageRef}! (${u.updateType || "update"})\n Current: ${current}\n Latest: ${latest}`; + const current = u.currentVersion || u.currentDigest?.substring(0, 19) || "unknown"; + const latest = u.latestVersion || u.latestDigest?.substring(0, 19) || "unknown"; + const note = u.updateType === "digest" + ? " (digest update: the pinned tag points to new image content — Arcane does not resolve newer version tags)" + : ` (${u.updateType || "update"})`; + return `Update available for ${imageRef}!${note}\n Current: ${current}\n Latest: ${latest}`; } return `${imageRef} is up to date.`; }