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/CHANGELOG.md b/CHANGELOG.md index 88ad03b..fcb62e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,53 @@ 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 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. +- `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}`). +- `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. + +### 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. +- 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`. +- **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..e901992 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 @@ -25,7 +26,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 (180 across 26 modules in `src/tools/`) All tools use `server.registerTool()` with: - `title` — human-readable name diff --git a/README.md b/README.md index 394d782..51ebc5c 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ 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 @@ -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. @@ -273,12 +273,13 @@ And a Claude Code slash command: ## 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 | @@ -299,7 +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` | Get service logs | +| `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 | @@ -322,18 +323,20 @@ 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 (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 | | `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 | @@ -355,7 +358,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 +399,7 @@ And a Claude Code slash command:
-GitOps, Webhooks, Auto-Updater & Dashboard (23 tools) +GitOps, Webhooks, Auto-Updater, Dashboard & Activities (23 tools) | Tool | Description | |------|-------------| @@ -418,15 +421,15 @@ 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 | +| `arcane_activity_list` | List background activities (update checks, prunes, scans) | +| `arcane_activity_get` | Get activity progress and messages |
-Environments, Registries, Auth & More (69 tools) +Environments, Registries, Auth & More (66 tools) | Category | Tools | What it covers | |----------|-------|----------------| @@ -434,8 +437,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 +518,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/ # 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 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..76f8e4d 100644 --- a/commands/configure.md +++ b/commands/configure.md @@ -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`. diff --git a/package-lock.json b/package-lock.json index 2beb13a..07a68f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,17 @@ { "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", "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 4c7347a..ed65368 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", @@ -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/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/skills/arcane-mcp-server/SKILL.md b/skills/arcane-mcp-server/SKILL.md index 4d2ef37..a498763 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,11 @@ 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` | +| "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` | | "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,11 +74,12 @@ 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 -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 @@ -106,17 +108,22 @@ 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. **Logs** — `arcane_swarm_get_service_logs` for debugging (incremental via `since`) -### 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_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 ## Safety Rules diff --git a/src/__tests__/integration/tool-filtering.test.ts b/src/__tests__/integration/tool-filtering.test.ts index 358b817..25438be 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)", () => { @@ -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(); 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..8280ca3 100644 --- a/src/client/arcane-client.ts +++ b/src/client/arcane-client.ts @@ -11,6 +11,9 @@ import { RETRY_BASE_DELAY_MS, 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 { @@ -30,9 +33,10 @@ export interface PaginatedResponse { success: boolean; data: T[]; pagination: { - total: number; - start: number; - limit: number; + totalItems: number; + totalPages: number; + currentPage: number; + itemsPerPage: number; }; } @@ -255,8 +259,130 @@ 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 }); + } + + /** + * 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; + } + + /** + * 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 + * 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}`); + }); } /** diff --git a/src/constants.ts b/src/constants.ts index 7ead50d..f2877a2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -10,6 +10,21 @@ 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; + +/** 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/__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..f78cf7d 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.", diff --git a/src/tools/__tests__/container-tools.test.ts b/src/tools/__tests__/container-tools.test.ts index f5222b4..1b75b93 100644 --- a/src/tools/__tests__/container-tools.test.ts +++ b/src/tools/__tests__/container-tools.test.ts @@ -73,24 +73,24 @@ 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: [], }, ], - 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")!; @@ -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 13e37c4..fd0080c 100644 --- a/src/tools/__tests__/dashboard-tools.test.ts +++ b/src/tools/__tests__/dashboard-tools.test.ts @@ -57,27 +57,21 @@ 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", () => { - 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" }, }, }); @@ -86,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: [] }, }, }); @@ -112,53 +101,13 @@ describe("dashboard-tools", () => { const text = result.content[0].text; 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"); + expect(text).toContain("Action Items: none"); }); 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/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/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 7e95d54..771c280 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.`; }) ); @@ -81,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, }); @@ -90,14 +81,14 @@ 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.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(""); } @@ -132,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"); @@ -215,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}`; }) ); @@ -245,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 2a53a28..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 { @@ -37,17 +38,20 @@ 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}`); + // 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 +87,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:"); @@ -118,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", @@ -343,13 +392,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 21ac2fb..fcbd225 100644 --- a/src/tools/dashboard-tools.ts +++ b/src/tools/dashboard-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 type { DashboardSnapshot, ActionItem } from "../types/arcane-types.js"; +import { formatSizeGB } from "../utils/format.js"; +import type { DashboardSnapshot } from "../types/arcane-types.js"; export function registerDashboardTools(server: McpServer, registry?: ToolRegistry): void { const register = moduleRegistrar(server, registry, "dashboard"); @@ -33,63 +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}`, - ]; + const lines = [`Dashboard Snapshot:`, ``]; - 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 counts = d.containers?.counts; + if (counts) { + lines.push(`Containers: ${counts.totalContainers} total (${counts.runningContainers} running, ${counts.stoppedContainers} stopped)`); } - return lines.join("\n"); - }) - ); - - // 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` - ); + const img = d.imageUsageCounts; + if (img) { + lines.push(`Images: ${img.totalImages} total (${img.imagesInuse} in use, ${img.imagesUnused} unused, ${formatSizeGB(img.totalImageSize)})`); + } - if (!response.data || response.data.length === 0) { - return "No action items — everything looks good!"; + 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 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(""); + 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 df66cd6..0c97e0e 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})`); @@ -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}` : ""}`; }) ); @@ -261,30 +269,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 +313,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..2f4cce5 100644 --- a/src/tools/event-tools.ts +++ b/src/tools/event-tools.ts @@ -26,26 +26,26 @@ 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 }); + 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.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}`); } @@ -85,18 +85,18 @@ 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.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/gitops-tools.ts b/src/tools/gitops-tools.ts index 405b7c5..0a39532 100644 --- a/src/tools/gitops-tools.ts +++ b/src/tools/gitops-tools.ts @@ -36,20 +36,20 @@ 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}`); 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"); @@ -278,19 +278,18 @@ 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}`); 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 f1a6c3b..56ea631 100644 --- a/src/tools/image-tools.ts +++ b/src/tools/image-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 { formatSize, formatSizeMB, formatSizeGB } from "../utils/format.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"; @@ -36,20 +37,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(""); } @@ -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: ${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]}`); } @@ -113,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.`; }) ); @@ -140,13 +151,13 @@ 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 }); + toolHandler(async ({ environmentId, imageId, force }, client) => { + const resolvedId = await resolveImageId(client, environmentId, imageId); + await client.delete(`/environments/${environmentId}/images/${resolvedId}`, { force }); return `Image ${imageId} removed successfully.`; }) ); @@ -169,14 +180,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 +212,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 +243,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.`; } @@ -249,7 +269,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, @@ -261,21 +281,13 @@ 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`); - - const updates = response.data.filter(i => i.hasUpdate); - if (updates.length === 0) { - return "All images are up to date."; - } + client.postInBackground(`/environments/${environmentId}/image-updates/check-all`, {}); - const lines = [`Found ${updates.length} images with updates:\n`]; - for (const img of updates) { - lines.push(` - ${img.image}`); - } - - 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"); }) ); @@ -299,12 +311,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..afe5119 100644 --- a/src/tools/image-update-tools.ts +++ b/src/tools/image-update-tools.ts @@ -8,6 +8,42 @@ 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, 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.`; +} + +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 +70,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 +96,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 +105,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 +114,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 || {}); }) ); @@ -114,7 +132,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, @@ -126,26 +144,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` - ); - - 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}`); - } - } + client.postInBackground(`/environments/${environmentId}/image-updates/check-all`, {}); - if (batch.updatesAvailable === 0) { - lines.push("All images are up to date."); - } - - 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_update_get_summary or arcane_image_update_check_multiple for specific images.", + ].join("\n"); }) ); @@ -174,9 +179,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/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/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 5b991d9..2c949d1 100644 --- a/src/tools/network-tools.ts +++ b/src/tools/network-tools.ts @@ -36,21 +36,22 @@ 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)}`); 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/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/port-tools.ts b/src/tools/port-tools.ts index b4c09c3..98004ed 100644 --- a/src/tools/port-tools.ts +++ b/src/tools/port-tools.ts @@ -35,18 +35,18 @@ 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}` - : `${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 0eadd73..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 { @@ -17,7 +18,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,36 +28,47 @@ 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: { total: number; start: number; limit: number }; - }>(`/environments/${environmentId}/projects`, { search, sort, order, start, limit }); + pagination: { totalItems: number }; + }>(`/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.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}`); + 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) { - 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; + 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,18 +106,57 @@ export function registerProjectTools(server: McpServer, registry?: ToolRegistry) ` Path: ${proj.path || "N/A"}`, ` Created: ${proj.createdAt || "N/A"}`, ` Updated: ${proj.updatedAt || "N/A"}`, - "", - "Services:", ]; - for (const svc of proj.services || []) { - lines.push(` - ${svc.name}: ${svc.status} (${svc.containerCount || 0} containers)`); + 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.runtimeServices || []) { + lines.push(` - ${svc.name}: ${svc.status}${svc.health ? ` (${svc.health})` : ""}${svc.containerName ? ` [${svc.containerName}]` : ""}`); } return lines.join("\n"); }) ); + // 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", @@ -123,13 +174,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}`; @@ -257,6 +307,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", @@ -273,10 +355,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." : ""}`; }) ); @@ -322,13 +409,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 9a9fe71..f974d5b 100644 --- a/src/tools/registry-tools.ts +++ b/src/tools/registry-tools.ts @@ -31,21 +31,20 @@ 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}`); + 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 f160c61..f84dbff 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"); @@ -54,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) => { @@ -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"); @@ -105,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}`); } @@ -143,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(""); } @@ -196,14 +216,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 60e2465..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 { @@ -35,19 +37,19 @@ 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}`); 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 +80,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 +162,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 +220,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.`; }) ); @@ -232,7 +306,7 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): "arcane_swarm_get_service_logs", { title: "Get Swarm service logs", - description: "Get logs from a Swarm service", + 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, @@ -242,17 +316,20 @@ export function registerSwarmTools(server: McpServer, registry?: ToolRegistry): 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"), + 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, timestamps }, client) => { - const response = await client.get<{ data: string }>( - `/environments/${environmentId}/swarm/services/${serviceId}/logs`, - { tail, timestamps } + 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 response.data || "No logs available."; + return formatLogResult(`service ${serviceId}`, result, timestamps); }) ); @@ -276,20 +353,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"); }) ); @@ -369,12 +442,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 8bc7923..d31c728 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"); }) ); @@ -277,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 fb4f993..37d3b8f 100644 --- a/src/tools/template-tools.ts +++ b/src/tools/template-tools.ts @@ -24,26 +24,26 @@ 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: { total: number }; - }>("/templates", { search, category, start, limit }); + pagination: { totalItems: number }; + }>("/templates", { search, type, 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}`); - 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.`; @@ -204,17 +205,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 +240,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..5a48ab3 100644 --- a/src/tools/user-tools.ts +++ b/src/tools/user-tools.ts @@ -31,23 +31,20 @@ 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}`); + 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..8ab65a2 100644 --- a/src/tools/volume-tools.ts +++ b/src/tools/volume-tools.ts @@ -38,21 +38,21 @@ 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}`); 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}`; }) ); @@ -348,8 +346,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 +378,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 +396,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 +443,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..d46895b 100644 --- a/src/tools/vulnerability-tools.ts +++ b/src/tools/vulnerability-tools.ts @@ -6,7 +6,34 @@ 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 { resolveImageId } from "../utils/image-resolver.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"); @@ -25,23 +52,16 @@ 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` ); - 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 +70,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, @@ -59,27 +79,16 @@ 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/result` + `/environments/${environmentId}/images/${resolvedId}/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); }) ); @@ -97,16 +106,17 @@ 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 response = await client.get<{ data: { total: number; critical: number; high: number; medium: number; low: number; scannedAt?: string } }>( - `/environments/${environmentId}/images/${imageId}/vulnerabilities/summary` - ); + const resolvedId = await resolveImageId(client, environmentId, imageId); + const response = await client.get<{ + data: { status: string; scanPhase?: string; scanTime?: string; summary?: SeveritySummary }; + }>(`/environments/${environmentId}/images/${resolvedId}/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 +138,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"); @@ -157,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"), @@ -169,8 +182,8 @@ 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 }; - }>(`/environments/${environmentId}/images/${imageId}/vulnerabilities`, { + pagination: { totalItems: number }; + }>(`/environments/${environmentId}/images/${await resolveImageId(client, environmentId, imageId)}/vulnerabilities/list`, { severity, search, sort, order, start, limit, }); @@ -178,14 +191,9 @@ 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) { - 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 +221,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 +229,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"); @@ -250,16 +250,22 @@ 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"), 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) => { + const resolvedId = await resolveImageId(client, environmentId, imageId); + await client.post(`/environments/${environmentId}/vulnerabilities/ignore`, { + imageId: resolvedId, + vulnerabilityId, + pkgName, + installedVersion, + reason, + }); return `Vulnerability ${vulnerabilityId} ignored.`; }) ); @@ -269,7 +275,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 +284,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.`; }) ); @@ -308,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"); }) @@ -343,12 +344,12 @@ 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<{ data: Vulnerability[]; - pagination: { total: number; start: number; limit: number }; + pagination: { totalItems: number }; }>(`/environments/${environmentId}/vulnerabilities/all`, { severity, imageName, search, start, limit, }); @@ -357,14 +358,9 @@ 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) { - 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 +372,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 +384,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 +394,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(""); } @@ -426,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 7becf7d..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; } @@ -44,23 +48,40 @@ export interface FileEntry { export interface Backup { id: string; volumeName: string; - filename: string; size: number; createdAt: string; } // === 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; 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; } @@ -71,33 +92,34 @@ export interface Image { id: string; repoTags: string[]; repoDigests?: string[]; - created: string; + /** Unix timestamp (seconds) */ + created: number; size: number; virtualSize?: number; + inUse?: boolean; } // === 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 === @@ -109,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; } @@ -123,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 { @@ -144,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 === @@ -153,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 { @@ -179,21 +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 }; -} - -export interface ActionItem { - type: string; - severity: string; - title: string; - description?: string; - resourceId?: string; - resourceName?: string; + 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 === @@ -201,7 +238,9 @@ export interface ActionItem { export interface Event { id: string; type: string; - message: string; + title: string; + description?: string; + severity: string; resourceType?: string; resourceId?: string; resourceName?: string; @@ -218,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; } @@ -230,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 === @@ -241,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 === @@ -279,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 === @@ -302,40 +354,57 @@ 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 === +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 +412,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 === @@ -379,10 +468,13 @@ export interface Vulnerability { 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; } 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?: { diff --git a/src/utils/format.ts b/src/utils/format.ts index 25b1172..5720a92 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 || !Number.isFinite(seconds)) return "unknown"; + return new Date(seconds * 1000).toISOString(); +} + /** * Validate a file path parameter to prevent path traversal attacks. * Rejects paths containing ".." sequences. 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; +} 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"); +}