{
  "openapi": "3.1.0",
  "info": {
    "title": "Ghostdock API",
    "version": "1",
    "description": "Every Ghostdock tool, the same ones the CLI and the MCP server offer. Authenticate with `Authorization: Bearer <token>`: an organization API token (scoped) or a CLI login. Calls are relative to the host that serves this document. Files past 256 KiB and live commands in a container are WebSockets, which this document cannot describe: see the external docs."
  },
  "externalDocs": {
    "description": "The WebSocket streams: copying files of any size and live container commands",
    "url": "/streams.md"
  },
  "servers": [
    {
      "url": "/"
    }
  ],
  "security": [
    {
      "bearer": []
    }
  ],
  "paths": {
    "/api/v1/me": {
      "get": {
        "operationId": "me",
        "tags": ["account"],
        "summary": "The account behind the token",
        "responses": {
          "200": {
            "description": "The caller.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Me"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools": {
      "get": {
        "operationId": "tool_catalog",
        "tags": ["account"],
        "summary": "The tools this token may call, with their JSON Schemas",
        "responses": {
          "200": {
            "description": "The catalog, filtered by the token’s scopes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolCatalog"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/organization_list": {
      "post": {
        "operationId": "organization_list",
        "tags": ["organization"],
        "summary": "List the organizations you belong to, with their ids and slugs.",
        "description": "List the organizations you belong to, with their ids and slugs.\n\nAny organization API token may call it. CLI: `ghostdock organization list`.",
        "x-ghostdock-token-rule": "always",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrganizationListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ssh_key_list": {
      "post": {
        "operationId": "ssh_key_list",
        "tags": ["ssh-key"],
        "summary": "List the SSH public keys of your account.",
        "description": "List the SSH public keys of your account. With one of them, ssh <vm>--<org>@<host> (or <user>--<vm>--<org>@<host>) logs in to a Server of any of your organizations, without vm_ssh_get; vm_ssh_info answers that command as keyCommand, with what a client needs to use it.\n\nAn organization API token needs the `ssh_keys:read` scope. CLI: `ghostdock ssh-key list`.",
        "x-ghostdock-token-rule": "ssh_keys:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SshKeyListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SshKeyListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ssh_key_add": {
      "post": {
        "operationId": "ssh_key_add",
        "tags": ["ssh-key"],
        "summary": "Add an SSH public key to your account.",
        "description": "Add an SSH public key to your account. ed25519, ecdsa, or RSA of at least 3072 bits; the private key never leaves your machine. It logs in to the Servers of every organization you belong to, as ghost or the user the login names.\n\nAn organization API token needs the `ssh_keys:write` scope. CLI: `ghostdock ssh-key add`.",
        "x-ghostdock-token-rule": "ssh_keys:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SshKeyAddInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SshKeyAddOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ssh_key_delete": {
      "post": {
        "operationId": "ssh_key_delete",
        "tags": ["ssh-key"],
        "summary": "Remove an SSH key from your account.",
        "description": "Remove an SSH key from your account. Logins with it stop at once.\n\nAn organization API token needs the `ssh_keys:write` scope. CLI: `ghostdock ssh-key delete`.",
        "x-ghostdock-token-rule": "ssh_keys:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SshKeyDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SshKeyDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/template_list": {
      "post": {
        "operationId": "template_list",
        "tags": ["template"],
        "summary": "List what to create a VM from: systems and templates.",
        "description": "List what to create a VM from: systems and templates. systems are ours (headless, desktop; scope system): vm_up boots one by its name, and they are never templates. templates are the platform’s and the organization’s (nginx, …). The platform’s ready-made VMs and the organization’s own, each with scope (platform or organization), title, description and the create request it stands for (spec: system and/or source plus defaults such as URLs and resources; a template that names no system runs on a Container host). A name means the organization’s template first: one with shadows true hides the platform template of the same name (shadowed true), which vm_up --platform still reaches. Create one with vm_up. Templates with listed false (building blocks another template starts, such as github-actions-job-runner) are left out unless all is true; template_get and vm_up still take them by name.\n\nAn organization API token needs the `templates:read` scope. CLI: `ghostdock template list`.",
        "x-ghostdock-token-rule": "templates:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TemplateListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TemplateListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/template_get": {
      "post": {
        "operationId": "template_get",
        "tags": ["template"],
        "summary": "Get one template by name, with what its source asks of a VM.",
        "description": "Get one template by name, with what its source asks of a VM. Its spec (system and/or source plus defaults), and what vm_up would read from the source (a system alone: from its OS image). manifest is the redacted manifest from the source’s ghostdock.* labels, derived now (never stored): a Dockerfile’s LABELs, the Compose files’ labels, a Compose reference’s override, an image’s own labels from its registry (digest says which). requiredEnvironment, requiredUrls and requiredMcps are what vm_up must be given; manifestReason says why there is no manifest (none, invalid, or unreachable: the image’s registry could not be read). The organization’s template of that name, else the platform’s; platform true takes the platform’s.\n\nAn organization API token needs the `templates:read` scope. CLI: `ghostdock template get`.",
        "x-ghostdock-token-rule": "templates:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TemplateGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TemplateGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/template_create": {
      "post": {
        "operationId": "template_create",
        "tags": ["template"],
        "summary": "Save a VM create request as a template of the organization.",
        "description": "Save a VM create request as a template of the organization. Its members and agents make it with `ghostdock vm up <name>`. spec is what vm_up takes without the organization’s own things: system (what boots: headless, desktop, container-host or an OS image ref labelled ghostdock.os=true; omitted: the create’s default, a Container host when the template runs something, a headless Server when it does not), source (what runs on it: an image ref, Dockerfile, Compose files or a Compose reference; no snapshot), at least one of the two, and defaults (resources, lifecycle, restart, urls, mcps). Environment values stay out: a template that needs some declares them as ghostdock.env labels. A name the platform has too is allowed: the answer says shadows true, and the organization’s template wins for its members.\n\nAn organization API token needs the `templates:write` scope. CLI: `ghostdock template create`.",
        "x-ghostdock-token-rule": "templates:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TemplateCreateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TemplateCreateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/template_update": {
      "post": {
        "operationId": "template_update",
        "tags": ["template"],
        "summary": "Change a template of the organization by its name.",
        "description": "Change a template of the organization by its name. The fields given replace the stored ones: spec replaces the whole create request, source only what it boots (the defaults stay). Platform templates are changed by platform admins only.\n\nAn organization API token needs the `templates:write` scope. CLI: `ghostdock template update`.",
        "x-ghostdock-token-rule": "templates:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TemplateUpdateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TemplateUpdateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/template_delete": {
      "post": {
        "operationId": "template_delete",
        "tags": ["template"],
        "summary": "Delete a template of the organization by its name.",
        "description": "Delete a template of the organization by its name. VMs made from it keep running; a platform template it shadowed answers to the name again.\n\nAn organization API token needs the `templates:write` scope. CLI: `ghostdock template delete`.",
        "x-ghostdock-token-rule": "templates:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TemplateDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TemplateDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_up": {
      "post": {
        "operationId": "vm_up",
        "tags": ["vm"],
        "summary": "Bring up a new VM: what runs on it (optional) and the system it boots.",
        "description": "Bring up a new VM: what runs on it (optional) and the system it boots. system is what boots: headless (a Server, Headless, based on Ubuntu 26.04: the VM’s own system with sshd, Docker and systemd, where SSH and commands land on the VM), desktop (a Server, Desktop: the same with an XFCE desktop in the browser on its private Desktop URL), container-host (the platform’s read-only base that only runs the workload’s containers, no SSH; needs a workload), or the ref of an image labelled ghostdock.os=true. Defaults: with nothing to run, a headless Server (`ghostdock vm up`; container-host is refused without a workload, so a provider without Servers needs one). With something to run, a Container host (`ghostdock vm up nginx`, `--image redis`, Compose), unless the template names its system; system wins over both. The positional template takes a system’s name too: `ghostdock vm up desktop` (template desktop) is system desktop, and may come with a source (`vm up desktop --image redis`); headless, desktop and container-host are never template names. The workload is what runs on it, at most one: a template by name (template_list; platform true takes the platform’s), or source: an image, a Dockerfile, Compose files or a Compose oci:// reference. On a Server the workload runs as its own Compose project in /srv/ghostdock/<project>, as vm_container_up adds one (an image is one container named after it, nginx; a Compose source’s project is named after the VM), with its URLs, MCPs and forwards and this call’s urls, forwards and mcps. On a Container host it is the VM’s own project. An image labelled ghostdock.os=true is a system, never a workload. A template brings its system (or the default), its source and defaults; this call may change everything but the source (system, resources, lifecycle, idle time, environment, env, urls, forwards, mcps, restart, provider). A snapshot (whole disk) is a whole VM instead and brings its own system: not with system; a snapshot of a Server makes a Server. name gives the VM the name you will type (api); omitted, it is named after displayName, else it gets one like quiet-harbor. Inline content only: for a directory or ZIP (Dockerfile COPY/ADD, Compose build files) use `ghostdock vm build`. Snapshots and images (through their labels) can require environment entries, URLs and MCP names (requiredEnvironment / requiredUrls / requiredMcps); a missing environment entry fails with its names (missingEnvironment), and removing a required URL or MCP fails with them (missingUrls / missingMcps). Waits at most waitSeconds (default 120) for the VM and its workload: done by then, it returns the VM with `boot` (how long the VM and the workload's compose up took, each in ms, and the images it pulled) and on a Server `workload` (its container or project, URLs and MCPs); still running, it returns { vmId, name, organizationId, status: \"creating\" } and the create goes on in the background, whether or not the caller is still there: poll vm_status with vm set to that vmId (and waitSeconds) until status is no longer creating. A failed create's vm_status says why (failure: the same { code, message, retryable } a failed call returns). Retrying a create after a timeout or a dropped connection: pass the same idempotencyKey, which returns the same VM instead of making a second one. Idle-stop and auto-delete apply (defaults 20 minutes / 14 days; a Container host where nothing runs also sleeps after 5 minutes). Servers run on Ghostdock Cloud only: a named Server system elsewhere is refused (server_not_supported), and so is a create there without a workload. Read the vm skill for systems, sources, manifests, lifecycle and providers.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm up`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmUpInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmUpOutput"
                }
              }
            }
          },
          "202": {
            "description": "The create still runs after waitSeconds: { vmId, name, organizationId, status: \"creating\" }; poll vm_status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmUpOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_list": {
      "post": {
        "operationId": "vm_list",
        "tags": ["vm"],
        "summary": "List the VMs of an organization, with their lifecycle and deadlines.",
        "description": "List the VMs of an organization, with their lifecycle and deadlines. Each has a name (e.g. quiet-harbor, or one chosen at vm_up such as api), unique in the organization, that every VM tool accepts as `vm`, and maybe a displayName, a free label. disk is each VM’s last disk reading (at most minutes old; vm_status reads it now).\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm list`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_list": {
      "post": {
        "operationId": "provider_list",
        "tags": ["provider"],
        "summary": "List the providers an organization can create VMs on.",
        "description": "List the providers an organization can create VMs on. Includes its own connected providers and the platform providers it may use, in fallback order. Use an item id as provider. Only items with acceptsNewVms true take new VMs; an own provider stays incomplete until customDomain.status is active. defaultProviderId is the effective default. shadows and shadowed say an organization provider hides a platform provider of the same name, ignoring case. hostFolders are the folders a Docker or Incus host’s owner listed at setup (name, original path, readOnly), which volume_create hostFolder picks from; null when the host predates host folders. Read the vm skill for the details.\n\nAn organization API token needs the `providers:read` scope. CLI: `ghostdock provider list`.",
        "x-ghostdock-token-rule": "providers:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_rename": {
      "post": {
        "operationId": "provider_rename",
        "tags": ["provider"],
        "summary": "Rename one of the organization’s own providers.",
        "description": "Rename one of the organization’s own providers. Owner or admin. Platform providers cannot be renamed; names must be unique in the organization, ignoring case.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock provider rename`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderRenameInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderRenameOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_set_default": {
      "post": {
        "operationId": "provider_set_default",
        "tags": ["provider"],
        "summary": "Set the provider used when a create omits provider.",
        "description": "Set the provider used when a create omits provider. Applies to vm_up, project_publish and project_redeploy. Pass an own connected provider or a platform provider that accepts new VMs; pass null (or platformDefaultProviderId) to follow the platform default. With decline, answers \"no\" to a Docker or Incus host’s setup question (setup step default in provider_status): stored, so it is not asked again, and the default stays. Owner or admin.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock provider set-default`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderSetDefaultInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderSetDefaultOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_disconnect": {
      "post": {
        "operationId": "provider_disconnect",
        "tags": ["provider"],
        "summary": "Disconnect one of the organization’s own providers.",
        "description": "Disconnect one of the organization’s own providers. Owner or admin. Fails while VMs or volumes still use it (volume_delete them first). If organization snapshots live on it, the first call fails: pass confirmLinkedDeletion to delete them permanently. A Docker host that is not connected cannot delete its VMs and volumes: the first call fails, and confirmLinkedDeletion removes them from Ghostdock (whatever is still on the machine stays there). Also frees its custom domain; a default provider falls back to the platform default.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock provider disconnect`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderDisconnectInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderDisconnectOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain_list": {
      "post": {
        "operationId": "domain_list",
        "tags": ["domain"],
        "summary": "List the organization’s custom domains and their certificates.",
        "description": "List the organization’s custom domains and their certificates. Each domain is used by a provider or kept unused. Each has provider (null: unused, since unusedSince, its certificate kept), certificate (expiry), renewal (automatic; once_more: unused, renewed once more; stopped: unused and left to expire; manual: uploaded), renewsAt, lastIssuedAt, lastError, and allowance: how many new certificates Let’s Encrypt still issues for its name now (5 per 168 h), with nextAt when none is left.\n\nAn organization API token needs the `providers:read` scope. CLI: `ghostdock domain list`.",
        "x-ghostdock-token-rule": "providers:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DomainListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain_attach": {
      "post": {
        "operationId": "domain_attach",
        "tags": ["domain"],
        "summary": "Attach a custom domain to a provider.",
        "description": "Attach a custom domain to a provider. The organization’s stored domain keeps its certificate; a new one is added. Owner or admin. A domain the provider had is detached and kept. Returns the DNS records to create; then call domain_check. certificatePlan says what it costs: reuse (its certificate, no order) or order (a new certificate, with allowance). A domain another provider uses is refused: domain_detach it there first.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock domain attach`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DomainAttachInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainAttachOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain_check": {
      "post": {
        "operationId": "domain_check",
        "tags": ["domain"],
        "summary": "Check the DNS records of an attached custom domain against its provider.",
        "description": "Check the DNS records of an attached custom domain against its provider. Owner or admin. Once they point at the provider, a stored certificate valid for more than 7 days is served at once; otherwise Let’s Encrypt is asked for one (status pending_ssl, then active). Call again until checks pass.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock domain check`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DomainCheckInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainCheckOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain_detach": {
      "post": {
        "operationId": "domain_detach",
        "tags": ["domain"],
        "summary": "Detach a custom domain from the provider that uses it.",
        "description": "Detach a custom domain from the provider that uses it. Owner or admin. Its VM URLs on that provider stop; the domain and its certificate stay, ready to be attached again without a new certificate.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock domain detach`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DomainDetachInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainDetachOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain_delete": {
      "post": {
        "operationId": "domain_delete",
        "tags": ["domain"],
        "summary": "Delete a custom domain and throw its certificate away.",
        "description": "Delete a custom domain and throw its certificate away. Owner or admin. Adding it again orders a new certificate, which counts toward Let’s Encrypt’s 5 per 168 h (see allowance in domain_list). A domain a provider uses is refused unless confirmInUse: then it is detached first and that provider’s VM URLs stop.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock domain delete`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DomainDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_connect": {
      "post": {
        "operationId": "provider_connect",
        "tags": ["provider"],
        "summary": "Start connecting your own server to Ghostdock as an Incus host or a Docker host.",
        "description": "Start connecting your own server to Ghostdock as an Incus host or a Docker host. kind is incus (VMs as system containers in an Incus project of their own) or docker (VMs as containers next to the server’s Docker, with Sysbox). Owner or admin. Returns the new provider and its join: the secret setupCommand to run on that server as root, valid for one hour and one join. Then call provider_verify. To finish an incomplete setup, get a new command with provider_new_join instead of connecting again. Read the host-setup skill first.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock provider connect`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderConnectInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderConnectOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_new_join": {
      "post": {
        "operationId": "provider_new_join",
        "tags": ["provider"],
        "summary": "Get a new setup command for a Docker or Incus host that is not connected.",
        "description": "Get a new setup command for a Docker or Incus host that is not connected. For when the first expired or the server was set up again. Owner or admin. Refused while the server is connected. Read the host-setup skill.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock provider new-join`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderNewJoinInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderNewJoinOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_verify": {
      "post": {
        "operationId": "provider_verify",
        "tags": ["provider"],
        "summary": "Check or finish connecting a Docker or Incus host.",
        "description": "Check or finish connecting a Docker or Incus host. Owner or admin. Runs the server's self-check, and a failure names what is wrong; with an active domain it also tries a VM URL from outside (reach). Read the host-setup skill.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock provider verify`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderVerifyInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderVerifyOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_status": {
      "post": {
        "operationId": "provider_status",
        "tags": ["provider"],
        "summary": "Show how a provider is doing: what is wrong now and where its release stands.",
        "description": "Show how a provider is doing: what is wrong now and where its release stands. failing lists the checks failing now, oldest first, with the VMs each affects; blocking ones stop new VMs once they have lasted. release says the current and latest release, its state (current, outdated, unsupported, blocked, unknown), canUpdate and autoUpdate. Kinds that report less leave failing empty and release null: platform providers.\n\nAn organization API token needs the `providers:read` scope. CLI: `ghostdock provider status`.",
        "x-ghostdock-token-rule": "providers:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderStatusInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderStatusOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_update": {
      "post": {
        "operationId": "provider_update",
        "tags": ["provider"],
        "summary": "Update a provider to its newest release.",
        "description": "Update a provider to its newest release. Owner or admin. Only when provider_status says canUpdate (today: Docker and Incus hosts). Returns the target version and updateId at once; the host downloads the release and replaces its own containers or instances in a minute or two, and VMs keep running. While it runs, provider_status shows release.update with its step (download, replace, health) and progress. If the new release is not healthy within 5 minutes, it returns to the old one and provider_status lists a docker-update or incus-update failure. provider_update_list says how it ended; provider_update_log has its log.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock provider update`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderUpdateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderUpdateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_update_list": {
      "post": {
        "operationId": "provider_update_list",
        "tags": ["provider"],
        "summary": "List a provider’s last 20 updates, newest first.",
        "description": "List a provider’s last 20 updates, newest first. Each says by hand (with who) or automatic, from and to which version, when, and how it ended (running, updated, rolled_back, failed, lost) with the reason. hasLog says whether provider_update_log has its log (hosts on a release with update logs). Today: Docker and Incus hosts.\n\nAn organization API token needs the `providers:read` scope. CLI: `ghostdock provider update-list`.",
        "x-ghostdock-token-rule": "providers:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderUpdateListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderUpdateListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_update_log": {
      "post": {
        "operationId": "provider_update_log",
        "tags": ["provider"],
        "summary": "Show one of a provider’s updates with the host’s log of it.",
        "description": "Show one of a provider’s updates with the host’s log of it. The log says what the host did: the download, the swap, the new release’s health report, and a rollback’s reason. A long log keeps its start and its end.\n\nAn organization API token needs the `providers:read` scope. CLI: `ghostdock provider update-log`.",
        "x-ghostdock-token-rule": "providers:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderUpdateLogInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderUpdateLogOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_set_auto_update": {
      "post": {
        "operationId": "provider_set_auto_update",
        "tags": ["provider"],
        "summary": "Turn automatic updates of a provider on or off.",
        "description": "Turn automatic updates of a provider on or off. Owner or admin. On (the default), it takes each new release by itself a day after it is published, the same way as provider_update. Only for providers that provider_status gives a release.\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock provider set-auto-update`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderSetAutoUpdateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderSetAutoUpdateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/provider_set_address": {
      "post": {
        "operationId": "provider_set_address",
        "tags": ["provider"],
        "summary": "Set the address an organization’s Docker or Incus host is reached at.",
        "description": "Set the address an organization’s Docker or Incus host is reached at. For a machine people reach at another address than the one its agent connects from: behind NAT, a second address, or a dynamic DNS name. Owner or admin. An IPv4 address makes the custom domain’s traffic record an A record, an IPv6 address AAAA, a host name CNAME; provider_list shows it as address (source set). null goes back to the connection’s address (source connection). Then check the domain (domain_check).\n\nOrganization API tokens cannot call it; a CLI login can. CLI: `ghostdock provider set-address`.",
        "x-ghostdock-token-rule": "never",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderSetAddressInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderSetAddressOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/snapshot_list": {
      "post": {
        "operationId": "snapshot_list",
        "tags": ["snapshot"],
        "summary": "List the snapshots an organization can boot VMs from.",
        "description": "List the snapshots an organization can boot VMs from. Each item has status (pending, active, error), the provider that holds it (providerId; boot it there), vmCount, and a redacted manifest with requiredEnvironment / requiredUrls / requiredMcps.\n\nAn organization API token needs the `snapshots:read` scope. CLI: `ghostdock snapshot list`.",
        "x-ghostdock-token-rule": "snapshots:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SnapshotListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/snapshot_create": {
      "post": {
        "operationId": "snapshot_create",
        "tags": ["snapshot"],
        "summary": "Save a VM’s filesystem as a reusable organization snapshot.",
        "description": "Save a VM’s filesystem as a reusable organization snapshot. The VM must be stopped, unless stopAndResume. Captures its URLs and environment into a manifest (secrets as required, without values). Waits up to ~120 seconds; if still pending it returns timedOut, then poll snapshot_get. Setting secret values here is allowed; prefer the Ghostdock CLI so they stay out of the conversation.\n\nAn organization API token needs the `snapshots:write` scope. CLI: `ghostdock snapshot create`.",
        "x-ghostdock-token-rule": "snapshots:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SnapshotCreateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotCreateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/snapshot_get": {
      "post": {
        "operationId": "snapshot_get",
        "tags": ["snapshot"],
        "summary": "Get one snapshot with its manifest and required environment, URLs and MCPs.",
        "description": "Get one snapshot with its manifest and required environment, URLs and MCPs. Returns a redacted manifest with requiredEnvironment / requiredUrls / requiredMcps. Poll it after snapshot_create while status is pending.\n\nAn organization API token needs the `snapshots:read` scope. CLI: `ghostdock snapshot get`.",
        "x-ghostdock-token-rule": "snapshots:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SnapshotGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/snapshot_delete": {
      "post": {
        "operationId": "snapshot_delete",
        "tags": ["snapshot"],
        "summary": "Permanently delete an organization snapshot (provider artifact and record).",
        "description": "Permanently delete an organization snapshot (provider artifact and record).\n\nAn organization API token needs the `snapshots:write` scope. CLI: `ghostdock snapshot delete`.",
        "x-ghostdock-token-rule": "snapshots:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SnapshotDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/snapshot_update_manifest": {
      "post": {
        "operationId": "snapshot_update_manifest",
        "tags": ["snapshot"],
        "summary": "Replace a snapshot’s manifest (URLs, environment, MCPs).",
        "description": "Replace a snapshot’s manifest (URLs, environment, MCPs). Does not change the snapshot itself. Secret values in the body are stored encrypted; the response is redacted. Setting secret values here is allowed; prefer the Ghostdock CLI so they stay out of the conversation.\n\nAn organization API token needs the `snapshots:write` scope. CLI: `ghostdock snapshot update-manifest`.",
        "x-ghostdock-token-rule": "snapshots:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SnapshotUpdateManifestInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotUpdateManifestOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/volume_list": {
      "post": {
        "operationId": "volume_list",
        "tags": ["volume"],
        "summary": "List the organization’s volumes (ADR 0061): storage that outlives VMs.",
        "description": "List the organization’s volumes (ADR 0061): storage that outlives VMs. Each has kind (disk: one VM writes it at a time, like a local disk, the place for databases; shared: any number of VMs at once, live), sizeGiB, usedBytes (what its host last read), status, provider (with its kind) and host, backing and backingNote (what keeps its data on that provider: block, a Ghostdock Cloud disk’s own block device; nfs, a Cloud shared folder served over NFS, slower; pool, a folder in an Incus host’s ZFS or Btrfs pool, size enforced; folder, a folder on a Docker host’s machine, size not enforced), ownerTokenId (the identity that owns it, or null), attachments (vmName, name in the VM, path, readOnly, state: pending attaches at the VM’s next start, detaching leaves then, or for a shared folder once nothing in the VM uses it; guest: what the VM last reported, mounted, a problem, busyBy), and for a shared folder fileService (its storage VM on the host, running or stopped). fileServices lists the file service per host. A token of reach own sees only its own volumes.\n\nAn organization API token needs the `volumes:read` scope. CLI: `ghostdock volume list`.",
        "x-ghostdock-token-rule": "volumes:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VolumeListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/volume_show": {
      "post": {
        "operationId": "volume_show",
        "tags": ["volume"],
        "summary": "One volume by name or id, with its attachments.",
        "description": "One volume by name or id, with its attachments. backingNote says what keeps its data on its provider, and whether the size is a hard limit there. usedBytes is read from its host now. A shared folder names its file service (the storage VM that serves it): running, or stopped (it starts with the first VM that attaches it, and stops 10 minutes after the last one stopped).\n\nAn organization API token needs the `volumes:read` scope. CLI: `ghostdock volume show`.",
        "x-ghostdock-token-rule": "volumes:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VolumeShowInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeShowOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/volume_create": {
      "post": {
        "operationId": "volume_create",
        "tags": ["volume"],
        "summary": "Create a volume.",
        "description": "Create a volume. The kinds are the same on every provider: a disk (the default) is written by one VM at a time and behaves like a local disk, the place for databases and anything with locks; shared is a folder any number of VMs mount at once, read-write or read-only each, attached and detached live in a running VM, for uploads, assets and build outputs, never two database servers on one. What keeps the data is the provider’s (backingNote in the result): on Ghostdock Cloud a disk is its own block device and a shared folder is served over NFS, slower and slowest with many small files; on an Incus host both are a folder in its ZFS or Btrfs pool, at local speed, size enforced; on a Docker host both are a folder on the machine and the size is not enforced. A host folder (hostFolder, only on a Docker or Incus host) is a folder of the machine itself that its owner listed at setup (provider_list hostFolders): attached like a shared folder, never read-write when listed read-only, no size; Ghostdock never deletes its files, and deleting the volume only forgets it. One volume per host folder. Files of the machine’s first user (uid 1000) belong to ghost in the VM. Most callers skip this: vm_up volumes and vm_volume_attach create a missing volume on first use. sizeGiB defaults to the platform’s VM disk size; it only grows later (volume_resize).\n\nAn organization API token needs the `volumes:write` scope. CLI: `ghostdock volume create`.",
        "x-ghostdock-token-rule": "volumes:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VolumeCreateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeCreateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/volume_resize": {
      "post": {
        "operationId": "volume_resize",
        "tags": ["volume"],
        "summary": "Grow a volume (never shrink).",
        "description": "Grow a volume (never shrink). A VM that has a disk sees the new size at its next start, when its filesystem grows; a shared folder grows live. A host folder has no size and is refused.\n\nAn organization API token needs the `volumes:write` scope. CLI: `ghostdock volume resize`.",
        "x-ghostdock-token-rule": "volumes:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VolumeResizeInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeResizeOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/volume_delete": {
      "post": {
        "operationId": "volume_delete",
        "tags": ["volume"],
        "summary": "Delete a volume, and a disk’s or shared folder’s data with it.",
        "description": "Delete a volume, and a disk’s or shared folder’s data with it. Refused while any VM has it attached, running or not, naming the VMs: vm_volume_detach first. Deleting a VM never deletes a volume. A host folder is only forgotten: its files stay on the machine (message says so).\n\nAn organization API token needs the `volumes:write` scope. CLI: `ghostdock volume delete`.",
        "x-ghostdock-token-rule": "volumes:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VolumeDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/volume_release": {
      "post": {
        "operationId": "volume_release",
        "tags": ["volume"],
        "summary": "Release a volume from the identity that created it.",
        "description": "Release a volume from the identity that created it. The owner is a VM’s identity or a token of reach own. It becomes an ordinary volume of the organization and keeps its data and attachments: the owner can no longer see or manage it, and it no longer counts against the owner’s budget. A member, or the owner itself.\n\nAn organization API token needs the `volumes:write` scope. CLI: `ghostdock volume release`.",
        "x-ghostdock-token-rule": "volumes:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VolumeReleaseInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeReleaseOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/volume_file_list": {
      "post": {
        "operationId": "volume_file_list",
        "tags": ["volume"],
        "summary": "List one folder of a volume: files (with size) and folders.",
        "description": "List one folder of a volume: files (with size) and folders. hidden counts links and special files left out; truncated says the listing was cut (list a folder below it); readOnly is true for a Disk. No VM of yours is needed: a Shared folder is read through the organization’s storage VM (started for the call when stopped; it stops again 10 minutes after the last use), a Disk through the running VM it is attached to (a stopped or detached Disk is refused with volume_files_vm_stopped or volume_files_needs_vm), on a Docker or Incus host by the host itself.\n\nAn organization API token needs the `volumes:read` scope. CLI: `ghostdock volume file list`.",
        "x-ghostdock-token-rule": "volumes:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VolumeFileListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeFileListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/volume_file_read": {
      "post": {
        "operationId": "volume_file_read",
        "tags": ["volume"],
        "summary": "Read one file of a volume.",
        "description": "Read one file of a volume. content is utf8 text; base64 carries bytes that are binary (or all bytes with encoding base64). A file over 384 KiB answers tooLarge with no bytes: read it in a VM that has the volume attached (ghostdock vm cp). No VM of yours is needed: a Shared folder is read through the organization’s storage VM (started for the call when stopped; it stops again 10 minutes after the last use), a Disk through the running VM it is attached to (a stopped or detached Disk is refused with volume_files_vm_stopped or volume_files_needs_vm), on a Docker or Incus host by the host itself.\n\nAn organization API token needs the `volumes:read` scope. CLI: `ghostdock volume file read`.",
        "x-ghostdock-token-rule": "volumes:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VolumeFileReadInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeFileReadOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/volume_file_write": {
      "post": {
        "operationId": "volume_file_write",
        "tags": ["volume"],
        "summary": "Upload one file into a Shared folder or a Host folder.",
        "description": "Upload one file into a Shared folder or a Host folder. At most 256 KiB, into a folder that exists. An existing file is replaced and keeps its owner and mode; a new one belongs to the folder’s owner. A Disk is read-only here (volume_read_only): its one writer is its VM. No VM of yours is needed: a Shared folder is read through the organization’s storage VM (started for the call when stopped; it stops again 10 minutes after the last use), a Disk through the running VM it is attached to (a stopped or detached Disk is refused with volume_files_vm_stopped or volume_files_needs_vm), on a Docker or Incus host by the host itself. A secret belongs in env set, not in a file.\n\nAn organization API token needs the `volumes:write` scope. CLI: `ghostdock volume file write`.",
        "x-ghostdock-token-rule": "volumes:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VolumeFileWriteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeFileWriteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_volume_attach": {
      "post": {
        "operationId": "vm_volume_attach",
        "tags": ["vm"],
        "summary": "Attach a volume to a VM, as docker run --mount does.",
        "description": "Attach a volume to a VM, as docker run --mount does. source is the volume, created on first use as a disk (shared and sizeGiB only matter then). It attaches live in a running VM (takesEffect live: Live now), a stopped one at its next start; a running VM on an older base image, started before disks attached live, or on a Docker host takes a disk at its next start too (takesEffect next_start, the message says why). A disk belongs to one VM at a time: one another VM has is refused, naming it. Any number of VMs may have a shared folder; a read-write one at a database path or /var/lib/docker warns (warnings), with the provider’s reason: on Ghostdock Cloud NFS speed and locking (node_modules warns too), on Incus and Docker hosts two writers on one data directory. The result’s message says whether it was created or an existing one was attached; check it, a typo makes a new empty volume. In the VM it is mounted at path (default /mnt/volumes/<name>) and is a Docker volume of its name (docker run -v <name>:/x, or external in Compose).\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm volume attach`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmVolumeAttachInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmVolumeAttachOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_volume_detach": {
      "post": {
        "operationId": "vm_volume_detach",
        "tags": ["vm"],
        "summary": "Detach a volume from a VM, by its name in the VM or the volume’s name.",
        "description": "Detach a volume from a VM, by its name in the VM or the volume’s name. A stopped VM lets it go now; a running one lets it go live (a running VM that takes disks only at a start keeps a disk until its next start: takesEffect next_start). One a process in the VM still uses waits (takesEffect when_unused, busyBy names them): it detaches when they stop using it, or at the VM’s next start. The volume and its data stay.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm volume detach`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmVolumeDetachInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmVolumeDetachOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_url_list": {
      "post": {
        "operationId": "vm_url_list",
        "tags": ["vm"],
        "summary": "List the URLs that expose a VM’s ports, with protocol, access and title.",
        "description": "List the URLs that expose a VM’s ports, with protocol, access and title. A titled URL (for example `Desktop`, the desktop image’s desktop in a browser) gets its own button in the app.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm url list`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmUrlListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmUrlListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_url_set": {
      "post": {
        "operationId": "vm_url_set",
        "tags": ["vm"],
        "summary": "Give a VM port, or a container’s port, its URL, or change the one it has.",
        "description": "Give a VM port, or a container’s port, its URL, or change the one it has. One URL per port, keyed by container and port. Creates it when missing, applies the fields given and keeps the others; the answer says created true or false. Safe to repeat. access organization (default for HTTP): only members of the organization, after logging in; public: anyone. TCP URLs use TLS (not HTTP), have no login and are always public; for a private TCP port use vm_ssh_get and an SSH forward. Read the vm skill for TCP clients.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm url set`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmUrlSetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmUrlSetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_url_new_name": {
      "post": {
        "operationId": "vm_url_new_name",
        "tags": ["vm"],
        "summary": "Give a port’s URL a new name (slug).",
        "description": "Give a port’s URL a new name (slug). The old address stops working at once; links to it break. Settings stay.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm url new-name`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmUrlNewNameInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmUrlNewNameOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_url_move": {
      "post": {
        "operationId": "vm_url_move",
        "tags": ["vm"],
        "summary": "Move a port’s URL to another container, keeping its address and settings.",
        "description": "Move a port’s URL to another container, keeping its address and settings. For example after a container was renamed (vm_container_list shows former names). The port stays the same.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm url move`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmUrlMoveInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmUrlMoveOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_url_delete": {
      "post": {
        "operationId": "vm_url_delete",
        "tags": ["vm"],
        "summary": "Delete a port’s URL.",
        "description": "Delete a port’s URL. Its address stops working; share links to the port stay (vm_share_link_delete revokes them).\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm url delete`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmUrlDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmUrlDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_share_link_list": {
      "post": {
        "operationId": "vm_share_link_list",
        "tags": ["vm"],
        "summary": "List a VM’s share links, or those of one port.",
        "description": "List a VM’s share links, or those of one port. Each has its name, address, expiry, wake and last use; expired links stay listed for 30 days after they expire, then are deleted.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm share-link list`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmShareLinkListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmShareLinkListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_share_link_set": {
      "post": {
        "operationId": "vm_share_link_set",
        "tags": ["vm"],
        "summary": "Make a named share link to an HTTP port, or change the link of that name.",
        "description": "Make a named share link to an HTTP port, or change the link of that name. https://{token}--share.{domain} opens the port of the VM or container without signing in until it expires or is deleted, for example a preview in an iframe; treat it as a secret. The port needs no URL. Creates it when missing (defaults: expires 60 minutes after its last use, 7 days at most, wakes the VM), else applies the fields given and keeps the others; the answer says created true or false. Safe to repeat: use one fixed name per purpose. Sending an expiry setting (idleMinutes, maxLifetimeMinutes) restarts both clocks from now, also for an expired link: the same address works again; a call without one keeps them. At most 50 links per port.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm share-link set`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmShareLinkSetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmShareLinkSetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_share_link_replace": {
      "post": {
        "operationId": "vm_share_link_replace",
        "tags": ["vm"],
        "summary": "Give a share link a new address (token).",
        "description": "Give a share link a new address (token). The old address stops at once and open connections through it close; name, expiry and wake stay.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm share-link replace`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmShareLinkReplaceInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmShareLinkReplaceOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_share_link_delete": {
      "post": {
        "operationId": "vm_share_link_delete",
        "tags": ["vm"],
        "summary": "Revoke a share link at once.",
        "description": "Revoke a share link at once. Open connections through it close.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm share-link delete`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmShareLinkDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmShareLinkDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_forward_list": {
      "post": {
        "operationId": "vm_forward_list",
        "tags": ["vm"],
        "summary": "List a VM’s forwards: VM ports that reach a container’s port.",
        "description": "List a VM’s forwards: VM ports that reach a container’s port. Each reads like VM :8080 → web:80; a port the VM could not listen on carries its error.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm forward list`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmForwardListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmForwardListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_forward_set": {
      "post": {
        "operationId": "vm_forward_set",
        "tags": ["vm"],
        "summary": "Forward a VM port to a container’s port, or point its forward elsewhere.",
        "description": "Forward a VM port to a container’s port, or point its forward elsewhere. Works at any time; the container is not touched or restarted, and needs no published port. The VM then answers on that port for apps on the host network (localhost), the private network and URLs. The forward stays when the container is recreated under the same name. docker ps does not list it. Needs a VM on the current base image. One forward per VM port, keyed by it. Creates it when missing (container and containerPort needed), applies the fields given and keeps the others; the answer says created true or false. Safe to repeat.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm forward set`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmForwardSetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmForwardSetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_forward_delete": {
      "post": {
        "operationId": "vm_forward_delete",
        "tags": ["vm"],
        "summary": "Remove the forward of a VM port.",
        "description": "Remove the forward of a VM port. The VM stops listening on it.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm forward delete`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmForwardDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmForwardDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_mcp_list": {
      "post": {
        "operationId": "vm_mcp_list",
        "tags": ["vm"],
        "summary": "List the MCP endpoints a VM exposes (name, port, path, autoWake).",
        "description": "List the MCP endpoints a VM exposes (name, port, path, autoWake).\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm mcp list`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmMcpListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmMcpListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_mcp_set": {
      "post": {
        "operationId": "vm_mcp_set",
        "tags": ["vm"],
        "summary": "Expose an MCP server in a VM by name, or change the endpoint of that name.",
        "description": "Expose an MCP server in a VM by name, or change the endpoint of that name. Keyed by VM and name. Creates it when missing (port needed), applies the fields given and keeps the others; the answer says created true or false. Safe to repeat. A new endpoint also gets an Organization URL on its port when the port has none.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm mcp set`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmMcpSetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmMcpSetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_mcp_delete": {
      "post": {
        "operationId": "vm_mcp_delete",
        "tags": ["vm"],
        "summary": "Delete a VM’s MCP endpoint, by name.",
        "description": "Delete a VM’s MCP endpoint, by name. Its URL stays.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm mcp delete`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmMcpDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmMcpDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_tool_list": {
      "post": {
        "operationId": "vm_tool_list",
        "tags": ["vm"],
        "summary": "List the tools of the MCP servers a VM exposes.",
        "description": "List the tools of the MCP servers a VM exposes. A server that cannot be reached is reported in errors; the others are still listed.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm tool list`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmToolListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmToolListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_tool_call": {
      "post": {
        "operationId": "vm_tool_call",
        "tags": ["vm"],
        "summary": "Call a tool on an MCP server inside a VM.",
        "description": "Call a tool on an MCP server inside a VM. Wakes a stopped VM when the endpoint has autoWake.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm tool call`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmToolCallInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmToolCallOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_ssh_get": {
      "post": {
        "operationId": "vm_ssh_get",
        "tags": ["vm"],
        "summary": "Get temporary SSH access to a Server: a command and token for 60 minutes.",
        "description": "Get temporary SSH access to a Server: a command and token for 60 minutes. The access is yours: each person has their own, and getting it never ends someone else’s. ssh <token>@<host> logs in to the VM’s own sshd as its login user (ghost on our images). When the VM’s sshd is not running, that login ends with exit status 255 and says why (the unit’s state and its last log lines). rescue true gets a rescue shell instead: a shell or command in the VM as the login user through Ghostdock’s guest agent, without sshd (no sftp or forwarding), to repair sshd. Starts the VM when needed. Idle-stop still applies, independent of the token. hostPublicKey, when present, is the SSH gateway’s host key (an OpenSSH public key line) for the command’s host: pin it in known_hosts instead of trusting it on first use. A Container host has no SSH (vm_ssh_container_host): reach its containers with vm_container_exec.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm ssh get`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmSshGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmSshGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_ssh_info": {
      "post": {
        "operationId": "vm_ssh_info",
        "tags": ["vm"],
        "summary": "How you can log in to a Server over SSH, creating nothing and starting nothing.",
        "description": "How you can log in to a Server over SSH, creating nothing and starting nothing. keyCommand is the permanent login for an SSH key in your account (accountKeys lists them, by fingerprint); it also works with scp, rsync and VS Code, and starts the VM when needed. Null where the VM has no key logins. sshCommand is your live temporary login from vm_ssh_get, with expiresAt. hostPublicKey, when present, is the SSH gateway’s host key (an OpenSSH public key line) for keyCommand’s host. A Container host has no SSH (vm_ssh_container_host).\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm ssh info`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmSshInfoInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmSshInfoOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_ssh_revoke": {
      "post": {
        "operationId": "vm_ssh_revoke",
        "tags": ["vm"],
        "summary": "Revoke your own temporary SSH access to a Server.",
        "description": "Revoke your own temporary SSH access to a Server. The token vm_ssh_get handed out to you stops working for new logins; open sessions go on, and other people’s access stays. all true ends everyone’s SSH access to the Server.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm ssh revoke`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmSshRevokeInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmSshRevokeOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_up": {
      "post": {
        "operationId": "vm_container_up",
        "tags": ["vm"],
        "summary": "Add a container to a VM from a template or a source.",
        "description": "Add a container to a VM from a template or a source. A template by its name, or a source as in vm_up: an image ref, a Dockerfile, Compose files or a reference (not a snapshot). It runs as its own Compose project in /srv/ghostdock/<project>, next to the VM’s, which stays as it is. An image or a Dockerfile is one container named after its service (nginx, redis) or name; a Compose source keeps Compose’s names. A name already in use gets the next free number (nginx-2). The source’s URLs and MCPs are made after it runs; a port that already has a URL, or an MCP name the VM already has, is refused. Starts the VM when needed.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container up`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerUpInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerUpOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_list": {
      "post": {
        "operationId": "vm_container_list",
        "tags": ["vm"],
        "summary": "List the containers of a VM, running or not.",
        "description": "List the containers of a VM, running or not. Each with state, health, restart policy, ports, Compose project and service, its lock (locked, and whether a person or its ghostdock.lock label decided) and ghostdock.* labels. A stopped VM lists none (it is not started for this).\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm container list`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_exec": {
      "post": {
        "operationId": "vm_container_exec",
        "tags": ["vm"],
        "summary": "Run a command in a container, as docker exec does.",
        "description": "Run a command in a container, as docker exec does. Its stdout, stderr and exit code once it ends, waiting up to 120 seconds; still running, sessionId and commandId to poll with vm_command_get and vm_command_logs (pass the same container). On any kind of VM: a Container host has no SSH, and on a Server this reaches a container rather than the VM. Starts the VM when needed. Never put secret values in the command; it is logged.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container exec`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerExecInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerExecOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_cp": {
      "post": {
        "operationId": "vm_container_cp",
        "tags": ["vm"],
        "summary": "Copy files into or out of a container, as docker cp does.",
        "description": "Copy files into or out of a container, as docker cp does. A read (from) needs vms:read. A write (to) needs vms:write. from \"web:/app/x\" reads a file (utf8 text, or base64 for small binaries) or lists a folder's entries. to \"web:/app\" writes files there: small inline files or a base64 ZIP, by paths relative to it. For directories and local files, use `ghostdock vm container cp`. A path without a leading / is from the container’s start folder (its dir). A file it creates belongs to the container’s login user. A file this call returns is at most 256 KiB: tool payloads are JSON. A larger file is `ghostdock vm cp` or `ghostdock vm container cp`. A secret belongs in `vm env set`, not in a file. Starts the VM when needed.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container cp`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerCpInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerCpOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_file_list": {
      "post": {
        "operationId": "vm_file_list",
        "tags": ["vm"],
        "summary": "List one level of a folder.",
        "description": "List one level of a folder. No container on a Server is the VM’s own files, as its login user (the same person ssh would be). A container name is that container: a list, delete, move or mkdir as its user, a read or a write as docker cp does it. A folder whose listing is over 256 KiB is refused: list a folder below it. These tools move files, not credentials. A secret belongs in `vm env set`, not in a file.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm file list`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmFileListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmFileListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_file_read": {
      "post": {
        "operationId": "vm_file_read",
        "tags": ["vm"],
        "summary": "Read one file: utf8 text, or base64 when the bytes are binary.",
        "description": "Read one file: utf8 text, or base64 when the bytes are binary. No container on a Server is the VM’s own files, as its login user (the same person ssh would be). A container name is that container: a list, delete, move or mkdir as its user, a read or a write as docker cp does it. At most 256 KiB, which is as much as one tool call can carry. A larger file is `ghostdock vm cp`. A folder is vm_file_list. These tools move files, not credentials. A secret belongs in `vm env set`, not in a file.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm file read`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmFileReadInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmFileReadOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_file_write": {
      "post": {
        "operationId": "vm_file_write",
        "tags": ["vm"],
        "summary": "Write one file, creating its parent folders.",
        "description": "Write one file, creating its parent folders. content is utf8, or base64 when encoding is base64. A new file is 0644; an existing one keeps its mode, so a script stays executable, and a link to a file writes that file. No container on a Server is the VM’s own files, as its login user (the same person ssh would be). A container name is that container: a list, delete, move or mkdir as its user, a read or a write as docker cp does it. At most 256 KiB, which is as much as one tool call can carry. A larger file is `ghostdock vm cp`. These tools move files, not credentials. A secret belongs in `vm env set`, not in a file.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm file write`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmFileWriteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmFileWriteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_file_mkdir": {
      "post": {
        "operationId": "vm_file_mkdir",
        "tags": ["vm"],
        "summary": "Create a folder, and the folders above it.",
        "description": "Create a folder, and the folders above it. An existing folder is left as it is. No container on a Server is the VM’s own files, as its login user (the same person ssh would be). A container name is that container: a list, delete, move or mkdir as its user, a read or a write as docker cp does it. These tools move files, not credentials. A secret belongs in `vm env set`, not in a file.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm file mkdir`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmFileMkdirInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmFileMkdirOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_file_delete": {
      "post": {
        "operationId": "vm_file_delete",
        "tags": ["vm"],
        "summary": "Delete a file, or with recursive a folder and what is in it.",
        "description": "Delete a file, or with recursive a folder and what is in it. A path that is not there is already deleted. /, the login user’s home and a folder above it are never deleted. No container on a Server is the VM’s own files, as its login user (the same person ssh would be). A container name is that container: a list, delete, move or mkdir as its user, a read or a write as docker cp does it. These tools move files, not credentials. A secret belongs in `vm env set`, not in a file.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm file delete`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmFileDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmFileDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_file_move": {
      "post": {
        "operationId": "vm_file_move",
        "tags": ["vm"],
        "summary": "Move or rename a file or folder.",
        "description": "Move or rename a file or folder. It lands at exactly destination, creating its parent folders, and never replaces what is at destination and never moves into a folder there. Both paths are on the same target, and a relative path uses its start folder. No container on a Server is the VM’s own files, as its login user (the same person ssh would be). A container name is that container: a list, delete, move or mkdir as its user, a read or a write as docker cp does it. These tools move files, not credentials. A secret belongs in `vm env set`, not in a file.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm file move`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmFileMoveInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmFileMoveOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_lock": {
      "post": {
        "operationId": "vm_container_lock",
        "tags": ["vm"],
        "summary": "Lock a container against removal.",
        "description": "Lock a container against removal. A locked container cannot be removed, renamed or recreated through Docker (docker rm, compose down, a compose up that would recreate it) until it is unlocked here; start, stop and restart still work. It also pauses the VM’s auto-delete. Never starts the VM: a stopped one gets the lock at its next start.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container lock`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerLockInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerLockOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_unlock": {
      "post": {
        "operationId": "vm_container_unlock",
        "tags": ["vm"],
        "summary": "Unlock a container so Docker can remove or recreate it.",
        "description": "Unlock a container so Docker can remove or recreate it. Also one its image locked with the ghostdock.lock label. Never starts the VM: a stopped one gets it at its next start, and an overdue auto-delete it held goes ahead.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container unlock`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerUnlockInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerUnlockOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_start": {
      "post": {
        "operationId": "vm_container_start",
        "tags": ["vm"],
        "summary": "Start a stopped container, as docker start does.",
        "description": "Start a stopped container, as docker start does. A running container stays as it is. Starts the VM when needed.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container start`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerStartInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerStartOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_stop": {
      "post": {
        "operationId": "vm_container_stop",
        "tags": ["vm"],
        "summary": "Stop a container, as docker stop does.",
        "description": "Stop a container, as docker stop does. It gets its own stop signal, then a kill after its own stop timeout. It stays stopped while the VM sleeps and wakes, as Docker keeps a stopped container stopped, unless its restart policy is always. On a stopped VM it does nothing (note vm_stopped). A lock does not block it. note last_running says it was the last one running: on a Container host commands and files have nowhere to land until one runs.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container stop`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerStopInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerStopOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_restart": {
      "post": {
        "operationId": "vm_container_restart",
        "tags": ["vm"],
        "summary": "Restart a container, as docker restart does (stopping as docker stop does).",
        "description": "Restart a container, as docker restart does (stopping as docker stop does). Starts the VM when needed.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container restart`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerRestartInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerRestartOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_remove": {
      "post": {
        "operationId": "vm_container_remove",
        "tags": ["vm"],
        "summary": "Remove a container (docker rm -f).",
        "description": "Remove a container (docker rm -f). A running one is killed first. Its volumes are kept. A locked container is refused (container_locked): vm_container_unlock it first. Starts the VM when needed.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container remove`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerRemoveInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerRemoveOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_restart_policy": {
      "post": {
        "operationId": "vm_container_restart_policy",
        "tags": ["vm"],
        "summary": "Set a container’s restart policy (docker update --restart).",
        "description": "Set a container’s restart policy (docker update --restart). Running or not. unless-stopped: Docker brings it back after a crash and when the VM wakes, unless it was stopped on purpose. no: never. A Compose project’s next recreate of the container takes the policy from its files again. Starts the VM when needed.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm container restart-policy`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerRestartPolicyInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerRestartPolicyOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_compose_start": {
      "post": {
        "operationId": "vm_compose_start",
        "tags": ["vm"],
        "summary": "Start a Compose project’s stopped containers (docker compose start).",
        "description": "Start a Compose project’s stopped containers (docker compose start). Works for every project in the VM, also one brought up with docker compose through the Docker context. Starts the VM when needed.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm compose start`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmComposeStartInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmComposeStartOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_compose_stop": {
      "post": {
        "operationId": "vm_compose_stop",
        "tags": ["vm"],
        "summary": "Stop a Compose project’s containers (docker compose stop).",
        "description": "Stop a Compose project’s containers (docker compose stop). Each gets its own stop signal and timeout. They stay stopped while the VM sleeps and wakes, unless their restart policy is always. On a stopped VM it does nothing (note vm_stopped).\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm compose stop`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmComposeStopInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmComposeStopOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_compose_restart": {
      "post": {
        "operationId": "vm_compose_restart",
        "tags": ["vm"],
        "summary": "Restart a Compose project’s containers (docker compose restart).",
        "description": "Restart a Compose project’s containers (docker compose restart). Starts the VM when needed.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm compose restart`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmComposeRestartInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmComposeRestartOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_compose_down": {
      "post": {
        "operationId": "vm_compose_down",
        "tags": ["vm"],
        "summary": "Remove a Compose project’s containers and networks (docker compose down).",
        "description": "Remove a Compose project’s containers and networks (docker compose down). Its volumes are kept, and its folder (/srv/ghostdock/<project>: its Compose files and what it wrote next to them) too unless deleteFiles; a kept folder is listed in vm_storage_list’s projects as removed and deleted with vm_storage_delete kind project. Refused while one of its containers is locked (compose_project_locked): vm_container_unlock them first. Starts the VM when needed.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm compose down`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmComposeDownInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmComposeDownOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_container_logs": {
      "post": {
        "operationId": "vm_container_logs",
        "tags": ["vm"],
        "summary": "Read a container’s output, as docker logs does.",
        "description": "Read a container’s output, as docker logs does. Oldest first, each line with its stream (stdout, stderr) and time. The last tail lines (default 200), or with after only the lines after that time: pass the last line’s time to follow. truncated says lines were left out. A stopped VM has none (it is not started for this).\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm container logs`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmContainerLogsInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmContainerLogsOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_storage_list": {
      "post": {
        "operationId": "vm_storage_list",
        "tags": ["vm"],
        "summary": "List a VM’s volumes, bind mounts and what removed containers and projects left.",
        "description": "List a VM’s volumes, bind mounts and what removed containers and projects left. bindPaths: the paths the containers bind now (file: a bound file). unboundPaths: on a Container host (vmFolders true), whose binds land in its own folder tree, the largest folders and files no container or volume uses any more. projects: the platform’s Compose project folders (/srv/ghostdock/<name>); removed: the project is gone and the folder is what Remove project kept. On a Server (vmFolders false) bind mounts are its own paths: read them with vm_file_list and vm_file_read. Each with its size and sizeState (measured; measuring: ask again in a few seconds; tooBig: too big to measure cheaply; outside: a volume bound to a system path, not measured nor browsable); volumes and bindPaths with the containers using them; plus every container’s mounts. A volume with attachment (name in the VM, the organization’s volume) is an attached volume’s Docker volume: its usage is the volume’s usedBytes (volume_get), and it goes with vm_volume_detach, not vm_storage_delete. truncated says entries were left out. A stopped VM lists none (it is not started for this).\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm storage list`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmStorageListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmStorageListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_storage_delete": {
      "post": {
        "operationId": "vm_storage_delete",
        "tags": ["vm"],
        "summary": "Delete a volume, a leftover folder or a removed project’s files.",
        "description": "Delete a volume, a leftover folder or a removed project’s files. kind volume: a named volume; folder: a Container host’s path from unboundPaths; project: a removed project’s folder, by the project’s name. Everything in it goes. A Server has no VM folders: delete its own paths with vm_file_delete. Refused while a container mounts it (in any state: a stopped one counts, so stopping does not help), mounts a folder above it (a bind of /), a volume keeps its data in the folder, or its project still has containers: remove those first.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm storage delete`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmStorageDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmStorageDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_command_run": {
      "post": {
        "operationId": "vm_command_run",
        "tags": ["vm"],
        "summary": "Run a shell command in a VM.",
        "description": "Run a shell command in a VM. Waits up to 120 seconds, then returns sessionId and commandId to poll. Starts the VM when allowed. Sessions do not survive idle-stop: for a process that must keep running, read the vm-boot skill. Never put secret values in the command; it is logged.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm command run`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmCommandRunInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmCommandRunOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_command_get": {
      "post": {
        "operationId": "vm_command_get",
        "tags": ["vm"],
        "summary": "Get a shell command’s status and exit code.",
        "description": "Get a shell command’s status and exit code.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm command get`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmCommandGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmCommandGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_command_logs": {
      "post": {
        "operationId": "vm_command_logs",
        "tags": ["vm"],
        "summary": "Get a page of a shell command’s stdout and stderr.",
        "description": "Get a page of a shell command’s stdout and stderr.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm command logs`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmCommandLogsInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmCommandLogsOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_command_kill": {
      "post": {
        "operationId": "vm_command_kill",
        "tags": ["vm"],
        "summary": "Interrupt a running shell command.",
        "description": "Interrupt a running shell command.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm command kill`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmCommandKillInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmCommandKillOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_shell_create": {
      "post": {
        "operationId": "vm_shell_create",
        "tags": ["vm"],
        "summary": "Open a shell session that keeps cwd and environment between commands.",
        "description": "Open a shell session that keeps cwd and environment between commands. Starts the VM when allowed; the session ends at idle-stop.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm shell create`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmShellCreateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmShellCreateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_shell_close": {
      "post": {
        "operationId": "vm_shell_close",
        "tags": ["vm"],
        "summary": "Close a shell session.",
        "description": "Close a shell session.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm shell close`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmShellCloseInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmShellCloseOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_update": {
      "post": {
        "operationId": "vm_update",
        "tags": ["vm"],
        "summary": "Change a VM’s display name, idle-stop interval or lifecycle.",
        "description": "Change a VM’s display name, idle-stop interval or lifecycle. The name is fixed: vm_up takes it. Omit a field to keep it; null resets it to the platform default.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm update`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmUpdateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmUpdateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_resize": {
      "post": {
        "operationId": "vm_resize",
        "tags": ["vm"],
        "summary": "Change a VM’s CPU and/or memory.",
        "description": "Change a VM’s CPU and/or memory. While running only increases are allowed; stop it first to decrease (this tool does not stop it). Disk: vm_resize_disk.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm resize`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmResizeInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmResizeOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_resize_disk": {
      "post": {
        "operationId": "vm_resize_disk",
        "tags": ["vm"],
        "summary": "Grow a VM’s disk.",
        "description": "Grow a VM’s disk. The VM must be stopped first (this tool does not stop it). Disk only grows, never shrinks.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm resize-disk`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmResizeDiskInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmResizeDiskOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_start": {
      "post": {
        "operationId": "vm_start",
        "tags": ["vm"],
        "summary": "Start a stopped VM, or reset the idle-stop countdown of a running one.",
        "description": "Start a stopped VM, or reset the idle-stop countdown of a running one. Returns status, idleStopsAt / deletesAt, and `boot` (VM and container start times in ms; null when it was already running).\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm start`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmStartInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmStartOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_restart": {
      "post": {
        "operationId": "vm_restart",
        "tags": ["vm"],
        "summary": "Restart a VM, keeping it: an ephemeral VM is not deleted.",
        "description": "Restart a VM, keeping it: an ephemeral VM is not deleted. A stopped VM is only started. Attached disks attach and detach at a start (vm_volume_attach, vm_volume_detach); shared folders change live and need no restart. Returns what vm_start returns.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm restart`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmRestartInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmRestartOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_status": {
      "post": {
        "operationId": "vm_status",
        "tags": ["vm"],
        "summary": "Get a VM’s status and lifecycle deadlines without waking it.",
        "description": "Get a VM’s status and lifecycle deadlines without waking it. Returns idleStopsAt, deletesAt, `boot` (the last start: VM and container times in ms) and `disk` (usedBytes of sizeBytes, read now while it runs: check it before a big pull or build, and resize with vm_resize when it is nearly full) and does not reset idle activity. While a vm_up still runs it answers { vmId, name, organizationId, status: \"creating\", progress } (vm: the vmId vm_up returned, or the name asked for), and after a failed create { …, status: \"failed\", failure: { code, message, retryable } }. progress says how far it got: steps so far in order (create, image, boot, setup, containers; the last runs now) and image, the OS image download while that runs ({ done, total, unit: bytes or percent }; total 0 when the host names none); absent when the server no longer holds it. waitSeconds waits that long at most while the create runs.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm status`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmStatusInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmStatusOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_create_progress": {
      "post": {
        "operationId": "vm_create_progress",
        "tags": ["vm"],
        "summary": "The steps of a vm_up you started with a progressKey, while that call waits.",
        "description": "The steps of a vm_up you started with a progressKey, while that call waits. Answers { progress: { state, steps, image } }, or { progress: null } before the create began, a few minutes after it ended, or for a key that is not yours. state is running, done or failed; steps and image as vm_status answers them. Poll about once a second; a create you have the vmId of reads the same in vm_status.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm create-progress`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmCreateProgressInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmCreateProgressOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_budget": {
      "post": {
        "operationId": "vm_budget",
        "tags": ["vm"],
        "summary": "An identity’s budget by kind, what it uses, and what is left.",
        "description": "An identity’s budget by kind, what it uses, and what is left. For an identity that manages only what it creates (a VM’s GHOSTDOCK_TOKEN, a token of reach own). budget is what it may create, by kind: vms { cpu, memoryGiB, diskGiB, count? } (cpu and memoryGiB: its VMs that run; diskGiB and count: all of them), sites { count?, sizeMiB? } (how many sites, and their files in MiB as the CDN holds them) and volumes { sizeGiB, count? } (their configured sizes together, attached or not); a kind it lacks it may not create. used is, per kind in the budget, what its owned rows and creates in flight hold now (vms: cpu, memoryGiB, diskGiB, count; sites: count, bytes; volumes: count, sizeGiB); remaining is what is left, counted as a create, a start, a growing republish or a volume resize checks it (count and sizeMiB only when the budget limits them). Without vm: the caller’s own budget, as a VM’s GHOSTDOCK_TOKEN or a token of reach own; a person or another token gets nulls. With vm: the budget of that VM’s identity, nulls when it has none. Read only.\n\nAn organization API token needs the `vms:read` scope. CLI: `ghostdock vm budget`.",
        "x-ghostdock-token-rule": "vms:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmBudgetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmBudgetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_stop": {
      "post": {
        "operationId": "vm_stop",
        "tags": ["vm"],
        "summary": "Stop a running VM.",
        "description": "Stop a running VM. Its files stay, unless the VM is ephemeral: then it is deleted, and the answer has deleted: true.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm stop`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmStopInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmStopOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_delete": {
      "post": {
        "operationId": "vm_delete",
        "tags": ["vm"],
        "summary": "Permanently delete a VM and its files.",
        "description": "Permanently delete a VM and its files. Refused while it has locked containers (vm_has_locked_containers, naming them) unless deleteLocked is true. A VM whose identity still owns VMs or sites is refused (owns_resources, naming them by kind) unless ownedResources says what happens to them: delete them too (down the whole tree), or release them as ordinary ones of the organization.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm delete`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_release": {
      "post": {
        "operationId": "vm_release",
        "tags": ["vm"],
        "summary": "Release a VM from the identity that created it.",
        "description": "Release a VM from the identity that created it. The owner is a VM’s identity or a token of reach own. The VM becomes an ordinary VM of the organization, still running with its disk, URLs and lifecycle: the owner can no longer see or manage it, and it no longer counts against the owner’s budget. A VM that has an identity keeps it and what it owns. A member, or the owner itself.\n\nAn organization API token needs the `vms:write` scope. CLI: `ghostdock vm release`.",
        "x-ghostdock-token-rule": "vms:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmReleaseInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmReleaseOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/site_list": {
      "post": {
        "operationId": "site_list",
        "tags": ["site"],
        "summary": "List the sites of an organization, last published first, with their URLs.",
        "description": "List the sites of an organization, last published first, with their URLs. owner is the identity that created a site (its token’s name, and its VM’s name for a VM’s identity); null for an ordinary site. bytes is what its files take on the CDN; null until measured. A site is static files on the CDN; each has a siteId to pass to site_publish (to republish into it), site_delete and site_release. A token of reach own sees only its own sites.\n\nAn organization API token needs the `sites:read` scope. CLI: `ghostdock site list`.",
        "x-ghostdock-token-rule": "sites:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SiteListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/site_publish": {
      "post": {
        "operationId": "site_publish",
        "tags": ["site"],
        "summary": "Publish static files to the CDN and return a durable public URL.",
        "description": "Publish static files to the CDN and return a durable public URL. No VM. Pass files or zipBase64, or `vm` to collect a directory from that VM. With siteId it republishes into that site, keeping its URL (overwritten in place, never offline); without, it creates a new site. A token of reach own owns the sites it creates (its budget's sites key allows them, count caps them) and republishes only its own. For source that needs building, use project_publish (read the publishing skill). For directories or large ZIPs, use `ghostdock site publish`.\n\nAn organization API token needs the `sites:write` scope. CLI: `ghostdock site publish`.",
        "x-ghostdock-token-rule": "sites:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SitePublishInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SitePublishOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_publish": {
      "post": {
        "operationId": "project_publish",
        "tags": ["project"],
        "summary": "Deploy source as a project: a deploy agent plans, builds and ships it.",
        "description": "Deploy source as a project: a deploy agent plans, builds and ships it. Static files go to the CDN; anything else runs in a VM with Compose. Needs a Compose-capable provider. Returns an outcome (deployed, awaiting_configuration, build_failed, start_failed, verify_failed) and fileUrls. Read the publishing skill before the first call. For directories or large ZIPs, use `ghostdock project publish`.\n\nAn organization API token needs the `projects:write` scope. CLI: `ghostdock project publish`.",
        "x-ghostdock-token-rule": "projects:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectPublishInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectPublishOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_list": {
      "post": {
        "operationId": "project_list",
        "tags": ["project"],
        "summary": "List an organization’s projects.",
        "description": "List an organization’s projects. A project owns its environment, deployment history and live URL. site_list lists sites instead.\n\nAn organization API token needs the `projects:read` scope. CLI: `ghostdock project list`.",
        "x-ghostdock-token-rule": "projects:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_get": {
      "post": {
        "operationId": "project_get",
        "tags": ["project"],
        "summary": "Get a project with its latest attempt and live deployment.",
        "description": "Get a project with its latest attempt and live deployment. latestDeploymentId includes failures; liveDeploymentId / liveUrl is the success that serves the public URL.\n\nAn organization API token needs the `projects:read` scope. CLI: `ghostdock project get`.",
        "x-ghostdock-token-rule": "projects:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_create": {
      "post": {
        "operationId": "project_create",
        "tags": ["project"],
        "summary": "Create an empty project.",
        "description": "Create an empty project. Nothing is deployed until project_publish.\n\nAn organization API token needs the `projects:write` scope. CLI: `ghostdock project create`.",
        "x-ghostdock-token-rule": "projects:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectCreateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectCreateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_update": {
      "post": {
        "operationId": "project_update",
        "tags": ["project"],
        "summary": "Rename a project.",
        "description": "Rename a project.\n\nAn organization API token needs the `projects:write` scope. CLI: `ghostdock project update`.",
        "x-ghostdock-token-rule": "projects:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectUpdateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectUpdateOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_delete": {
      "post": {
        "operationId": "project_delete",
        "tags": ["project"],
        "summary": "Permanently delete a project and everything it runs and stores.",
        "description": "Permanently delete a project and everything it runs and stores. Every VM its deployments ran on goes (locked containers too), with its live URL, its CDN site, the stored uploads and generated files, its deployment history and its environment. Cannot be undone.\n\nAn organization API token needs the `projects:write` scope. CLI: `ghostdock project delete`.",
        "x-ghostdock-token-rule": "projects:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_deployment_list": {
      "post": {
        "operationId": "project_deployment_list",
        "tags": ["project"],
        "summary": "List a project’s deploy attempts, newest first.",
        "description": "List a project’s deploy attempts, newest first.\n\nAn organization API token needs the `projects:read` scope. CLI: `ghostdock project deployment list`.",
        "x-ghostdock-token-rule": "projects:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectDeploymentListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectDeploymentListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_deployment_get": {
      "post": {
        "operationId": "project_deployment_get",
        "tags": ["project"],
        "summary": "Get one deploy attempt, with links to its stored files.",
        "description": "Get one deploy attempt, with links to its stored files. fileUrls are authenticated GET paths for source.zip and generated Compose files.\n\nAn organization API token needs the `projects:read` scope. CLI: `ghostdock project deployment get`.",
        "x-ghostdock-token-rule": "projects:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectDeploymentGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectDeploymentGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_redeploy": {
      "post": {
        "operationId": "project_redeploy",
        "tags": ["project"],
        "summary": "Deploy a project’s stored source again, with its current environment.",
        "description": "Deploy a project’s stored source again, with its current environment. No new upload. Omit deploymentId to retry the last attempt that stored source. Same outcomes and settings as project_publish; read the publishing skill.\n\nAn organization API token needs the `projects:write` scope. CLI: `ghostdock project redeploy`.",
        "x-ghostdock-token-rule": "projects:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectRedeployInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectRedeployOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_env_get": {
      "post": {
        "operationId": "project_env_get",
        "tags": ["project"],
        "summary": "Get a project’s stored environment.",
        "description": "Get a project’s stored environment. Local entries (secret values withheld), organization opt-ins and bindings, applied on every deploy. platformEntries lists the variables Ghostdock gives every container of the VM a deploy runs in, so dev servers accept its URL host names (read the vm skill): for the VM serving the project, else the provider a deploy without providerId uses; none when the project is served from the CDN. overriddenBy is set when a project entry of the same name replaces one; a compose file’s own environment value wins inside that container. GHOSTDOCK_* names are reserved.\n\nAn organization API token needs the `environment:read` scope. CLI: `ghostdock project env get`.",
        "x-ghostdock-token-rule": "environment:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectEnvGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectEnvGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_env_select": {
      "post": {
        "operationId": "project_env_select",
        "tags": ["project"],
        "summary": "Replace the organization entries a project exports.",
        "description": "Replace the organization entries a project exports. Full replace: environment is the whole list ([] clears it), and omitting bindings clears the remaps. Read the environment skill.\n\nAn organization API token needs the `environment:write` scope. CLI: `ghostdock project env select`.",
        "x-ghostdock-token-rule": "environment:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectEnvSelectInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectEnvSelectOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_env_set": {
      "post": {
        "operationId": "project_env_set",
        "tags": ["project"],
        "summary": "Create or replace one of a project’s own variables or secrets.",
        "description": "Create or replace one of a project’s own variables or secrets. It overrides an organization entry or platform variable of the same name (GHOSTDOCK_* names are reserved). Prefer the CLI for secret values so they stay out of the conversation.\n\nAn organization API token needs the `environment:write` scope. CLI: `ghostdock project env set`.",
        "x-ghostdock-token-rule": "environment:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectEnvSetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectEnvSetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/project_env_delete": {
      "post": {
        "operationId": "project_env_delete",
        "tags": ["project"],
        "summary": "Delete one of a project’s own variables or secrets.",
        "description": "Delete one of a project’s own variables or secrets.\n\nAn organization API token needs the `environment:write` scope. CLI: `ghostdock project env delete`.",
        "x-ghostdock-token-rule": "environment:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectEnvDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectEnvDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/site_delete": {
      "post": {
        "operationId": "site_delete",
        "tags": ["site"],
        "summary": "Permanently delete a site and its files.",
        "description": "Permanently delete a site and its files. Its files leave the CDN, its URL answers 404, and its name is free again. A project’s deployment is the project’s: delete the project instead.\n\nAn organization API token needs the `sites:write` scope. CLI: `ghostdock site delete`.",
        "x-ghostdock-token-rule": "sites:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SiteDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/site_release": {
      "post": {
        "operationId": "site_release",
        "tags": ["site"],
        "summary": "Release a site from the identity that created it.",
        "description": "Release a site from the identity that created it. The owner is a VM’s identity or a token of reach own. It becomes an ordinary site of the organization and keeps its URL and files: the owner can no longer see or manage it, and it no longer counts against the owner’s budget. A member, or the owner itself.\n\nAn organization API token needs the `sites:write` scope. CLI: `ghostdock site release`.",
        "x-ghostdock-token-rule": "sites:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SiteReleaseInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteReleaseOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_env_get": {
      "post": {
        "operationId": "vm_env_get",
        "tags": ["vm"],
        "summary": "Get a VM’s environment: selections, bindings and local entries.",
        "description": "Get a VM’s environment: selections, bindings and local entries. Shows each organization entry with whether it is selected, exportAs, and overriddenByLocal; secret values are withheld. Nothing is inherited. platformEntries lists the variables Ghostdock gives every container so dev servers accept the VM’s URL host names (read the vm skill), with overriddenBy set when a VM entry of the same name replaces one. A container’s image or docker run -e can also set its own value; that wins inside that container. GHOSTDOCK_* names are reserved.\n\nAn organization API token needs the `environment:read` scope. CLI: `ghostdock vm env get`.",
        "x-ghostdock-token-rule": "environment:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmEnvGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmEnvGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_env_select": {
      "post": {
        "operationId": "vm_env_select",
        "tags": ["vm"],
        "summary": "Replace the organization entries a VM exports.",
        "description": "Replace the organization entries a VM exports. Full replace: environment is the whole list ([] clears it), and omitting bindings clears the remaps. Running processes keep their old values until restarted (pass restart). Read the environment skill.\n\nAn organization API token needs the `environment:write` scope. CLI: `ghostdock vm env select`.",
        "x-ghostdock-token-rule": "environment:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmEnvSelectInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmEnvSelectOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_env_set": {
      "post": {
        "operationId": "vm_env_set",
        "tags": ["vm"],
        "summary": "Create or replace one of a VM’s own variables or secrets.",
        "description": "Create or replace one of a VM’s own variables or secrets. It overrides an organization entry or platform variable of the same name (GHOSTDOCK_* names are reserved). kind is required when creating. Setting secrets via this tool is allowed; prefer the Ghostdock CLI so values stay out of the conversation, and never put them in commands.\n\nAn organization API token needs the `environment:write` scope. CLI: `ghostdock vm env set`.",
        "x-ghostdock-token-rule": "environment:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmEnvSetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmEnvSetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vm_env_delete": {
      "post": {
        "operationId": "vm_env_delete",
        "tags": ["vm"],
        "summary": "Delete one of a VM’s own variables or secrets.",
        "description": "Delete one of a VM’s own variables or secrets.\n\nAn organization API token needs the `environment:write` scope. CLI: `ghostdock vm env delete`.",
        "x-ghostdock-token-rule": "environment:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VmEnvDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VmEnvDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/env_list": {
      "post": {
        "operationId": "env_list",
        "tags": ["env"],
        "summary": "List an organization’s environment variables and secrets.",
        "description": "List an organization’s environment variables and secrets. Variable values are inline (longer than 1024 characters: read with env_get); secret values are never returned.\n\nAn organization API token needs the `environment:read` scope. CLI: `ghostdock env list`.",
        "x-ghostdock-token-rule": "environment:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnvListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/env_get": {
      "post": {
        "operationId": "env_get",
        "tags": ["env"],
        "summary": "Read one organization variable in full.",
        "description": "Read one organization variable in full. Fails for secrets: a secret can be replaced but never read back.\n\nAn organization API token needs the `environment:read` scope. CLI: `ghostdock env get`.",
        "x-ghostdock-token-rule": "environment:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnvGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/env_set": {
      "post": {
        "operationId": "env_set",
        "tags": ["env"],
        "summary": "Create or replace an organization variable or secret.",
        "description": "Create or replace an organization variable or secret. kind is required when creating; a different kind converts the entry. VMs that selected it get the new value when they next start. Setting secrets via this tool is allowed; prefer the Ghostdock CLI (`ghostdock env set NAME --secret --value-stdin`) so values stay out of the conversation. Read the environment skill.\n\nAn organization API token needs the `environment:write` scope. CLI: `ghostdock env set`.",
        "x-ghostdock-token-rule": "environment:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvSetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnvSetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/env_delete": {
      "post": {
        "operationId": "env_delete",
        "tags": ["env"],
        "summary": "Delete an organization variable or secret.",
        "description": "Delete an organization variable or secret. It is removed from every VM that selected it; running VMs keep the old value until they restart.\n\nAn organization API token needs the `environment:write` scope. CLI: `ghostdock env delete`.",
        "x-ghostdock-token-rule": "environment:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvDeleteInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnvDeleteOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/registry_credentials": {
      "post": {
        "operationId": "registry_credentials",
        "tags": ["registry"],
        "summary": "Get a one-hour password for the organization’s container registry.",
        "description": "Get a one-hour password for the organization’s container registry. Username is the organization slug; scope is push and pull on <slug>/*. The password is shown once: call again when it expires. Push with docker, then vm_up source type image with the same provider.\n\nAn organization API token needs the `registry:write` scope. CLI: `ghostdock registry credentials`.",
        "x-ghostdock-token-rule": "registry:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegistryCredentialsInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegistryCredentialsOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/skill_list": {
      "post": {
        "operationId": "skill_list",
        "tags": ["skill"],
        "summary": "List the Agent Skills (fallback for clients without MCP resources).",
        "description": "List the Agent Skills (fallback for clients without MCP resources). Same catalog as skill://index.json. If you can use resources/list and resources/read, skip this tool and use those.\n\nAn organization API token needs the `skills:read` scope. CLI: `ghostdock skill list`.",
        "x-ghostdock-token-rule": "skills:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkillListInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkillListOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/skill_get": {
      "post": {
        "operationId": "skill_get",
        "tags": ["skill"],
        "summary": "Read one SKILL.md (fallback for clients without MCP resources).",
        "description": "Read one SKILL.md (fallback for clients without MCP resources). Same document as resources/read on its skill:// URI. If you can use resources/read, skip this tool.\n\nAn organization API token needs the `skills:read` scope. CLI: `ghostdock skill get`.",
        "x-ghostdock-token-rule": "skills:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkillGetInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The tool’s result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkillGetOutput"
                }
              }
            }
          },
          "400": {
            "description": "The body is not valid JSON or does not match the input schema.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, unknown, revoked or expired token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The token lacks the scope, or the caller lacks access.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The organization, VM or other named thing does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The call conflicts with the current state (a budget, a lock, a name, a reused idempotency key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A rate limit; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The VM or its provider failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "No capacity right now, or a create was interrupted; `retryable` is true.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "An organization API token (`ext_ot_…`) or a CLI login’s access token."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Every failed call. A failed tool call carries the tool error as `data` (ADR 0050): a stable `code` from the error catalog, `retryable` (whether the same call can succeed later), the English `message`, and `details` a program acts on. MCP answers the same object as the failed call’s structured content (`{ error }`), and the CLI’s --json prints it.",
        "properties": {
          "statusCode": {
            "type": "integer"
          },
          "statusMessage": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "data": {
            "$ref": "#/components/schemas/ToolError"
          }
        },
        "required": ["statusCode", "message"],
        "additionalProperties": true
      },
      "ToolError": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "invalid_args",
              "insufficient_scope",
              "unknown_tool",
              "vm_not_found",
              "tool_failed",
              "internal_error",
              "idempotency_key_reused",
              "vm_create_interrupted",
              "image_not_found",
              "image_pull_denied",
              "image_pull_failed",
              "template_not_found",
              "image_build_failed",
              "container_not_found",
              "container_not_running",
              "container_paused",
              "container_choice_required",
              "container_action_failed",
              "container_locked",
              "compose_project_not_found",
              "compose_project_locked",
              "compose_action_failed",
              "guest_needs_newer",
              "volume_in_use",
              "volume_not_found",
              "storage_has_clients",
              "storage_not_running",
              "volume_disk_next_start",
              "volumes_need_recreate",
              "volume_read_only",
              "host_folder_read_only",
              "host_folder_unknown",
              "volume_files_needs_vm",
              "volume_files_vm_stopped",
              "volume_not_mounted",
              "volume_files_needs_newer_agent",
              "volume_files_needs_newer_guest",
              "storage_in_use",
              "storage_not_found",
              "storage_no_vm_folders",
              "storage_needs_newer_agent",
              "storage_needs_newer_guest",
              "path_not_found",
              "file_permission_denied",
              "path_not_a_file",
              "path_not_a_folder",
              "path_exists",
              "folder_not_empty",
              "folder_holds_home",
              "folder_into_itself",
              "folder_list_too_large",
              "vm_login_user_missing",
              "container_none",
              "container_none_running",
              "server_not_supported",
              "system_image_as_workload",
              "not_a_system_image",
              "vm_needs_workload_without_servers",
              "budget_exceeded",
              "owner_cannot_create",
              "vm_stopped_cannot_become_ephemeral",
              "owns_resources",
              "owner_create_rate_limited",
              "vm_owner_organization_environment",
              "vm_owner_nested_budget",
              "site_not_found",
              "container_host_needs_workload",
              "vm_ssh_container_host",
              "vm_sshd_down",
              "ssh_key_invalid",
              "ssh_key_unsupported",
              "ssh_key_exists",
              "vm_compose_failed",
              "vm_compose_busy",
              "vm_compose_timeout",
              "vm_guest_too_old",
              "vm_base_too_old_for_targets",
              "vm_has_locked_containers",
              "vm_name_taken",
              "url_access_unsupported",
              "public_tcp_not_configured",
              "share_link_tcp_unsupported",
              "share_link_limit",
              "share_link_name_taken",
              "restart_not_for_compose",
              "host_memory_full",
              "docker_vm_memory_too_large",
              "docker_machine_too_small",
              "docker_vm_cpu_too_large",
              "provider_failed",
              "host_not_connected",
              "host_failed"
            ]
          },
          "message": {
            "type": "string"
          },
          "retryable": {
            "type": "boolean"
          },
          "params": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            }
          },
          "detail": {
            "type": "string"
          },
          "details": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          }
        },
        "required": ["code", "message", "retryable", "params"],
        "additionalProperties": false
      },
      "Me": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "minLength": 1
          },
          "email": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "organizationToken": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              },
              "organizationId": {
                "type": "string",
                "minLength": 1
              },
              "scopes": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "vms:read",
                    "vms:write",
                    "ssh_keys:read",
                    "ssh_keys:write",
                    "environment:read",
                    "environment:write",
                    "projects:read",
                    "projects:write",
                    "sites:read",
                    "sites:write",
                    "snapshots:read",
                    "snapshots:write",
                    "volumes:read",
                    "volumes:write",
                    "templates:read",
                    "templates:write",
                    "providers:read",
                    "registry:write",
                    "skills:read"
                  ]
                }
              },
              "reach": {
                "type": "string",
                "enum": ["organization", "own"]
              }
            },
            "required": ["id", "organizationId", "scopes", "reach"],
            "additionalProperties": false
          }
        },
        "required": ["userId"],
        "additionalProperties": false
      },
      "ToolCatalog": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "minLength": 1
                },
                "name": {
                  "type": "string",
                  "minLength": 1
                },
                "description": {
                  "type": "string",
                  "minLength": 1
                },
                "inputSchema": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {}
                },
                "outputSchema": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {}
                }
              },
              "required": ["id", "name", "description", "inputSchema", "outputSchema"],
              "additionalProperties": false
            }
          }
        },
        "required": ["items"],
        "additionalProperties": false
      },
      "OrganizationListInput": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "OrganizationListOutput": {
        "type": "object",
        "properties": {
          "organizations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "slug": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": ["id", "name", "slug"],
              "additionalProperties": false
            }
          }
        },
        "required": ["organizations"],
        "additionalProperties": false
      },
      "SshKeyListInput": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "SshKeyListOutput": {
        "type": "object",
        "properties": {
          "keys": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "fingerprint": {
                  "type": "string"
                },
                "publicKey": {
                  "type": "string"
                },
                "createdAt": {
                  "type": "string"
                },
                "lastUsedAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "id",
                "name",
                "type",
                "fingerprint",
                "publicKey",
                "createdAt",
                "lastUsedAt"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["keys"],
        "additionalProperties": false
      },
      "SshKeyAddInput": {
        "type": "object",
        "properties": {
          "publicKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 8192,
            "description": "The public key line, as in ~/.ssh/id_ed25519.pub: ssh-ed25519 AAAA… you@laptop. ed25519, ecdsa, or RSA of at least 3072 bits."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "A name for the key, e.g. laptop. Default: the key's comment."
          }
        },
        "required": ["publicKey"],
        "additionalProperties": false
      },
      "SshKeyAddOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "fingerprint": {
            "type": "string"
          },
          "publicKey": {
            "type": "string"
          },
          "createdAt": {
            "type": "string"
          },
          "lastUsedAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["id", "name", "type", "fingerprint", "publicKey", "createdAt", "lastUsedAt"],
        "additionalProperties": false
      },
      "SshKeyDeleteInput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "Key id, from ssh_key_list."
          }
        },
        "required": ["id"],
        "additionalProperties": false
      },
      "SshKeyDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "TemplateListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "all": {
            "description": "true: also the templates hidden from Create VM (listed false).",
            "type": "boolean"
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "TemplateListOutput": {
        "type": "object",
        "properties": {
          "systems": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "scope": {
                  "type": "string",
                  "const": "system"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                }
              },
              "required": ["name", "scope", "title", "description"],
              "additionalProperties": false
            }
          },
          "templates": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "scope": {
                  "type": "string",
                  "enum": ["platform", "organization"]
                },
                "name": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "listed": {
                  "type": "boolean"
                },
                "icon": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sourceKind": {
                  "type": "string",
                  "enum": ["image", "dockerfile", "compose", "system"]
                },
                "spec": {
                  "type": "object",
                  "properties": {
                    "system": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 512,
                      "description": "What boots: headless (a Server, Headless, based on Ubuntu 26.04: the VM’s own system with sshd, Docker and systemd; the default when nothing runs on it, where the provider runs Servers), desktop (a Server, Desktop: the same with an XFCE desktop in the browser), container-host (the platform’s read-only base that runs the workload’s containers, no SSH; the default when something runs on it), or the ref of an image labelled ghostdock.os=true. A template’s own system wins over these defaults; this field wins over the template’s."
                    },
                    "source": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "image"
                            },
                            "ref": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 512
                            }
                          },
                          "required": ["type", "ref"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "dockerfile"
                            },
                            "content": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 512000
                            },
                            "files": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 512000
                              }
                            }
                          },
                          "required": ["type", "content"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "compose"
                            },
                            "files": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 512000
                              }
                            }
                          },
                          "required": ["type", "files"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "compose"
                            },
                            "reference": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 512,
                              "pattern": "^oci:\\/\\/(?:[a-z0-9]+(?:[.-][a-z0-9]+)*(?::\\d{1,5})?\\/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:\\/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@sha256:[a-f0-9]{64})?$"
                            },
                            "override": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 262144
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": ["type", "reference"],
                          "additionalProperties": false
                        }
                      ]
                    },
                    "resources": {
                      "type": "object",
                      "properties": {
                        "cpu": {
                          "type": "number",
                          "exclusiveMinimum": 0
                        },
                        "memoryGiB": {
                          "type": "number",
                          "exclusiveMinimum": 0
                        },
                        "diskGiB": {
                          "type": "number",
                          "exclusiveMinimum": 0
                        }
                      },
                      "additionalProperties": false
                    },
                    "idleStopMinutes": {
                      "type": "number"
                    },
                    "lifecycle": {
                      "type": "string",
                      "enum": ["ephemeral", "auto_delete", "keep"]
                    },
                    "autoDeleteDays": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 365
                    },
                    "restart": {
                      "type": "string",
                      "enum": ["no", "always", "unless-stopped", "on-failure"]
                    },
                    "urls": {
                      "maxItems": 100,
                      "type": "array",
                      "items": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "target": {
                                "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 200,
                                    "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "port": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 65535
                              },
                              "protocol": {
                                "type": "string",
                                "enum": ["http", "tcp"]
                              },
                              "autoWake": {
                                "type": "boolean"
                              },
                              "access": {
                                "description": "\"organization\": only members of the organization, after logging in; \"public\": anyone on the internet. Default organization for HTTP; TCP has no login and is always public.",
                                "type": "string",
                                "enum": ["organization", "public"]
                              },
                              "title": {
                                "description": "Name shown for the URL, up to 40 characters. A titled HTTP URL gets its own button on the VM card; TCP titles are shown in URL lists. Untitled HTTP URLs are listed under \"Open URL\".",
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            },
                            "required": ["port", "autoWake"],
                            "additionalProperties": false
                          },
                          {
                            "type": "object",
                            "properties": {
                              "target": {
                                "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 200,
                                    "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "port": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 65535
                              },
                              "remove": {
                                "type": "boolean",
                                "const": true
                              }
                            },
                            "required": ["port", "remove"],
                            "additionalProperties": false
                          }
                        ]
                      }
                    },
                    "forwards": {
                      "maxItems": 64,
                      "type": "array",
                      "items": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "port": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 65535,
                                "description": "The VM port that forwards."
                              },
                              "target": {
                                "type": "string",
                                "maxLength": 200,
                                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
                                "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service)."
                              },
                              "containerPort": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 65535,
                                "description": "The port in the service's container."
                              }
                            },
                            "required": ["port", "target", "containerPort"],
                            "additionalProperties": false
                          },
                          {
                            "type": "object",
                            "properties": {
                              "port": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 65535
                              },
                              "remove": {
                                "type": "boolean",
                                "const": true
                              }
                            },
                            "required": ["port", "remove"],
                            "additionalProperties": false
                          }
                        ]
                      }
                    },
                    "mcps": {
                      "maxItems": 100,
                      "type": "array",
                      "items": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "maxLength": 64,
                                "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                              },
                              "port": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 65535
                              },
                              "path": {
                                "type": "string"
                              },
                              "autoWake": {
                                "type": "boolean"
                              }
                            },
                            "required": ["name", "port", "autoWake"],
                            "additionalProperties": false
                          },
                          {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "maxLength": 64,
                                "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                              },
                              "remove": {
                                "type": "boolean",
                                "const": true
                              }
                            },
                            "required": ["name", "remove"],
                            "additionalProperties": false
                          }
                        ]
                      }
                    },
                    "env": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "all": {
                              "type": "boolean",
                              "const": true
                            }
                          },
                          "required": ["all"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "names": {
                              "maxItems": 500,
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "name": {
                                    "type": "string",
                                    "maxLength": 128
                                  },
                                  "from": {
                                    "type": "string",
                                    "maxLength": 128
                                  }
                                },
                                "required": ["name"],
                                "additionalProperties": false
                              }
                            }
                          },
                          "required": ["names"],
                          "additionalProperties": false
                        }
                      ]
                    },
                    "identity": {
                      "type": "object",
                      "properties": {
                        "budget": {
                          "type": "object",
                          "properties": {
                            "vms": {
                              "type": "object",
                              "properties": {
                                "cpu": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991
                                },
                                "memoryGiB": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991
                                },
                                "diskGiB": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991
                                },
                                "count": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991
                                }
                              },
                              "required": ["cpu", "memoryGiB", "diskGiB"],
                              "additionalProperties": false
                            },
                            "sites": {
                              "type": "object",
                              "properties": {
                                "count": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991
                                },
                                "sizeMiB": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991
                                }
                              },
                              "additionalProperties": false
                            },
                            "volumes": {
                              "type": "object",
                              "properties": {
                                "count": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991
                                },
                                "sizeGiB": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991
                                }
                              },
                              "required": ["sizeGiB"],
                              "additionalProperties": false
                            }
                          },
                          "additionalProperties": false
                        },
                        "onAutoDelete": {
                          "type": "string",
                          "enum": ["delete", "release"]
                        }
                      },
                      "required": ["budget", "onAutoDelete"],
                      "additionalProperties": false
                    },
                    "volumes": {
                      "maxItems": 16,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "source": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 67
                          },
                          "name": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$"
                          },
                          "path": {
                            "type": "string"
                          },
                          "readOnly": {
                            "type": "boolean"
                          },
                          "create": {
                            "type": "object",
                            "properties": {
                              "shared": {
                                "type": "boolean"
                              },
                              "sizeGiB": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 16384
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "required": ["source"],
                        "additionalProperties": false
                      }
                    }
                  },
                  "additionalProperties": false
                },
                "shadows": {
                  "type": "boolean"
                },
                "shadowed": {
                  "type": "boolean"
                },
                "vmUsage": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "running": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "stopped": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        }
                      },
                      "required": ["running", "stopped"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "draft": {
                  "type": "boolean"
                }
              },
              "required": [
                "scope",
                "name",
                "title",
                "description",
                "listed",
                "icon",
                "sourceKind",
                "spec",
                "shadows",
                "shadowed",
                "vmUsage",
                "draft"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["systems", "templates"],
        "additionalProperties": false
      },
      "TemplateGetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "template": {
            "type": "string",
            "minLength": 2,
            "maxLength": 40,
            "pattern": "^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$",
            "description": "Template name from template_list, e.g. postgres-pgadmin."
          },
          "platform": {
            "description": "Take the platform’s template of this name even when the organization has its own (shadows).",
            "type": "boolean"
          }
        },
        "required": ["organization", "template"],
        "additionalProperties": false
      },
      "TemplateGetOutput": {
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "enum": ["platform", "organization"]
          },
          "name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "instructions": {
            "type": "string"
          },
          "listed": {
            "type": "boolean"
          },
          "icon": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sourceKind": {
            "type": "string",
            "enum": ["image", "dockerfile", "compose", "system"]
          },
          "spec": {
            "type": "object",
            "properties": {
              "system": {
                "type": "string",
                "minLength": 1,
                "maxLength": 512,
                "description": "What boots: headless (a Server, Headless, based on Ubuntu 26.04: the VM’s own system with sshd, Docker and systemd; the default when nothing runs on it, where the provider runs Servers), desktop (a Server, Desktop: the same with an XFCE desktop in the browser), container-host (the platform’s read-only base that runs the workload’s containers, no SSH; the default when something runs on it), or the ref of an image labelled ghostdock.os=true. A template’s own system wins over these defaults; this field wins over the template’s."
              },
              "source": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "image"
                      },
                      "ref": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512
                      }
                    },
                    "required": ["type", "ref"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "dockerfile"
                      },
                      "content": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512000
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "content"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "files"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "reference": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512,
                        "pattern": "^oci:\\/\\/(?:[a-z0-9]+(?:[.-][a-z0-9]+)*(?::\\d{1,5})?\\/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:\\/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@sha256:[a-f0-9]{64})?$"
                      },
                      "override": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 262144
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["type", "reference"],
                    "additionalProperties": false
                  }
                ]
              },
              "resources": {
                "type": "object",
                "properties": {
                  "cpu": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "memoryGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "diskGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  }
                },
                "additionalProperties": false
              },
              "idleStopMinutes": {
                "type": "number"
              },
              "lifecycle": {
                "type": "string",
                "enum": ["ephemeral", "auto_delete", "keep"]
              },
              "autoDeleteDays": {
                "type": "integer",
                "minimum": 1,
                "maximum": 365
              },
              "restart": {
                "type": "string",
                "enum": ["no", "always", "unless-stopped", "on-failure"]
              },
              "urls": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "protocol": {
                          "type": "string",
                          "enum": ["http", "tcp"]
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "access": {
                          "description": "\"organization\": only members of the organization, after logging in; \"public\": anyone on the internet. Default organization for HTTP; TCP has no login and is always public.",
                          "type": "string",
                          "enum": ["organization", "public"]
                        },
                        "title": {
                          "description": "Name shown for the URL, up to 40 characters. A titled HTTP URL gets its own button on the VM card; TCP titles are shown in URL lists. Untitled HTTP URLs are listed under \"Open URL\".",
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": ["port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "forwards": {
                "maxItems": 64,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The VM port that forwards."
                        },
                        "target": {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service)."
                        },
                        "containerPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The port in the service's container."
                        }
                      },
                      "required": ["port", "target", "containerPort"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "mcps": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "path": {
                          "type": "string"
                        },
                        "autoWake": {
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["name", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "env": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "all": {
                        "type": "boolean",
                        "const": true
                      }
                    },
                    "required": ["all"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "names": {
                        "maxItems": 500,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "from": {
                              "type": "string",
                              "maxLength": 128
                            }
                          },
                          "required": ["name"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["names"],
                    "additionalProperties": false
                  }
                ]
              },
              "identity": {
                "type": "object",
                "properties": {
                  "budget": {
                    "type": "object",
                    "properties": {
                      "vms": {
                        "type": "object",
                        "properties": {
                          "cpu": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "memoryGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "diskGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["cpu", "memoryGiB", "diskGiB"],
                        "additionalProperties": false
                      },
                      "sites": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeMiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "additionalProperties": false
                      },
                      "volumes": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["sizeGiB"],
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "onAutoDelete": {
                    "type": "string",
                    "enum": ["delete", "release"]
                  }
                },
                "required": ["budget", "onAutoDelete"],
                "additionalProperties": false
              },
              "volumes": {
                "maxItems": 16,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "source": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 67
                    },
                    "name": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$"
                    },
                    "path": {
                      "type": "string"
                    },
                    "readOnly": {
                      "type": "boolean"
                    },
                    "create": {
                      "type": "object",
                      "properties": {
                        "shared": {
                          "type": "boolean"
                        },
                        "sizeGiB": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 16384
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "required": ["source"],
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false
          },
          "shadows": {
            "type": "boolean"
          },
          "shadowed": {
            "type": "boolean"
          },
          "vmUsage": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "running": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "stopped": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  }
                },
                "required": ["running", "stopped"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "draft": {
            "type": "boolean"
          },
          "manifest": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "urls": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "target": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "access": {
                          "type": "string",
                          "enum": ["organization", "public"]
                        },
                        "required": {
                          "default": false,
                          "type": "boolean"
                        },
                        "protocol": {
                          "default": "http",
                          "type": "string",
                          "enum": ["http", "tcp"]
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": ["port", "autoWake", "access", "required", "protocol"],
                      "additionalProperties": false
                    }
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "value": {
                              "type": "string",
                              "maxLength": 32768
                            },
                            "comment": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            "choice": {
                              "type": "string",
                              "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                            }
                          },
                          "required": ["name", "kind", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "hasValue": {
                              "type": "boolean"
                            },
                            "comment": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            "choice": {
                              "type": "string",
                              "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                            }
                          },
                          "required": ["name", "kind", "required", "hasValue"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  },
                  "choices": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,39}$"
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "choice": {
                          "type": "string",
                          "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                        },
                        "options": {
                          "minItems": 1,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,39}$"
                              },
                              "title": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 100
                              }
                            },
                            "required": ["id"],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": ["id", "required", "options"],
                      "additionalProperties": false
                    }
                  },
                  "mcp": {
                    "default": [],
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "path": {
                          "default": "/mcp",
                          "type": "string"
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "required": {
                          "default": false,
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "port", "path", "autoWake", "required"],
                      "additionalProperties": false
                    }
                  },
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "role": {
                          "type": "string",
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "path": {
                          "type": "string",
                          "minLength": 1
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "description": {
                          "type": "string"
                        }
                      },
                      "required": ["role", "path", "required"],
                      "additionalProperties": false
                    }
                  },
                  "forwards": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "target": {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        "containerPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        }
                      },
                      "required": ["port", "target", "containerPort"],
                      "additionalProperties": false
                    }
                  }
                },
                "required": ["urls", "env", "mcp"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "manifestReason": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["none", "invalid", "unreachable"]
              },
              {
                "type": "null"
              }
            ]
          },
          "digest": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredEnvironment": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredUrls": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "target": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    }
                  },
                  "required": ["target", "port"],
                  "additionalProperties": false
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredMcps": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "scope",
          "name",
          "title",
          "description",
          "instructions",
          "listed",
          "icon",
          "sourceKind",
          "spec",
          "shadows",
          "shadowed",
          "vmUsage",
          "draft",
          "manifest",
          "manifestReason",
          "digest",
          "requiredEnvironment",
          "requiredUrls",
          "requiredMcps"
        ],
        "additionalProperties": false
      },
      "TemplateCreateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "name": {
            "type": "string",
            "minLength": 2,
            "maxLength": 40,
            "pattern": "^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$",
            "description": "Short name, unique in the organization: lower-case words joined by hyphens, e.g. postgres-pgadmin."
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Title on the tile."
          },
          "description": {
            "description": "What it is for, in a sentence or two.",
            "type": "string",
            "maxLength": 500
          },
          "instructions": {
            "description": "Setup instructions in Markdown: what to prepare before a create (credentials, where to find them) and how to use the VM. Shown in Create VM, the gallery and `template get`; raw HTML is shown as text.",
            "type": "string",
            "maxLength": 20000
          },
          "listed": {
            "description": "Offered in Create VM and template_list (default true). false: a building block used by name only (vm_up, another template), still shown on the templates page.",
            "type": "boolean"
          },
          "icon": {
            "description": "An Iconify class the app bundles (i-simple-icons-postgresql, i-lucide-database) or an https image URL. Omit for the default icon.",
            "type": "string",
            "minLength": 1,
            "maxLength": 2048
          },
          "spec": {
            "type": "object",
            "properties": {
              "system": {
                "type": "string",
                "minLength": 1,
                "maxLength": 512,
                "description": "What boots: headless (a Server, Headless, based on Ubuntu 26.04: the VM’s own system with sshd, Docker and systemd; the default when nothing runs on it, where the provider runs Servers), desktop (a Server, Desktop: the same with an XFCE desktop in the browser), container-host (the platform’s read-only base that runs the workload’s containers, no SSH; the default when something runs on it), or the ref of an image labelled ghostdock.os=true. A template’s own system wins over these defaults; this field wins over the template’s."
              },
              "source": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "image"
                      },
                      "ref": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512
                      }
                    },
                    "required": ["type", "ref"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "dockerfile"
                      },
                      "content": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512000
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "content"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "files"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "reference": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512,
                        "pattern": "^oci:\\/\\/(?:[a-z0-9]+(?:[.-][a-z0-9]+)*(?::\\d{1,5})?\\/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:\\/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@sha256:[a-f0-9]{64})?$"
                      },
                      "override": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 262144
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["type", "reference"],
                    "additionalProperties": false
                  }
                ]
              },
              "resources": {
                "type": "object",
                "properties": {
                  "cpu": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "memoryGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "diskGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  }
                },
                "additionalProperties": false
              },
              "idleStopMinutes": {
                "type": "number"
              },
              "lifecycle": {
                "type": "string",
                "enum": ["ephemeral", "auto_delete", "keep"]
              },
              "autoDeleteDays": {
                "type": "integer",
                "minimum": 1,
                "maximum": 365
              },
              "restart": {
                "type": "string",
                "enum": ["no", "always", "unless-stopped", "on-failure"]
              },
              "urls": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "protocol": {
                          "type": "string",
                          "enum": ["http", "tcp"]
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "access": {
                          "description": "\"organization\": only members of the organization, after logging in; \"public\": anyone on the internet. Default organization for HTTP; TCP has no login and is always public.",
                          "type": "string",
                          "enum": ["organization", "public"]
                        },
                        "title": {
                          "description": "Name shown for the URL, up to 40 characters. A titled HTTP URL gets its own button on the VM card; TCP titles are shown in URL lists. Untitled HTTP URLs are listed under \"Open URL\".",
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": ["port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "forwards": {
                "maxItems": 64,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The VM port that forwards."
                        },
                        "target": {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service)."
                        },
                        "containerPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The port in the service's container."
                        }
                      },
                      "required": ["port", "target", "containerPort"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "mcps": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "path": {
                          "type": "string"
                        },
                        "autoWake": {
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["name", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "env": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "all": {
                        "type": "boolean",
                        "const": true
                      }
                    },
                    "required": ["all"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "names": {
                        "maxItems": 500,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "from": {
                              "type": "string",
                              "maxLength": 128
                            }
                          },
                          "required": ["name"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["names"],
                    "additionalProperties": false
                  }
                ]
              },
              "identity": {
                "type": "object",
                "properties": {
                  "budget": {
                    "type": "object",
                    "properties": {
                      "vms": {
                        "type": "object",
                        "properties": {
                          "cpu": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "memoryGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "diskGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["cpu", "memoryGiB", "diskGiB"],
                        "additionalProperties": false
                      },
                      "sites": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeMiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "additionalProperties": false
                      },
                      "volumes": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["sizeGiB"],
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "onAutoDelete": {
                    "type": "string",
                    "enum": ["delete", "release"]
                  }
                },
                "required": ["budget", "onAutoDelete"],
                "additionalProperties": false
              },
              "volumes": {
                "maxItems": 16,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "source": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 67
                    },
                    "name": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$"
                    },
                    "path": {
                      "type": "string"
                    },
                    "readOnly": {
                      "type": "boolean"
                    },
                    "create": {
                      "type": "object",
                      "properties": {
                        "shared": {
                          "type": "boolean"
                        },
                        "sizeGiB": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 16384
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "required": ["source"],
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false,
            "description": "The create request: { system?, source?, resources?, idleStopMinutes?, lifecycle?, autoDeleteDays?, restart?, urls?, forwards?, mcps? }, the same fields vm_up takes; system or source or both (container-host needs a source). A URL’s or forward’s target names a Compose service of the source, never a container."
          }
        },
        "required": ["organization", "name", "title", "spec"],
        "additionalProperties": false
      },
      "TemplateCreateOutput": {
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "enum": ["platform", "organization"]
          },
          "name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "instructions": {
            "type": "string"
          },
          "listed": {
            "type": "boolean"
          },
          "icon": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sourceKind": {
            "type": "string",
            "enum": ["image", "dockerfile", "compose", "system"]
          },
          "spec": {
            "type": "object",
            "properties": {
              "system": {
                "type": "string",
                "minLength": 1,
                "maxLength": 512,
                "description": "What boots: headless (a Server, Headless, based on Ubuntu 26.04: the VM’s own system with sshd, Docker and systemd; the default when nothing runs on it, where the provider runs Servers), desktop (a Server, Desktop: the same with an XFCE desktop in the browser), container-host (the platform’s read-only base that runs the workload’s containers, no SSH; the default when something runs on it), or the ref of an image labelled ghostdock.os=true. A template’s own system wins over these defaults; this field wins over the template’s."
              },
              "source": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "image"
                      },
                      "ref": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512
                      }
                    },
                    "required": ["type", "ref"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "dockerfile"
                      },
                      "content": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512000
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "content"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "files"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "reference": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512,
                        "pattern": "^oci:\\/\\/(?:[a-z0-9]+(?:[.-][a-z0-9]+)*(?::\\d{1,5})?\\/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:\\/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@sha256:[a-f0-9]{64})?$"
                      },
                      "override": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 262144
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["type", "reference"],
                    "additionalProperties": false
                  }
                ]
              },
              "resources": {
                "type": "object",
                "properties": {
                  "cpu": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "memoryGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "diskGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  }
                },
                "additionalProperties": false
              },
              "idleStopMinutes": {
                "type": "number"
              },
              "lifecycle": {
                "type": "string",
                "enum": ["ephemeral", "auto_delete", "keep"]
              },
              "autoDeleteDays": {
                "type": "integer",
                "minimum": 1,
                "maximum": 365
              },
              "restart": {
                "type": "string",
                "enum": ["no", "always", "unless-stopped", "on-failure"]
              },
              "urls": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "protocol": {
                          "type": "string",
                          "enum": ["http", "tcp"]
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "access": {
                          "description": "\"organization\": only members of the organization, after logging in; \"public\": anyone on the internet. Default organization for HTTP; TCP has no login and is always public.",
                          "type": "string",
                          "enum": ["organization", "public"]
                        },
                        "title": {
                          "description": "Name shown for the URL, up to 40 characters. A titled HTTP URL gets its own button on the VM card; TCP titles are shown in URL lists. Untitled HTTP URLs are listed under \"Open URL\".",
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": ["port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "forwards": {
                "maxItems": 64,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The VM port that forwards."
                        },
                        "target": {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service)."
                        },
                        "containerPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The port in the service's container."
                        }
                      },
                      "required": ["port", "target", "containerPort"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "mcps": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "path": {
                          "type": "string"
                        },
                        "autoWake": {
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["name", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "env": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "all": {
                        "type": "boolean",
                        "const": true
                      }
                    },
                    "required": ["all"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "names": {
                        "maxItems": 500,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "from": {
                              "type": "string",
                              "maxLength": 128
                            }
                          },
                          "required": ["name"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["names"],
                    "additionalProperties": false
                  }
                ]
              },
              "identity": {
                "type": "object",
                "properties": {
                  "budget": {
                    "type": "object",
                    "properties": {
                      "vms": {
                        "type": "object",
                        "properties": {
                          "cpu": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "memoryGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "diskGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["cpu", "memoryGiB", "diskGiB"],
                        "additionalProperties": false
                      },
                      "sites": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeMiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "additionalProperties": false
                      },
                      "volumes": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["sizeGiB"],
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "onAutoDelete": {
                    "type": "string",
                    "enum": ["delete", "release"]
                  }
                },
                "required": ["budget", "onAutoDelete"],
                "additionalProperties": false
              },
              "volumes": {
                "maxItems": 16,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "source": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 67
                    },
                    "name": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$"
                    },
                    "path": {
                      "type": "string"
                    },
                    "readOnly": {
                      "type": "boolean"
                    },
                    "create": {
                      "type": "object",
                      "properties": {
                        "shared": {
                          "type": "boolean"
                        },
                        "sizeGiB": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 16384
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "required": ["source"],
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false
          },
          "shadows": {
            "type": "boolean"
          },
          "shadowed": {
            "type": "boolean"
          },
          "vmUsage": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "running": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "stopped": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  }
                },
                "required": ["running", "stopped"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "draft": {
            "type": "boolean"
          }
        },
        "required": [
          "scope",
          "name",
          "title",
          "description",
          "instructions",
          "listed",
          "icon",
          "sourceKind",
          "spec",
          "shadows",
          "shadowed",
          "vmUsage",
          "draft"
        ],
        "additionalProperties": false
      },
      "TemplateUpdateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "template": {
            "type": "string",
            "minLength": 2,
            "maxLength": 40,
            "pattern": "^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$",
            "description": "The organization’s template, by name."
          },
          "name": {
            "description": "A new name; vm_up answers to it only.",
            "type": "string",
            "minLength": 2,
            "maxLength": 40,
            "pattern": "^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$"
          },
          "title": {
            "description": "Title on the tile.",
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "description": {
            "description": "What it is for.",
            "type": "string",
            "maxLength": 500
          },
          "instructions": {
            "description": "Setup instructions in Markdown; an empty string removes them.",
            "type": "string",
            "maxLength": 20000
          },
          "listed": {
            "description": "Offered in Create VM and template_list (default true). false: a building block used by name only (vm_up, another template), still shown on the templates page.",
            "type": "boolean"
          },
          "icon": {
            "description": "Iconify class or https image URL; null for the default icon.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 2048
              },
              {
                "type": "null"
              }
            ]
          },
          "spec": {
            "description": "The whole create request, as template_create takes it.",
            "type": "object",
            "properties": {
              "system": {
                "type": "string",
                "minLength": 1,
                "maxLength": 512,
                "description": "What boots: headless (a Server, Headless, based on Ubuntu 26.04: the VM’s own system with sshd, Docker and systemd; the default when nothing runs on it, where the provider runs Servers), desktop (a Server, Desktop: the same with an XFCE desktop in the browser), container-host (the platform’s read-only base that runs the workload’s containers, no SSH; the default when something runs on it), or the ref of an image labelled ghostdock.os=true. A template’s own system wins over these defaults; this field wins over the template’s."
              },
              "source": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "image"
                      },
                      "ref": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512
                      }
                    },
                    "required": ["type", "ref"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "dockerfile"
                      },
                      "content": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512000
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "content"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "files"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "reference": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512,
                        "pattern": "^oci:\\/\\/(?:[a-z0-9]+(?:[.-][a-z0-9]+)*(?::\\d{1,5})?\\/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:\\/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@sha256:[a-f0-9]{64})?$"
                      },
                      "override": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 262144
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["type", "reference"],
                    "additionalProperties": false
                  }
                ]
              },
              "resources": {
                "type": "object",
                "properties": {
                  "cpu": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "memoryGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "diskGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  }
                },
                "additionalProperties": false
              },
              "idleStopMinutes": {
                "type": "number"
              },
              "lifecycle": {
                "type": "string",
                "enum": ["ephemeral", "auto_delete", "keep"]
              },
              "autoDeleteDays": {
                "type": "integer",
                "minimum": 1,
                "maximum": 365
              },
              "restart": {
                "type": "string",
                "enum": ["no", "always", "unless-stopped", "on-failure"]
              },
              "urls": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "protocol": {
                          "type": "string",
                          "enum": ["http", "tcp"]
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "access": {
                          "description": "\"organization\": only members of the organization, after logging in; \"public\": anyone on the internet. Default organization for HTTP; TCP has no login and is always public.",
                          "type": "string",
                          "enum": ["organization", "public"]
                        },
                        "title": {
                          "description": "Name shown for the URL, up to 40 characters. A titled HTTP URL gets its own button on the VM card; TCP titles are shown in URL lists. Untitled HTTP URLs are listed under \"Open URL\".",
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": ["port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "forwards": {
                "maxItems": 64,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The VM port that forwards."
                        },
                        "target": {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service)."
                        },
                        "containerPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The port in the service's container."
                        }
                      },
                      "required": ["port", "target", "containerPort"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "mcps": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "path": {
                          "type": "string"
                        },
                        "autoWake": {
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["name", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "env": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "all": {
                        "type": "boolean",
                        "const": true
                      }
                    },
                    "required": ["all"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "names": {
                        "maxItems": 500,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "from": {
                              "type": "string",
                              "maxLength": 128
                            }
                          },
                          "required": ["name"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["names"],
                    "additionalProperties": false
                  }
                ]
              },
              "identity": {
                "type": "object",
                "properties": {
                  "budget": {
                    "type": "object",
                    "properties": {
                      "vms": {
                        "type": "object",
                        "properties": {
                          "cpu": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "memoryGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "diskGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["cpu", "memoryGiB", "diskGiB"],
                        "additionalProperties": false
                      },
                      "sites": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeMiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "additionalProperties": false
                      },
                      "volumes": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["sizeGiB"],
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "onAutoDelete": {
                    "type": "string",
                    "enum": ["delete", "release"]
                  }
                },
                "required": ["budget", "onAutoDelete"],
                "additionalProperties": false
              },
              "volumes": {
                "maxItems": 16,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "source": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 67
                    },
                    "name": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$"
                    },
                    "path": {
                      "type": "string"
                    },
                    "readOnly": {
                      "type": "boolean"
                    },
                    "create": {
                      "type": "object",
                      "properties": {
                        "shared": {
                          "type": "boolean"
                        },
                        "sizeGiB": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 16384
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "required": ["source"],
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false
          },
          "source": {
            "description": "Only what the template boots (an image ref, a Dockerfile with its files, Compose files or a reference); its defaults stay. Not with spec.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "image"
                  },
                  "ref": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  }
                },
                "required": ["type", "ref"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "dockerfile"
                  },
                  "content": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512000
                  },
                  "files": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 512000
                    }
                  }
                },
                "required": ["type", "content"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "compose"
                  },
                  "files": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 512000
                    }
                  }
                },
                "required": ["type", "files"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "compose"
                  },
                  "reference": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512,
                    "pattern": "^oci:\\/\\/(?:[a-z0-9]+(?:[.-][a-z0-9]+)*(?::\\d{1,5})?\\/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:\\/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@sha256:[a-f0-9]{64})?$"
                  },
                  "override": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 262144
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["type", "reference"],
                "additionalProperties": false
              }
            ]
          }
        },
        "required": ["organization", "template"],
        "additionalProperties": false
      },
      "TemplateUpdateOutput": {
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "enum": ["platform", "organization"]
          },
          "name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "instructions": {
            "type": "string"
          },
          "listed": {
            "type": "boolean"
          },
          "icon": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sourceKind": {
            "type": "string",
            "enum": ["image", "dockerfile", "compose", "system"]
          },
          "spec": {
            "type": "object",
            "properties": {
              "system": {
                "type": "string",
                "minLength": 1,
                "maxLength": 512,
                "description": "What boots: headless (a Server, Headless, based on Ubuntu 26.04: the VM’s own system with sshd, Docker and systemd; the default when nothing runs on it, where the provider runs Servers), desktop (a Server, Desktop: the same with an XFCE desktop in the browser), container-host (the platform’s read-only base that runs the workload’s containers, no SSH; the default when something runs on it), or the ref of an image labelled ghostdock.os=true. A template’s own system wins over these defaults; this field wins over the template’s."
              },
              "source": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "image"
                      },
                      "ref": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512
                      }
                    },
                    "required": ["type", "ref"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "dockerfile"
                      },
                      "content": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512000
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "content"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "files": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 512000
                        }
                      }
                    },
                    "required": ["type", "files"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "compose"
                      },
                      "reference": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 512,
                        "pattern": "^oci:\\/\\/(?:[a-z0-9]+(?:[.-][a-z0-9]+)*(?::\\d{1,5})?\\/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:\\/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@sha256:[a-f0-9]{64})?$"
                      },
                      "override": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 262144
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["type", "reference"],
                    "additionalProperties": false
                  }
                ]
              },
              "resources": {
                "type": "object",
                "properties": {
                  "cpu": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "memoryGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "diskGiB": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  }
                },
                "additionalProperties": false
              },
              "idleStopMinutes": {
                "type": "number"
              },
              "lifecycle": {
                "type": "string",
                "enum": ["ephemeral", "auto_delete", "keep"]
              },
              "autoDeleteDays": {
                "type": "integer",
                "minimum": 1,
                "maximum": 365
              },
              "restart": {
                "type": "string",
                "enum": ["no", "always", "unless-stopped", "on-failure"]
              },
              "urls": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "protocol": {
                          "type": "string",
                          "enum": ["http", "tcp"]
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "access": {
                          "description": "\"organization\": only members of the organization, after logging in; \"public\": anyone on the internet. Default organization for HTTP; TCP has no login and is always public.",
                          "type": "string",
                          "enum": ["organization", "public"]
                        },
                        "title": {
                          "description": "Name shown for the URL, up to 40 characters. A titled HTTP URL gets its own button on the VM card; TCP titles are shown in URL lists. Untitled HTTP URLs are listed under \"Open URL\".",
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": ["port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "forwards": {
                "maxItems": 64,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The VM port that forwards."
                        },
                        "target": {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
                          "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service)."
                        },
                        "containerPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535,
                          "description": "The port in the service's container."
                        }
                      },
                      "required": ["port", "target", "containerPort"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["port", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "mcps": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "port": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "path": {
                          "type": "string"
                        },
                        "autoWake": {
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "port", "autoWake"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "remove": {
                          "type": "boolean",
                          "const": true
                        }
                      },
                      "required": ["name", "remove"],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "env": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "all": {
                        "type": "boolean",
                        "const": true
                      }
                    },
                    "required": ["all"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "names": {
                        "maxItems": 500,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "from": {
                              "type": "string",
                              "maxLength": 128
                            }
                          },
                          "required": ["name"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["names"],
                    "additionalProperties": false
                  }
                ]
              },
              "identity": {
                "type": "object",
                "properties": {
                  "budget": {
                    "type": "object",
                    "properties": {
                      "vms": {
                        "type": "object",
                        "properties": {
                          "cpu": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "memoryGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "diskGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["cpu", "memoryGiB", "diskGiB"],
                        "additionalProperties": false
                      },
                      "sites": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeMiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "additionalProperties": false
                      },
                      "volumes": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["sizeGiB"],
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "onAutoDelete": {
                    "type": "string",
                    "enum": ["delete", "release"]
                  }
                },
                "required": ["budget", "onAutoDelete"],
                "additionalProperties": false
              },
              "volumes": {
                "maxItems": 16,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "source": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 67
                    },
                    "name": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$"
                    },
                    "path": {
                      "type": "string"
                    },
                    "readOnly": {
                      "type": "boolean"
                    },
                    "create": {
                      "type": "object",
                      "properties": {
                        "shared": {
                          "type": "boolean"
                        },
                        "sizeGiB": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 16384
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "required": ["source"],
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false
          },
          "shadows": {
            "type": "boolean"
          },
          "shadowed": {
            "type": "boolean"
          },
          "vmUsage": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "running": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "stopped": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  }
                },
                "required": ["running", "stopped"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "draft": {
            "type": "boolean"
          }
        },
        "required": [
          "scope",
          "name",
          "title",
          "description",
          "instructions",
          "listed",
          "icon",
          "sourceKind",
          "spec",
          "shadows",
          "shadowed",
          "vmUsage",
          "draft"
        ],
        "additionalProperties": false
      },
      "TemplateDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "template": {
            "type": "string",
            "minLength": 2,
            "maxLength": 40,
            "pattern": "^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$",
            "description": "The organization’s template, by name."
          }
        },
        "required": ["organization", "template"],
        "additionalProperties": false
      },
      "TemplateDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "VmUpInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "system": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512,
            "description": "What boots: headless (a Server, Headless, based on Ubuntu 26.04: the VM’s own system with sshd, Docker and systemd; the default when nothing runs on it, where the provider runs Servers), desktop (a Server, Desktop: the same with an XFCE desktop in the browser), container-host (the platform’s read-only base that runs the workload’s containers, no SSH; the default when something runs on it), or the ref of an image labelled ghostdock.os=true. A template’s own system wins over these defaults; this field wins over the template’s."
          },
          "template": {
            "description": "Template name from template_list, e.g. nginx, or a system name (headless, desktop, container-host), which is the system. A template is not with source; a system name may be.",
            "type": "string",
            "minLength": 2,
            "maxLength": 40,
            "pattern": "^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$"
          },
          "platform": {
            "description": "Take the platform’s template of this name even when the organization has its own (shadows).",
            "type": "boolean"
          },
          "source": {
            "description": "The workload, what runs on the system: { type: \"image\", ref }, { type: \"dockerfile\", content, files? }, { type: \"compose\", files } or { type: \"compose\", reference, override? }, or { type: \"template\", name, scope? }; or { type: \"snapshot\", name }, a whole VM. Not with template; with neither, the system runs nothing.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "snapshot"
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The snapshot’s name or id from snapshot_list."
                  }
                },
                "required": ["type", "name"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "image"
                  },
                  "ref": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  }
                },
                "required": ["type", "ref"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "dockerfile"
                  },
                  "content": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512000
                  },
                  "files": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 512000
                    }
                  }
                },
                "required": ["type", "content"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "compose"
                  },
                  "files": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 512000
                    }
                  }
                },
                "required": ["type", "files"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "compose"
                  },
                  "reference": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512,
                    "pattern": "^oci:\\/\\/(?:[a-z0-9]+(?:[.-][a-z0-9]+)*(?::\\d{1,5})?\\/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:\\/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@sha256:[a-f0-9]{64})?$"
                  },
                  "override": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 262144
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["type", "reference"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "template"
                  },
                  "name": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 40,
                    "pattern": "^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$"
                  },
                  "scope": {
                    "type": "string",
                    "enum": ["platform", "organization"]
                  }
                },
                "required": ["type", "name"],
                "additionalProperties": false
              }
            ]
          },
          "name": {
            "description": "The VM’s name, what every VM tool takes as `vm` and its addresses carry (api.<org>.ghostdock.internal): 3–30 lowercase letters, digits and single hyphens, e.g. api or my-web-app. Unique in the organization and fixed for the VM’s life (vm_name_taken when another VM has it). Omit for one from displayName (\"Marketing site\" → marketing-site, -2 … -9 if taken), else a generated one (quiet-harbor).",
            "type": "string"
          },
          "displayName": {
            "description": "What people call it, e.g. \"Marketing site\". Without name the VM is named after it (marketing-site). Optional; vm_update changes it, never the name.",
            "type": "string",
            "maxLength": 200
          },
          "restart": {
            "description": "Restart policy of the service an image or a Dockerfile becomes, Docker's names: unless-stopped (default), always, on-failure, or no (it does not come back after the VM sleeps). Not for Compose: its files set restart:.",
            "type": "string",
            "enum": ["no", "always", "unless-stopped", "on-failure"]
          },
          "resources": {
            "type": "object",
            "properties": {
              "cpu": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "memoryGiB": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "diskGiB": {
                "type": "number",
                "exclusiveMinimum": 0
              }
            },
            "additionalProperties": false,
            "description": "Compute sizing. For image/dockerfile/compose: layered on platform defaults when omitted. For snapshot: optional override applied via resize after create."
          },
          "idleStopMinutes": {
            "description": "Minutes of inactivity before the platform worker idle-stops the VM. -1: never stops for inactivity. 0 is rejected. Omit for the platform default. Provider-native timers are optional backup. A Container host in which no container runs also sleeps 5 minutes after the last one stopped; a Server (e.g. `vm up headless`) stops by this time alone. Timers and cron jobs are not activity: a Server whose work is only timers or cron jobs takes -1.",
            "type": "number"
          },
          "lifecycle": {
            "description": "What happens when the VM stops. ephemeral: the VM and its disk are deleted, and it cannot be started again; a stop by the platform (host maintenance) keeps it. auto_delete (default): a stop keeps the disk, and the record goes autoDeleteDays after it. keep: a stop keeps the disk, and the record is never removed automatically.",
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "description": "Days the VM stays stopped before the platform worker deletes the record (1–365). Omit for the platform default (14). Makes the VM auto_delete; not with keep or ephemeral. A container a person locked holds it.",
            "type": "integer",
            "minimum": 1,
            "maximum": 365
          },
          "provider": {
            "description": "Provider name or id from provider_list (not the provider kind). Omit to use the organization default (the org choice, else the platform default); if that provider lacks a capability this create needs, the first listed provider that accepts new VMs and has it is used. When no provider fits, the call fails with a not-configured error.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          },
          "identity": {
            "description": "Give the VM its own identity (GHOSTDOCK_TOKEN and GHOSTDOCK_ORG in its environment) that sees and manages only what it creates. budget says what it may create, by kind: vms { cpu, memoryGiB, diskGiB, count? } lets it create VMs (cpu and memoryGiB cap its VMs that run at once, so stopped VMs do not count and every start is checked; diskGiB and count cap all of them), sites { count?, sizeMiB? } lets it publish sites (sizeMiB caps their files together, as the CDN holds them); a kind it lacks is refused (owner_cannot_create). onAutoDelete (required): delete or release what it owns when this VM goes without a person deciding (ephemeral end, auto-delete, its host gone). The ghostdock CLI, REST and MCP work inside the VM with it. null: none, even when the template gives one.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "budget": {
                    "type": "object",
                    "properties": {
                      "vms": {
                        "type": "object",
                        "properties": {
                          "cpu": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "memoryGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "diskGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["cpu", "memoryGiB", "diskGiB"],
                        "additionalProperties": false
                      },
                      "sites": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeMiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "additionalProperties": false
                      },
                      "volumes": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["sizeGiB"],
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "onAutoDelete": {
                    "type": "string",
                    "enum": ["delete", "release"]
                  }
                },
                "required": ["budget", "onAutoDelete"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "environment": {
            "description": "Environment to give this VM. organization: names of organization entries (from env_list) to export under their own names. bindings: remap org entries onto slot names ({ name: slot, organization: orgEntryName }). local: VM-only variables/secrets to create with the VM (kind required for each). Both land as ordinary process environment variables ($NAME / process.env.NAME); a local entry overrides an organization entry of the same name. When booting from an organization snapshot, omit organization/bindings/local to keep manifest env defaults, but still supply every name in requiredEnvironment (via organization, bindings, or local). Otherwise a VM gets nothing unless listed here.",
            "type": "object",
            "properties": {
              "organization": {
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 128,
                  "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
                }
              },
              "bindings": {
                "description": "Slot-centric org bindings: export an organization entry under a (possibly different) VM env name. Conflicts with organization/local exporting the same name are rejected.",
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "VM process env / slot name."
                    },
                    "organization": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Organization catalogue entry name to export into the slot."
                    }
                  },
                  "required": ["name", "organization"]
                }
              },
              "local": {
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
                    },
                    "value": {
                      "type": "string",
                      "maxLength": 32768
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "comment": {
                      "type": "string",
                      "maxLength": 500
                    }
                  },
                  "required": ["name", "value", "kind"]
                }
              }
            }
          },
          "env": {
            "description": "What the container an image or a Dockerfile becomes gets of the VM’s environment: { all: true } for every VM variable, or { names: [{ name, from? }] } for those variables as references (from: the VM variable it reads, default the same name). Omit for the names the source declares (ghostdock.env.NAME labels) and every variable the VM is created with. Values never go into the container’s files: it only references the VM’s variables. Not for Compose: its files reference VM variables (ghostdock://env/NAME) themselves.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "all": {
                    "type": "boolean",
                    "const": true
                  }
                },
                "required": ["all"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "names": {
                    "maxItems": 500,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 128
                        },
                        "from": {
                          "type": "string",
                          "maxLength": 128
                        }
                      },
                      "required": ["name"],
                      "additionalProperties": false
                    }
                  }
                },
                "required": ["names"],
                "additionalProperties": false
              }
            ]
          },
          "urls": {
            "description": "Changes to the image’s, snapshot’s or template’s URLs, keyed by (target, port): target is the Compose service the URL reaches (its container, no published port needed), omitted for the host network (the VM’s own port; for an image or a Dockerfile, its one container). Omit for the image URLs as they are; otherwise you get the image URLs plus yours: an entry on the same target and port replaces that URL completely (omitted fields take their defaults), and { target, port, remove: true } drops it; removing one the image does not declare does nothing. A required URL cannot be removed. TCP URLs are always public.",
            "maxItems": 100,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "target": {
                      "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    },
                    "protocol": {
                      "type": "string",
                      "enum": ["http", "tcp"]
                    },
                    "autoWake": {
                      "type": "boolean"
                    },
                    "access": {
                      "description": "\"organization\": only members of the organization, after logging in; \"public\": anyone on the internet. Default organization for HTTP; TCP has no login and is always public.",
                      "type": "string",
                      "enum": ["organization", "public"]
                    },
                    "title": {
                      "description": "Name shown for the URL, up to 40 characters. A titled HTTP URL gets its own button on the VM card; TCP titles are shown in URL lists. Untitled HTTP URLs are listed under \"Open URL\".",
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 40
                    }
                  },
                  "required": ["port", "autoWake"],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "target": {
                      "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    },
                    "remove": {
                      "type": "boolean",
                      "const": true
                    }
                  },
                  "required": ["port", "remove"],
                  "additionalProperties": false
                }
              ]
            }
          },
          "forwards": {
            "description": "Changes to the source’s forwards (ghostdock.forward labels), keyed by VM port: { port, target, containerPort } makes VM port `port` reach `containerPort` of the Compose service `target` without publishing it; { port, remove: true } drops one. Same rules as urls.",
            "maxItems": 64,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535,
                      "description": "The VM port that forwards."
                    },
                    "target": {
                      "type": "string",
                      "maxLength": 200,
                      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
                      "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service)."
                    },
                    "containerPort": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535,
                      "description": "The port in the service's container."
                    }
                  },
                  "required": ["port", "target", "containerPort"],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    },
                    "remove": {
                      "type": "boolean",
                      "const": true
                    }
                  },
                  "required": ["port", "remove"],
                  "additionalProperties": false
                }
              ]
            }
          },
          "mcps": {
            "description": "Changes to the image’s, snapshot’s or template’s MCP exposures, keyed by name. Omit for the image MCPs as they are; otherwise you get the image MCPs plus yours: an entry with the same name replaces that MCP completely, and { name, remove: true } drops it; removing a name the image does not declare does nothing. A required MCP (requiredMcps) cannot be removed.",
            "maxItems": 100,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 64,
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                    },
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    },
                    "path": {
                      "type": "string"
                    },
                    "autoWake": {
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "port", "autoWake"],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 64,
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                    },
                    "remove": {
                      "type": "boolean",
                      "const": true
                    }
                  },
                  "required": ["name", "remove"],
                  "additionalProperties": false
                }
              ]
            }
          },
          "volumes": {
            "description": "Volumes the VM boots with (ADR 0061), as docker run -v: { source, name?, path?, readOnly?, create?: { shared?, sizeGiB? } }. source is the volume, created on first use as a disk (create says otherwise; it only matters then); {vm} in it is the VM’s name (a template’s {vm}-pgdata). name is the Docker volume’s name in the VM (default the source’s), path where it is mounted (default /mnt/volumes/<name>). A disk belongs to one VM at a time: one another VM has is refused; a shared folder (create.shared) any number of VMs mount at once, read-write or read-only each. An entry with the template’s name replaces that one. The answer’s volumes say for each whether it was created or an existing one attached: check it, a typo makes a new empty volume.",
            "maxItems": 16,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "source": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 67
                },
                "name": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$"
                },
                "path": {
                  "type": "string"
                },
                "readOnly": {
                  "type": "boolean"
                },
                "create": {
                  "type": "object",
                  "properties": {
                    "shared": {
                      "type": "boolean"
                    },
                    "sizeGiB": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 16384
                    }
                  },
                  "additionalProperties": false
                }
              },
              "required": ["source"],
              "additionalProperties": false
            }
          },
          "waitSeconds": {
            "description": "Seconds to wait for the VM before returning it as creating, to poll with vm_status: 0 to 120, default 120.",
            "type": "integer",
            "minimum": 0,
            "maximum": 120
          },
          "idempotencyKey": {
            "description": "Makes the create safe to retry: the same key with the same request, from the same caller within 24 hours, returns the same VM (also while it is still being created) instead of making another; the same key with a different request is refused (idempotency_key_reused). Use one key per intended VM, e.g. a job id.",
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "progressKey": {
            "description": "A UUID you made, to read the create’s steps with vm_create_progress while this call still waits (the CLI does). Not needed otherwise: a creating answer and vm_status carry progress.",
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "VmUpOutput": {
        "type": "object",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "organizationId": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": ["stopped", "starting", "running", "stopping", "failed"]
              },
              "displayName": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "idleStopMinutes": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "lifecycle": {
                "type": "string",
                "enum": ["ephemeral", "auto_delete", "keep"]
              },
              "autoDeleteDays": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "sourceType": {
                "type": "string",
                "enum": ["snapshot", "image", "dockerfile", "compose"]
              },
              "kind": {
                "type": "string",
                "enum": ["server", "container_host"]
              },
              "snapshotName": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "composeProject": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "resources": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "cpu": {
                        "anyOf": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "memoryGiB": {
                        "anyOf": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "diskGiB": {
                        "anyOf": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["cpu", "memoryGiB", "diskGiB"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "ownerTokenId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "boot": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "trigger": {
                        "type": "string",
                        "enum": ["create", "wake"]
                      },
                      "vm": {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      "compose": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "startedAt": {
                                "type": "string"
                              },
                              "readyAt": {
                                "type": "string"
                              },
                              "ms": {
                                "type": "number"
                              }
                            },
                            "required": ["startedAt", "readyAt", "ms"],
                            "additionalProperties": false
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "disk": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": ["fresh", "image-base", "user-snapshot"]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "provision": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "startedAt": {
                                "type": "string"
                              },
                              "readyAt": {
                                "type": "string"
                              },
                              "ms": {
                                "type": "number"
                              }
                            },
                            "required": ["startedAt", "readyAt", "ms"],
                            "additionalProperties": false
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "provisionResult": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": ["ready", "unhealthy", "timeout"]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "pulled": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": [
                      "trigger",
                      "vm",
                      "compose",
                      "disk",
                      "provision",
                      "provisionResult"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "template": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "scope": {
                    "type": "string",
                    "enum": ["platform", "organization"]
                  },
                  "shadows": {
                    "type": "boolean"
                  }
                },
                "required": ["name", "scope", "shadows"],
                "additionalProperties": false
              },
              "workload": {
                "type": "object",
                "properties": {
                  "container": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "project": {
                    "type": "string"
                  },
                  "containers": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "urls": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "number"
                        },
                        "url": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "access": {
                          "type": "string",
                          "enum": ["organization", "public"]
                        }
                      },
                      "required": ["port", "url", "access"],
                      "additionalProperties": false
                    }
                  },
                  "mcps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["name"],
                      "additionalProperties": false
                    }
                  }
                },
                "required": ["container"],
                "additionalProperties": false
              },
              "sizeLowered": {
                "type": "object",
                "properties": {
                  "requested": {
                    "type": "object",
                    "properties": {
                      "cpu": {
                        "type": "number"
                      },
                      "memoryGiB": {
                        "type": "number"
                      }
                    },
                    "additionalProperties": false
                  },
                  "machine": {
                    "type": "object",
                    "properties": {
                      "cpus": {
                        "type": "integer",
                        "minimum": -9007199254740991,
                        "maximum": 9007199254740991
                      },
                      "memoryGiB": {
                        "type": "number"
                      },
                      "vmMemoryGiB": {
                        "type": "number"
                      }
                    },
                    "required": ["cpus", "memoryGiB", "vmMemoryGiB"],
                    "additionalProperties": false
                  }
                },
                "required": ["requested", "machine"],
                "additionalProperties": false
              },
              "volumes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "volume": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["disk", "shared", "host"]
                    },
                    "sizeGiB": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created": {
                      "type": "boolean"
                    },
                    "name": {
                      "type": "string"
                    },
                    "path": {
                      "type": "string"
                    },
                    "readOnly": {
                      "type": "boolean"
                    },
                    "takesEffect": {
                      "type": "string",
                      "enum": ["live", "next_start", "boot"]
                    },
                    "message": {
                      "type": "string"
                    },
                    "warnings": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "volume",
                    "kind",
                    "sizeGiB",
                    "created",
                    "name",
                    "path",
                    "readOnly",
                    "takesEffect",
                    "message",
                    "warnings"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "name",
              "vmId",
              "organizationId",
              "status",
              "displayName",
              "idleStopMinutes",
              "lifecycle",
              "autoDeleteDays",
              "sourceType",
              "kind",
              "snapshotName",
              "composeProject",
              "resources"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "vmId": {
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "organizationId": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "const": "creating"
              },
              "progress": {
                "type": "object",
                "properties": {
                  "state": {
                    "type": "string",
                    "enum": ["running", "done", "failed"]
                  },
                  "steps": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": ["create", "image", "boot", "setup", "containers"]
                    }
                  },
                  "image": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "done": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "total": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "unit": {
                            "type": "string",
                            "enum": ["bytes", "percent"]
                          }
                        },
                        "required": ["done", "total", "unit"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["state", "steps", "image"],
                "additionalProperties": false
              }
            },
            "required": ["vmId", "name", "organizationId", "status"],
            "additionalProperties": false
          }
        ]
      },
      "VmListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "VmListOutput": {
        "type": "object",
        "properties": {
          "vms": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "vmId": {
                  "type": "string"
                },
                "organizationId": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": ["stopped", "starting", "running", "stopping", "failed"]
                },
                "kind": {
                  "type": "string",
                  "enum": ["server", "container_host"]
                },
                "edition": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "displayName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "idleStopMinutes": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lifecycle": {
                  "type": "string",
                  "enum": ["ephemeral", "auto_delete", "keep"]
                },
                "autoDeleteDays": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lastActivityAt": {
                  "type": "string"
                },
                "stoppedAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "stopReason": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["requested", "idle", "exited", "crashed", "platform"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "crashCause": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["panic", "out_of_memory", "vmm", "filtered"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "crashedAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "crashCount": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                "idleStopsAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "idleReason": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["idle", "no_containers"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "deletesAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "autoDeletePausedBy": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "ownerName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string"
                },
                "disk": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "usedBytes": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 9007199254740991
                        },
                        "sizeBytes": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991
                        },
                        "measuredAt": {
                          "type": "string"
                        }
                      },
                      "required": ["usedBytes", "sizeBytes", "measuredAt"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "name",
                "vmId",
                "organizationId",
                "status",
                "kind",
                "displayName",
                "idleStopMinutes",
                "lifecycle",
                "autoDeleteDays",
                "lastActivityAt",
                "stoppedAt",
                "stopReason",
                "crashCause",
                "crashedAt",
                "crashCount",
                "idleStopsAt",
                "idleReason",
                "deletesAt",
                "autoDeletePausedBy"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["vms"],
        "additionalProperties": false
      },
      "ProviderListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "ProviderListOutput": {
        "type": "object",
        "properties": {
          "defaultProviderId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "inheritsPlatformDefault": {
            "type": "boolean"
          },
          "platformDefaultProviderId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "origin": {
                  "type": "string",
                  "enum": ["platform", "organization"]
                },
                "kind": {
                  "type": "string",
                  "enum": ["microvm", "docker", "incus"]
                },
                "isDefault": {
                  "type": "boolean"
                },
                "capabilities": {
                  "type": "object",
                  "properties": {
                    "vm": {
                      "type": "boolean"
                    },
                    "servers": {
                      "type": "boolean"
                    },
                    "image": {
                      "type": "boolean"
                    },
                    "ssh": {
                      "type": "boolean"
                    },
                    "urls": {
                      "type": "boolean"
                    },
                    "private_urls": {
                      "type": "boolean"
                    },
                    "websocket": {
                      "type": "boolean"
                    },
                    "snapshot": {
                      "type": "boolean"
                    },
                    "dockerfile": {
                      "type": "boolean"
                    },
                    "compose": {
                      "type": "boolean"
                    },
                    "kubernetes": {
                      "type": "boolean"
                    },
                    "env": {
                      "type": "boolean"
                    },
                    "mcp": {
                      "type": "boolean"
                    },
                    "private_network": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "vm",
                    "servers",
                    "image",
                    "ssh",
                    "urls",
                    "private_urls",
                    "websocket",
                    "snapshot",
                    "dockerfile",
                    "compose",
                    "kubernetes",
                    "env",
                    "mcp",
                    "private_network"
                  ],
                  "additionalProperties": false
                },
                "status": {
                  "default": "connected",
                  "type": "string",
                  "enum": ["incomplete", "connected", "error"]
                },
                "verifiedAt": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "machine": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "cpus": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991
                        },
                        "memoryMib": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991
                        },
                        "vmMemoryMib": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991
                        },
                        "vmsMemoryGiB": {
                          "type": "number",
                          "minimum": 0
                        }
                      },
                      "required": ["cpus", "memoryMib", "vmMemoryMib", "vmsMemoryGiB"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "osImages": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "state": {
                          "type": "string",
                          "enum": ["ready", "preparing", "failed"]
                        },
                        "images": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string"
                              },
                              "ready": {
                                "type": "boolean"
                              }
                            },
                            "required": ["name", "ready"],
                            "additionalProperties": false
                          }
                        },
                        "lastError": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": ["state", "images", "lastError"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "hostFolders": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": "string",
                            "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
                          },
                          "path": {
                            "type": "string",
                            "minLength": 2,
                            "maxLength": 4096
                          },
                          "readOnly": {
                            "type": "boolean"
                          }
                        },
                        "required": ["name", "path", "readOnly"],
                        "additionalProperties": false
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "customDomain": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "domain": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": ["pending_dns", "pending_ssl", "active", "failed"]
                        },
                        "issuance": {
                          "type": "string",
                          "enum": ["acme", "uploaded"]
                        }
                      },
                      "required": ["domain", "status", "issuance"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "setup": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "enum": ["firewall", "connect", "domain", "reach", "default"]
                              },
                              "state": {
                                "type": "string",
                                "enum": ["done", "current", "todo", "unchecked"]
                              },
                              "how": {
                                "type": "object",
                                "properties": {
                                  "summary": {
                                    "type": "string"
                                  },
                                  "tools": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    }
                                  },
                                  "cli": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    }
                                  },
                                  "ui": {
                                    "type": "string"
                                  },
                                  "question": {
                                    "type": "string"
                                  }
                                },
                                "required": ["summary", "tools", "cli", "ui"],
                                "additionalProperties": false
                              }
                            },
                            "required": ["name", "state", "how"],
                            "additionalProperties": false
                          }
                        },
                        "next": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": ["firewall", "connect", "domain", "reach", "default"]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": ["steps", "next"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lastReach": {
                  "default": null,
                  "anyOf": [
                    {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "ok": {
                              "type": "boolean",
                              "const": true
                            },
                            "name": {
                              "type": "string"
                            },
                            "address": {
                              "type": "string"
                            }
                          },
                          "required": ["ok", "name", "address"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "ok": {
                              "type": "boolean",
                              "const": false
                            },
                            "name": {
                              "type": "string"
                            },
                            "reason": {
                              "type": "string",
                              "enum": [
                                "no_address",
                                "private_address",
                                "unreachable",
                                "other_certificate",
                                "stale_certificate",
                                "not_ghostdock"
                              ]
                            },
                            "address": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "certificateName": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "message": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "ok",
                            "name",
                            "reason",
                            "address",
                            "certificateName",
                            "message"
                          ],
                          "additionalProperties": false
                        }
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "address": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "value": {
                          "type": "string"
                        },
                        "type": {
                          "type": "string",
                          "enum": ["A", "AAAA", "CNAME"]
                        },
                        "source": {
                          "type": "string",
                          "enum": ["connection", "set"]
                        }
                      },
                      "required": ["value", "type", "source"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lastError": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "updatedAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "acceptsNewVms": {
                  "type": "boolean"
                },
                "shadows": {
                  "type": "boolean"
                },
                "shadowed": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "name",
                "origin",
                "kind",
                "isDefault",
                "capabilities",
                "status",
                "verifiedAt",
                "machine",
                "osImages",
                "hostFolders",
                "customDomain",
                "setup",
                "lastReach",
                "address",
                "lastError",
                "createdAt",
                "updatedAt",
                "acceptsNewVms",
                "shadows",
                "shadowed"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "defaultProviderId",
          "inheritsPlatformDefault",
          "platformDefaultProviderId",
          "items"
        ],
        "additionalProperties": false
      },
      "ProviderRenameInput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "New name, unique in the organization ignoring case."
          },
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          }
        },
        "required": ["name", "organization", "provider"],
        "additionalProperties": false
      },
      "ProviderRenameOutput": {
        "type": "object",
        "properties": {
          "defaultProviderId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "inheritsPlatformDefault": {
            "type": "boolean"
          },
          "platformDefaultProviderId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "origin": {
                  "type": "string",
                  "enum": ["platform", "organization"]
                },
                "kind": {
                  "type": "string",
                  "enum": ["microvm", "docker", "incus"]
                },
                "isDefault": {
                  "type": "boolean"
                },
                "capabilities": {
                  "type": "object",
                  "properties": {
                    "vm": {
                      "type": "boolean"
                    },
                    "servers": {
                      "type": "boolean"
                    },
                    "image": {
                      "type": "boolean"
                    },
                    "ssh": {
                      "type": "boolean"
                    },
                    "urls": {
                      "type": "boolean"
                    },
                    "private_urls": {
                      "type": "boolean"
                    },
                    "websocket": {
                      "type": "boolean"
                    },
                    "snapshot": {
                      "type": "boolean"
                    },
                    "dockerfile": {
                      "type": "boolean"
                    },
                    "compose": {
                      "type": "boolean"
                    },
                    "kubernetes": {
                      "type": "boolean"
                    },
                    "env": {
                      "type": "boolean"
                    },
                    "mcp": {
                      "type": "boolean"
                    },
                    "private_network": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "vm",
                    "servers",
                    "image",
                    "ssh",
                    "urls",
                    "private_urls",
                    "websocket",
                    "snapshot",
                    "dockerfile",
                    "compose",
                    "kubernetes",
                    "env",
                    "mcp",
                    "private_network"
                  ],
                  "additionalProperties": false
                },
                "status": {
                  "default": "connected",
                  "type": "string",
                  "enum": ["incomplete", "connected", "error"]
                },
                "verifiedAt": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "machine": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "cpus": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991
                        },
                        "memoryMib": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991
                        },
                        "vmMemoryMib": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991
                        },
                        "vmsMemoryGiB": {
                          "type": "number",
                          "minimum": 0
                        }
                      },
                      "required": ["cpus", "memoryMib", "vmMemoryMib", "vmsMemoryGiB"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "osImages": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "state": {
                          "type": "string",
                          "enum": ["ready", "preparing", "failed"]
                        },
                        "images": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string"
                              },
                              "ready": {
                                "type": "boolean"
                              }
                            },
                            "required": ["name", "ready"],
                            "additionalProperties": false
                          }
                        },
                        "lastError": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": ["state", "images", "lastError"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "hostFolders": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": "string",
                            "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
                          },
                          "path": {
                            "type": "string",
                            "minLength": 2,
                            "maxLength": 4096
                          },
                          "readOnly": {
                            "type": "boolean"
                          }
                        },
                        "required": ["name", "path", "readOnly"],
                        "additionalProperties": false
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "customDomain": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "domain": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": ["pending_dns", "pending_ssl", "active", "failed"]
                        },
                        "issuance": {
                          "type": "string",
                          "enum": ["acme", "uploaded"]
                        }
                      },
                      "required": ["domain", "status", "issuance"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "setup": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "enum": ["firewall", "connect", "domain", "reach", "default"]
                              },
                              "state": {
                                "type": "string",
                                "enum": ["done", "current", "todo", "unchecked"]
                              },
                              "how": {
                                "type": "object",
                                "properties": {
                                  "summary": {
                                    "type": "string"
                                  },
                                  "tools": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    }
                                  },
                                  "cli": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    }
                                  },
                                  "ui": {
                                    "type": "string"
                                  },
                                  "question": {
                                    "type": "string"
                                  }
                                },
                                "required": ["summary", "tools", "cli", "ui"],
                                "additionalProperties": false
                              }
                            },
                            "required": ["name", "state", "how"],
                            "additionalProperties": false
                          }
                        },
                        "next": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": ["firewall", "connect", "domain", "reach", "default"]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": ["steps", "next"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lastReach": {
                  "default": null,
                  "anyOf": [
                    {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "ok": {
                              "type": "boolean",
                              "const": true
                            },
                            "name": {
                              "type": "string"
                            },
                            "address": {
                              "type": "string"
                            }
                          },
                          "required": ["ok", "name", "address"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "ok": {
                              "type": "boolean",
                              "const": false
                            },
                            "name": {
                              "type": "string"
                            },
                            "reason": {
                              "type": "string",
                              "enum": [
                                "no_address",
                                "private_address",
                                "unreachable",
                                "other_certificate",
                                "stale_certificate",
                                "not_ghostdock"
                              ]
                            },
                            "address": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "certificateName": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "message": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "ok",
                            "name",
                            "reason",
                            "address",
                            "certificateName",
                            "message"
                          ],
                          "additionalProperties": false
                        }
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "address": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "value": {
                          "type": "string"
                        },
                        "type": {
                          "type": "string",
                          "enum": ["A", "AAAA", "CNAME"]
                        },
                        "source": {
                          "type": "string",
                          "enum": ["connection", "set"]
                        }
                      },
                      "required": ["value", "type", "source"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lastError": {
                  "default": null,
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "updatedAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "acceptsNewVms": {
                  "type": "boolean"
                },
                "shadows": {
                  "type": "boolean"
                },
                "shadowed": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "name",
                "origin",
                "kind",
                "isDefault",
                "capabilities",
                "status",
                "verifiedAt",
                "machine",
                "osImages",
                "hostFolders",
                "customDomain",
                "setup",
                "lastReach",
                "address",
                "lastError",
                "createdAt",
                "updatedAt",
                "acceptsNewVms",
                "shadows",
                "shadowed"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "defaultProviderId",
          "inheritsPlatformDefault",
          "platformDefaultProviderId",
          "items"
        ],
        "additionalProperties": false
      },
      "ProviderSetDefaultInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 128
              },
              {
                "type": "null"
              }
            ],
            "description": "Provider name or id from provider_list (own or platform), or null to follow the platform default. Passing platformDefaultProviderId also follows the platform default; it is never pinned."
          },
          "decline": {
            "description": "Do not make this Docker or Incus host the default, and do not ask again (its setup step default is then done). The default stays as it is.",
            "type": "boolean"
          }
        },
        "required": ["organization", "provider"],
        "additionalProperties": false
      },
      "ProviderSetDefaultOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "defaultProviderId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "inheritsPlatformDefault": {
            "type": "boolean"
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "ProviderDisconnectInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          },
          "confirmLinkedDeletion": {
            "description": "Required when this provider still has organization snapshots, or VMs or volumes on a Docker host that is not connected. Permanently deletes those snapshots and removes those VMs and volumes from Ghostdock, then disconnects.",
            "type": "boolean"
          }
        },
        "required": ["organization", "provider"],
        "additionalProperties": false
      },
      "ProviderDisconnectOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "defaultProviderId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "inheritsPlatformDefault": {
            "type": "boolean"
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "DomainListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "DomainListOutput": {
        "type": "object",
        "properties": {
          "domains": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "domain": {
                  "type": "string"
                },
                "issuance": {
                  "type": "string",
                  "enum": ["acme", "uploaded"]
                },
                "status": {
                  "type": "string",
                  "enum": ["unused", "pending_dns", "pending_ssl", "active", "failed"]
                },
                "provider": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "kind": {
                          "type": "string"
                        }
                      },
                      "required": ["id", "name", "kind"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "unusedSince": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "certificate": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "commonName": {
                          "type": "string"
                        },
                        "altNames": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "autoRenewal": {
                          "type": "boolean"
                        },
                        "issuedAt": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "expiresAt": {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        }
                      },
                      "required": [
                        "id",
                        "commonName",
                        "altNames",
                        "autoRenewal",
                        "issuedAt",
                        "expiresAt"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "renewal": {
                  "type": "string",
                  "enum": ["automatic", "once_more", "stopped", "manual"]
                },
                "renewsAt": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lastIssuedAt": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "allowance": {
                  "type": "object",
                  "properties": {
                    "left": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "limit": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "nextAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": ["left", "limit", "nextAt"],
                  "additionalProperties": false
                },
                "nextOrderAt": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lastError": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "id",
                "domain",
                "issuance",
                "status",
                "provider",
                "unusedSince",
                "certificate",
                "renewal",
                "renewsAt",
                "lastIssuedAt",
                "allowance",
                "nextOrderAt",
                "lastError"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["domains"],
        "additionalProperties": false
      },
      "DomainAttachInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "domain": {
            "type": "string",
            "minLength": 1,
            "description": "Custom domain, such as boxes.example.com (domain_list)."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          }
        },
        "required": ["organization", "domain", "provider"],
        "additionalProperties": false
      },
      "DomainAttachOutput": {
        "type": "object",
        "properties": {
          "domain": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "domain": {
                    "type": "string"
                  },
                  "issuance": {
                    "type": "string",
                    "enum": ["acme", "uploaded"]
                  },
                  "status": {
                    "type": "string",
                    "enum": ["pending_dns", "pending_ssl", "active", "failed"]
                  },
                  "lastDnsCheckedAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "lastSslError": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "certExpiresAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "nextOrderAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "createdAt": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                  }
                },
                "required": [
                  "id",
                  "domain",
                  "issuance",
                  "status",
                  "lastDnsCheckedAt",
                  "lastSslError",
                  "certExpiresAt",
                  "nextOrderAt",
                  "createdAt"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "records": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "purpose": {
                  "type": "string",
                  "enum": ["http_wildcard", "acme_http"]
                },
                "type": {
                  "type": "string",
                  "enum": ["CNAME", "A", "AAAA"]
                },
                "name": {
                  "type": "string"
                },
                "fqdn": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                },
                "proxied": {
                  "type": "boolean",
                  "const": false
                }
              },
              "required": ["purpose", "type", "name", "fqdn", "value", "proxied"],
              "additionalProperties": false
            }
          },
          "checks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "purpose": {
                  "type": "string",
                  "enum": ["http_wildcard", "acme_http"]
                },
                "queryName": {
                  "type": "string"
                },
                "ok": {
                  "type": "boolean"
                },
                "error": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["nxdomain", "mismatch", "lookup_failed"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "observed": {
                  "type": "object",
                  "properties": {
                    "cname": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "a": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "aaaa": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": ["cname", "a", "aaaa"],
                  "additionalProperties": false
                }
              },
              "required": ["purpose", "queryName", "ok", "error", "observed"],
              "additionalProperties": false
            }
          },
          "certificate": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "commonName": {
                    "type": "string"
                  },
                  "altNames": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "autoRenewal": {
                    "type": "boolean"
                  },
                  "issuedAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "expiresAt": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                  }
                },
                "required": [
                  "id",
                  "commonName",
                  "altNames",
                  "autoRenewal",
                  "issuedAt",
                  "expiresAt"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "certificatePlan": {
            "anyOf": [
              {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "reuse"
                      },
                      "expiresAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      }
                    },
                    "required": ["kind", "expiresAt"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "order"
                      },
                      "allowance": {
                        "type": "object",
                        "properties": {
                          "left": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "limit": {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          "nextAt": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time",
                                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": ["left", "limit", "nextAt"],
                        "additionalProperties": false
                      }
                    },
                    "required": ["kind", "allowance"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "uploaded"
                      }
                    },
                    "required": ["kind"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "in_use"
                      },
                      "providerName": {
                        "type": "string"
                      }
                    },
                    "required": ["kind", "providerName"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "taken"
                      }
                    },
                    "required": ["kind"],
                    "additionalProperties": false
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "reach": {
            "default": null,
            "anyOf": [
              {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "ok": {
                        "type": "boolean",
                        "const": true
                      },
                      "name": {
                        "type": "string"
                      },
                      "address": {
                        "type": "string"
                      }
                    },
                    "required": ["ok", "name", "address"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "ok": {
                        "type": "boolean",
                        "const": false
                      },
                      "name": {
                        "type": "string"
                      },
                      "reason": {
                        "type": "string",
                        "enum": [
                          "no_address",
                          "private_address",
                          "unreachable",
                          "other_certificate",
                          "stale_certificate",
                          "not_ghostdock"
                        ]
                      },
                      "address": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "certificateName": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "message": {
                        "type": "string"
                      }
                    },
                    "required": ["ok", "name", "reason", "address", "certificateName", "message"],
                    "additionalProperties": false
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["domain", "records", "checks", "certificate", "certificatePlan", "reach"],
        "additionalProperties": false
      },
      "DomainCheckInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "domain": {
            "type": "string",
            "minLength": 1,
            "description": "Custom domain, such as boxes.example.com (domain_list)."
          }
        },
        "required": ["organization", "domain"],
        "additionalProperties": false
      },
      "DomainCheckOutput": {
        "type": "object",
        "properties": {
          "domain": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "domain": {
                    "type": "string"
                  },
                  "issuance": {
                    "type": "string",
                    "enum": ["acme", "uploaded"]
                  },
                  "status": {
                    "type": "string",
                    "enum": ["pending_dns", "pending_ssl", "active", "failed"]
                  },
                  "lastDnsCheckedAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "lastSslError": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "certExpiresAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "nextOrderAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "createdAt": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                  }
                },
                "required": [
                  "id",
                  "domain",
                  "issuance",
                  "status",
                  "lastDnsCheckedAt",
                  "lastSslError",
                  "certExpiresAt",
                  "nextOrderAt",
                  "createdAt"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "records": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "purpose": {
                  "type": "string",
                  "enum": ["http_wildcard", "acme_http"]
                },
                "type": {
                  "type": "string",
                  "enum": ["CNAME", "A", "AAAA"]
                },
                "name": {
                  "type": "string"
                },
                "fqdn": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                },
                "proxied": {
                  "type": "boolean",
                  "const": false
                }
              },
              "required": ["purpose", "type", "name", "fqdn", "value", "proxied"],
              "additionalProperties": false
            }
          },
          "checks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "purpose": {
                  "type": "string",
                  "enum": ["http_wildcard", "acme_http"]
                },
                "queryName": {
                  "type": "string"
                },
                "ok": {
                  "type": "boolean"
                },
                "error": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["nxdomain", "mismatch", "lookup_failed"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "observed": {
                  "type": "object",
                  "properties": {
                    "cname": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "a": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "aaaa": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": ["cname", "a", "aaaa"],
                  "additionalProperties": false
                }
              },
              "required": ["purpose", "queryName", "ok", "error", "observed"],
              "additionalProperties": false
            }
          },
          "certificate": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "commonName": {
                    "type": "string"
                  },
                  "altNames": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "autoRenewal": {
                    "type": "boolean"
                  },
                  "issuedAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "expiresAt": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                  }
                },
                "required": [
                  "id",
                  "commonName",
                  "altNames",
                  "autoRenewal",
                  "issuedAt",
                  "expiresAt"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "certificatePlan": {
            "anyOf": [
              {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "reuse"
                      },
                      "expiresAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      }
                    },
                    "required": ["kind", "expiresAt"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "order"
                      },
                      "allowance": {
                        "type": "object",
                        "properties": {
                          "left": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "limit": {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          "nextAt": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time",
                                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": ["left", "limit", "nextAt"],
                        "additionalProperties": false
                      }
                    },
                    "required": ["kind", "allowance"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "uploaded"
                      }
                    },
                    "required": ["kind"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "in_use"
                      },
                      "providerName": {
                        "type": "string"
                      }
                    },
                    "required": ["kind", "providerName"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "taken"
                      }
                    },
                    "required": ["kind"],
                    "additionalProperties": false
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "reach": {
            "default": null,
            "anyOf": [
              {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "ok": {
                        "type": "boolean",
                        "const": true
                      },
                      "name": {
                        "type": "string"
                      },
                      "address": {
                        "type": "string"
                      }
                    },
                    "required": ["ok", "name", "address"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "ok": {
                        "type": "boolean",
                        "const": false
                      },
                      "name": {
                        "type": "string"
                      },
                      "reason": {
                        "type": "string",
                        "enum": [
                          "no_address",
                          "private_address",
                          "unreachable",
                          "other_certificate",
                          "stale_certificate",
                          "not_ghostdock"
                        ]
                      },
                      "address": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "certificateName": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "message": {
                        "type": "string"
                      }
                    },
                    "required": ["ok", "name", "reason", "address", "certificateName", "message"],
                    "additionalProperties": false
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["domain", "records", "checks", "certificate", "certificatePlan", "reach"],
        "additionalProperties": false
      },
      "DomainDetachInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "domain": {
            "type": "string",
            "minLength": 1,
            "description": "Custom domain, such as boxes.example.com (domain_list)."
          }
        },
        "required": ["organization", "domain"],
        "additionalProperties": false
      },
      "DomainDetachOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "DomainDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "domain": {
            "type": "string",
            "minLength": 1,
            "description": "Custom domain, such as boxes.example.com (domain_list)."
          },
          "confirmInUse": {
            "description": "Required when a provider uses the domain: detaches it from that provider, then deletes it.",
            "type": "boolean"
          }
        },
        "required": ["organization", "domain"],
        "additionalProperties": false
      },
      "DomainDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "ProviderConnectInput": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": ["docker", "incus"],
            "description": "incus: VMs as system containers in an Incus project on the server (needs Incus 7, Linux 6.12, a ZFS or Btrfs pool). docker: VMs as containers next to Docker, with Sysbox."
          },
          "name": {
            "description": "Name for the new provider. Optional.",
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          }
        },
        "required": ["kind", "organization"],
        "additionalProperties": false
      },
      "ProviderConnectOutput": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "origin": {
                "type": "string",
                "enum": ["platform", "organization"]
              },
              "kind": {
                "type": "string",
                "enum": ["microvm", "docker", "incus"]
              },
              "isDefault": {
                "type": "boolean"
              },
              "capabilities": {
                "type": "object",
                "properties": {
                  "vm": {
                    "type": "boolean"
                  },
                  "servers": {
                    "type": "boolean"
                  },
                  "image": {
                    "type": "boolean"
                  },
                  "ssh": {
                    "type": "boolean"
                  },
                  "urls": {
                    "type": "boolean"
                  },
                  "private_urls": {
                    "type": "boolean"
                  },
                  "websocket": {
                    "type": "boolean"
                  },
                  "snapshot": {
                    "type": "boolean"
                  },
                  "dockerfile": {
                    "type": "boolean"
                  },
                  "compose": {
                    "type": "boolean"
                  },
                  "kubernetes": {
                    "type": "boolean"
                  },
                  "env": {
                    "type": "boolean"
                  },
                  "mcp": {
                    "type": "boolean"
                  },
                  "private_network": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "vm",
                  "servers",
                  "image",
                  "ssh",
                  "urls",
                  "private_urls",
                  "websocket",
                  "snapshot",
                  "dockerfile",
                  "compose",
                  "kubernetes",
                  "env",
                  "mcp",
                  "private_network"
                ],
                "additionalProperties": false
              },
              "status": {
                "default": "connected",
                "type": "string",
                "enum": ["incomplete", "connected", "error"]
              },
              "verifiedAt": {
                "default": null,
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "machine": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "cpus": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "memoryMib": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "vmMemoryMib": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "vmsMemoryGiB": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "required": ["cpus", "memoryMib", "vmMemoryMib", "vmsMemoryGiB"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "osImages": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "state": {
                        "type": "string",
                        "enum": ["ready", "preparing", "failed"]
                      },
                      "images": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string"
                            },
                            "ready": {
                              "type": "boolean"
                            }
                          },
                          "required": ["name", "ready"],
                          "additionalProperties": false
                        }
                      },
                      "lastError": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["state", "images", "lastError"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hostFolders": {
                "default": null,
                "anyOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
                        },
                        "path": {
                          "type": "string",
                          "minLength": 2,
                          "maxLength": 4096
                        },
                        "readOnly": {
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "path", "readOnly"],
                      "additionalProperties": false
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "customDomain": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "domain": {
                        "type": "string"
                      },
                      "status": {
                        "type": "string",
                        "enum": ["pending_dns", "pending_ssl", "active", "failed"]
                      },
                      "issuance": {
                        "type": "string",
                        "enum": ["acme", "uploaded"]
                      }
                    },
                    "required": ["domain", "status", "issuance"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "setup": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "enum": ["firewall", "connect", "domain", "reach", "default"]
                            },
                            "state": {
                              "type": "string",
                              "enum": ["done", "current", "todo", "unchecked"]
                            },
                            "how": {
                              "type": "object",
                              "properties": {
                                "summary": {
                                  "type": "string"
                                },
                                "tools": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  }
                                },
                                "cli": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  }
                                },
                                "ui": {
                                  "type": "string"
                                },
                                "question": {
                                  "type": "string"
                                }
                              },
                              "required": ["summary", "tools", "cli", "ui"],
                              "additionalProperties": false
                            }
                          },
                          "required": ["name", "state", "how"],
                          "additionalProperties": false
                        }
                      },
                      "next": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": ["firewall", "connect", "domain", "reach", "default"]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["steps", "next"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "lastReach": {
                "default": null,
                "anyOf": [
                  {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "ok": {
                            "type": "boolean",
                            "const": true
                          },
                          "name": {
                            "type": "string"
                          },
                          "address": {
                            "type": "string"
                          }
                        },
                        "required": ["ok", "name", "address"],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "ok": {
                            "type": "boolean",
                            "const": false
                          },
                          "name": {
                            "type": "string"
                          },
                          "reason": {
                            "type": "string",
                            "enum": [
                              "no_address",
                              "private_address",
                              "unreachable",
                              "other_certificate",
                              "stale_certificate",
                              "not_ghostdock"
                            ]
                          },
                          "address": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "certificateName": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "message": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "ok",
                          "name",
                          "reason",
                          "address",
                          "certificateName",
                          "message"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "address": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "value": {
                        "type": "string"
                      },
                      "type": {
                        "type": "string",
                        "enum": ["A", "AAAA", "CNAME"]
                      },
                      "source": {
                        "type": "string",
                        "enum": ["connection", "set"]
                      }
                    },
                    "required": ["value", "type", "source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "lastError": {
                "default": null,
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "createdAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "updatedAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "acceptsNewVms": {
                "type": "boolean"
              },
              "shadows": {
                "type": "boolean"
              },
              "shadowed": {
                "type": "boolean"
              }
            },
            "required": [
              "id",
              "name",
              "origin",
              "kind",
              "isDefault",
              "capabilities",
              "status",
              "verifiedAt",
              "machine",
              "osImages",
              "hostFolders",
              "customDomain",
              "setup",
              "lastReach",
              "address",
              "lastError",
              "createdAt",
              "updatedAt",
              "acceptsNewVms",
              "shadows",
              "shadowed"
            ],
            "additionalProperties": false
          },
          "join": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "enum": ["docker", "incus"]
              },
              "setupCommand": {
                "type": "string"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              }
            },
            "required": ["kind", "setupCommand", "expiresAt"],
            "additionalProperties": false
          },
          "catalog": {
            "type": "object",
            "properties": {
              "defaultProviderId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "inheritsPlatformDefault": {
                "type": "boolean"
              },
              "platformDefaultProviderId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "origin": {
                      "type": "string",
                      "enum": ["platform", "organization"]
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["microvm", "docker", "incus"]
                    },
                    "isDefault": {
                      "type": "boolean"
                    },
                    "capabilities": {
                      "type": "object",
                      "properties": {
                        "vm": {
                          "type": "boolean"
                        },
                        "servers": {
                          "type": "boolean"
                        },
                        "image": {
                          "type": "boolean"
                        },
                        "ssh": {
                          "type": "boolean"
                        },
                        "urls": {
                          "type": "boolean"
                        },
                        "private_urls": {
                          "type": "boolean"
                        },
                        "websocket": {
                          "type": "boolean"
                        },
                        "snapshot": {
                          "type": "boolean"
                        },
                        "dockerfile": {
                          "type": "boolean"
                        },
                        "compose": {
                          "type": "boolean"
                        },
                        "kubernetes": {
                          "type": "boolean"
                        },
                        "env": {
                          "type": "boolean"
                        },
                        "mcp": {
                          "type": "boolean"
                        },
                        "private_network": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "vm",
                        "servers",
                        "image",
                        "ssh",
                        "urls",
                        "private_urls",
                        "websocket",
                        "snapshot",
                        "dockerfile",
                        "compose",
                        "kubernetes",
                        "env",
                        "mcp",
                        "private_network"
                      ],
                      "additionalProperties": false
                    },
                    "status": {
                      "default": "connected",
                      "type": "string",
                      "enum": ["incomplete", "connected", "error"]
                    },
                    "verifiedAt": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "machine": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "cpus": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991
                            },
                            "memoryMib": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991
                            },
                            "vmMemoryMib": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991
                            },
                            "vmsMemoryGiB": {
                              "type": "number",
                              "minimum": 0
                            }
                          },
                          "required": ["cpus", "memoryMib", "vmMemoryMib", "vmsMemoryGiB"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "osImages": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "state": {
                              "type": "string",
                              "enum": ["ready", "preparing", "failed"]
                            },
                            "images": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "name": {
                                    "type": "string"
                                  },
                                  "ready": {
                                    "type": "boolean"
                                  }
                                },
                                "required": ["name", "ready"],
                                "additionalProperties": false
                              }
                            },
                            "lastError": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": ["state", "images", "lastError"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "hostFolders": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
                              },
                              "path": {
                                "type": "string",
                                "minLength": 2,
                                "maxLength": 4096
                              },
                              "readOnly": {
                                "type": "boolean"
                              }
                            },
                            "required": ["name", "path", "readOnly"],
                            "additionalProperties": false
                          }
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "customDomain": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "domain": {
                              "type": "string"
                            },
                            "status": {
                              "type": "string",
                              "enum": ["pending_dns", "pending_ssl", "active", "failed"]
                            },
                            "issuance": {
                              "type": "string",
                              "enum": ["acme", "uploaded"]
                            }
                          },
                          "required": ["domain", "status", "issuance"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "setup": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "steps": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "name": {
                                    "type": "string",
                                    "enum": ["firewall", "connect", "domain", "reach", "default"]
                                  },
                                  "state": {
                                    "type": "string",
                                    "enum": ["done", "current", "todo", "unchecked"]
                                  },
                                  "how": {
                                    "type": "object",
                                    "properties": {
                                      "summary": {
                                        "type": "string"
                                      },
                                      "tools": {
                                        "type": "array",
                                        "items": {
                                          "type": "string"
                                        }
                                      },
                                      "cli": {
                                        "type": "array",
                                        "items": {
                                          "type": "string"
                                        }
                                      },
                                      "ui": {
                                        "type": "string"
                                      },
                                      "question": {
                                        "type": "string"
                                      }
                                    },
                                    "required": ["summary", "tools", "cli", "ui"],
                                    "additionalProperties": false
                                  }
                                },
                                "required": ["name", "state", "how"],
                                "additionalProperties": false
                              }
                            },
                            "next": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": ["firewall", "connect", "domain", "reach", "default"]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": ["steps", "next"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "lastReach": {
                      "default": null,
                      "anyOf": [
                        {
                          "oneOf": [
                            {
                              "type": "object",
                              "properties": {
                                "ok": {
                                  "type": "boolean",
                                  "const": true
                                },
                                "name": {
                                  "type": "string"
                                },
                                "address": {
                                  "type": "string"
                                }
                              },
                              "required": ["ok", "name", "address"],
                              "additionalProperties": false
                            },
                            {
                              "type": "object",
                              "properties": {
                                "ok": {
                                  "type": "boolean",
                                  "const": false
                                },
                                "name": {
                                  "type": "string"
                                },
                                "reason": {
                                  "type": "string",
                                  "enum": [
                                    "no_address",
                                    "private_address",
                                    "unreachable",
                                    "other_certificate",
                                    "stale_certificate",
                                    "not_ghostdock"
                                  ]
                                },
                                "address": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "certificateName": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "message": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "ok",
                                "name",
                                "reason",
                                "address",
                                "certificateName",
                                "message"
                              ],
                              "additionalProperties": false
                            }
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "address": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "value": {
                              "type": "string"
                            },
                            "type": {
                              "type": "string",
                              "enum": ["A", "AAAA", "CNAME"]
                            },
                            "source": {
                              "type": "string",
                              "enum": ["connection", "set"]
                            }
                          },
                          "required": ["value", "type", "source"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "lastError": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "createdAt": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "updatedAt": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "acceptsNewVms": {
                      "type": "boolean"
                    },
                    "shadows": {
                      "type": "boolean"
                    },
                    "shadowed": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "origin",
                    "kind",
                    "isDefault",
                    "capabilities",
                    "status",
                    "verifiedAt",
                    "machine",
                    "osImages",
                    "hostFolders",
                    "customDomain",
                    "setup",
                    "lastReach",
                    "address",
                    "lastError",
                    "createdAt",
                    "updatedAt",
                    "acceptsNewVms",
                    "shadows",
                    "shadowed"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "defaultProviderId",
              "inheritsPlatformDefault",
              "platformDefaultProviderId",
              "items"
            ],
            "additionalProperties": false
          }
        },
        "required": ["provider", "join", "catalog"],
        "additionalProperties": false
      },
      "ProviderNewJoinInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          }
        },
        "required": ["organization", "provider"],
        "additionalProperties": false
      },
      "ProviderNewJoinOutput": {
        "type": "object",
        "properties": {
          "join": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "enum": ["docker", "incus"]
              },
              "setupCommand": {
                "type": "string"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              }
            },
            "required": ["kind", "setupCommand", "expiresAt"],
            "additionalProperties": false
          }
        },
        "required": ["join"],
        "additionalProperties": false
      },
      "ProviderVerifyInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          }
        },
        "required": ["organization", "provider"],
        "additionalProperties": false
      },
      "ProviderVerifyOutput": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "origin": {
                "type": "string",
                "enum": ["platform", "organization"]
              },
              "kind": {
                "type": "string",
                "enum": ["microvm", "docker", "incus"]
              },
              "isDefault": {
                "type": "boolean"
              },
              "capabilities": {
                "type": "object",
                "properties": {
                  "vm": {
                    "type": "boolean"
                  },
                  "servers": {
                    "type": "boolean"
                  },
                  "image": {
                    "type": "boolean"
                  },
                  "ssh": {
                    "type": "boolean"
                  },
                  "urls": {
                    "type": "boolean"
                  },
                  "private_urls": {
                    "type": "boolean"
                  },
                  "websocket": {
                    "type": "boolean"
                  },
                  "snapshot": {
                    "type": "boolean"
                  },
                  "dockerfile": {
                    "type": "boolean"
                  },
                  "compose": {
                    "type": "boolean"
                  },
                  "kubernetes": {
                    "type": "boolean"
                  },
                  "env": {
                    "type": "boolean"
                  },
                  "mcp": {
                    "type": "boolean"
                  },
                  "private_network": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "vm",
                  "servers",
                  "image",
                  "ssh",
                  "urls",
                  "private_urls",
                  "websocket",
                  "snapshot",
                  "dockerfile",
                  "compose",
                  "kubernetes",
                  "env",
                  "mcp",
                  "private_network"
                ],
                "additionalProperties": false
              },
              "status": {
                "default": "connected",
                "type": "string",
                "enum": ["incomplete", "connected", "error"]
              },
              "verifiedAt": {
                "default": null,
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "machine": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "cpus": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "memoryMib": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "vmMemoryMib": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "vmsMemoryGiB": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "required": ["cpus", "memoryMib", "vmMemoryMib", "vmsMemoryGiB"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "osImages": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "state": {
                        "type": "string",
                        "enum": ["ready", "preparing", "failed"]
                      },
                      "images": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string"
                            },
                            "ready": {
                              "type": "boolean"
                            }
                          },
                          "required": ["name", "ready"],
                          "additionalProperties": false
                        }
                      },
                      "lastError": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["state", "images", "lastError"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hostFolders": {
                "default": null,
                "anyOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
                        },
                        "path": {
                          "type": "string",
                          "minLength": 2,
                          "maxLength": 4096
                        },
                        "readOnly": {
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "path", "readOnly"],
                      "additionalProperties": false
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "customDomain": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "domain": {
                        "type": "string"
                      },
                      "status": {
                        "type": "string",
                        "enum": ["pending_dns", "pending_ssl", "active", "failed"]
                      },
                      "issuance": {
                        "type": "string",
                        "enum": ["acme", "uploaded"]
                      }
                    },
                    "required": ["domain", "status", "issuance"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "setup": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "enum": ["firewall", "connect", "domain", "reach", "default"]
                            },
                            "state": {
                              "type": "string",
                              "enum": ["done", "current", "todo", "unchecked"]
                            },
                            "how": {
                              "type": "object",
                              "properties": {
                                "summary": {
                                  "type": "string"
                                },
                                "tools": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  }
                                },
                                "cli": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  }
                                },
                                "ui": {
                                  "type": "string"
                                },
                                "question": {
                                  "type": "string"
                                }
                              },
                              "required": ["summary", "tools", "cli", "ui"],
                              "additionalProperties": false
                            }
                          },
                          "required": ["name", "state", "how"],
                          "additionalProperties": false
                        }
                      },
                      "next": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": ["firewall", "connect", "domain", "reach", "default"]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": ["steps", "next"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "lastReach": {
                "default": null,
                "anyOf": [
                  {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "ok": {
                            "type": "boolean",
                            "const": true
                          },
                          "name": {
                            "type": "string"
                          },
                          "address": {
                            "type": "string"
                          }
                        },
                        "required": ["ok", "name", "address"],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "ok": {
                            "type": "boolean",
                            "const": false
                          },
                          "name": {
                            "type": "string"
                          },
                          "reason": {
                            "type": "string",
                            "enum": [
                              "no_address",
                              "private_address",
                              "unreachable",
                              "other_certificate",
                              "stale_certificate",
                              "not_ghostdock"
                            ]
                          },
                          "address": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "certificateName": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "message": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "ok",
                          "name",
                          "reason",
                          "address",
                          "certificateName",
                          "message"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "address": {
                "default": null,
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "value": {
                        "type": "string"
                      },
                      "type": {
                        "type": "string",
                        "enum": ["A", "AAAA", "CNAME"]
                      },
                      "source": {
                        "type": "string",
                        "enum": ["connection", "set"]
                      }
                    },
                    "required": ["value", "type", "source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "lastError": {
                "default": null,
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "createdAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "updatedAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "acceptsNewVms": {
                "type": "boolean"
              },
              "shadows": {
                "type": "boolean"
              },
              "shadowed": {
                "type": "boolean"
              }
            },
            "required": [
              "id",
              "name",
              "origin",
              "kind",
              "isDefault",
              "capabilities",
              "status",
              "verifiedAt",
              "machine",
              "osImages",
              "hostFolders",
              "customDomain",
              "setup",
              "lastReach",
              "address",
              "lastError",
              "createdAt",
              "updatedAt",
              "acceptsNewVms",
              "shadows",
              "shadowed"
            ],
            "additionalProperties": false
          },
          "catalog": {
            "type": "object",
            "properties": {
              "defaultProviderId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "inheritsPlatformDefault": {
                "type": "boolean"
              },
              "platformDefaultProviderId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "origin": {
                      "type": "string",
                      "enum": ["platform", "organization"]
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["microvm", "docker", "incus"]
                    },
                    "isDefault": {
                      "type": "boolean"
                    },
                    "capabilities": {
                      "type": "object",
                      "properties": {
                        "vm": {
                          "type": "boolean"
                        },
                        "servers": {
                          "type": "boolean"
                        },
                        "image": {
                          "type": "boolean"
                        },
                        "ssh": {
                          "type": "boolean"
                        },
                        "urls": {
                          "type": "boolean"
                        },
                        "private_urls": {
                          "type": "boolean"
                        },
                        "websocket": {
                          "type": "boolean"
                        },
                        "snapshot": {
                          "type": "boolean"
                        },
                        "dockerfile": {
                          "type": "boolean"
                        },
                        "compose": {
                          "type": "boolean"
                        },
                        "kubernetes": {
                          "type": "boolean"
                        },
                        "env": {
                          "type": "boolean"
                        },
                        "mcp": {
                          "type": "boolean"
                        },
                        "private_network": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "vm",
                        "servers",
                        "image",
                        "ssh",
                        "urls",
                        "private_urls",
                        "websocket",
                        "snapshot",
                        "dockerfile",
                        "compose",
                        "kubernetes",
                        "env",
                        "mcp",
                        "private_network"
                      ],
                      "additionalProperties": false
                    },
                    "status": {
                      "default": "connected",
                      "type": "string",
                      "enum": ["incomplete", "connected", "error"]
                    },
                    "verifiedAt": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "machine": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "cpus": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991
                            },
                            "memoryMib": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991
                            },
                            "vmMemoryMib": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991
                            },
                            "vmsMemoryGiB": {
                              "type": "number",
                              "minimum": 0
                            }
                          },
                          "required": ["cpus", "memoryMib", "vmMemoryMib", "vmsMemoryGiB"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "osImages": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "state": {
                              "type": "string",
                              "enum": ["ready", "preparing", "failed"]
                            },
                            "images": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "name": {
                                    "type": "string"
                                  },
                                  "ready": {
                                    "type": "boolean"
                                  }
                                },
                                "required": ["name", "ready"],
                                "additionalProperties": false
                              }
                            },
                            "lastError": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": ["state", "images", "lastError"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "hostFolders": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
                              },
                              "path": {
                                "type": "string",
                                "minLength": 2,
                                "maxLength": 4096
                              },
                              "readOnly": {
                                "type": "boolean"
                              }
                            },
                            "required": ["name", "path", "readOnly"],
                            "additionalProperties": false
                          }
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "customDomain": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "domain": {
                              "type": "string"
                            },
                            "status": {
                              "type": "string",
                              "enum": ["pending_dns", "pending_ssl", "active", "failed"]
                            },
                            "issuance": {
                              "type": "string",
                              "enum": ["acme", "uploaded"]
                            }
                          },
                          "required": ["domain", "status", "issuance"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "setup": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "steps": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "name": {
                                    "type": "string",
                                    "enum": ["firewall", "connect", "domain", "reach", "default"]
                                  },
                                  "state": {
                                    "type": "string",
                                    "enum": ["done", "current", "todo", "unchecked"]
                                  },
                                  "how": {
                                    "type": "object",
                                    "properties": {
                                      "summary": {
                                        "type": "string"
                                      },
                                      "tools": {
                                        "type": "array",
                                        "items": {
                                          "type": "string"
                                        }
                                      },
                                      "cli": {
                                        "type": "array",
                                        "items": {
                                          "type": "string"
                                        }
                                      },
                                      "ui": {
                                        "type": "string"
                                      },
                                      "question": {
                                        "type": "string"
                                      }
                                    },
                                    "required": ["summary", "tools", "cli", "ui"],
                                    "additionalProperties": false
                                  }
                                },
                                "required": ["name", "state", "how"],
                                "additionalProperties": false
                              }
                            },
                            "next": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": ["firewall", "connect", "domain", "reach", "default"]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": ["steps", "next"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "lastReach": {
                      "default": null,
                      "anyOf": [
                        {
                          "oneOf": [
                            {
                              "type": "object",
                              "properties": {
                                "ok": {
                                  "type": "boolean",
                                  "const": true
                                },
                                "name": {
                                  "type": "string"
                                },
                                "address": {
                                  "type": "string"
                                }
                              },
                              "required": ["ok", "name", "address"],
                              "additionalProperties": false
                            },
                            {
                              "type": "object",
                              "properties": {
                                "ok": {
                                  "type": "boolean",
                                  "const": false
                                },
                                "name": {
                                  "type": "string"
                                },
                                "reason": {
                                  "type": "string",
                                  "enum": [
                                    "no_address",
                                    "private_address",
                                    "unreachable",
                                    "other_certificate",
                                    "stale_certificate",
                                    "not_ghostdock"
                                  ]
                                },
                                "address": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "certificateName": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "message": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "ok",
                                "name",
                                "reason",
                                "address",
                                "certificateName",
                                "message"
                              ],
                              "additionalProperties": false
                            }
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "address": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "value": {
                              "type": "string"
                            },
                            "type": {
                              "type": "string",
                              "enum": ["A", "AAAA", "CNAME"]
                            },
                            "source": {
                              "type": "string",
                              "enum": ["connection", "set"]
                            }
                          },
                          "required": ["value", "type", "source"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "lastError": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "createdAt": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "updatedAt": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "acceptsNewVms": {
                      "type": "boolean"
                    },
                    "shadows": {
                      "type": "boolean"
                    },
                    "shadowed": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "origin",
                    "kind",
                    "isDefault",
                    "capabilities",
                    "status",
                    "verifiedAt",
                    "machine",
                    "osImages",
                    "hostFolders",
                    "customDomain",
                    "setup",
                    "lastReach",
                    "address",
                    "lastError",
                    "createdAt",
                    "updatedAt",
                    "acceptsNewVms",
                    "shadows",
                    "shadowed"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "defaultProviderId",
              "inheritsPlatformDefault",
              "platformDefaultProviderId",
              "items"
            ],
            "additionalProperties": false
          },
          "reach": {
            "anyOf": [
              {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "ok": {
                        "type": "boolean",
                        "const": true
                      },
                      "name": {
                        "type": "string"
                      },
                      "address": {
                        "type": "string"
                      }
                    },
                    "required": ["ok", "name", "address"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "ok": {
                        "type": "boolean",
                        "const": false
                      },
                      "name": {
                        "type": "string"
                      },
                      "reason": {
                        "type": "string",
                        "enum": [
                          "no_address",
                          "private_address",
                          "unreachable",
                          "other_certificate",
                          "stale_certificate",
                          "not_ghostdock"
                        ]
                      },
                      "address": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "certificateName": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "message": {
                        "type": "string"
                      }
                    },
                    "required": ["ok", "name", "reason", "address", "certificateName", "message"],
                    "additionalProperties": false
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["provider", "catalog", "reach"],
        "additionalProperties": false
      },
      "ProviderStatusInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          }
        },
        "required": ["organization", "provider"],
        "additionalProperties": false
      },
      "ProviderStatusOutput": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": ["incomplete", "connected", "error"]
          },
          "lastError": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "failing": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "detail": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "since": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                },
                "blocking": {
                  "type": "boolean"
                },
                "vms": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": ["name", "detail", "since", "blocking", "vms"],
              "additionalProperties": false
            }
          },
          "release": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "current": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "latest": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "state": {
                    "type": "string",
                    "enum": ["current", "outdated", "unsupported", "blocked", "unknown"]
                  },
                  "unsupportedAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "canUpdate": {
                    "type": "boolean"
                  },
                  "autoUpdate": {
                    "type": "boolean"
                  },
                  "update": {
                    "default": null,
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "toVersion": {
                            "type": "string"
                          },
                          "step": {
                            "type": "string",
                            "enum": ["download", "replace", "health", "done"]
                          },
                          "progress": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "done": {
                                    "type": "number"
                                  },
                                  "total": {
                                    "type": "number"
                                  },
                                  "unit": {
                                    "type": "string",
                                    "enum": ["bytes", "percent"]
                                  }
                                },
                                "required": ["done", "total", "unit"],
                                "additionalProperties": false
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "startedAt": {
                            "type": "string",
                            "format": "date-time",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                          }
                        },
                        "required": ["id", "toVersion", "step", "progress", "startedAt"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "current",
                  "latest",
                  "state",
                  "unsupportedAt",
                  "canUpdate",
                  "autoUpdate",
                  "update"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "setup": {
            "default": null,
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "steps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "enum": ["firewall", "connect", "domain", "reach", "default"]
                        },
                        "state": {
                          "type": "string",
                          "enum": ["done", "current", "todo", "unchecked"]
                        },
                        "how": {
                          "type": "object",
                          "properties": {
                            "summary": {
                              "type": "string"
                            },
                            "tools": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "cli": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "ui": {
                              "type": "string"
                            },
                            "question": {
                              "type": "string"
                            }
                          },
                          "required": ["summary", "tools", "cli", "ui"],
                          "additionalProperties": false
                        }
                      },
                      "required": ["name", "state", "how"],
                      "additionalProperties": false
                    }
                  },
                  "next": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["firewall", "connect", "domain", "reach", "default"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["steps", "next"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["status", "lastError", "failing", "release", "setup"],
        "additionalProperties": false
      },
      "ProviderUpdateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          }
        },
        "required": ["organization", "provider"],
        "additionalProperties": false
      },
      "ProviderUpdateOutput": {
        "type": "object",
        "properties": {
          "version": {
            "type": "string"
          },
          "updateId": {
            "type": "string"
          }
        },
        "required": ["version", "updateId"],
        "additionalProperties": false
      },
      "ProviderUpdateListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          }
        },
        "required": ["organization", "provider"],
        "additionalProperties": false
      },
      "ProviderUpdateListOutput": {
        "type": "object",
        "properties": {
          "updates": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "fromVersion": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "toVersion": {
                  "type": "string"
                },
                "trigger": {
                  "type": "string",
                  "enum": ["manual", "auto"]
                },
                "startedBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["id", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "startedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                },
                "finishedAt": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "outcome": {
                  "type": "string",
                  "enum": ["running", "updated", "rolled_back", "failed", "lost"]
                },
                "step": {
                  "type": "string",
                  "enum": ["download", "replace", "health", "done"]
                },
                "reason": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "hasLog": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "fromVersion",
                "toVersion",
                "trigger",
                "startedBy",
                "startedAt",
                "finishedAt",
                "outcome",
                "step",
                "reason",
                "hasLog"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["updates"],
        "additionalProperties": false
      },
      "ProviderUpdateLogInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          },
          "update": {
            "type": "string",
            "minLength": 1,
            "description": "The update id, from provider_update_list or provider_update."
          }
        },
        "required": ["organization", "provider", "update"],
        "additionalProperties": false
      },
      "ProviderUpdateLogOutput": {
        "type": "object",
        "properties": {
          "update": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "fromVersion": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "toVersion": {
                "type": "string"
              },
              "trigger": {
                "type": "string",
                "enum": ["manual", "auto"]
              },
              "startedBy": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": ["id", "name"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              "finishedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "outcome": {
                "type": "string",
                "enum": ["running", "updated", "rolled_back", "failed", "lost"]
              },
              "step": {
                "type": "string",
                "enum": ["download", "replace", "health", "done"]
              },
              "reason": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasLog": {
                "type": "boolean"
              }
            },
            "required": [
              "id",
              "fromVersion",
              "toVersion",
              "trigger",
              "startedBy",
              "startedAt",
              "finishedAt",
              "outcome",
              "step",
              "reason",
              "hasLog"
            ],
            "additionalProperties": false
          },
          "log": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["update", "log"],
        "additionalProperties": false
      },
      "ProviderSetAutoUpdateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          },
          "enabled": {
            "type": "boolean",
            "description": "true to update automatically, false to update only by hand."
          }
        },
        "required": ["organization", "provider", "enabled"],
        "additionalProperties": false
      },
      "ProviderSetAutoUpdateOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "defaultProviderId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "inheritsPlatformDefault": {
            "type": "boolean"
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "ProviderSetAddressInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Provider name or id, from provider_list."
          },
          "address": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 253
              },
              {
                "type": "null"
              }
            ],
            "description": "An IPv4 or IPv6 address or a host name, such as 203.0.113.7 or home.example.net. null: the address the host connects from."
          }
        },
        "required": ["organization", "provider", "address"],
        "additionalProperties": false
      },
      "ProviderSetAddressOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "defaultProviderId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "inheritsPlatformDefault": {
            "type": "boolean"
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "SnapshotListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "SnapshotListOutput": {
        "type": "object",
        "properties": {
          "snapshots": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "provider": {
                  "type": "string",
                  "enum": ["microvm", "incus"]
                },
                "providerId": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["organization"]
                },
                "status": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["pending", "active", "error"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "image": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "resources": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "cpu": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "memoryGiB": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "diskGiB": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": ["cpu", "memoryGiB", "diskGiB"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "description": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "vmCount": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "manifest": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "urls": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "target": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 200,
                                    "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "port": {
                                "type": "integer",
                                "minimum": -9007199254740991,
                                "maximum": 9007199254740991
                              },
                              "autoWake": {
                                "type": "boolean"
                              },
                              "access": {
                                "type": "string",
                                "enum": ["organization", "public"]
                              },
                              "required": {
                                "default": false,
                                "type": "boolean"
                              },
                              "protocol": {
                                "default": "http",
                                "type": "string",
                                "enum": ["http", "tcp"]
                              },
                              "title": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            },
                            "required": ["port", "autoWake", "access", "required", "protocol"],
                            "additionalProperties": false
                          }
                        },
                        "env": {
                          "type": "array",
                          "items": {
                            "oneOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "name": {
                                    "type": "string",
                                    "maxLength": 128
                                  },
                                  "kind": {
                                    "type": "string",
                                    "const": "variable"
                                  },
                                  "required": {
                                    "type": "boolean"
                                  },
                                  "value": {
                                    "type": "string",
                                    "maxLength": 32768
                                  },
                                  "comment": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "title": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 100
                                  },
                                  "description": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 500
                                  },
                                  "choice": {
                                    "type": "string",
                                    "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                                  }
                                },
                                "required": ["name", "kind", "required"],
                                "additionalProperties": false
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "name": {
                                    "type": "string",
                                    "maxLength": 128
                                  },
                                  "kind": {
                                    "type": "string",
                                    "const": "secret"
                                  },
                                  "required": {
                                    "type": "boolean"
                                  },
                                  "hasValue": {
                                    "type": "boolean"
                                  },
                                  "comment": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "title": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 100
                                  },
                                  "description": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 500
                                  },
                                  "choice": {
                                    "type": "string",
                                    "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                                  }
                                },
                                "required": ["name", "kind", "required", "hasValue"],
                                "additionalProperties": false
                              }
                            ]
                          }
                        },
                        "choices": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,39}$"
                              },
                              "title": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 100
                              },
                              "required": {
                                "type": "boolean"
                              },
                              "choice": {
                                "type": "string",
                                "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                              },
                              "options": {
                                "minItems": 1,
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "id": {
                                      "type": "string",
                                      "pattern": "^[a-z][a-z0-9_]{0,39}$"
                                    },
                                    "title": {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 100
                                    }
                                  },
                                  "required": ["id"],
                                  "additionalProperties": false
                                }
                              }
                            },
                            "required": ["id", "required", "options"],
                            "additionalProperties": false
                          }
                        },
                        "mcp": {
                          "default": [],
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "maxLength": 64,
                                "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                              },
                              "port": {
                                "type": "integer",
                                "minimum": -9007199254740991,
                                "maximum": 9007199254740991
                              },
                              "path": {
                                "default": "/mcp",
                                "type": "string"
                              },
                              "autoWake": {
                                "type": "boolean"
                              },
                              "required": {
                                "default": false,
                                "type": "boolean"
                              }
                            },
                            "required": ["name", "port", "path", "autoWake", "required"],
                            "additionalProperties": false
                          }
                        },
                        "files": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "role": {
                                "type": "string",
                                "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                              },
                              "path": {
                                "type": "string",
                                "minLength": 1
                              },
                              "required": {
                                "type": "boolean"
                              },
                              "description": {
                                "type": "string"
                              }
                            },
                            "required": ["role", "path", "required"],
                            "additionalProperties": false
                          }
                        },
                        "forwards": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "port": {
                                "type": "integer",
                                "minimum": -9007199254740991,
                                "maximum": 9007199254740991
                              },
                              "target": {
                                "type": "string",
                                "maxLength": 200,
                                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                              },
                              "containerPort": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 65535
                              }
                            },
                            "required": ["port", "target", "containerPort"],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": ["urls", "env", "mcp"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "requiredEnvironment": {
                  "anyOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "requiredUrls": {
                  "anyOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "target": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 200,
                                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "port": {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["target", "port"],
                        "additionalProperties": false
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "requiredMcps": {
                  "anyOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "id",
                "name",
                "provider",
                "providerId",
                "kind",
                "status",
                "image",
                "resources",
                "description",
                "vmCount",
                "manifest",
                "requiredEnvironment",
                "requiredUrls",
                "requiredMcps"
              ],
              "additionalProperties": false
            }
          },
          "note": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": ["snapshots", "note"],
        "additionalProperties": false
      },
      "SnapshotCreateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Snapshot name, unique in the organization."
          },
          "stopAndResume": {
            "description": "When the VM is running: stop it, snapshot, then start it again. Without this it must already be stopped.",
            "type": "boolean"
          },
          "includeSecretValues": {
            "description": "Names of VM-local secrets whose values to embed in the snapshot. Organization secrets cannot be copied.",
            "maxItems": 500,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "manifest": {
            "description": "Replaces the captured URLs and environment entirely (no merge). Secret values are stored encrypted.",
            "type": "object",
            "properties": {
              "urls": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "target": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "autoWake": {
                      "type": "boolean"
                    },
                    "access": {
                      "type": "string",
                      "enum": ["organization", "public"]
                    },
                    "required": {
                      "default": false,
                      "type": "boolean"
                    },
                    "protocol": {
                      "default": "http",
                      "type": "string",
                      "enum": ["http", "tcp"]
                    },
                    "title": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 40
                    }
                  },
                  "required": ["port", "autoWake", "access"],
                  "additionalProperties": false
                }
              },
              "env": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 128
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "value": {
                      "type": "string",
                      "maxLength": 32768
                    },
                    "comment": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "title": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "description": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500
                    },
                    "choice": {
                      "type": "string",
                      "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                    }
                  },
                  "required": ["name", "kind", "required"],
                  "additionalProperties": false
                }
              },
              "choices": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_]{0,39}$"
                    },
                    "title": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "choice": {
                      "type": "string",
                      "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                    },
                    "options": {
                      "minItems": 1,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_]{0,39}$"
                          },
                          "title": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 100
                          }
                        },
                        "required": ["id"],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": ["id", "required", "options"],
                  "additionalProperties": false
                }
              },
              "mcp": {
                "default": [],
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 64,
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                    },
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "path": {
                      "default": "/mcp",
                      "type": "string"
                    },
                    "autoWake": {
                      "type": "boolean"
                    },
                    "required": {
                      "default": false,
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "port", "autoWake"],
                  "additionalProperties": false
                }
              },
              "files": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "role": {
                      "type": "string",
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                    },
                    "path": {
                      "type": "string",
                      "minLength": 1
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "description": {
                      "type": "string"
                    }
                  },
                  "required": ["role", "path", "required"],
                  "additionalProperties": false
                }
              },
              "forwards": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "target": {
                      "type": "string",
                      "maxLength": 200,
                      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                    },
                    "containerPort": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    }
                  },
                  "required": ["port", "target", "containerPort"],
                  "additionalProperties": false
                }
              }
            },
            "required": ["urls", "env"],
            "additionalProperties": false
          }
        },
        "required": ["organization", "vm", "name"],
        "additionalProperties": false
      },
      "SnapshotCreateOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "provider": {
            "type": "string",
            "enum": ["microvm", "incus"]
          },
          "providerId": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": ["organization"]
          },
          "status": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["pending", "active", "error"]
              },
              {
                "type": "null"
              }
            ]
          },
          "image": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "resources": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "cpu": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "memoryGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "diskGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["cpu", "memoryGiB", "diskGiB"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "vmCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "manifest": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "urls": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "target": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "access": {
                          "type": "string",
                          "enum": ["organization", "public"]
                        },
                        "required": {
                          "default": false,
                          "type": "boolean"
                        },
                        "protocol": {
                          "default": "http",
                          "type": "string",
                          "enum": ["http", "tcp"]
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": ["port", "autoWake", "access", "required", "protocol"],
                      "additionalProperties": false
                    }
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "value": {
                              "type": "string",
                              "maxLength": 32768
                            },
                            "comment": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            "choice": {
                              "type": "string",
                              "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                            }
                          },
                          "required": ["name", "kind", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "hasValue": {
                              "type": "boolean"
                            },
                            "comment": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            "choice": {
                              "type": "string",
                              "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                            }
                          },
                          "required": ["name", "kind", "required", "hasValue"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  },
                  "choices": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,39}$"
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "choice": {
                          "type": "string",
                          "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                        },
                        "options": {
                          "minItems": 1,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,39}$"
                              },
                              "title": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 100
                              }
                            },
                            "required": ["id"],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": ["id", "required", "options"],
                      "additionalProperties": false
                    }
                  },
                  "mcp": {
                    "default": [],
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "path": {
                          "default": "/mcp",
                          "type": "string"
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "required": {
                          "default": false,
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "port", "path", "autoWake", "required"],
                      "additionalProperties": false
                    }
                  },
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "role": {
                          "type": "string",
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "path": {
                          "type": "string",
                          "minLength": 1
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "description": {
                          "type": "string"
                        }
                      },
                      "required": ["role", "path", "required"],
                      "additionalProperties": false
                    }
                  },
                  "forwards": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "target": {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        "containerPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        }
                      },
                      "required": ["port", "target", "containerPort"],
                      "additionalProperties": false
                    }
                  }
                },
                "required": ["urls", "env", "mcp"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredEnvironment": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredUrls": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "target": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    }
                  },
                  "required": ["target", "port"],
                  "additionalProperties": false
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredMcps": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "timedOut": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "name",
          "provider",
          "providerId",
          "kind",
          "status",
          "image",
          "resources",
          "description",
          "vmCount",
          "manifest",
          "requiredEnvironment",
          "requiredUrls",
          "requiredMcps",
          "timedOut"
        ],
        "additionalProperties": false
      },
      "SnapshotGetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "snapshotId": {
            "type": "string",
            "minLength": 1,
            "description": "Snapshot id from snapshot_list (the provider snapshot name), its database id, or its name."
          }
        },
        "required": ["organization", "snapshotId"],
        "additionalProperties": false
      },
      "SnapshotGetOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "provider": {
            "type": "string",
            "enum": ["microvm", "incus"]
          },
          "providerId": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": ["organization"]
          },
          "status": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["pending", "active", "error"]
              },
              {
                "type": "null"
              }
            ]
          },
          "image": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "resources": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "cpu": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "memoryGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "diskGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["cpu", "memoryGiB", "diskGiB"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "vmCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "manifest": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "urls": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "target": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "access": {
                          "type": "string",
                          "enum": ["organization", "public"]
                        },
                        "required": {
                          "default": false,
                          "type": "boolean"
                        },
                        "protocol": {
                          "default": "http",
                          "type": "string",
                          "enum": ["http", "tcp"]
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": ["port", "autoWake", "access", "required", "protocol"],
                      "additionalProperties": false
                    }
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "value": {
                              "type": "string",
                              "maxLength": 32768
                            },
                            "comment": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            "choice": {
                              "type": "string",
                              "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                            }
                          },
                          "required": ["name", "kind", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "hasValue": {
                              "type": "boolean"
                            },
                            "comment": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            "choice": {
                              "type": "string",
                              "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                            }
                          },
                          "required": ["name", "kind", "required", "hasValue"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  },
                  "choices": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,39}$"
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "choice": {
                          "type": "string",
                          "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                        },
                        "options": {
                          "minItems": 1,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,39}$"
                              },
                              "title": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 100
                              }
                            },
                            "required": ["id"],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": ["id", "required", "options"],
                      "additionalProperties": false
                    }
                  },
                  "mcp": {
                    "default": [],
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "path": {
                          "default": "/mcp",
                          "type": "string"
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "required": {
                          "default": false,
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "port", "path", "autoWake", "required"],
                      "additionalProperties": false
                    }
                  },
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "role": {
                          "type": "string",
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "path": {
                          "type": "string",
                          "minLength": 1
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "description": {
                          "type": "string"
                        }
                      },
                      "required": ["role", "path", "required"],
                      "additionalProperties": false
                    }
                  },
                  "forwards": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "target": {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        "containerPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        }
                      },
                      "required": ["port", "target", "containerPort"],
                      "additionalProperties": false
                    }
                  }
                },
                "required": ["urls", "env", "mcp"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredEnvironment": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredUrls": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "target": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    }
                  },
                  "required": ["target", "port"],
                  "additionalProperties": false
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredMcps": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "name",
          "provider",
          "providerId",
          "kind",
          "status",
          "image",
          "resources",
          "description",
          "vmCount",
          "manifest",
          "requiredEnvironment",
          "requiredUrls",
          "requiredMcps"
        ],
        "additionalProperties": false
      },
      "SnapshotDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "snapshotId": {
            "type": "string",
            "minLength": 1,
            "description": "Snapshot id from snapshot_list (the provider snapshot name), its database id, or its name."
          }
        },
        "required": ["organization", "snapshotId"],
        "additionalProperties": false
      },
      "SnapshotDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "SnapshotUpdateManifestInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "snapshotId": {
            "type": "string",
            "minLength": 1,
            "description": "Snapshot id from snapshot_list (the provider snapshot name), its database id, or its name."
          },
          "manifest": {
            "type": "object",
            "properties": {
              "urls": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "target": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "autoWake": {
                      "type": "boolean"
                    },
                    "access": {
                      "type": "string",
                      "enum": ["organization", "public"]
                    },
                    "required": {
                      "default": false,
                      "type": "boolean"
                    },
                    "protocol": {
                      "default": "http",
                      "type": "string",
                      "enum": ["http", "tcp"]
                    },
                    "title": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 40
                    }
                  },
                  "required": ["port", "autoWake", "access"],
                  "additionalProperties": false
                }
              },
              "env": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 128
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "value": {
                      "type": "string",
                      "maxLength": 32768
                    },
                    "comment": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "title": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "description": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500
                    },
                    "choice": {
                      "type": "string",
                      "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                    }
                  },
                  "required": ["name", "kind", "required"],
                  "additionalProperties": false
                }
              },
              "choices": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_]{0,39}$"
                    },
                    "title": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "choice": {
                      "type": "string",
                      "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                    },
                    "options": {
                      "minItems": 1,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_]{0,39}$"
                          },
                          "title": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 100
                          }
                        },
                        "required": ["id"],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": ["id", "required", "options"],
                  "additionalProperties": false
                }
              },
              "mcp": {
                "default": [],
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 64,
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                    },
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "path": {
                      "default": "/mcp",
                      "type": "string"
                    },
                    "autoWake": {
                      "type": "boolean"
                    },
                    "required": {
                      "default": false,
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "port", "autoWake"],
                  "additionalProperties": false
                }
              },
              "files": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "role": {
                      "type": "string",
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                    },
                    "path": {
                      "type": "string",
                      "minLength": 1
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "description": {
                      "type": "string"
                    }
                  },
                  "required": ["role", "path", "required"],
                  "additionalProperties": false
                }
              },
              "forwards": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "target": {
                      "type": "string",
                      "maxLength": 200,
                      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                    },
                    "containerPort": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    }
                  },
                  "required": ["port", "target", "containerPort"],
                  "additionalProperties": false
                }
              }
            },
            "required": ["urls", "env"],
            "additionalProperties": false,
            "description": "The new manifest; replaces the stored one. Secret values are stored encrypted."
          }
        },
        "required": ["organization", "snapshotId", "manifest"],
        "additionalProperties": false
      },
      "SnapshotUpdateManifestOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "provider": {
            "type": "string",
            "enum": ["microvm", "incus"]
          },
          "providerId": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": ["organization"]
          },
          "status": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["pending", "active", "error"]
              },
              {
                "type": "null"
              }
            ]
          },
          "image": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "resources": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "cpu": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "memoryGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "diskGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["cpu", "memoryGiB", "diskGiB"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "vmCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "manifest": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "urls": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "target": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200,
                              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "access": {
                          "type": "string",
                          "enum": ["organization", "public"]
                        },
                        "required": {
                          "default": false,
                          "type": "boolean"
                        },
                        "protocol": {
                          "default": "http",
                          "type": "string",
                          "enum": ["http", "tcp"]
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": ["port", "autoWake", "access", "required", "protocol"],
                      "additionalProperties": false
                    }
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "value": {
                              "type": "string",
                              "maxLength": 32768
                            },
                            "comment": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            "choice": {
                              "type": "string",
                              "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                            }
                          },
                          "required": ["name", "kind", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "maxLength": 128
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "hasValue": {
                              "type": "boolean"
                            },
                            "comment": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            "choice": {
                              "type": "string",
                              "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                            }
                          },
                          "required": ["name", "kind", "required", "hasValue"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  },
                  "choices": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,39}$"
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "choice": {
                          "type": "string",
                          "pattern": "^([a-z][a-z0-9_]{0,39})\\.([a-z][a-z0-9_]{0,39})$"
                        },
                        "options": {
                          "minItems": 1,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,39}$"
                              },
                              "title": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 100
                              }
                            },
                            "required": ["id"],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": ["id", "required", "options"],
                      "additionalProperties": false
                    }
                  },
                  "mcp": {
                    "default": [],
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "path": {
                          "default": "/mcp",
                          "type": "string"
                        },
                        "autoWake": {
                          "type": "boolean"
                        },
                        "required": {
                          "default": false,
                          "type": "boolean"
                        }
                      },
                      "required": ["name", "port", "path", "autoWake", "required"],
                      "additionalProperties": false
                    }
                  },
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "role": {
                          "type": "string",
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                        },
                        "path": {
                          "type": "string",
                          "minLength": 1
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "description": {
                          "type": "string"
                        }
                      },
                      "required": ["role", "path", "required"],
                      "additionalProperties": false
                    }
                  },
                  "forwards": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "port": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "target": {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        "containerPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        }
                      },
                      "required": ["port", "target", "containerPort"],
                      "additionalProperties": false
                    }
                  }
                },
                "required": ["urls", "env", "mcp"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredEnvironment": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredUrls": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "target": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    }
                  },
                  "required": ["target", "port"],
                  "additionalProperties": false
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "requiredMcps": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "name",
          "provider",
          "providerId",
          "kind",
          "status",
          "image",
          "resources",
          "description",
          "vmCount",
          "manifest",
          "requiredEnvironment",
          "requiredUrls",
          "requiredMcps"
        ],
        "additionalProperties": false
      },
      "VolumeListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "VolumeListOutput": {
        "type": "object",
        "properties": {
          "volumes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["disk", "shared", "host"]
                },
                "sizeGiB": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "hostFolder": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "path": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "readOnly": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": ["name", "path", "readOnly"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "usedBytes": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "usedMeasuredAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "status": {
                  "type": "string",
                  "enum": ["creating", "ready", "deleting", "error"]
                },
                "lastError": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "provider": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "name": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["microvm", "docker", "incus"]
                    }
                  },
                  "required": ["id", "name", "kind"],
                  "additionalProperties": false
                },
                "backing": {
                  "type": "string",
                  "enum": ["block", "nfs", "pool", "folder", "host"]
                },
                "backingNote": {
                  "type": "string"
                },
                "hostId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "attachments": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "vmId": {
                        "type": "string"
                      },
                      "vmName": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      },
                      "path": {
                        "type": "string"
                      },
                      "readOnly": {
                        "type": "boolean"
                      },
                      "state": {
                        "type": "string",
                        "enum": ["pending", "attached", "detaching"]
                      },
                      "atNextStart": {
                        "type": "boolean"
                      },
                      "guest": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "mounted": {
                                "type": "boolean"
                              },
                              "problem": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "busyBy": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "reportedAt": {
                                "type": "string"
                              }
                            },
                            "required": ["mounted", "problem", "busyBy", "reportedAt"],
                            "additionalProperties": false
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "vmId",
                      "vmName",
                      "name",
                      "path",
                      "readOnly",
                      "state",
                      "atNextStart",
                      "guest"
                    ],
                    "additionalProperties": false
                  }
                },
                "createdBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["id", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "ownerTokenId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "fileService": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "providerId": {
                          "type": "string"
                        },
                        "providerName": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "hostId": {
                          "type": "string"
                        },
                        "state": {
                          "type": "string",
                          "enum": ["running", "stopped"]
                        },
                        "lastClientSeenAt": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "providerId",
                        "providerName",
                        "hostId",
                        "state",
                        "lastClientSeenAt"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name",
                "kind",
                "sizeGiB",
                "hostFolder",
                "usedBytes",
                "usedMeasuredAt",
                "status",
                "lastError",
                "provider",
                "backing",
                "backingNote",
                "hostId",
                "attachments",
                "createdBy",
                "ownerTokenId",
                "fileService",
                "createdAt"
              ],
              "additionalProperties": false
            }
          },
          "fileServices": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "providerId": {
                  "type": "string"
                },
                "providerName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "hostId": {
                  "type": "string"
                },
                "state": {
                  "type": "string",
                  "enum": ["running", "stopped"]
                },
                "lastClientSeenAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": ["providerId", "providerName", "hostId", "state", "lastClientSeenAt"],
              "additionalProperties": false
            }
          }
        },
        "required": ["volumes", "fileServices"],
        "additionalProperties": false
      },
      "VolumeShowInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "volume": {
            "type": "string",
            "minLength": 1,
            "description": "Volume name (e.g. pgdata) or id, from volume_list."
          }
        },
        "required": ["organization", "volume"],
        "additionalProperties": false
      },
      "VolumeShowOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": ["disk", "shared", "host"]
          },
          "sizeGiB": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "hostFolder": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "path": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "readOnly": {
                    "anyOf": [
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["name", "path", "readOnly"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "usedBytes": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "usedMeasuredAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": ["creating", "ready", "deleting", "error"]
          },
          "lastError": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "provider": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "kind": {
                "type": "string",
                "enum": ["microvm", "docker", "incus"]
              }
            },
            "required": ["id", "name", "kind"],
            "additionalProperties": false
          },
          "backing": {
            "type": "string",
            "enum": ["block", "nfs", "pool", "folder", "host"]
          },
          "backingNote": {
            "type": "string"
          },
          "hostId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "vmId": {
                  "type": "string"
                },
                "vmName": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "readOnly": {
                  "type": "boolean"
                },
                "state": {
                  "type": "string",
                  "enum": ["pending", "attached", "detaching"]
                },
                "atNextStart": {
                  "type": "boolean"
                },
                "guest": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "mounted": {
                          "type": "boolean"
                        },
                        "problem": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "busyBy": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "reportedAt": {
                          "type": "string"
                        }
                      },
                      "required": ["mounted", "problem", "busyBy", "reportedAt"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "vmId",
                "vmName",
                "name",
                "path",
                "readOnly",
                "state",
                "atNextStart",
                "guest"
              ],
              "additionalProperties": false
            }
          },
          "createdBy": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": ["id", "name"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerTokenId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "fileService": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "providerId": {
                    "type": "string"
                  },
                  "providerName": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "hostId": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string",
                    "enum": ["running", "stopped"]
                  },
                  "lastClientSeenAt": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["providerId", "providerName", "hostId", "state", "lastClientSeenAt"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "kind",
          "sizeGiB",
          "hostFolder",
          "usedBytes",
          "usedMeasuredAt",
          "status",
          "lastError",
          "provider",
          "backing",
          "backingNote",
          "hostId",
          "attachments",
          "createdBy",
          "ownerTokenId",
          "fileService",
          "createdAt"
        ],
        "additionalProperties": false
      },
      "VolumeCreateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "name": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$",
            "description": "Unique in the organization; the Docker volume name in a VM by default."
          },
          "shared": {
            "description": "A shared folder instead of a disk.",
            "type": "boolean"
          },
          "sizeGiB": {
            "type": "integer",
            "minimum": 1,
            "maximum": 16384,
            "description": "Size in GiB (1–16384)."
          },
          "hostFolder": {
            "description": "A host folder instead: the name of a folder the provider’s host lists (provider_list hostFolders). It has no size and is never a shared folder.",
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
          },
          "provider": {
            "description": "Provider that keeps it, from provider_list; omitted: the organization’s default for VMs. A VM attaches only volumes of its own provider and host.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          }
        },
        "required": ["organization", "name"],
        "additionalProperties": false
      },
      "VolumeCreateOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": ["disk", "shared", "host"]
          },
          "sizeGiB": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "hostFolder": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "path": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "readOnly": {
                    "anyOf": [
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["name", "path", "readOnly"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "usedBytes": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "usedMeasuredAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": ["creating", "ready", "deleting", "error"]
          },
          "lastError": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "provider": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "kind": {
                "type": "string",
                "enum": ["microvm", "docker", "incus"]
              }
            },
            "required": ["id", "name", "kind"],
            "additionalProperties": false
          },
          "backing": {
            "type": "string",
            "enum": ["block", "nfs", "pool", "folder", "host"]
          },
          "backingNote": {
            "type": "string"
          },
          "hostId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "vmId": {
                  "type": "string"
                },
                "vmName": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "readOnly": {
                  "type": "boolean"
                },
                "state": {
                  "type": "string",
                  "enum": ["pending", "attached", "detaching"]
                },
                "atNextStart": {
                  "type": "boolean"
                },
                "guest": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "mounted": {
                          "type": "boolean"
                        },
                        "problem": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "busyBy": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "reportedAt": {
                          "type": "string"
                        }
                      },
                      "required": ["mounted", "problem", "busyBy", "reportedAt"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "vmId",
                "vmName",
                "name",
                "path",
                "readOnly",
                "state",
                "atNextStart",
                "guest"
              ],
              "additionalProperties": false
            }
          },
          "createdBy": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": ["id", "name"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerTokenId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "fileService": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "providerId": {
                    "type": "string"
                  },
                  "providerName": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "hostId": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string",
                    "enum": ["running", "stopped"]
                  },
                  "lastClientSeenAt": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["providerId", "providerName", "hostId", "state", "lastClientSeenAt"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "kind",
          "sizeGiB",
          "hostFolder",
          "usedBytes",
          "usedMeasuredAt",
          "status",
          "lastError",
          "provider",
          "backing",
          "backingNote",
          "hostId",
          "attachments",
          "createdBy",
          "ownerTokenId",
          "fileService",
          "createdAt"
        ],
        "additionalProperties": false
      },
      "VolumeResizeInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "volume": {
            "type": "string",
            "minLength": 1,
            "description": "Volume name (e.g. pgdata) or id, from volume_list."
          },
          "sizeGiB": {
            "type": "integer",
            "minimum": 1,
            "maximum": 16384,
            "description": "Size in GiB (1–16384)."
          }
        },
        "required": ["organization", "volume", "sizeGiB"],
        "additionalProperties": false
      },
      "VolumeResizeOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": ["disk", "shared", "host"]
          },
          "sizeGiB": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "hostFolder": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "path": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "readOnly": {
                    "anyOf": [
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["name", "path", "readOnly"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "usedBytes": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "usedMeasuredAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": ["creating", "ready", "deleting", "error"]
          },
          "lastError": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "provider": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "kind": {
                "type": "string",
                "enum": ["microvm", "docker", "incus"]
              }
            },
            "required": ["id", "name", "kind"],
            "additionalProperties": false
          },
          "backing": {
            "type": "string",
            "enum": ["block", "nfs", "pool", "folder", "host"]
          },
          "backingNote": {
            "type": "string"
          },
          "hostId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "vmId": {
                  "type": "string"
                },
                "vmName": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "readOnly": {
                  "type": "boolean"
                },
                "state": {
                  "type": "string",
                  "enum": ["pending", "attached", "detaching"]
                },
                "atNextStart": {
                  "type": "boolean"
                },
                "guest": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "mounted": {
                          "type": "boolean"
                        },
                        "problem": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "busyBy": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "reportedAt": {
                          "type": "string"
                        }
                      },
                      "required": ["mounted", "problem", "busyBy", "reportedAt"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "vmId",
                "vmName",
                "name",
                "path",
                "readOnly",
                "state",
                "atNextStart",
                "guest"
              ],
              "additionalProperties": false
            }
          },
          "createdBy": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": ["id", "name"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerTokenId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "fileService": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "providerId": {
                    "type": "string"
                  },
                  "providerName": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "hostId": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string",
                    "enum": ["running", "stopped"]
                  },
                  "lastClientSeenAt": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["providerId", "providerName", "hostId", "state", "lastClientSeenAt"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "kind",
          "sizeGiB",
          "hostFolder",
          "usedBytes",
          "usedMeasuredAt",
          "status",
          "lastError",
          "provider",
          "backing",
          "backingNote",
          "hostId",
          "attachments",
          "createdBy",
          "ownerTokenId",
          "fileService",
          "createdAt"
        ],
        "additionalProperties": false
      },
      "VolumeDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "volume": {
            "type": "string",
            "minLength": 1,
            "description": "Volume name (e.g. pgdata) or id, from volume_list."
          }
        },
        "required": ["organization", "volume"],
        "additionalProperties": false
      },
      "VolumeDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "message": {
            "type": "string"
          }
        },
        "required": ["ok", "message"],
        "additionalProperties": false
      },
      "VolumeReleaseInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "volume": {
            "type": "string",
            "minLength": 1,
            "description": "Volume name (e.g. pgdata) or id, from volume_list."
          }
        },
        "required": ["organization", "volume"],
        "additionalProperties": false
      },
      "VolumeReleaseOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": ["disk", "shared", "host"]
          },
          "sizeGiB": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "hostFolder": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "path": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "readOnly": {
                    "anyOf": [
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["name", "path", "readOnly"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "usedBytes": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "usedMeasuredAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": ["creating", "ready", "deleting", "error"]
          },
          "lastError": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "provider": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "kind": {
                "type": "string",
                "enum": ["microvm", "docker", "incus"]
              }
            },
            "required": ["id", "name", "kind"],
            "additionalProperties": false
          },
          "backing": {
            "type": "string",
            "enum": ["block", "nfs", "pool", "folder", "host"]
          },
          "backingNote": {
            "type": "string"
          },
          "hostId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "vmId": {
                  "type": "string"
                },
                "vmName": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "readOnly": {
                  "type": "boolean"
                },
                "state": {
                  "type": "string",
                  "enum": ["pending", "attached", "detaching"]
                },
                "atNextStart": {
                  "type": "boolean"
                },
                "guest": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "mounted": {
                          "type": "boolean"
                        },
                        "problem": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "busyBy": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "reportedAt": {
                          "type": "string"
                        }
                      },
                      "required": ["mounted", "problem", "busyBy", "reportedAt"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "vmId",
                "vmName",
                "name",
                "path",
                "readOnly",
                "state",
                "atNextStart",
                "guest"
              ],
              "additionalProperties": false
            }
          },
          "createdBy": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": ["id", "name"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerTokenId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "fileService": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "providerId": {
                    "type": "string"
                  },
                  "providerName": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "hostId": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string",
                    "enum": ["running", "stopped"]
                  },
                  "lastClientSeenAt": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["providerId", "providerName", "hostId", "state", "lastClientSeenAt"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "kind",
          "sizeGiB",
          "hostFolder",
          "usedBytes",
          "usedMeasuredAt",
          "status",
          "lastError",
          "provider",
          "backing",
          "backingNote",
          "hostId",
          "attachments",
          "createdBy",
          "ownerTokenId",
          "fileService",
          "createdAt"
        ],
        "additionalProperties": false
      },
      "VolumeFileListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "volume": {
            "type": "string",
            "minLength": 1,
            "description": "Volume name (e.g. pgdata) or id, from volume_list."
          },
          "path": {
            "description": "Folder inside the volume. Default /.",
            "type": "string",
            "minLength": 1,
            "maxLength": 4096
          }
        },
        "required": ["organization", "volume"],
        "additionalProperties": false
      },
      "VolumeFileListOutput": {
        "type": "object",
        "properties": {
          "entries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string",
                  "enum": ["file", "dir"]
                },
                "size": {
                  "type": "number"
                }
              },
              "required": ["path", "name", "type"],
              "additionalProperties": false
            }
          },
          "hidden": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "truncated": {
            "type": "boolean"
          },
          "readOnly": {
            "type": "boolean"
          },
          "kind": {
            "type": "string",
            "enum": ["disk", "shared", "host"]
          },
          "path": {
            "type": "string"
          }
        },
        "required": ["entries", "hidden", "truncated", "readOnly", "kind", "path"],
        "additionalProperties": false
      },
      "VolumeFileReadInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "volume": {
            "type": "string",
            "minLength": 1,
            "description": "Volume name (e.g. pgdata) or id, from volume_list."
          },
          "path": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4096,
            "description": "Path inside the volume: / for its root, else an absolute path such as /config/app.yml. A path with . or .. or an empty part is refused."
          },
          "encoding": {
            "description": "base64: always the bytes as base64, for a byte-exact copy. Omit: utf8 for text.",
            "type": "string",
            "enum": ["utf8", "base64"]
          }
        },
        "required": ["organization", "volume", "path"],
        "additionalProperties": false
      },
      "VolumeFileReadOutput": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "isBinary": {
            "type": "boolean"
          },
          "tooLarge": {
            "type": "boolean"
          },
          "content": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "base64": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "size": {
            "type": "number"
          }
        },
        "required": ["path", "isBinary", "tooLarge", "content", "base64", "size"],
        "additionalProperties": false
      },
      "VolumeFileWriteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "volume": {
            "type": "string",
            "minLength": 1,
            "description": "Volume name (e.g. pgdata) or id, from volume_list."
          },
          "path": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4096,
            "description": "Path inside the volume: / for its root, else an absolute path such as /config/app.yml. A path with . or .. or an empty part is refused."
          },
          "content": {
            "type": "string",
            "description": "The file’s bytes: utf8 text, or base64 when encoding is base64."
          },
          "encoding": {
            "description": "How to read content. Omit for utf8. base64 for bytes that are not text.",
            "type": "string",
            "enum": ["utf8", "base64"]
          }
        },
        "required": ["organization", "volume", "path", "content"],
        "additionalProperties": false
      },
      "VolumeFileWriteOutput": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "size": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": ["path", "size"],
        "additionalProperties": false
      },
      "VmVolumeAttachInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "source": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$",
            "description": "The volume, by name."
          },
          "name": {
            "description": "Its name in the VM (the Docker volume’s); default the volume’s name.",
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$"
          },
          "path": {
            "description": "Where it is mounted; default /mnt/volumes/<name>.",
            "type": "string"
          },
          "readOnly": {
            "description": "Mount it read-only in this VM.",
            "type": "boolean"
          },
          "shared": {
            "description": "Create it as a shared folder (only when missing).",
            "type": "boolean"
          },
          "sizeGiB": {
            "description": "Size when it is created here.",
            "type": "integer",
            "minimum": 1,
            "maximum": 16384
          }
        },
        "required": ["organization", "vm", "source"],
        "additionalProperties": false
      },
      "VmVolumeAttachOutput": {
        "type": "object",
        "properties": {
          "volume": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": ["disk", "shared", "host"]
          },
          "sizeGiB": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "created": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "readOnly": {
            "type": "boolean"
          },
          "takesEffect": {
            "type": "string",
            "enum": ["live", "next_start", "boot"]
          },
          "message": {
            "type": "string"
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "volume",
          "kind",
          "sizeGiB",
          "created",
          "name",
          "path",
          "readOnly",
          "takesEffect",
          "message",
          "warnings"
        ],
        "additionalProperties": false
      },
      "VmVolumeDetachInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "volume": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$",
            "description": "The attachment’s name in the VM, or the volume’s name."
          }
        },
        "required": ["organization", "vm", "volume"],
        "additionalProperties": false
      },
      "VmVolumeDetachOutput": {
        "type": "object",
        "properties": {
          "volume": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "takesEffect": {
            "type": "string",
            "enum": ["now", "next_start", "when_unused"]
          },
          "message": {
            "type": "string"
          },
          "busyBy": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": ["volume", "name", "takesEffect", "message"],
        "additionalProperties": false
      },
      "VmUrlListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmUrlListOutput": {
        "type": "object",
        "properties": {
          "urls": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "vmId": {
                  "type": "string"
                },
                "slug": {
                  "type": "string"
                },
                "protocol": {
                  "type": "string",
                  "enum": ["http", "tcp"]
                },
                "url": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "container": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "port": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                "autoWake": {
                  "type": "boolean"
                },
                "access": {
                  "type": "string",
                  "enum": ["organization", "public"]
                },
                "title": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sshTunnel": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "remoteHost": {
                          "type": "string",
                          "const": "127.0.0.1"
                        },
                        "remotePort": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "commandTemplate": {
                          "type": "string"
                        }
                      },
                      "required": ["remoteHost", "remotePort", "commandTemplate"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "connect": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "tlsFirst": {
                          "type": "boolean",
                          "const": true
                        },
                        "listenPort": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 65535
                        },
                        "note": {
                          "type": "string"
                        }
                      },
                      "required": ["tlsFirst", "listenPort", "note"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "id",
                "vmId",
                "slug",
                "protocol",
                "url",
                "container",
                "port",
                "autoWake",
                "access",
                "title",
                "sshTunnel",
                "connect"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["urls"],
        "additionalProperties": false
      },
      "VmUrlSetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "The target’s container, by name from vm_container_list (its own port, no published port needed; needs a VM on the current base image). Omit or null for a port of the VM itself. On the command line: `container:port`.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "description": "The target’s port: a port of the VM, or of the container when one is named. On the command line: `port` or `container:port`."
          },
          "protocol": {
            "description": "\"http\" (default for a new URL) or \"tcp\". TCP URLs use TLS and are public.",
            "type": "string",
            "enum": ["http", "tcp"]
          },
          "access": {
            "description": "\"organization\": only members of the organization, after logging in; \"public\": anyone on the internet. Default organization for HTTP; TCP has no login and is always public.",
            "type": "string",
            "enum": ["organization", "public"]
          },
          "autoWake": {
            "description": "Start the VM when the URL is visited (TCP: connected to) while it is stopped. Default false for a new URL.",
            "type": "boolean"
          },
          "title": {
            "description": "Name shown for the URL, up to 40 characters. A titled HTTP URL gets its own button on the VM card; TCP titles are shown in URL lists. Untitled HTTP URLs are listed under \"Open URL\". Null removes it.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 40
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["organization", "vm", "port"],
        "additionalProperties": false
      },
      "VmUrlSetOutput": {
        "type": "object",
        "properties": {
          "url": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "slug": {
                "type": "string"
              },
              "protocol": {
                "type": "string",
                "enum": ["http", "tcp"]
              },
              "url": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "port": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "autoWake": {
                "type": "boolean"
              },
              "access": {
                "type": "string",
                "enum": ["organization", "public"]
              },
              "title": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "sshTunnel": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "remoteHost": {
                        "type": "string",
                        "const": "127.0.0.1"
                      },
                      "remotePort": {
                        "type": "integer",
                        "minimum": -9007199254740991,
                        "maximum": 9007199254740991
                      },
                      "commandTemplate": {
                        "type": "string"
                      }
                    },
                    "required": ["remoteHost", "remotePort", "commandTemplate"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "connect": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "tlsFirst": {
                        "type": "boolean",
                        "const": true
                      },
                      "listenPort": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 65535
                      },
                      "note": {
                        "type": "string"
                      }
                    },
                    "required": ["tlsFirst", "listenPort", "note"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "id",
              "vmId",
              "slug",
              "protocol",
              "url",
              "container",
              "port",
              "autoWake",
              "access",
              "title",
              "sshTunnel",
              "connect"
            ],
            "additionalProperties": false
          },
          "created": {
            "type": "boolean"
          }
        },
        "required": ["url", "created"],
        "additionalProperties": false
      },
      "VmUrlNewNameInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "The target’s container, by name from vm_container_list (its own port, no published port needed; needs a VM on the current base image). Omit or null for a port of the VM itself. On the command line: `container:port`.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "description": "The target’s port: a port of the VM, or of the container when one is named. On the command line: `port` or `container:port`."
          }
        },
        "required": ["organization", "vm", "port"],
        "additionalProperties": false
      },
      "VmUrlNewNameOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "protocol": {
            "type": "string",
            "enum": ["http", "tcp"]
          },
          "url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "autoWake": {
            "type": "boolean"
          },
          "access": {
            "type": "string",
            "enum": ["organization", "public"]
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sshTunnel": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "remoteHost": {
                    "type": "string",
                    "const": "127.0.0.1"
                  },
                  "remotePort": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "commandTemplate": {
                    "type": "string"
                  }
                },
                "required": ["remoteHost", "remotePort", "commandTemplate"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "connect": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "tlsFirst": {
                    "type": "boolean",
                    "const": true
                  },
                  "listenPort": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 65535
                  },
                  "note": {
                    "type": "string"
                  }
                },
                "required": ["tlsFirst", "listenPort", "note"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "vmId",
          "slug",
          "protocol",
          "url",
          "container",
          "port",
          "autoWake",
          "access",
          "title",
          "sshTunnel",
          "connect"
        ],
        "additionalProperties": false
      },
      "VmUrlMoveInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "The target’s container, by name from vm_container_list (its own port, no published port needed; needs a VM on the current base image). Omit or null for a port of the VM itself. On the command line: `container:port`.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "description": "The target’s port: a port of the VM, or of the container when one is named. On the command line: `port` or `container:port`."
          },
          "toContainer": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
              },
              {
                "type": "null"
              }
            ],
            "description": "The container it reaches from now on, by name; null (on the command line: null) for a port of the VM itself."
          }
        },
        "required": ["organization", "vm", "port", "toContainer"],
        "additionalProperties": false
      },
      "VmUrlMoveOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "protocol": {
            "type": "string",
            "enum": ["http", "tcp"]
          },
          "url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "autoWake": {
            "type": "boolean"
          },
          "access": {
            "type": "string",
            "enum": ["organization", "public"]
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sshTunnel": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "remoteHost": {
                    "type": "string",
                    "const": "127.0.0.1"
                  },
                  "remotePort": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "commandTemplate": {
                    "type": "string"
                  }
                },
                "required": ["remoteHost", "remotePort", "commandTemplate"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "connect": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "tlsFirst": {
                    "type": "boolean",
                    "const": true
                  },
                  "listenPort": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 65535
                  },
                  "note": {
                    "type": "string"
                  }
                },
                "required": ["tlsFirst", "listenPort", "note"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "vmId",
          "slug",
          "protocol",
          "url",
          "container",
          "port",
          "autoWake",
          "access",
          "title",
          "sshTunnel",
          "connect"
        ],
        "additionalProperties": false
      },
      "VmUrlDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "The target’s container, by name from vm_container_list (its own port, no published port needed; needs a VM on the current base image). Omit or null for a port of the VM itself. On the command line: `container:port`.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "description": "The target’s port: a port of the VM, or of the container when one is named. On the command line: `port` or `container:port`."
          }
        },
        "required": ["organization", "vm", "port"],
        "additionalProperties": false
      },
      "VmUrlDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "VmShareLinkListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "The target’s container, by name from vm_container_list (its own port, no published port needed; needs a VM on the current base image). Omit or null for a port of the VM itself. On the command line: `container:port`. Omit with port omitted: every link of the VM.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "description": "The target’s port: a port of the VM, or of the container when one is named. On the command line: `port` or `container:port`. Omit: every port.",
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmShareLinkListOutput": {
        "type": "object",
        "properties": {
          "shareLinks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "vmId": {
                  "type": "string"
                },
                "container": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "port": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                "name": {
                  "type": "string"
                },
                "url": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "idleMinutes": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "maxLifetimeMinutes": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "expiresAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "maxExpiresAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "expired": {
                  "type": "boolean"
                },
                "autoWake": {
                  "type": "boolean"
                },
                "lastUsedAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "vmId",
                "container",
                "port",
                "name",
                "url",
                "idleMinutes",
                "maxLifetimeMinutes",
                "expiresAt",
                "maxExpiresAt",
                "expired",
                "autoWake",
                "lastUsedAt",
                "createdAt"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["shareLinks"],
        "additionalProperties": false
      },
      "VmShareLinkSetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "The target’s container, by name from vm_container_list (its own port, no published port needed; needs a VM on the current base image). Omit or null for a port of the VM itself. On the command line: `container:port`.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "description": "The target’s port: a port of the VM, or of the container when one is named. On the command line: `port` or `container:port`."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The link’s name, unique per port, for example who it is for. It finds the link again."
          },
          "idleMinutes": {
            "description": "Minutes without use before the link expires; each use pushes it out. At least 5; null: use does not matter. Default 60 for a new link. On the command line also 90m, 2h, 1d or off.",
            "anyOf": [
              {
                "type": "integer",
                "minimum": 5,
                "maximum": 525600
              },
              {
                "type": "null"
              }
            ]
          },
          "maxLifetimeMinutes": {
            "description": "The longest the link lasts, in minutes from now. Null: no limit (with idleMinutes null too, it never expires). Default 10080 (7 days) for a new link. On the command line also 1h, 7d, 4w or off.",
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1,
                "maximum": 525600
              },
              {
                "type": "null"
              }
            ]
          },
          "autoWake": {
            "description": "Start the VM when someone visits the link while it is stopped. Default true.",
            "type": "boolean"
          },
          "rename": {
            "description": "A new name for the link.",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": ["organization", "vm", "port", "name"],
        "additionalProperties": false
      },
      "VmShareLinkSetOutput": {
        "type": "object",
        "properties": {
          "shareLink": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "port": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "name": {
                "type": "string"
              },
              "url": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "idleMinutes": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "maxLifetimeMinutes": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "expiresAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "maxExpiresAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "expired": {
                "type": "boolean"
              },
              "autoWake": {
                "type": "boolean"
              },
              "lastUsedAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "createdAt": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "vmId",
              "container",
              "port",
              "name",
              "url",
              "idleMinutes",
              "maxLifetimeMinutes",
              "expiresAt",
              "maxExpiresAt",
              "expired",
              "autoWake",
              "lastUsedAt",
              "createdAt"
            ],
            "additionalProperties": false
          },
          "created": {
            "type": "boolean"
          }
        },
        "required": ["shareLink", "created"],
        "additionalProperties": false
      },
      "VmShareLinkReplaceInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "The target’s container, by name from vm_container_list (its own port, no published port needed; needs a VM on the current base image). Omit or null for a port of the VM itself. On the command line: `container:port`.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "description": "The target’s port: a port of the VM, or of the container when one is named. On the command line: `port` or `container:port`."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The link’s name."
          }
        },
        "required": ["organization", "vm", "port", "name"],
        "additionalProperties": false
      },
      "VmShareLinkReplaceOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "name": {
            "type": "string"
          },
          "url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleMinutes": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "maxLifetimeMinutes": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "expiresAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "maxExpiresAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "expired": {
            "type": "boolean"
          },
          "autoWake": {
            "type": "boolean"
          },
          "lastUsedAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "vmId",
          "container",
          "port",
          "name",
          "url",
          "idleMinutes",
          "maxLifetimeMinutes",
          "expiresAt",
          "maxExpiresAt",
          "expired",
          "autoWake",
          "lastUsedAt",
          "createdAt"
        ],
        "additionalProperties": false
      },
      "VmShareLinkDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "The target’s container, by name from vm_container_list (its own port, no published port needed; needs a VM on the current base image). Omit or null for a port of the VM itself. On the command line: `container:port`.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "description": "The target’s port: a port of the VM, or of the container when one is named. On the command line: `port` or `container:port`."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The link’s name."
          }
        },
        "required": ["organization", "vm", "port", "name"],
        "additionalProperties": false
      },
      "VmShareLinkDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "VmForwardListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmForwardListOutput": {
        "type": "object",
        "properties": {
          "forwards": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "vmId": {
                  "type": "string"
                },
                "port": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 65535
                },
                "container": {
                  "type": "string"
                },
                "containerPort": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 65535
                },
                "error": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "vmId",
                "port",
                "container",
                "containerPort",
                "error",
                "createdAt"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["forwards"],
        "additionalProperties": false
      },
      "VmForwardSetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "description": "VM port to listen on. Not 22, 2375, 2376 or 10031."
          },
          "container": {
            "description": "Container to reach, by name from vm_container_list. Needed for a new forward.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "containerPort": {
            "description": "The container’s port. Needed for a new forward.",
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          }
        },
        "required": ["organization", "vm", "port"],
        "additionalProperties": false
      },
      "VmForwardSetOutput": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          },
          "container": {
            "type": "string"
          },
          "containerPort": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string"
          },
          "created": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "vmId",
          "port",
          "container",
          "containerPort",
          "error",
          "createdAt",
          "created"
        ],
        "additionalProperties": false
      },
      "VmForwardDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "description": "The forward’s VM port."
          }
        },
        "required": ["organization", "vm", "port"],
        "additionalProperties": false
      },
      "VmForwardDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "VmMcpListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmMcpListOutput": {
        "type": "object",
        "properties": {
          "mcps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "vmId": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "port": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                "path": {
                  "type": "string"
                },
                "autoWake": {
                  "type": "boolean"
                }
              },
              "required": ["id", "vmId", "name", "port", "path", "autoWake"],
              "additionalProperties": false
            }
          }
        },
        "required": ["mcps"],
        "additionalProperties": false
      },
      "VmMcpSetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "name": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_-]*$",
            "description": "Endpoint name, unique in the VM. Letters, digits, _ and -, starting with a letter."
          },
          "port": {
            "description": "Port the MCP server listens on inside the VM. Needed to create the endpoint.",
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          },
          "path": {
            "description": "HTTP path of the MCP endpoint. Default /mcp for a new endpoint.",
            "type": "string"
          },
          "autoWake": {
            "description": "Start the VM when the endpoint is called while it is stopped. Default false for a new endpoint.",
            "type": "boolean"
          },
          "rename": {
            "description": "A new name for the endpoint. For one that does not exist yet: the name it gets.",
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
          }
        },
        "required": ["organization", "vm", "name"],
        "additionalProperties": false
      },
      "VmMcpSetOutput": {
        "type": "object",
        "properties": {
          "mcp": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "port": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "path": {
                "type": "string"
              },
              "autoWake": {
                "type": "boolean"
              }
            },
            "required": ["id", "vmId", "name", "port", "path", "autoWake"],
            "additionalProperties": false
          },
          "created": {
            "type": "boolean"
          }
        },
        "required": ["mcp", "created"],
        "additionalProperties": false
      },
      "VmMcpDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "name": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_-]*$",
            "description": "Endpoint name, from vm_mcp_list."
          }
        },
        "required": ["organization", "vm", "name"],
        "additionalProperties": false
      },
      "VmMcpDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "VmToolListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "mcpName": {
            "description": "Only list the tools of this MCP endpoint.",
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmToolListOutput": {
        "type": "object",
        "properties": {
          "tools": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "mcpName": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "inputSchema": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {}
                }
              },
              "required": ["mcpName", "name", "description", "inputSchema"],
              "additionalProperties": false
            }
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "mcpName": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              },
              "required": ["mcpName", "message"],
              "additionalProperties": false
            }
          }
        },
        "required": ["tools", "errors"],
        "additionalProperties": false
      },
      "VmToolCallInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "Tool name, from vm_tool_list."
          },
          "arguments": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {},
            "description": "Tool arguments as a JSON object."
          },
          "mcpName": {
            "description": "MCP endpoint to call. Needed when several endpoints expose the same tool name.",
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
          }
        },
        "required": ["organization", "vm", "name", "arguments"],
        "additionalProperties": false
      },
      "VmToolCallOutput": {
        "type": "object",
        "properties": {
          "mcpName": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "isError": {
            "type": "boolean"
          },
          "content": {
            "type": "array",
            "items": {}
          }
        },
        "required": ["mcpName", "name", "content"],
        "additionalProperties": false
      },
      "VmSshGetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "rescue": {
            "description": "A rescue shell: without the VM’s sshd, through Ghostdock’s guest agent (no sftp or forwarding). Servers only.",
            "type": "boolean"
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmSshGetOutput": {
        "type": "object",
        "properties": {
          "sshCommand": {
            "type": "string",
            "minLength": 1
          },
          "token": {
            "type": "string",
            "minLength": 1
          },
          "expiresAt": {
            "type": "string",
            "minLength": 1
          },
          "rescue": {
            "type": "boolean",
            "const": true
          },
          "keyCommand": {
            "type": "string"
          },
          "hostPublicKey": {
            "type": "string"
          }
        },
        "required": ["sshCommand", "token", "expiresAt"],
        "additionalProperties": false
      },
      "VmSshInfoInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmSshInfoOutput": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "expiresAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "mintedAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "source": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["ui", "agent"]
              },
              {
                "type": "null"
              }
            ]
          },
          "sshd": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["active", "inactive", "failed", "none"]
              },
              {
                "type": "null"
              }
            ]
          },
          "sshCommand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "keyCommand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "hostPublicKey": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "accountKeys": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "fingerprint": {
                  "type": "string"
                }
              },
              "required": ["name", "fingerprint"],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "active",
          "expiresAt",
          "mintedAt",
          "source",
          "sshd",
          "sshCommand",
          "keyCommand",
          "hostPublicKey",
          "accountKeys"
        ],
        "additionalProperties": false
      },
      "VmSshRevokeInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "all": {
            "description": "End every person’s SSH access to the Server, not only yours.",
            "type": "boolean"
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmSshRevokeOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "VmContainerUpInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "template": {
            "description": "Template name from template_list, e.g. nginx. Give this or source.",
            "type": "string",
            "minLength": 2,
            "maxLength": 40,
            "pattern": "^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$"
          },
          "platform": {
            "description": "Take the platform’s template of this name even when the organization has its own (shadows).",
            "type": "boolean"
          },
          "source": {
            "description": "What to run, as vm_up’s source without snapshot and template: { type: \"image\", ref }, { type: \"dockerfile\", content, files? }, { type: \"compose\", files } or { type: \"compose\", reference, override? }. Give this or template.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "image"
                  },
                  "ref": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  }
                },
                "required": ["type", "ref"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "dockerfile"
                  },
                  "content": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512000
                  },
                  "files": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 512000
                    }
                  }
                },
                "required": ["type", "content"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "compose"
                  },
                  "files": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 512000
                    }
                  }
                },
                "required": ["type", "files"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "compose"
                  },
                  "reference": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512,
                    "pattern": "^oci:\\/\\/(?:[a-z0-9]+(?:[.-][a-z0-9]+)*(?::\\d{1,5})?\\/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:\\/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@sha256:[a-f0-9]{64})?$"
                  },
                  "override": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 262144
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["type", "reference"],
                "additionalProperties": false
              }
            ]
          },
          "name": {
            "description": "Name of the container (image, Dockerfile) or of the Compose project: lowercase letters, digits, - and _. Default: the service, else the template’s name, else compose.",
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$"
          },
          "restart": {
            "description": "Restart policy of the service an image or a Dockerfile becomes, Docker's names: unless-stopped (default), always, on-failure, or no. Not for Compose: its files set restart:.",
            "type": "string",
            "enum": ["no", "always", "unless-stopped", "on-failure"]
          },
          "urls": {
            "description": "Changes to the source’s URLs, keyed by (target, port), as in vm_up: the same target and port replaces, { target, port, remove: true } drops. A target is a service of this source, resolved to the container it runs as.",
            "maxItems": 100,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "target": {
                      "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    },
                    "protocol": {
                      "type": "string",
                      "enum": ["http", "tcp"]
                    },
                    "autoWake": {
                      "type": "boolean"
                    },
                    "access": {
                      "description": "\"organization\": only members of the organization, after logging in; \"public\": anyone on the internet. Default organization for HTTP; TCP has no login and is always public.",
                      "type": "string",
                      "enum": ["organization", "public"]
                    },
                    "title": {
                      "description": "Name shown for the URL, up to 40 characters. A titled HTTP URL gets its own button on the VM card; TCP titles are shown in URL lists. Untitled HTTP URLs are listed under \"Open URL\".",
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 40
                    }
                  },
                  "required": ["port", "autoWake"],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "target": {
                      "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service, named after the image, or app); omitted or null: the host network, the VM's own port. A service on the host network is the host network.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 200,
                          "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    },
                    "remove": {
                      "type": "boolean",
                      "const": true
                    }
                  },
                  "required": ["port", "remove"],
                  "additionalProperties": false
                }
              ]
            }
          },
          "forwards": {
            "description": "Changes to the source’s forwards, keyed by VM port, as in vm_up. A VM port that forwards already, or that a container publishes, is refused.",
            "maxItems": 64,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535,
                      "description": "The VM port that forwards."
                    },
                    "target": {
                      "type": "string",
                      "maxLength": 200,
                      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
                      "description": "The Compose service of the source it reaches (an image or a Dockerfile is one service)."
                    },
                    "containerPort": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535,
                      "description": "The port in the service's container."
                    }
                  },
                  "required": ["port", "target", "containerPort"],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    },
                    "remove": {
                      "type": "boolean",
                      "const": true
                    }
                  },
                  "required": ["port", "remove"],
                  "additionalProperties": false
                }
              ]
            }
          },
          "mcps": {
            "description": "Changes to the source’s MCP exposures, keyed by name, as in vm_up: the same name replaces, { name, remove: true } drops. A name the VM already has is refused.",
            "maxItems": 100,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 64,
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                    },
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    },
                    "path": {
                      "type": "string"
                    },
                    "autoWake": {
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "port", "autoWake"],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 64,
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
                    },
                    "remove": {
                      "type": "boolean",
                      "const": true
                    }
                  },
                  "required": ["name", "remove"],
                  "additionalProperties": false
                }
              ]
            }
          },
          "env": {
            "description": "What the container an image or a Dockerfile becomes gets of the VM’s environment: { all: true } for every VM variable, or { names: [{ name, from? }] } for those variables as references (from: the VM variable it reads, default the same name). Omit for the names the source declares (ghostdock.env.NAME labels). Values never go into the container’s files: it only references the VM’s variables. Not for Compose: its files reference VM variables (ghostdock://env/NAME) themselves.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "all": {
                    "type": "boolean",
                    "const": true
                  }
                },
                "required": ["all"],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "names": {
                    "maxItems": 500,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 128
                        },
                        "from": {
                          "type": "string",
                          "maxLength": 128
                        }
                      },
                      "required": ["name"],
                      "additionalProperties": false
                    }
                  }
                },
                "required": ["names"],
                "additionalProperties": false
              }
            ]
          },
          "environment": {
            "description": "Values this container needs that the VM does not have yet: each becomes one of the VM’s own entries (kind variable or secret) before the container runs, and the container references it. A name the VM already has is refused. A variable the source requires that the VM lacks refuses the call, with its names in missingEnvironment.",
            "type": "object",
            "properties": {
              "local": {
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
                    },
                    "value": {
                      "type": "string",
                      "maxLength": 32768
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "comment": {
                      "type": "string",
                      "maxLength": 500
                    }
                  },
                  "required": ["name", "value", "kind"]
                }
              }
            }
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmContainerUpOutput": {
        "type": "object",
        "properties": {
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "project": {
            "type": "string"
          },
          "containers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "port": {
                  "type": "number"
                },
                "url": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "access": {
                  "type": "string",
                  "enum": ["organization", "public"]
                }
              },
              "required": ["port", "url", "access"],
              "additionalProperties": false
            }
          },
          "mcps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                }
              },
              "required": ["name"],
              "additionalProperties": false
            }
          },
          "note": {
            "type": "string"
          }
        },
        "required": ["container"],
        "additionalProperties": false
      },
      "VmContainerListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmContainerListOutput": {
        "type": "object",
        "properties": {
          "containers": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                },
                "image": {
                  "type": "string"
                },
                "state": {
                  "type": "string",
                  "enum": [
                    "created",
                    "running",
                    "paused",
                    "restarting",
                    "removing",
                    "exited",
                    "dead"
                  ]
                },
                "health": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["starting", "healthy", "unhealthy"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "restart": {
                  "type": "string",
                  "enum": ["no", "always", "unless-stopped", "on-failure"]
                },
                "exitCode": {
                  "type": "number"
                },
                "createdAt": {
                  "type": "string"
                },
                "startedAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "project": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "service": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lock": {
                  "type": "object",
                  "properties": {
                    "locked": {
                      "type": "boolean"
                    },
                    "source": {
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": ["label", "user"]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "by": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string"
                            },
                            "name": {
                              "type": "string"
                            },
                            "kind": {
                              "type": "string",
                              "enum": ["person", "api_token"]
                            }
                          },
                          "required": ["id", "name"],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "at": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": ["locked", "source", "by", "at"],
                  "additionalProperties": false
                },
                "hostNetwork": {
                  "type": "boolean"
                },
                "ports": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "proto": {
                        "type": "string",
                        "enum": ["tcp", "udp", "sctp"]
                      },
                      "containerPort": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 65535
                      },
                      "hostPort": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 65535
                      }
                    },
                    "required": ["proto", "containerPort"],
                    "additionalProperties": false
                  }
                },
                "labels": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "type": "string"
                  }
                },
                "dir": {
                  "type": "string"
                },
                "formerNames": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "name",
                "id",
                "image",
                "state",
                "health",
                "restart",
                "exitCode",
                "createdAt",
                "startedAt",
                "project",
                "service",
                "lock",
                "hostNetwork",
                "ports",
                "labels",
                "dir"
              ],
              "additionalProperties": false
            }
          },
          "running": {
            "type": "boolean"
          },
          "provision": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "ms": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "disk": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["fresh", "image-base", "user-snapshot"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "result": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["ready", "unhealthy", "timeout"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "pending": {
                    "type": "boolean"
                  }
                },
                "required": ["ms", "disk", "result", "pending"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["containers", "running", "provision"],
        "additionalProperties": false
      },
      "VmContainerExecInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
            "description": "Container, by name, from vm_container_list."
          },
          "command": {
            "type": "string",
            "minLength": 1,
            "description": "Shell command to run, e.g. ls /app. Never include secret values: commands are logged."
          },
          "cwd": {
            "description": "Directory to run the command in.",
            "type": "string",
            "minLength": 1
          },
          "waitSeconds": {
            "description": "Seconds to wait before returning handles to poll: 1 to 120, default 120.",
            "type": "number"
          }
        },
        "required": ["organization", "vm", "container", "command"],
        "additionalProperties": false
      },
      "VmContainerExecOutput": {
        "type": "object",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "running"
              },
              "sessionId": {
                "type": "string"
              },
              "commandId": {
                "type": "string"
              },
              "ephemeral": {
                "type": "boolean"
              },
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": ["status", "sessionId", "commandId", "ephemeral", "container"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": ["completed", "failed"]
              },
              "sessionId": {
                "type": "string"
              },
              "commandId": {
                "type": "string"
              },
              "exitCode": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "stdout": {
                "type": "string"
              },
              "stderr": {
                "type": "string"
              },
              "ephemeral": {
                "type": "boolean"
              },
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "status",
              "commandId",
              "exitCode",
              "stdout",
              "stderr",
              "ephemeral",
              "container"
            ],
            "additionalProperties": false
          }
        ]
      },
      "VmContainerCpInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "from": {
            "description": "What to read: container:path, e.g. web:/app/config.json or web:/app.",
            "type": "string",
            "minLength": 3
          },
          "to": {
            "description": "Where to write: container:folder, e.g. web:/app. Give files or zipBase64 with it.",
            "type": "string",
            "minLength": 3
          },
          "files": {
            "description": "Small inline files: { path, content } for utf8 text, or { path, contentBase64 } for binary.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string",
                  "minLength": 1
                },
                "content": {
                  "type": "string"
                },
                "encoding": {
                  "type": "string",
                  "enum": ["utf8", "base64"]
                },
                "contentBase64": {
                  "type": "string"
                }
              },
              "required": ["path"]
            }
          },
          "zipBase64": {
            "description": "A ZIP archive as base64, instead of files. For large uploads use the CLI.",
            "type": "string"
          },
          "wake": {
            "description": "false: a stopped VM is not started for a read, which then fails (tab completion). Default true.",
            "type": "boolean"
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmContainerCpOutput": {
        "type": "object",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "isBinary": {
                "type": "boolean"
              },
              "tooLarge": {
                "type": "boolean"
              },
              "content": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "base64": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "size": {
                "type": "number"
              },
              "type": {
                "type": "string",
                "const": "file"
              },
              "container": {
                "type": "string"
              }
            },
            "required": [
              "path",
              "isBinary",
              "tooLarge",
              "content",
              "base64",
              "size",
              "type",
              "container"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "dir"
              },
              "container": {
                "type": "string"
              },
              "path": {
                "type": "string"
              },
              "entries": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "path": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "type": {
                      "type": "string",
                      "enum": ["file", "dir"]
                    },
                    "size": {
                      "type": "number"
                    }
                  },
                  "required": ["path", "name", "type"],
                  "additionalProperties": false
                }
              }
            },
            "required": ["type", "container", "path", "entries"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "written": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "root": {
                "type": "string"
              }
            },
            "required": ["written", "container", "root"],
            "additionalProperties": false
          }
        ]
      },
      "VmFileListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "path": {
            "type": "string",
            "minLength": 1,
            "description": "Path on the VM. An absolute path lands where it says. A relative path, or ~/…, starts in the target’s start folder: the login user’s home on the Server (as ssh starts there), the container’s start dir in a container. An answer names a path in the home as ~/…, which you can pass back. A path with .. is refused."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "wake": {
            "description": "false: a stopped VM is not started, and the list fails (tab completion). Default true.",
            "type": "boolean"
          }
        },
        "required": ["organization", "vm", "path"],
        "additionalProperties": false
      },
      "VmFileListOutput": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "entries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string",
                  "enum": ["file", "dir"]
                },
                "size": {
                  "type": "number"
                }
              },
              "required": ["path", "name", "type"],
              "additionalProperties": false
            }
          }
        },
        "required": ["path", "container", "entries"],
        "additionalProperties": false
      },
      "VmFileReadInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "path": {
            "type": "string",
            "minLength": 1,
            "description": "Path on the VM. An absolute path lands where it says. A relative path, or ~/…, starts in the target’s start folder: the login user’s home on the Server (as ssh starts there), the container’s start dir in a container. An answer names a path in the home as ~/…, which you can pass back. A path with .. is refused."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          }
        },
        "required": ["organization", "vm", "path"],
        "additionalProperties": false
      },
      "VmFileReadOutput": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "isBinary": {
            "type": "boolean"
          },
          "tooLarge": {
            "type": "boolean"
          },
          "content": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "base64": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "size": {
            "type": "number"
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["path", "isBinary", "tooLarge", "content", "base64", "size", "container"],
        "additionalProperties": false
      },
      "VmFileWriteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "path": {
            "type": "string",
            "minLength": 1,
            "description": "Path on the VM. An absolute path lands where it says. A relative path, or ~/…, starts in the target’s start folder: the login user’s home on the Server (as ssh starts there), the container’s start dir in a container. An answer names a path in the home as ~/…, which you can pass back. A path with .. is refused."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "content": {
            "type": "string",
            "description": "The file’s bytes: utf8 text, or base64 when encoding is base64."
          },
          "encoding": {
            "description": "How to read content. Omit for utf8. base64 for bytes that are not text.",
            "type": "string",
            "enum": ["utf8", "base64"]
          }
        },
        "required": ["organization", "vm", "path", "content"],
        "additionalProperties": false
      },
      "VmFileWriteOutput": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "bytes": {
            "type": "number"
          }
        },
        "required": ["path", "container", "bytes"],
        "additionalProperties": false
      },
      "VmFileMkdirInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "path": {
            "type": "string",
            "minLength": 1,
            "description": "Path on the VM. An absolute path lands where it says. A relative path, or ~/…, starts in the target’s start folder: the login user’s home on the Server (as ssh starts there), the container’s start dir in a container. An answer names a path in the home as ~/…, which you can pass back. A path with .. is refused."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          }
        },
        "required": ["organization", "vm", "path"],
        "additionalProperties": false
      },
      "VmFileMkdirOutput": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["path", "container"],
        "additionalProperties": false
      },
      "VmFileDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "path": {
            "type": "string",
            "minLength": 1,
            "description": "Path on the VM. An absolute path lands where it says. A relative path, or ~/…, starts in the target’s start folder: the login user’s home on the Server (as ssh starts there), the container’s start dir in a container. An answer names a path in the home as ~/…, which you can pass back. A path with .. is refused."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "recursive": {
            "description": "Delete a folder and what is in it. Omit to delete a file.",
            "type": "boolean"
          }
        },
        "required": ["organization", "vm", "path"],
        "additionalProperties": false
      },
      "VmFileDeleteOutput": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["path", "container"],
        "additionalProperties": false
      },
      "VmFileMoveInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "path": {
            "type": "string",
            "minLength": 1,
            "description": "Path on the VM. An absolute path lands where it says. A relative path, or ~/…, starts in the target’s start folder: the login user’s home on the Server (as ssh starts there), the container’s start dir in a container. An answer names a path in the home as ~/…, which you can pass back. A path with .. is refused."
          },
          "destination": {
            "type": "string",
            "minLength": 1,
            "description": "Where to move it. The same rules as path: absolute, or relative to the target’s start folder."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          }
        },
        "required": ["organization", "vm", "path", "destination"],
        "additionalProperties": false
      },
      "VmFileMoveOutput": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "destination": {
            "type": "string"
          }
        },
        "required": ["path", "container", "destination"],
        "additionalProperties": false
      },
      "VmContainerLockInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
            "description": "Container, by name."
          }
        },
        "required": ["organization", "vm", "container"],
        "additionalProperties": false
      },
      "VmContainerLockOutput": {
        "type": "object",
        "properties": {
          "container": {
            "type": "string"
          },
          "locked": {
            "type": "boolean"
          }
        },
        "required": ["container", "locked"],
        "additionalProperties": false
      },
      "VmContainerUnlockInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
            "description": "Container, by name."
          }
        },
        "required": ["organization", "vm", "container"],
        "additionalProperties": false
      },
      "VmContainerUnlockOutput": {
        "type": "object",
        "properties": {
          "container": {
            "type": "string"
          },
          "locked": {
            "type": "boolean"
          }
        },
        "required": ["container", "locked"],
        "additionalProperties": false
      },
      "VmContainerStartInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
            "description": "Container, by name."
          }
        },
        "required": ["organization", "vm", "container"],
        "additionalProperties": false
      },
      "VmContainerStartOutput": {
        "type": "object",
        "properties": {
          "container": {
            "type": "string"
          },
          "action": {
            "type": "string",
            "enum": ["start", "stop", "restart"]
          },
          "note": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["last_running", "vm_stopped"]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["container", "action", "note"],
        "additionalProperties": false
      },
      "VmContainerStopInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
            "description": "Container, by name."
          }
        },
        "required": ["organization", "vm", "container"],
        "additionalProperties": false
      },
      "VmContainerStopOutput": {
        "type": "object",
        "properties": {
          "container": {
            "type": "string"
          },
          "action": {
            "type": "string",
            "enum": ["start", "stop", "restart"]
          },
          "note": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["last_running", "vm_stopped"]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["container", "action", "note"],
        "additionalProperties": false
      },
      "VmContainerRestartInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
            "description": "Container, by name."
          }
        },
        "required": ["organization", "vm", "container"],
        "additionalProperties": false
      },
      "VmContainerRestartOutput": {
        "type": "object",
        "properties": {
          "container": {
            "type": "string"
          },
          "action": {
            "type": "string",
            "enum": ["start", "stop", "restart"]
          },
          "note": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["last_running", "vm_stopped"]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["container", "action", "note"],
        "additionalProperties": false
      },
      "VmContainerRemoveInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
            "description": "Container, by name."
          }
        },
        "required": ["organization", "vm", "container"],
        "additionalProperties": false
      },
      "VmContainerRemoveOutput": {
        "type": "object",
        "properties": {
          "container": {
            "type": "string"
          },
          "removed": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["container", "removed"],
        "additionalProperties": false
      },
      "VmContainerRestartPolicyInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
            "description": "Container, by name."
          },
          "policy": {
            "type": "string",
            "enum": ["unless-stopped", "no"],
            "description": "unless-stopped or no."
          }
        },
        "required": ["organization", "vm", "container", "policy"],
        "additionalProperties": false
      },
      "VmContainerRestartPolicyOutput": {
        "type": "object",
        "properties": {
          "container": {
            "type": "string"
          },
          "restart": {
            "type": "string",
            "enum": ["unless-stopped", "no"]
          }
        },
        "required": ["container", "restart"],
        "additionalProperties": false
      },
      "VmComposeStartInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "project": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$",
            "description": "Compose project, by name: a container’s project in vm_container_list."
          }
        },
        "required": ["organization", "vm", "project"],
        "additionalProperties": false
      },
      "VmComposeStartOutput": {
        "type": "object",
        "properties": {
          "project": {
            "type": "string"
          },
          "action": {
            "type": "string",
            "enum": ["start", "stop", "restart", "down"]
          },
          "containers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "note": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["vm_stopped"]
              },
              {
                "type": "null"
              }
            ]
          },
          "filesDeleted": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["project", "action", "containers", "note", "filesDeleted"],
        "additionalProperties": false
      },
      "VmComposeStopInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "project": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$",
            "description": "Compose project, by name: a container’s project in vm_container_list."
          }
        },
        "required": ["organization", "vm", "project"],
        "additionalProperties": false
      },
      "VmComposeStopOutput": {
        "type": "object",
        "properties": {
          "project": {
            "type": "string"
          },
          "action": {
            "type": "string",
            "enum": ["start", "stop", "restart", "down"]
          },
          "containers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "note": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["vm_stopped"]
              },
              {
                "type": "null"
              }
            ]
          },
          "filesDeleted": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["project", "action", "containers", "note", "filesDeleted"],
        "additionalProperties": false
      },
      "VmComposeRestartInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "project": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$",
            "description": "Compose project, by name: a container’s project in vm_container_list."
          }
        },
        "required": ["organization", "vm", "project"],
        "additionalProperties": false
      },
      "VmComposeRestartOutput": {
        "type": "object",
        "properties": {
          "project": {
            "type": "string"
          },
          "action": {
            "type": "string",
            "enum": ["start", "stop", "restart", "down"]
          },
          "containers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "note": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["vm_stopped"]
              },
              {
                "type": "null"
              }
            ]
          },
          "filesDeleted": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["project", "action", "containers", "note", "filesDeleted"],
        "additionalProperties": false
      },
      "VmComposeDownInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "project": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$",
            "description": "Compose project, by name: a container’s project in vm_container_list."
          },
          "deleteFiles": {
            "description": "Also delete the project’s folder after the down; filesDeleted says whether it went.",
            "type": "boolean"
          }
        },
        "required": ["organization", "vm", "project"],
        "additionalProperties": false
      },
      "VmComposeDownOutput": {
        "type": "object",
        "properties": {
          "project": {
            "type": "string"
          },
          "action": {
            "type": "string",
            "enum": ["start", "stop", "restart", "down"]
          },
          "containers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "note": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["vm_stopped"]
              },
              {
                "type": "null"
              }
            ]
          },
          "filesDeleted": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["project", "action", "containers", "note", "filesDeleted"],
        "additionalProperties": false
      },
      "VmContainerLogsInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$",
            "description": "Container, by name."
          },
          "tail": {
            "description": "The last N lines (at most 5000).",
            "type": "integer",
            "minimum": 1,
            "maximum": 5000
          },
          "after": {
            "description": "Only lines after this time: the time of the last line already read.",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,9})?(Z|[+-]\\d{2}:\\d{2})$"
          }
        },
        "required": ["organization", "vm", "container"],
        "additionalProperties": false
      },
      "VmContainerLogsOutput": {
        "type": "object",
        "properties": {
          "lines": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "stream": {
                  "type": "string",
                  "enum": ["stdout", "stderr"]
                },
                "time": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "text": {
                  "type": "string"
                }
              },
              "required": ["stream", "time", "text"],
              "additionalProperties": false
            }
          },
          "truncated": {
            "type": "boolean"
          },
          "running": {
            "type": "boolean"
          }
        },
        "required": ["lines", "truncated", "running"],
        "additionalProperties": false
      },
      "VmStorageListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmStorageListOutput": {
        "type": "object",
        "properties": {
          "volumes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "driver": {
                  "type": "string"
                },
                "folder": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sizeBytes": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sizeState": {
                  "type": "string",
                  "enum": ["measured", "measuring", "tooBig", "outside"]
                },
                "usedBy": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "attachment": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "volume": {
                          "type": "string"
                        }
                      },
                      "required": ["name", "volume"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "name",
                "driver",
                "folder",
                "sizeBytes",
                "sizeState",
                "usedBy",
                "attachment"
              ],
              "additionalProperties": false
            }
          },
          "vmFolders": {
            "type": "boolean"
          },
          "bindPaths": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "file": {
                  "type": "boolean"
                },
                "sizeBytes": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sizeState": {
                  "type": "string",
                  "enum": ["measured", "measuring", "tooBig", "outside"]
                },
                "usedBy": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": ["path", "file", "sizeBytes", "sizeState", "usedBy"],
              "additionalProperties": false
            }
          },
          "unboundPaths": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "file": {
                  "type": "boolean"
                },
                "sizeBytes": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sizeState": {
                  "type": "string",
                  "enum": ["measured", "measuring", "tooBig", "outside"]
                }
              },
              "required": ["path", "file", "sizeBytes", "sizeState"],
              "additionalProperties": false
            }
          },
          "projects": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "removed": {
                  "type": "boolean"
                },
                "sizeBytes": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sizeState": {
                  "type": "string",
                  "enum": ["measured", "measuring", "tooBig", "outside"]
                }
              },
              "required": ["name", "path", "removed", "sizeBytes", "sizeState"],
              "additionalProperties": false
            }
          },
          "mounts": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "container": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["volume", "folder"]
                },
                "source": {
                  "type": "string"
                },
                "destination": {
                  "type": "string"
                },
                "readOnly": {
                  "type": "boolean"
                }
              },
              "required": ["container", "kind", "source", "destination", "readOnly"],
              "additionalProperties": false
            }
          },
          "running": {
            "type": "boolean"
          },
          "truncated": {
            "type": "boolean"
          }
        },
        "required": [
          "volumes",
          "vmFolders",
          "bindPaths",
          "unboundPaths",
          "projects",
          "mounts",
          "running",
          "truncated"
        ],
        "additionalProperties": false
      },
      "VmStorageDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "kind": {
            "type": "string",
            "enum": ["volume", "folder", "project"],
            "description": "volume, folder or project."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "The volume’s name, the folder’s path in the VM as unboundPaths names it (/srv/old), or the project’s name."
          }
        },
        "required": ["organization", "vm", "kind", "name"],
        "additionalProperties": false
      },
      "VmStorageDeleteOutput": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": ["volume", "folder", "project"]
          },
          "name": {
            "type": "string"
          }
        },
        "required": ["kind", "name"],
        "additionalProperties": false
      },
      "VmCommandRunInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "command": {
            "type": "string",
            "minLength": 1,
            "description": "Shell command to run. Never include secret values: commands are logged."
          },
          "sessionId": {
            "description": "Session from vm_shell_create, to keep cwd and environment from earlier commands. Omit for a one-off session.",
            "type": "string",
            "minLength": 1
          },
          "cwd": {
            "description": "Directory to run the command in.",
            "type": "string",
            "minLength": 1
          },
          "waitSeconds": {
            "description": "Seconds to wait before returning handles to poll: 1 to 120, default 120.",
            "type": "number"
          }
        },
        "required": ["organization", "vm", "command"],
        "additionalProperties": false
      },
      "VmCommandRunOutput": {
        "type": "object",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "running"
              },
              "sessionId": {
                "type": "string"
              },
              "commandId": {
                "type": "string"
              },
              "ephemeral": {
                "type": "boolean"
              },
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": ["status", "sessionId", "commandId", "ephemeral", "container"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": ["completed", "failed"]
              },
              "sessionId": {
                "type": "string"
              },
              "commandId": {
                "type": "string"
              },
              "exitCode": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "stdout": {
                "type": "string"
              },
              "stderr": {
                "type": "string"
              },
              "ephemeral": {
                "type": "boolean"
              },
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "status",
              "commandId",
              "exitCode",
              "stdout",
              "stderr",
              "ephemeral",
              "container"
            ],
            "additionalProperties": false
          }
        ]
      },
      "VmCommandGetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "sessionId": {
            "type": "string",
            "minLength": 1,
            "description": "Session id returned by vm_command_run together with the commandId."
          },
          "commandId": {
            "type": "string",
            "minLength": 1,
            "description": "Command id returned by vm_command_run."
          }
        },
        "required": ["organization", "vm", "sessionId", "commandId"],
        "additionalProperties": false
      },
      "VmCommandGetOutput": {
        "type": "object",
        "properties": {
          "commandId": {
            "type": "string"
          },
          "command": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": ["running", "completed", "failed", "unknown"]
          },
          "exitCode": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["commandId", "command", "status", "exitCode"],
        "additionalProperties": false
      },
      "VmCommandLogsInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "sessionId": {
            "type": "string",
            "minLength": 1,
            "description": "Session id returned by vm_command_run together with the commandId."
          },
          "commandId": {
            "type": "string",
            "minLength": 1,
            "description": "Command id returned by vm_command_run."
          },
          "offset": {
            "description": "Character offset to continue reading from. Default 0.",
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": ["organization", "vm", "sessionId", "commandId"],
        "additionalProperties": false
      },
      "VmCommandLogsOutput": {
        "type": "object",
        "properties": {
          "stdout": {
            "type": "string"
          },
          "stderr": {
            "type": "string"
          },
          "nextOffset": {
            "type": "number"
          },
          "exhausted": {
            "type": "boolean"
          }
        },
        "required": ["stdout", "stderr", "nextOffset", "exhausted"],
        "additionalProperties": false
      },
      "VmCommandKillInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "sessionId": {
            "type": "string",
            "minLength": 1,
            "description": "Session id returned by vm_command_run together with the commandId."
          },
          "commandId": {
            "type": "string",
            "minLength": 1,
            "description": "Command id returned by vm_command_run."
          }
        },
        "required": ["organization", "vm", "sessionId", "commandId"],
        "additionalProperties": false
      },
      "VmCommandKillOutput": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "VmShellCreateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "sessionId": {
            "description": "Id for the new session: a slug. Omit to generate one.",
            "type": "string",
            "minLength": 1
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmShellCreateOutput": {
        "type": "object",
        "properties": {
          "sessionId": {
            "type": "string"
          },
          "container": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["sessionId", "container"],
        "additionalProperties": false
      },
      "VmShellCloseInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "container": {
            "description": "Container to work in, by name, from vm_container_list. Omitted: on a Server the VM itself; on a Container host the one running container (with several running the call fails and lists them).",
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
          },
          "sessionId": {
            "type": "string",
            "minLength": 1,
            "description": "Session id from vm_shell_create."
          }
        },
        "required": ["organization", "vm", "sessionId"],
        "additionalProperties": false
      },
      "VmShellCloseOutput": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "VmUpdateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "displayName": {
            "description": "New display name, a free label shown next to the name. Null or blank clears it; omit to keep it. The name itself is fixed.",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 200
              },
              {
                "type": "null"
              }
            ]
          },
          "idleStopMinutes": {
            "description": "Minutes of inactivity before the platform worker idle-stops the VM. -1: never stops for inactivity. 0 is rejected. Null resets to the platform default. Provider-native timers are optional backup. Timers and cron jobs are not activity: a Server whose work is only those takes -1.",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lifecycle": {
            "description": "ephemeral: the VM is deleted when it stops; refused on a stopped VM. auto_delete: the record goes autoDeleteDays after the VM stops. keep: never removed automatically.",
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "description": "Days stopped before the record is deleted (1–365). Makes the VM auto_delete. Null writes the platform default. Not with keep or ephemeral.",
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1,
                "maximum": 365
              },
              {
                "type": "null"
              }
            ]
          },
          "identity": {
            "description": "Give the VM its own identity, or change it: budget by kind (vms { cpu, memoryGiB, diskGiB, count? }, sites { count?, sizeMiB? }; a kind’s key lets it create that kind, and gives its token that kind’s write scope) and onAutoDelete (delete or release what it owns when the VM goes without a person deciding). Its identity (GHOSTDOCK_TOKEN in its environment) manages only what it creates. Lowering a budget stops nothing; creates past it are refused. Null takes the identity away: its token stops working, and a VM whose identity still owns anything needs ownedResources.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "budget": {
                    "type": "object",
                    "properties": {
                      "vms": {
                        "type": "object",
                        "properties": {
                          "cpu": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "memoryGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "diskGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["cpu", "memoryGiB", "diskGiB"],
                        "additionalProperties": false
                      },
                      "sites": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeMiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "additionalProperties": false
                      },
                      "volumes": {
                        "type": "object",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "sizeGiB": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": ["sizeGiB"],
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "onAutoDelete": {
                    "type": "string",
                    "enum": ["delete", "release"]
                  }
                },
                "required": ["budget", "onAutoDelete"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownedResources": {
            "description": "With identity null on a VM whose identity still owns VMs or sites: delete them too (down the whole tree), or release them as ordinary ones of the organization. Without it such a call is refused (owns_resources, naming them by kind).",
            "type": "string",
            "enum": ["delete", "release"]
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmUpdateOutput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": ["stopped", "starting", "running", "stopping", "failed"]
          },
          "displayName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleStopMinutes": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lifecycle": {
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "sourceType": {
            "type": "string",
            "enum": ["snapshot", "image", "dockerfile", "compose"]
          },
          "kind": {
            "type": "string",
            "enum": ["server", "container_host"]
          },
          "snapshotName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "composeProject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "resources": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "cpu": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "memoryGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "diskGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["cpu", "memoryGiB", "diskGiB"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerTokenId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "boot": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "trigger": {
                    "type": "string",
                    "enum": ["create", "wake"]
                  },
                  "vm": {
                    "type": "object",
                    "properties": {
                      "startedAt": {
                        "type": "string"
                      },
                      "readyAt": {
                        "type": "string"
                      },
                      "ms": {
                        "type": "number"
                      }
                    },
                    "required": ["startedAt", "readyAt", "ms"],
                    "additionalProperties": false
                  },
                  "compose": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "disk": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["fresh", "image-base", "user-snapshot"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provision": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provisionResult": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["ready", "unhealthy", "timeout"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "pulled": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": ["trigger", "vm", "compose", "disk", "provision", "provisionResult"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "template": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "scope": {
                "type": "string",
                "enum": ["platform", "organization"]
              },
              "shadows": {
                "type": "boolean"
              }
            },
            "required": ["name", "scope", "shadows"],
            "additionalProperties": false
          },
          "workload": {
            "type": "object",
            "properties": {
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "project": {
                "type": "string"
              },
              "containers": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "urls": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "port": {
                      "type": "number"
                    },
                    "url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "access": {
                      "type": "string",
                      "enum": ["organization", "public"]
                    }
                  },
                  "required": ["port", "url", "access"],
                  "additionalProperties": false
                }
              },
              "mcps": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": ["name"],
                  "additionalProperties": false
                }
              }
            },
            "required": ["container"],
            "additionalProperties": false
          },
          "sizeLowered": {
            "type": "object",
            "properties": {
              "requested": {
                "type": "object",
                "properties": {
                  "cpu": {
                    "type": "number"
                  },
                  "memoryGiB": {
                    "type": "number"
                  }
                },
                "additionalProperties": false
              },
              "machine": {
                "type": "object",
                "properties": {
                  "cpus": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "memoryGiB": {
                    "type": "number"
                  },
                  "vmMemoryGiB": {
                    "type": "number"
                  }
                },
                "required": ["cpus", "memoryGiB", "vmMemoryGiB"],
                "additionalProperties": false
              }
            },
            "required": ["requested", "machine"],
            "additionalProperties": false
          },
          "volumes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "volume": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["disk", "shared", "host"]
                },
                "sizeGiB": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "created": {
                  "type": "boolean"
                },
                "name": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "readOnly": {
                  "type": "boolean"
                },
                "takesEffect": {
                  "type": "string",
                  "enum": ["live", "next_start", "boot"]
                },
                "message": {
                  "type": "string"
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "volume",
                "kind",
                "sizeGiB",
                "created",
                "name",
                "path",
                "readOnly",
                "takesEffect",
                "message",
                "warnings"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "name",
          "vmId",
          "organizationId",
          "status",
          "displayName",
          "idleStopMinutes",
          "lifecycle",
          "autoDeleteDays",
          "sourceType",
          "kind",
          "snapshotName",
          "composeProject",
          "resources"
        ],
        "additionalProperties": false
      },
      "VmResizeInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "cpu": {
            "description": "Number of CPUs.",
            "type": "number",
            "exclusiveMinimum": 0
          },
          "memoryGiB": {
            "description": "Memory in GiB.",
            "type": "number",
            "exclusiveMinimum": 0
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmResizeOutput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": ["stopped", "starting", "running", "stopping", "failed"]
          },
          "displayName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleStopMinutes": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lifecycle": {
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "sourceType": {
            "type": "string",
            "enum": ["snapshot", "image", "dockerfile", "compose"]
          },
          "kind": {
            "type": "string",
            "enum": ["server", "container_host"]
          },
          "snapshotName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "composeProject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "resources": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "cpu": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "memoryGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "diskGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["cpu", "memoryGiB", "diskGiB"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerTokenId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "boot": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "trigger": {
                    "type": "string",
                    "enum": ["create", "wake"]
                  },
                  "vm": {
                    "type": "object",
                    "properties": {
                      "startedAt": {
                        "type": "string"
                      },
                      "readyAt": {
                        "type": "string"
                      },
                      "ms": {
                        "type": "number"
                      }
                    },
                    "required": ["startedAt", "readyAt", "ms"],
                    "additionalProperties": false
                  },
                  "compose": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "disk": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["fresh", "image-base", "user-snapshot"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provision": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provisionResult": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["ready", "unhealthy", "timeout"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "pulled": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": ["trigger", "vm", "compose", "disk", "provision", "provisionResult"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "template": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "scope": {
                "type": "string",
                "enum": ["platform", "organization"]
              },
              "shadows": {
                "type": "boolean"
              }
            },
            "required": ["name", "scope", "shadows"],
            "additionalProperties": false
          },
          "workload": {
            "type": "object",
            "properties": {
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "project": {
                "type": "string"
              },
              "containers": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "urls": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "port": {
                      "type": "number"
                    },
                    "url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "access": {
                      "type": "string",
                      "enum": ["organization", "public"]
                    }
                  },
                  "required": ["port", "url", "access"],
                  "additionalProperties": false
                }
              },
              "mcps": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": ["name"],
                  "additionalProperties": false
                }
              }
            },
            "required": ["container"],
            "additionalProperties": false
          },
          "sizeLowered": {
            "type": "object",
            "properties": {
              "requested": {
                "type": "object",
                "properties": {
                  "cpu": {
                    "type": "number"
                  },
                  "memoryGiB": {
                    "type": "number"
                  }
                },
                "additionalProperties": false
              },
              "machine": {
                "type": "object",
                "properties": {
                  "cpus": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "memoryGiB": {
                    "type": "number"
                  },
                  "vmMemoryGiB": {
                    "type": "number"
                  }
                },
                "required": ["cpus", "memoryGiB", "vmMemoryGiB"],
                "additionalProperties": false
              }
            },
            "required": ["requested", "machine"],
            "additionalProperties": false
          },
          "volumes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "volume": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["disk", "shared", "host"]
                },
                "sizeGiB": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "created": {
                  "type": "boolean"
                },
                "name": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "readOnly": {
                  "type": "boolean"
                },
                "takesEffect": {
                  "type": "string",
                  "enum": ["live", "next_start", "boot"]
                },
                "message": {
                  "type": "string"
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "volume",
                "kind",
                "sizeGiB",
                "created",
                "name",
                "path",
                "readOnly",
                "takesEffect",
                "message",
                "warnings"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "name",
          "vmId",
          "organizationId",
          "status",
          "displayName",
          "idleStopMinutes",
          "lifecycle",
          "autoDeleteDays",
          "sourceType",
          "kind",
          "snapshotName",
          "composeProject",
          "resources"
        ],
        "additionalProperties": false
      },
      "VmResizeDiskInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "diskGiB": {
            "type": "number",
            "exclusiveMinimum": 0,
            "description": "New total disk size in GiB; must be larger than the current size."
          }
        },
        "required": ["organization", "vm", "diskGiB"],
        "additionalProperties": false
      },
      "VmResizeDiskOutput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": ["stopped", "starting", "running", "stopping", "failed"]
          },
          "displayName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleStopMinutes": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lifecycle": {
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "sourceType": {
            "type": "string",
            "enum": ["snapshot", "image", "dockerfile", "compose"]
          },
          "kind": {
            "type": "string",
            "enum": ["server", "container_host"]
          },
          "snapshotName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "composeProject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "resources": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "cpu": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "memoryGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "diskGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["cpu", "memoryGiB", "diskGiB"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerTokenId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "boot": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "trigger": {
                    "type": "string",
                    "enum": ["create", "wake"]
                  },
                  "vm": {
                    "type": "object",
                    "properties": {
                      "startedAt": {
                        "type": "string"
                      },
                      "readyAt": {
                        "type": "string"
                      },
                      "ms": {
                        "type": "number"
                      }
                    },
                    "required": ["startedAt", "readyAt", "ms"],
                    "additionalProperties": false
                  },
                  "compose": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "disk": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["fresh", "image-base", "user-snapshot"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provision": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provisionResult": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["ready", "unhealthy", "timeout"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "pulled": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": ["trigger", "vm", "compose", "disk", "provision", "provisionResult"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "template": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "scope": {
                "type": "string",
                "enum": ["platform", "organization"]
              },
              "shadows": {
                "type": "boolean"
              }
            },
            "required": ["name", "scope", "shadows"],
            "additionalProperties": false
          },
          "workload": {
            "type": "object",
            "properties": {
              "container": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "project": {
                "type": "string"
              },
              "containers": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "urls": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "port": {
                      "type": "number"
                    },
                    "url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "access": {
                      "type": "string",
                      "enum": ["organization", "public"]
                    }
                  },
                  "required": ["port", "url", "access"],
                  "additionalProperties": false
                }
              },
              "mcps": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": ["name"],
                  "additionalProperties": false
                }
              }
            },
            "required": ["container"],
            "additionalProperties": false
          },
          "sizeLowered": {
            "type": "object",
            "properties": {
              "requested": {
                "type": "object",
                "properties": {
                  "cpu": {
                    "type": "number"
                  },
                  "memoryGiB": {
                    "type": "number"
                  }
                },
                "additionalProperties": false
              },
              "machine": {
                "type": "object",
                "properties": {
                  "cpus": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "memoryGiB": {
                    "type": "number"
                  },
                  "vmMemoryGiB": {
                    "type": "number"
                  }
                },
                "required": ["cpus", "memoryGiB", "vmMemoryGiB"],
                "additionalProperties": false
              }
            },
            "required": ["requested", "machine"],
            "additionalProperties": false
          },
          "volumes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "volume": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["disk", "shared", "host"]
                },
                "sizeGiB": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "created": {
                  "type": "boolean"
                },
                "name": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "readOnly": {
                  "type": "boolean"
                },
                "takesEffect": {
                  "type": "string",
                  "enum": ["live", "next_start", "boot"]
                },
                "message": {
                  "type": "string"
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "volume",
                "kind",
                "sizeGiB",
                "created",
                "name",
                "path",
                "readOnly",
                "takesEffect",
                "message",
                "warnings"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "name",
          "vmId",
          "organizationId",
          "status",
          "displayName",
          "idleStopMinutes",
          "lifecycle",
          "autoDeleteDays",
          "sourceType",
          "kind",
          "snapshotName",
          "composeProject",
          "resources"
        ],
        "additionalProperties": false
      },
      "VmStartInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmStartOutput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": ["stopped", "starting", "running", "stopping", "failed"]
          },
          "kind": {
            "type": "string",
            "enum": ["server", "container_host"]
          },
          "edition": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "displayName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleStopMinutes": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lifecycle": {
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lastActivityAt": {
            "type": "string"
          },
          "stoppedAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "stopReason": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["requested", "idle", "exited", "crashed", "platform"]
              },
              {
                "type": "null"
              }
            ]
          },
          "crashCause": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["panic", "out_of_memory", "vmm", "filtered"]
              },
              {
                "type": "null"
              }
            ]
          },
          "crashedAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "crashCount": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "idleStopsAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleReason": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["idle", "no_containers"]
              },
              {
                "type": "null"
              }
            ]
          },
          "deletesAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "autoDeletePausedBy": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string"
          },
          "disk": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "usedBytes": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  },
                  "sizeBytes": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991
                  },
                  "measuredAt": {
                    "type": "string"
                  }
                },
                "required": ["usedBytes", "sizeBytes", "measuredAt"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "boot": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "trigger": {
                    "type": "string",
                    "enum": ["create", "wake"]
                  },
                  "vm": {
                    "type": "object",
                    "properties": {
                      "startedAt": {
                        "type": "string"
                      },
                      "readyAt": {
                        "type": "string"
                      },
                      "ms": {
                        "type": "number"
                      }
                    },
                    "required": ["startedAt", "readyAt", "ms"],
                    "additionalProperties": false
                  },
                  "compose": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "disk": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["fresh", "image-base", "user-snapshot"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provision": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provisionResult": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["ready", "unhealthy", "timeout"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "pulled": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": ["trigger", "vm", "compose", "disk", "provision", "provisionResult"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "name",
          "vmId",
          "organizationId",
          "status",
          "kind",
          "displayName",
          "idleStopMinutes",
          "lifecycle",
          "autoDeleteDays",
          "lastActivityAt",
          "stoppedAt",
          "stopReason",
          "crashCause",
          "crashedAt",
          "crashCount",
          "idleStopsAt",
          "idleReason",
          "deletesAt",
          "autoDeletePausedBy"
        ],
        "additionalProperties": false
      },
      "VmRestartInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmRestartOutput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": ["stopped", "starting", "running", "stopping", "failed"]
          },
          "kind": {
            "type": "string",
            "enum": ["server", "container_host"]
          },
          "edition": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "displayName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleStopMinutes": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lifecycle": {
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lastActivityAt": {
            "type": "string"
          },
          "stoppedAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "stopReason": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["requested", "idle", "exited", "crashed", "platform"]
              },
              {
                "type": "null"
              }
            ]
          },
          "crashCause": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["panic", "out_of_memory", "vmm", "filtered"]
              },
              {
                "type": "null"
              }
            ]
          },
          "crashedAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "crashCount": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "idleStopsAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleReason": {
            "anyOf": [
              {
                "type": "string",
                "enum": ["idle", "no_containers"]
              },
              {
                "type": "null"
              }
            ]
          },
          "deletesAt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "autoDeletePausedBy": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string"
          },
          "disk": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "usedBytes": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  },
                  "sizeBytes": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991
                  },
                  "measuredAt": {
                    "type": "string"
                  }
                },
                "required": ["usedBytes", "sizeBytes", "measuredAt"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "boot": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "trigger": {
                    "type": "string",
                    "enum": ["create", "wake"]
                  },
                  "vm": {
                    "type": "object",
                    "properties": {
                      "startedAt": {
                        "type": "string"
                      },
                      "readyAt": {
                        "type": "string"
                      },
                      "ms": {
                        "type": "number"
                      }
                    },
                    "required": ["startedAt", "readyAt", "ms"],
                    "additionalProperties": false
                  },
                  "compose": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "disk": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["fresh", "image-base", "user-snapshot"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provision": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provisionResult": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": ["ready", "unhealthy", "timeout"]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "pulled": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": ["trigger", "vm", "compose", "disk", "provision", "provisionResult"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "name",
          "vmId",
          "organizationId",
          "status",
          "kind",
          "displayName",
          "idleStopMinutes",
          "lifecycle",
          "autoDeleteDays",
          "lastActivityAt",
          "stoppedAt",
          "stopReason",
          "crashCause",
          "crashedAt",
          "crashCount",
          "idleStopsAt",
          "idleReason",
          "deletesAt",
          "autoDeletePausedBy"
        ],
        "additionalProperties": false
      },
      "VmStatusInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "waitSeconds": {
            "description": "While the VM is still being created: seconds to wait for the create to end before answering, 0 to 120, default 0.",
            "type": "integer",
            "minimum": 0,
            "maximum": 120
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmStatusOutput": {
        "type": "object",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "organizationId": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": ["stopped", "starting", "running", "stopping", "failed"]
              },
              "kind": {
                "type": "string",
                "enum": ["server", "container_host"]
              },
              "edition": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "displayName": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "idleStopMinutes": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "lifecycle": {
                "type": "string",
                "enum": ["ephemeral", "auto_delete", "keep"]
              },
              "autoDeleteDays": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "lastActivityAt": {
                "type": "string"
              },
              "stoppedAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "stopReason": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": ["requested", "idle", "exited", "crashed", "platform"]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "crashCause": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": ["panic", "out_of_memory", "vmm", "filtered"]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "crashedAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "crashCount": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "idleStopsAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "idleReason": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": ["idle", "no_containers"]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "deletesAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "autoDeletePausedBy": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "ownerName": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "createdAt": {
                "type": "string"
              },
              "disk": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "usedBytes": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "sizeBytes": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "measuredAt": {
                        "type": "string"
                      }
                    },
                    "required": ["usedBytes", "sizeBytes", "measuredAt"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "environment": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "features": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "enum": ["tcp_bridge", "ssh"]
                    },
                    "enabled": {
                      "type": "boolean"
                    },
                    "detail": {
                      "type": "string",
                      "enum": ["not_running", "ready", "no_public_tcp"]
                    }
                  },
                  "required": ["id", "enabled", "detail"],
                  "additionalProperties": false
                }
              },
              "boot": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "trigger": {
                        "type": "string",
                        "enum": ["create", "wake"]
                      },
                      "vm": {
                        "type": "object",
                        "properties": {
                          "startedAt": {
                            "type": "string"
                          },
                          "readyAt": {
                            "type": "string"
                          },
                          "ms": {
                            "type": "number"
                          }
                        },
                        "required": ["startedAt", "readyAt", "ms"],
                        "additionalProperties": false
                      },
                      "compose": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "startedAt": {
                                "type": "string"
                              },
                              "readyAt": {
                                "type": "string"
                              },
                              "ms": {
                                "type": "number"
                              }
                            },
                            "required": ["startedAt", "readyAt", "ms"],
                            "additionalProperties": false
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "disk": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": ["fresh", "image-base", "user-snapshot"]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "provision": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "startedAt": {
                                "type": "string"
                              },
                              "readyAt": {
                                "type": "string"
                              },
                              "ms": {
                                "type": "number"
                              }
                            },
                            "required": ["startedAt", "readyAt", "ms"],
                            "additionalProperties": false
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "provisionResult": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": ["ready", "unhealthy", "timeout"]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "pulled": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": [
                      "trigger",
                      "vm",
                      "compose",
                      "disk",
                      "provision",
                      "provisionResult"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "volumes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "volume": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["disk", "shared", "host"]
                    },
                    "sizeGiB": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created": {
                      "type": "boolean"
                    },
                    "name": {
                      "type": "string"
                    },
                    "path": {
                      "type": "string"
                    },
                    "readOnly": {
                      "type": "boolean"
                    },
                    "takesEffect": {
                      "type": "string",
                      "enum": ["live", "next_start", "boot"]
                    },
                    "message": {
                      "type": "string"
                    },
                    "warnings": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "volume",
                    "kind",
                    "sizeGiB",
                    "created",
                    "name",
                    "path",
                    "readOnly",
                    "takesEffect",
                    "message",
                    "warnings"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "name",
              "vmId",
              "organizationId",
              "status",
              "kind",
              "displayName",
              "idleStopMinutes",
              "lifecycle",
              "autoDeleteDays",
              "lastActivityAt",
              "stoppedAt",
              "stopReason",
              "crashCause",
              "crashedAt",
              "crashCount",
              "idleStopsAt",
              "idleReason",
              "deletesAt",
              "autoDeletePausedBy",
              "environment",
              "features"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "vmId": {
                "type": "string"
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "organizationId": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": ["creating", "failed"]
              },
              "failure": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "enum": [
                      "invalid_args",
                      "insufficient_scope",
                      "unknown_tool",
                      "vm_not_found",
                      "tool_failed",
                      "internal_error",
                      "idempotency_key_reused",
                      "vm_create_interrupted",
                      "image_not_found",
                      "image_pull_denied",
                      "image_pull_failed",
                      "template_not_found",
                      "image_build_failed",
                      "container_not_found",
                      "container_not_running",
                      "container_paused",
                      "container_choice_required",
                      "container_action_failed",
                      "container_locked",
                      "compose_project_not_found",
                      "compose_project_locked",
                      "compose_action_failed",
                      "guest_needs_newer",
                      "volume_in_use",
                      "volume_not_found",
                      "storage_has_clients",
                      "storage_not_running",
                      "volume_disk_next_start",
                      "volumes_need_recreate",
                      "volume_read_only",
                      "host_folder_read_only",
                      "host_folder_unknown",
                      "volume_files_needs_vm",
                      "volume_files_vm_stopped",
                      "volume_not_mounted",
                      "volume_files_needs_newer_agent",
                      "volume_files_needs_newer_guest",
                      "storage_in_use",
                      "storage_not_found",
                      "storage_no_vm_folders",
                      "storage_needs_newer_agent",
                      "storage_needs_newer_guest",
                      "path_not_found",
                      "file_permission_denied",
                      "path_not_a_file",
                      "path_not_a_folder",
                      "path_exists",
                      "folder_not_empty",
                      "folder_holds_home",
                      "folder_into_itself",
                      "folder_list_too_large",
                      "vm_login_user_missing",
                      "container_none",
                      "container_none_running",
                      "server_not_supported",
                      "system_image_as_workload",
                      "not_a_system_image",
                      "vm_needs_workload_without_servers",
                      "budget_exceeded",
                      "owner_cannot_create",
                      "vm_stopped_cannot_become_ephemeral",
                      "owns_resources",
                      "owner_create_rate_limited",
                      "vm_owner_organization_environment",
                      "vm_owner_nested_budget",
                      "site_not_found",
                      "container_host_needs_workload",
                      "vm_ssh_container_host",
                      "vm_sshd_down",
                      "ssh_key_invalid",
                      "ssh_key_unsupported",
                      "ssh_key_exists",
                      "vm_compose_failed",
                      "vm_compose_busy",
                      "vm_compose_timeout",
                      "vm_guest_too_old",
                      "vm_base_too_old_for_targets",
                      "vm_has_locked_containers",
                      "vm_name_taken",
                      "url_access_unsupported",
                      "public_tcp_not_configured",
                      "share_link_tcp_unsupported",
                      "share_link_limit",
                      "share_link_name_taken",
                      "restart_not_for_compose",
                      "host_memory_full",
                      "docker_vm_memory_too_large",
                      "docker_machine_too_small",
                      "docker_vm_cpu_too_large",
                      "provider_failed",
                      "host_not_connected",
                      "host_failed"
                    ]
                  },
                  "message": {
                    "type": "string"
                  },
                  "retryable": {
                    "type": "boolean"
                  },
                  "params": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "detail": {
                    "type": "string"
                  },
                  "details": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {}
                  }
                },
                "required": ["code", "message", "retryable", "params"],
                "additionalProperties": false
              },
              "progress": {
                "type": "object",
                "properties": {
                  "state": {
                    "type": "string",
                    "enum": ["running", "done", "failed"]
                  },
                  "steps": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": ["create", "image", "boot", "setup", "containers"]
                    }
                  },
                  "image": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "done": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "total": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "unit": {
                            "type": "string",
                            "enum": ["bytes", "percent"]
                          }
                        },
                        "required": ["done", "total", "unit"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["state", "steps", "image"],
                "additionalProperties": false
              }
            },
            "required": ["vmId", "name", "organizationId", "status"],
            "additionalProperties": false
          }
        ]
      },
      "VmCreateProgressInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "progressKey": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "The progressKey you gave vm_up."
          }
        },
        "required": ["organization", "progressKey"],
        "additionalProperties": false
      },
      "VmCreateProgressOutput": {
        "type": "object",
        "properties": {
          "progress": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "state": {
                    "type": "string",
                    "enum": ["running", "done", "failed"]
                  },
                  "steps": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": ["create", "image", "boot", "setup", "containers"]
                    }
                  },
                  "image": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "done": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "total": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "unit": {
                            "type": "string",
                            "enum": ["bytes", "percent"]
                          }
                        },
                        "required": ["done", "total", "unit"],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["state", "steps", "image"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["progress"],
        "additionalProperties": false
      },
      "VmBudgetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "additionalProperties": false
      },
      "VmBudgetOutput": {
        "type": "object",
        "properties": {
          "budget": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "vms": {
                    "type": "object",
                    "properties": {
                      "cpu": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "memoryGiB": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "diskGiB": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "count": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "required": ["cpu", "memoryGiB", "diskGiB"],
                    "additionalProperties": false
                  },
                  "sites": {
                    "type": "object",
                    "properties": {
                      "count": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "sizeMiB": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "additionalProperties": false
                  },
                  "volumes": {
                    "type": "object",
                    "properties": {
                      "count": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      },
                      "sizeGiB": {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "required": ["sizeGiB"],
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "used": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "vms": {
                    "type": "object",
                    "properties": {
                      "cpu": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "memoryGiB": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "diskGiB": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "required": ["cpu", "memoryGiB", "diskGiB", "count"],
                    "additionalProperties": false
                  },
                  "sites": {
                    "type": "object",
                    "properties": {
                      "count": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "bytes": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "required": ["count", "bytes"],
                    "additionalProperties": false
                  },
                  "volumes": {
                    "type": "object",
                    "properties": {
                      "count": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "sizeGiB": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "required": ["count", "sizeGiB"],
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "remaining": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "vms": {
                    "type": "object",
                    "properties": {
                      "cpu": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "memoryGiB": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "diskGiB": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "required": ["cpu", "memoryGiB", "diskGiB"],
                    "additionalProperties": false
                  },
                  "sites": {
                    "type": "object",
                    "properties": {
                      "count": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "sizeMiB": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "additionalProperties": false
                  },
                  "volumes": {
                    "type": "object",
                    "properties": {
                      "sizeGiB": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "required": ["sizeGiB"],
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": ["budget", "used", "remaining"],
        "additionalProperties": false
      },
      "VmStopInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmStopOutput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": ["stopped", "starting", "running", "stopping", "failed"]
          },
          "displayName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleStopMinutes": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lifecycle": {
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "sourceType": {
            "type": "string",
            "enum": ["snapshot", "image", "dockerfile", "compose"]
          },
          "kind": {
            "type": "string",
            "enum": ["server", "container_host"]
          },
          "snapshotName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "composeProject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "resources": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "cpu": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "memoryGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "diskGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["cpu", "memoryGiB", "diskGiB"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerTokenId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "deleted": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "name",
          "vmId",
          "organizationId",
          "status",
          "displayName",
          "idleStopMinutes",
          "lifecycle",
          "autoDeleteDays",
          "sourceType",
          "kind",
          "snapshotName",
          "composeProject",
          "resources"
        ],
        "additionalProperties": false
      },
      "VmDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "deleteLocked": {
            "description": "Delete it with its locked containers. Without it, a locked container refuses the delete.",
            "type": "boolean"
          },
          "ownedResources": {
            "description": "For a VM whose identity owns VMs or sites: delete them too (and what they own in turn), or release them (they stay as ordinary ones of the organization, keeping their own identities).",
            "type": "string",
            "enum": ["delete", "release"]
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmDeleteOutput": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "VmReleaseInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmReleaseOutput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "vmId": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": ["stopped", "starting", "running", "stopping", "failed"]
          },
          "displayName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "idleStopMinutes": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "lifecycle": {
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "sourceType": {
            "type": "string",
            "enum": ["snapshot", "image", "dockerfile", "compose"]
          },
          "kind": {
            "type": "string",
            "enum": ["server", "container_host"]
          },
          "snapshotName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "composeProject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "resources": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "cpu": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "memoryGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "diskGiB": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": ["cpu", "memoryGiB", "diskGiB"],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "ownerTokenId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "name",
          "vmId",
          "organizationId",
          "status",
          "displayName",
          "idleStopMinutes",
          "lifecycle",
          "autoDeleteDays",
          "sourceType",
          "kind",
          "snapshotName",
          "composeProject",
          "resources"
        ],
        "additionalProperties": false
      },
      "SiteListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "SiteListOutput": {
        "type": "object",
        "properties": {
          "sites": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "siteId": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "displayName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "publishedAt": {
                  "type": "string"
                },
                "bytes": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "owner": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "tokenId": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "vmName": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": ["tokenId", "name", "vmName"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": ["siteId", "url", "displayName", "publishedAt", "bytes", "owner"],
              "additionalProperties": false
            }
          }
        },
        "required": ["sites"],
        "additionalProperties": false
      },
      "SitePublishInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "displayName": {
            "description": "Display name for the site. Optional.",
            "type": "string"
          },
          "siteId": {
            "description": "Republish into this site (its slug from site_list or an earlier site_publish), keeping its URL. Omit to create a new site.",
            "type": "string",
            "minLength": 1
          },
          "vm": {
            "description": "VM name or id, in this organization. Collect this VM directory when files/zip are omitted.",
            "type": "string",
            "minLength": 1
          },
          "directory": {
            "description": "VM directory to upload when files/zip are omitted: absolute, or relative to the container's start folder (its dir). Defaults to dist there.",
            "type": "string",
            "minLength": 1
          },
          "files": {
            "description": "Small inline files: { path, content } for utf8 text, or { path, contentBase64 } for binary.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string",
                  "minLength": 1
                },
                "content": {
                  "type": "string"
                },
                "encoding": {
                  "type": "string",
                  "enum": ["utf8", "base64"]
                },
                "contentBase64": {
                  "type": "string"
                }
              },
              "required": ["path"]
            }
          },
          "zipBase64": {
            "description": "A ZIP archive as base64, instead of files. For large uploads use the CLI.",
            "type": "string"
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "SitePublishOutput": {
        "type": "object",
        "properties": {
          "siteId": {
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "required": ["siteId", "url"],
        "additionalProperties": false
      },
      "ProjectPublishInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "description": "Existing project to record this deploy against. Omit to create a project. Always returned on the result.",
            "type": "string",
            "minLength": 1
          },
          "replan": {
            "description": "Force a new planner run even when the stored spec still matches this upload.",
            "type": "boolean"
          },
          "requireVerify": {
            "description": "When true, a failing verify step stops the deploy (verify_failed) and tears the VM down. Default false: tests still run and are reported, but a failure does not block shipping.",
            "type": "boolean"
          },
          "spec": {
            "description": "Execute this DeploymentSpec on a fresh VM instead of planning. On success it is stored for later replay. Mutually exclusive with replan.",
            "type": "object",
            "properties": {
              "version": {
                "type": "number",
                "const": 1
              },
              "build": {
                "type": "object",
                "properties": {
                  "context": {
                    "type": "string",
                    "minLength": 1
                  },
                  "dockerfile": {
                    "type": "object",
                    "properties": {
                      "base": {
                        "type": "string",
                        "minLength": 1
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "command": {
                        "minItems": 1,
                        "type": "array",
                        "items": {
                          "type": "string",
                          "minLength": 1
                        }
                      }
                    },
                    "required": ["base", "steps"],
                    "additionalProperties": false
                  },
                  "args": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": ["context", "dockerfile", "args"],
                "additionalProperties": false
              },
              "verify": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1
                    },
                    "command": {
                      "type": "string",
                      "minLength": 1
                    },
                    "profile": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": ["name", "command", "profile"],
                  "additionalProperties": false
                }
              },
              "run": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "static"
                      },
                      "outputDir": {
                        "type": "string",
                        "minLength": 1
                      }
                    },
                    "required": ["kind", "outputDir"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "compose"
                      },
                      "service": {
                        "type": "string",
                        "minLength": 1
                      },
                      "port": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 65535
                      },
                      "healthcheck": {
                        "type": "object",
                        "properties": {
                          "path": {
                            "type": "string"
                          },
                          "test": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "intervalSeconds": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "timeoutSeconds": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "retries": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991
                          },
                          "startPeriodSeconds": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "required": ["kind", "service", "port"],
                    "additionalProperties": false
                  }
                ]
              },
              "env": {
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1
                        },
                        "kind": {
                          "type": "string",
                          "const": "variable"
                        },
                        "phase": {
                          "default": "run",
                          "type": "string",
                          "enum": ["build", "run"]
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "public": {
                          "type": "boolean"
                        },
                        "comment": {
                          "type": "string"
                        }
                      },
                      "required": ["name", "kind", "required"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1
                        },
                        "kind": {
                          "type": "string",
                          "const": "secret"
                        },
                        "phase": {
                          "default": "run",
                          "type": "string",
                          "enum": ["build", "run"]
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "generate": {
                          "type": "string",
                          "enum": ["password", "hex32", "uuid"]
                        },
                        "comment": {
                          "type": "string"
                        }
                      },
                      "required": ["name", "kind", "required"],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "required": ["version", "run", "env"],
            "additionalProperties": false
          },
          "displayName": {
            "description": "Display name for a new project. Optional.",
            "type": "string"
          },
          "tag": {
            "description": "Optional caller tag stored on the deployment (git SHA or a free-form label). Metadata only.",
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "resources": {
            "type": "object",
            "properties": {
              "cpu": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "memoryGiB": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "diskGiB": {
                "type": "number",
                "exclusiveMinimum": 0
              }
            },
            "additionalProperties": false,
            "description": "Compute sizing. For image/dockerfile/compose: layered on platform defaults when omitted. For snapshot: optional override applied via resize after create."
          },
          "idleStopMinutes": {
            "description": "Minutes of inactivity before the platform worker idle-stops the VM. -1: never stops for inactivity. 0 is rejected. Omit for the platform default. Provider-native timers are optional backup. A Container host in which no container runs also sleeps 5 minutes after the last one stopped; a Server (e.g. `vm up headless`) stops by this time alone. Timers and cron jobs are not activity: a Server whose work is only timers or cron jobs takes -1.",
            "type": "number"
          },
          "lifecycle": {
            "description": "What happens when the VM stops. ephemeral: the VM and its disk are deleted, and it cannot be started again; a stop by the platform (host maintenance) keeps it. auto_delete (default): a stop keeps the disk, and the record goes autoDeleteDays after it. keep: a stop keeps the disk, and the record is never removed automatically.",
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "description": "Days the VM stays stopped before the platform worker deletes the record (1–365). Omit for the platform default (14). Makes the VM auto_delete; not with keep or ephemeral. A container a person locked holds it.",
            "type": "integer",
            "minimum": 1,
            "maximum": 365
          },
          "provider": {
            "description": "Provider name or id from provider_list (not the provider kind). Omit to use the organization default (the org choice, else the platform default); if that provider lacks a capability this create needs, the first listed provider that accepts new VMs and has it is used. When no provider fits, the call fails with a not-configured error.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          },
          "environment": {
            "description": "Environment to give this VM. organization: names of organization entries (from env_list) to export under their own names. bindings: remap org entries onto slot names ({ name: slot, organization: orgEntryName }). local: VM-only variables/secrets to create with the VM (kind required for each). Both land as ordinary process environment variables ($NAME / process.env.NAME); a local entry overrides an organization entry of the same name. When booting from an organization snapshot, omit organization/bindings/local to keep manifest env defaults, but still supply every name in requiredEnvironment (via organization, bindings, or local). Otherwise a VM gets nothing unless listed here.",
            "type": "object",
            "properties": {
              "organization": {
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 128,
                  "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
                }
              },
              "bindings": {
                "description": "Slot-centric org bindings: export an organization entry under a (possibly different) VM env name. Conflicts with organization/local exporting the same name are rejected.",
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "VM process env / slot name."
                    },
                    "organization": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Organization catalogue entry name to export into the slot."
                    }
                  },
                  "required": ["name", "organization"]
                }
              },
              "local": {
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
                    },
                    "value": {
                      "type": "string",
                      "maxLength": 32768
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "comment": {
                      "type": "string",
                      "maxLength": 500
                    }
                  },
                  "required": ["name", "value", "kind"]
                }
              }
            }
          },
          "autoWake": {
            "description": "Same as urls[].autoWake on vm_up. Default true for the published URL (vm_url_set defaults false).",
            "type": "boolean"
          },
          "public": {
            "description": "Whether the published URL is public (anyone) or, false, organization (members only). Default true. A publish raises a URL it serves to public, never lowers it: use vm_url_set for that.",
            "type": "boolean"
          },
          "files": {
            "description": "Small inline files: { path, content } for utf8 text, or { path, contentBase64 } for binary.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string",
                  "minLength": 1
                },
                "content": {
                  "type": "string"
                },
                "encoding": {
                  "type": "string",
                  "enum": ["utf8", "base64"]
                },
                "contentBase64": {
                  "type": "string"
                }
              },
              "required": ["path"]
            }
          },
          "zipBase64": {
            "description": "A ZIP archive as base64, instead of files. For large uploads use the CLI.",
            "type": "string"
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "ProjectPublishOutput": {
        "type": "object",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "deployed"
              },
              "cdn": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "siteId": {
                    "type": "string"
                  }
                },
                "required": ["url", "siteId"],
                "additionalProperties": false
              },
              "environment": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "comment": {
                      "type": "string"
                    },
                    "present": {
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "kind", "required", "present"],
                  "additionalProperties": false
                }
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "cdn", "environment", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "deployed"
              },
              "vm": {
                "type": "object",
                "properties": {
                  "vmId": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string"
                  },
                  "idleStopMinutes": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "lifecycle": {
                    "type": "string",
                    "enum": ["ephemeral", "auto_delete", "keep"]
                  },
                  "autoDeleteDays": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "autoWake": {
                    "type": "boolean"
                  },
                  "public": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "vmId",
                  "url",
                  "idleStopMinutes",
                  "lifecycle",
                  "autoDeleteDays",
                  "autoWake",
                  "public"
                ],
                "additionalProperties": false
              },
              "environment": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "comment": {
                      "type": "string"
                    },
                    "present": {
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "kind", "required", "present"],
                  "additionalProperties": false
                }
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "vm", "environment", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "awaiting_configuration"
              },
              "missing": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "comment": {
                      "type": "string"
                    }
                  },
                  "required": ["name", "kind", "required"],
                  "additionalProperties": false
                }
              },
              "environment": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "comment": {
                      "type": "string"
                    },
                    "present": {
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "kind", "required", "present"],
                  "additionalProperties": false
                }
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "missing", "environment", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "build_failed"
              },
              "stage": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "output": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "attemptedSpec": {
                "type": "object",
                "properties": {
                  "version": {
                    "type": "number",
                    "const": 1
                  },
                  "build": {
                    "type": "object",
                    "properties": {
                      "context": {
                        "type": "string",
                        "minLength": 1
                      },
                      "dockerfile": {
                        "type": "object",
                        "properties": {
                          "base": {
                            "type": "string",
                            "minLength": 1
                          },
                          "steps": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "command": {
                            "minItems": 1,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "minLength": 1
                            }
                          }
                        },
                        "required": ["base", "steps"],
                        "additionalProperties": false
                      },
                      "args": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": ["context", "dockerfile", "args"],
                    "additionalProperties": false
                  },
                  "verify": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1
                        },
                        "command": {
                          "type": "string",
                          "minLength": 1
                        },
                        "profile": {
                          "type": "string",
                          "minLength": 1
                        }
                      },
                      "required": ["name", "command", "profile"],
                      "additionalProperties": false
                    }
                  },
                  "run": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "static"
                          },
                          "outputDir": {
                            "type": "string",
                            "minLength": 1
                          }
                        },
                        "required": ["kind", "outputDir"],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "compose"
                          },
                          "service": {
                            "type": "string",
                            "minLength": 1
                          },
                          "port": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 65535
                          },
                          "healthcheck": {
                            "type": "object",
                            "properties": {
                              "path": {
                                "type": "string"
                              },
                              "test": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "intervalSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "timeoutSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "retries": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "startPeriodSeconds": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9007199254740991
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "required": ["kind", "service", "port"],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "public": {
                              "type": "boolean"
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "generate": {
                              "type": "string",
                              "enum": ["password", "hex32", "uuid"]
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  }
                },
                "required": ["version", "run", "env"],
                "additionalProperties": false
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "stage", "message", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "start_failed"
              },
              "stage": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "output": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "attemptedSpec": {
                "type": "object",
                "properties": {
                  "version": {
                    "type": "number",
                    "const": 1
                  },
                  "build": {
                    "type": "object",
                    "properties": {
                      "context": {
                        "type": "string",
                        "minLength": 1
                      },
                      "dockerfile": {
                        "type": "object",
                        "properties": {
                          "base": {
                            "type": "string",
                            "minLength": 1
                          },
                          "steps": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "command": {
                            "minItems": 1,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "minLength": 1
                            }
                          }
                        },
                        "required": ["base", "steps"],
                        "additionalProperties": false
                      },
                      "args": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": ["context", "dockerfile", "args"],
                    "additionalProperties": false
                  },
                  "verify": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1
                        },
                        "command": {
                          "type": "string",
                          "minLength": 1
                        },
                        "profile": {
                          "type": "string",
                          "minLength": 1
                        }
                      },
                      "required": ["name", "command", "profile"],
                      "additionalProperties": false
                    }
                  },
                  "run": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "static"
                          },
                          "outputDir": {
                            "type": "string",
                            "minLength": 1
                          }
                        },
                        "required": ["kind", "outputDir"],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "compose"
                          },
                          "service": {
                            "type": "string",
                            "minLength": 1
                          },
                          "port": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 65535
                          },
                          "healthcheck": {
                            "type": "object",
                            "properties": {
                              "path": {
                                "type": "string"
                              },
                              "test": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "intervalSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "timeoutSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "retries": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "startPeriodSeconds": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9007199254740991
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "required": ["kind", "service", "port"],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "public": {
                              "type": "boolean"
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "generate": {
                              "type": "string",
                              "enum": ["password", "hex32", "uuid"]
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  }
                },
                "required": ["version", "run", "env"],
                "additionalProperties": false
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "stage", "message", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "verify_failed"
              },
              "stage": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "output": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "attemptedSpec": {
                "type": "object",
                "properties": {
                  "version": {
                    "type": "number",
                    "const": 1
                  },
                  "build": {
                    "type": "object",
                    "properties": {
                      "context": {
                        "type": "string",
                        "minLength": 1
                      },
                      "dockerfile": {
                        "type": "object",
                        "properties": {
                          "base": {
                            "type": "string",
                            "minLength": 1
                          },
                          "steps": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "command": {
                            "minItems": 1,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "minLength": 1
                            }
                          }
                        },
                        "required": ["base", "steps"],
                        "additionalProperties": false
                      },
                      "args": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": ["context", "dockerfile", "args"],
                    "additionalProperties": false
                  },
                  "verify": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1
                        },
                        "command": {
                          "type": "string",
                          "minLength": 1
                        },
                        "profile": {
                          "type": "string",
                          "minLength": 1
                        }
                      },
                      "required": ["name", "command", "profile"],
                      "additionalProperties": false
                    }
                  },
                  "run": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "static"
                          },
                          "outputDir": {
                            "type": "string",
                            "minLength": 1
                          }
                        },
                        "required": ["kind", "outputDir"],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "compose"
                          },
                          "service": {
                            "type": "string",
                            "minLength": 1
                          },
                          "port": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 65535
                          },
                          "healthcheck": {
                            "type": "object",
                            "properties": {
                              "path": {
                                "type": "string"
                              },
                              "test": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "intervalSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "timeoutSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "retries": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "startPeriodSeconds": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9007199254740991
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "required": ["kind", "service", "port"],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "public": {
                              "type": "boolean"
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "generate": {
                              "type": "string",
                              "enum": ["password", "hex32", "uuid"]
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  }
                },
                "required": ["version", "run", "env"],
                "additionalProperties": false
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "stage", "message", "projectId", "source"],
            "additionalProperties": false
          }
        ]
      },
      "ProjectListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "ProjectListOutput": {
        "type": "object",
        "properties": {
          "projects": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "projectId": {
                  "type": "string"
                },
                "organizationId": {
                  "type": "string"
                },
                "displayName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "slug": {
                  "type": "string"
                },
                "latestDeploymentId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "liveDeploymentId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "latestStatus": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "deployed",
                        "awaiting_configuration",
                        "build_failed",
                        "start_failed",
                        "verify_failed"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "liveUrl": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "liveVmUrl": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "slug": {
                          "type": "string"
                        },
                        "access": {
                          "type": "string",
                          "enum": ["organization", "public"]
                        }
                      },
                      "required": ["slug", "access"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "latestVersion": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string"
                },
                "updatedAt": {
                  "type": "string"
                }
              },
              "required": [
                "projectId",
                "organizationId",
                "displayName",
                "slug",
                "latestDeploymentId",
                "liveDeploymentId",
                "latestStatus",
                "liveUrl",
                "liveVmUrl",
                "latestVersion",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["projects"],
        "additionalProperties": false
      },
      "ProjectGetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          }
        },
        "required": ["organization", "projectId"],
        "additionalProperties": false
      },
      "ProjectGetOutput": {
        "type": "object",
        "properties": {
          "project": {
            "type": "object",
            "properties": {
              "projectId": {
                "type": "string"
              },
              "organizationId": {
                "type": "string"
              },
              "displayName": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "slug": {
                "type": "string"
              },
              "latestDeploymentId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "liveDeploymentId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "latestStatus": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "deployed",
                      "awaiting_configuration",
                      "build_failed",
                      "start_failed",
                      "verify_failed"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "liveUrl": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "liveVmUrl": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "slug": {
                        "type": "string"
                      },
                      "access": {
                        "type": "string",
                        "enum": ["organization", "public"]
                      }
                    },
                    "required": ["slug", "access"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "latestVersion": {
                "anyOf": [
                  {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "createdAt": {
                "type": "string"
              },
              "updatedAt": {
                "type": "string"
              }
            },
            "required": [
              "projectId",
              "organizationId",
              "displayName",
              "slug",
              "latestDeploymentId",
              "liveDeploymentId",
              "latestStatus",
              "liveUrl",
              "liveVmUrl",
              "latestVersion",
              "createdAt",
              "updatedAt"
            ],
            "additionalProperties": false
          }
        },
        "required": ["project"],
        "additionalProperties": false
      },
      "ProjectCreateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "displayName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Project name."
          }
        },
        "required": ["organization", "displayName"],
        "additionalProperties": false
      },
      "ProjectCreateOutput": {
        "type": "object",
        "properties": {
          "project": {
            "type": "object",
            "properties": {
              "projectId": {
                "type": "string"
              },
              "organizationId": {
                "type": "string"
              },
              "displayName": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "slug": {
                "type": "string"
              },
              "latestDeploymentId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "liveDeploymentId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "latestStatus": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "deployed",
                      "awaiting_configuration",
                      "build_failed",
                      "start_failed",
                      "verify_failed"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "liveUrl": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "liveVmUrl": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "slug": {
                        "type": "string"
                      },
                      "access": {
                        "type": "string",
                        "enum": ["organization", "public"]
                      }
                    },
                    "required": ["slug", "access"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "latestVersion": {
                "anyOf": [
                  {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "createdAt": {
                "type": "string"
              },
              "updatedAt": {
                "type": "string"
              }
            },
            "required": [
              "projectId",
              "organizationId",
              "displayName",
              "slug",
              "latestDeploymentId",
              "liveDeploymentId",
              "latestStatus",
              "liveUrl",
              "liveVmUrl",
              "latestVersion",
              "createdAt",
              "updatedAt"
            ],
            "additionalProperties": false
          }
        },
        "required": ["project"],
        "additionalProperties": false
      },
      "ProjectUpdateInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          },
          "displayName": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 200
              },
              {
                "type": "null"
              }
            ],
            "description": "New name. Null or empty clears it."
          }
        },
        "required": ["organization", "projectId", "displayName"],
        "additionalProperties": false
      },
      "ProjectUpdateOutput": {
        "type": "object",
        "properties": {
          "project": {
            "type": "object",
            "properties": {
              "projectId": {
                "type": "string"
              },
              "organizationId": {
                "type": "string"
              },
              "displayName": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "slug": {
                "type": "string"
              },
              "latestDeploymentId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "liveDeploymentId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "latestStatus": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "deployed",
                      "awaiting_configuration",
                      "build_failed",
                      "start_failed",
                      "verify_failed"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "liveUrl": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "liveVmUrl": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "slug": {
                        "type": "string"
                      },
                      "access": {
                        "type": "string",
                        "enum": ["organization", "public"]
                      }
                    },
                    "required": ["slug", "access"],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "latestVersion": {
                "anyOf": [
                  {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "createdAt": {
                "type": "string"
              },
              "updatedAt": {
                "type": "string"
              }
            },
            "required": [
              "projectId",
              "organizationId",
              "displayName",
              "slug",
              "latestDeploymentId",
              "liveDeploymentId",
              "latestStatus",
              "liveUrl",
              "liveVmUrl",
              "latestVersion",
              "createdAt",
              "updatedAt"
            ],
            "additionalProperties": false
          }
        },
        "required": ["project"],
        "additionalProperties": false
      },
      "ProjectDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          }
        },
        "required": ["organization", "projectId"],
        "additionalProperties": false
      },
      "ProjectDeleteOutput": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "ProjectDeploymentListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          }
        },
        "required": ["organization", "projectId"],
        "additionalProperties": false
      },
      "ProjectDeploymentListOutput": {
        "type": "object",
        "properties": {
          "deployments": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "deploymentId": {
                  "type": "string"
                },
                "projectId": {
                  "type": "string"
                },
                "version": {
                  "type": "integer",
                  "exclusiveMinimum": 0,
                  "maximum": 9007199254740991
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "deployed",
                    "awaiting_configuration",
                    "build_failed",
                    "start_failed",
                    "verify_failed"
                  ]
                },
                "source": {
                  "type": "string",
                  "enum": ["planned", "replayed", "submitted", "redeployed"]
                },
                "url": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "tag": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "hasSource": {
                  "type": "boolean"
                },
                "hasGeneratedFiles": {
                  "type": "boolean"
                },
                "fileUrls": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "source": {
                          "type": "string"
                        }
                      },
                      "required": ["source"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "source": {
                          "type": "string"
                        },
                        "dockerfile": {
                          "type": "string"
                        },
                        "compose": {
                          "type": "string"
                        }
                      },
                      "required": ["source", "dockerfile", "compose"],
                      "additionalProperties": false
                    }
                  ]
                },
                "failingStage": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "failingMessage": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "missingSecretNames": {
                  "anyOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "vmId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "verify": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "outcome": {
                          "type": "string",
                          "const": "passed"
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "minLength": 1
                              },
                              "status": {
                                "type": "string",
                                "enum": ["passed", "failed", "skipped"]
                              },
                              "output": {
                                "type": "string"
                              }
                            },
                            "required": ["name", "status"],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": ["outcome", "steps"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "outcome": {
                          "type": "string",
                          "const": "failed"
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "minLength": 1
                              },
                              "status": {
                                "type": "string",
                                "enum": ["passed", "failed", "skipped"]
                              },
                              "output": {
                                "type": "string"
                              }
                            },
                            "required": ["name", "status"],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": ["outcome", "steps"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "outcome": {
                          "type": "string",
                          "const": "no_tests_found"
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "minLength": 1
                              },
                              "status": {
                                "type": "string",
                                "enum": ["passed", "failed", "skipped"]
                              },
                              "output": {
                                "type": "string"
                              }
                            },
                            "required": ["name", "status"],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": ["outcome", "steps"],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "outcome": {
                          "type": "string",
                          "const": "skipped"
                        },
                        "reason": {
                          "type": "string",
                          "enum": ["static", "planned"]
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "minLength": 1
                              },
                              "status": {
                                "type": "string",
                                "enum": ["passed", "failed", "skipped"]
                              },
                              "output": {
                                "type": "string"
                              }
                            },
                            "required": ["name", "status"],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": ["outcome", "reason", "steps"],
                      "additionalProperties": false
                    }
                  ]
                },
                "createdByUserId": {
                  "type": "string"
                },
                "createdBy": {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "enum": ["person", "api_token"]
                    },
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": ["kind", "name"],
                  "additionalProperties": false
                },
                "createdAt": {
                  "type": "string"
                }
              },
              "required": [
                "deploymentId",
                "projectId",
                "version",
                "status",
                "source",
                "url",
                "tag",
                "hasSource",
                "hasGeneratedFiles",
                "failingStage",
                "failingMessage",
                "missingSecretNames",
                "vmId",
                "createdByUserId",
                "createdAt"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": ["deployments"],
        "additionalProperties": false
      },
      "ProjectDeploymentGetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          },
          "deploymentId": {
            "type": "string",
            "minLength": 1,
            "description": "Deployment id, from project_deployment_list."
          }
        },
        "required": ["organization", "projectId", "deploymentId"],
        "additionalProperties": false
      },
      "ProjectDeploymentGetOutput": {
        "type": "object",
        "properties": {
          "deployment": {
            "type": "object",
            "properties": {
              "deploymentId": {
                "type": "string"
              },
              "projectId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "status": {
                "type": "string",
                "enum": [
                  "deployed",
                  "awaiting_configuration",
                  "build_failed",
                  "start_failed",
                  "verify_failed"
                ]
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "url": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "tag": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasSource": {
                "type": "boolean"
              },
              "hasGeneratedFiles": {
                "type": "boolean"
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              },
              "failingStage": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "failingMessage": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "missingSecretNames": {
                "anyOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "vmId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "createdByUserId": {
                "type": "string"
              },
              "createdBy": {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": ["person", "api_token"]
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": ["kind", "name"],
                "additionalProperties": false
              },
              "createdAt": {
                "type": "string"
              }
            },
            "required": [
              "deploymentId",
              "projectId",
              "version",
              "status",
              "source",
              "url",
              "tag",
              "hasSource",
              "hasGeneratedFiles",
              "failingStage",
              "failingMessage",
              "missingSecretNames",
              "vmId",
              "createdByUserId",
              "createdAt"
            ],
            "additionalProperties": false
          }
        },
        "required": ["deployment"],
        "additionalProperties": false
      },
      "ProjectRedeployInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          },
          "deploymentId": {
            "description": "Ship this version’s stored upload and spec. Omit to retry the last attempt that stored source.",
            "type": "string",
            "minLength": 1
          },
          "requireVerify": {
            "description": "When true, a failing verify step stops the deploy (verify_failed) and tears the VM down. Default false.",
            "type": "boolean"
          },
          "tag": {
            "description": "Optional caller tag stored on the new deployment. Metadata only.",
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "resources": {
            "type": "object",
            "properties": {
              "cpu": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "memoryGiB": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "diskGiB": {
                "type": "number",
                "exclusiveMinimum": 0
              }
            },
            "additionalProperties": false,
            "description": "Compute sizing. For image/dockerfile/compose: layered on platform defaults when omitted. For snapshot: optional override applied via resize after create."
          },
          "idleStopMinutes": {
            "description": "Minutes of inactivity before the platform worker idle-stops the VM. -1: never stops for inactivity. 0 is rejected. Omit for the platform default. Provider-native timers are optional backup. A Container host in which no container runs also sleeps 5 minutes after the last one stopped; a Server (e.g. `vm up headless`) stops by this time alone. Timers and cron jobs are not activity: a Server whose work is only timers or cron jobs takes -1.",
            "type": "number"
          },
          "lifecycle": {
            "description": "What happens when the VM stops. ephemeral: the VM and its disk are deleted, and it cannot be started again; a stop by the platform (host maintenance) keeps it. auto_delete (default): a stop keeps the disk, and the record goes autoDeleteDays after it. keep: a stop keeps the disk, and the record is never removed automatically.",
            "type": "string",
            "enum": ["ephemeral", "auto_delete", "keep"]
          },
          "autoDeleteDays": {
            "description": "Days the VM stays stopped before the platform worker deletes the record (1–365). Omit for the platform default (14). Makes the VM auto_delete; not with keep or ephemeral. A container a person locked holds it.",
            "type": "integer",
            "minimum": 1,
            "maximum": 365
          },
          "provider": {
            "description": "Provider name or id from provider_list (not the provider kind). Omit to use the organization default (the org choice, else the platform default); if that provider lacks a capability this create needs, the first listed provider that accepts new VMs and has it is used. When no provider fits, the call fails with a not-configured error.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          },
          "environment": {
            "description": "Environment to give this VM. organization: names of organization entries (from env_list) to export under their own names. bindings: remap org entries onto slot names ({ name: slot, organization: orgEntryName }). local: VM-only variables/secrets to create with the VM (kind required for each). Both land as ordinary process environment variables ($NAME / process.env.NAME); a local entry overrides an organization entry of the same name. When booting from an organization snapshot, omit organization/bindings/local to keep manifest env defaults, but still supply every name in requiredEnvironment (via organization, bindings, or local). Otherwise a VM gets nothing unless listed here.",
            "type": "object",
            "properties": {
              "organization": {
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 128,
                  "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
                }
              },
              "bindings": {
                "description": "Slot-centric org bindings: export an organization entry under a (possibly different) VM env name. Conflicts with organization/local exporting the same name are rejected.",
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "VM process env / slot name."
                    },
                    "organization": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Organization catalogue entry name to export into the slot."
                    }
                  },
                  "required": ["name", "organization"]
                }
              },
              "local": {
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
                    },
                    "value": {
                      "type": "string",
                      "maxLength": 32768
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "comment": {
                      "type": "string",
                      "maxLength": 500
                    }
                  },
                  "required": ["name", "value", "kind"]
                }
              }
            }
          },
          "autoWake": {
            "description": "Same as urls[].autoWake on vm_up. Default true for the minted URL.",
            "type": "boolean"
          },
          "public": {
            "description": "Whether the minted URL is public (anyone) or, false, organization (members only). Default true.",
            "type": "boolean"
          }
        },
        "required": ["organization", "projectId"],
        "additionalProperties": false
      },
      "ProjectRedeployOutput": {
        "type": "object",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "deployed"
              },
              "cdn": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "siteId": {
                    "type": "string"
                  }
                },
                "required": ["url", "siteId"],
                "additionalProperties": false
              },
              "environment": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "comment": {
                      "type": "string"
                    },
                    "present": {
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "kind", "required", "present"],
                  "additionalProperties": false
                }
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "cdn", "environment", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "deployed"
              },
              "vm": {
                "type": "object",
                "properties": {
                  "vmId": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string"
                  },
                  "idleStopMinutes": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "lifecycle": {
                    "type": "string",
                    "enum": ["ephemeral", "auto_delete", "keep"]
                  },
                  "autoDeleteDays": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "autoWake": {
                    "type": "boolean"
                  },
                  "public": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "vmId",
                  "url",
                  "idleStopMinutes",
                  "lifecycle",
                  "autoDeleteDays",
                  "autoWake",
                  "public"
                ],
                "additionalProperties": false
              },
              "environment": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "comment": {
                      "type": "string"
                    },
                    "present": {
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "kind", "required", "present"],
                  "additionalProperties": false
                }
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "vm", "environment", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "awaiting_configuration"
              },
              "missing": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "comment": {
                      "type": "string"
                    }
                  },
                  "required": ["name", "kind", "required"],
                  "additionalProperties": false
                }
              },
              "environment": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["variable", "secret"]
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "comment": {
                      "type": "string"
                    },
                    "present": {
                      "type": "boolean"
                    }
                  },
                  "required": ["name", "kind", "required", "present"],
                  "additionalProperties": false
                }
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "missing", "environment", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "build_failed"
              },
              "stage": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "output": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "attemptedSpec": {
                "type": "object",
                "properties": {
                  "version": {
                    "type": "number",
                    "const": 1
                  },
                  "build": {
                    "type": "object",
                    "properties": {
                      "context": {
                        "type": "string",
                        "minLength": 1
                      },
                      "dockerfile": {
                        "type": "object",
                        "properties": {
                          "base": {
                            "type": "string",
                            "minLength": 1
                          },
                          "steps": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "command": {
                            "minItems": 1,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "minLength": 1
                            }
                          }
                        },
                        "required": ["base", "steps"],
                        "additionalProperties": false
                      },
                      "args": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": ["context", "dockerfile", "args"],
                    "additionalProperties": false
                  },
                  "verify": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1
                        },
                        "command": {
                          "type": "string",
                          "minLength": 1
                        },
                        "profile": {
                          "type": "string",
                          "minLength": 1
                        }
                      },
                      "required": ["name", "command", "profile"],
                      "additionalProperties": false
                    }
                  },
                  "run": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "static"
                          },
                          "outputDir": {
                            "type": "string",
                            "minLength": 1
                          }
                        },
                        "required": ["kind", "outputDir"],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "compose"
                          },
                          "service": {
                            "type": "string",
                            "minLength": 1
                          },
                          "port": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 65535
                          },
                          "healthcheck": {
                            "type": "object",
                            "properties": {
                              "path": {
                                "type": "string"
                              },
                              "test": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "intervalSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "timeoutSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "retries": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "startPeriodSeconds": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9007199254740991
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "required": ["kind", "service", "port"],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "public": {
                              "type": "boolean"
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "generate": {
                              "type": "string",
                              "enum": ["password", "hex32", "uuid"]
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  }
                },
                "required": ["version", "run", "env"],
                "additionalProperties": false
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "stage", "message", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "start_failed"
              },
              "stage": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "output": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "attemptedSpec": {
                "type": "object",
                "properties": {
                  "version": {
                    "type": "number",
                    "const": 1
                  },
                  "build": {
                    "type": "object",
                    "properties": {
                      "context": {
                        "type": "string",
                        "minLength": 1
                      },
                      "dockerfile": {
                        "type": "object",
                        "properties": {
                          "base": {
                            "type": "string",
                            "minLength": 1
                          },
                          "steps": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "command": {
                            "minItems": 1,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "minLength": 1
                            }
                          }
                        },
                        "required": ["base", "steps"],
                        "additionalProperties": false
                      },
                      "args": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": ["context", "dockerfile", "args"],
                    "additionalProperties": false
                  },
                  "verify": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1
                        },
                        "command": {
                          "type": "string",
                          "minLength": 1
                        },
                        "profile": {
                          "type": "string",
                          "minLength": 1
                        }
                      },
                      "required": ["name", "command", "profile"],
                      "additionalProperties": false
                    }
                  },
                  "run": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "static"
                          },
                          "outputDir": {
                            "type": "string",
                            "minLength": 1
                          }
                        },
                        "required": ["kind", "outputDir"],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "compose"
                          },
                          "service": {
                            "type": "string",
                            "minLength": 1
                          },
                          "port": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 65535
                          },
                          "healthcheck": {
                            "type": "object",
                            "properties": {
                              "path": {
                                "type": "string"
                              },
                              "test": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "intervalSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "timeoutSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "retries": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "startPeriodSeconds": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9007199254740991
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "required": ["kind", "service", "port"],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "public": {
                              "type": "boolean"
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "generate": {
                              "type": "string",
                              "enum": ["password", "hex32", "uuid"]
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  }
                },
                "required": ["version", "run", "env"],
                "additionalProperties": false
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "stage", "message", "projectId", "source"],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "const": "verify_failed"
              },
              "stage": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "output": {
                "type": "string"
              },
              "vmId": {
                "type": "string"
              },
              "attemptedSpec": {
                "type": "object",
                "properties": {
                  "version": {
                    "type": "number",
                    "const": 1
                  },
                  "build": {
                    "type": "object",
                    "properties": {
                      "context": {
                        "type": "string",
                        "minLength": 1
                      },
                      "dockerfile": {
                        "type": "object",
                        "properties": {
                          "base": {
                            "type": "string",
                            "minLength": 1
                          },
                          "steps": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "command": {
                            "minItems": 1,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "minLength": 1
                            }
                          }
                        },
                        "required": ["base", "steps"],
                        "additionalProperties": false
                      },
                      "args": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": ["context", "dockerfile", "args"],
                    "additionalProperties": false
                  },
                  "verify": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1
                        },
                        "command": {
                          "type": "string",
                          "minLength": 1
                        },
                        "profile": {
                          "type": "string",
                          "minLength": 1
                        }
                      },
                      "required": ["name", "command", "profile"],
                      "additionalProperties": false
                    }
                  },
                  "run": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "static"
                          },
                          "outputDir": {
                            "type": "string",
                            "minLength": 1
                          }
                        },
                        "required": ["kind", "outputDir"],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "compose"
                          },
                          "service": {
                            "type": "string",
                            "minLength": 1
                          },
                          "port": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 65535
                          },
                          "healthcheck": {
                            "type": "object",
                            "properties": {
                              "path": {
                                "type": "string"
                              },
                              "test": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "intervalSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "timeoutSeconds": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "retries": {
                                "type": "integer",
                                "exclusiveMinimum": 0,
                                "maximum": 9007199254740991
                              },
                              "startPeriodSeconds": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9007199254740991
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "required": ["kind", "service", "port"],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "env": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "variable"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "public": {
                              "type": "boolean"
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "kind": {
                              "type": "string",
                              "const": "secret"
                            },
                            "phase": {
                              "default": "run",
                              "type": "string",
                              "enum": ["build", "run"]
                            },
                            "required": {
                              "type": "boolean"
                            },
                            "generate": {
                              "type": "string",
                              "enum": ["password", "hex32", "uuid"]
                            },
                            "comment": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "kind", "phase", "required"],
                          "additionalProperties": false
                        }
                      ]
                    }
                  }
                },
                "required": ["version", "run", "env"],
                "additionalProperties": false
              },
              "verify": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "passed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "failed"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "no_tests_found"
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "steps"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "outcome": {
                        "type": "string",
                        "const": "skipped"
                      },
                      "reason": {
                        "type": "string",
                        "enum": ["static", "planned"]
                      },
                      "steps": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": ["passed", "failed", "skipped"]
                            },
                            "output": {
                              "type": "string"
                            }
                          },
                          "required": ["name", "status"],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": ["outcome", "reason", "steps"],
                    "additionalProperties": false
                  }
                ]
              },
              "projectId": {
                "type": "string"
              },
              "source": {
                "type": "string",
                "enum": ["planned", "replayed", "submitted", "redeployed"]
              },
              "replacedStaleSpec": {
                "type": "boolean"
              },
              "deploymentId": {
                "type": "string"
              },
              "version": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "tag": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "fileUrls": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      }
                    },
                    "required": ["source"],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "dockerfile": {
                        "type": "string"
                      },
                      "compose": {
                        "type": "string"
                      }
                    },
                    "required": ["source", "dockerfile", "compose"],
                    "additionalProperties": false
                  }
                ]
              }
            },
            "required": ["status", "stage", "message", "projectId", "source"],
            "additionalProperties": false
          }
        ]
      },
      "ProjectEnvGetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          }
        },
        "required": ["organization", "projectId"],
        "additionalProperties": false
      },
      "ProjectEnvGetOutput": {
        "type": "object",
        "properties": {
          "localEntries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["variable", "secret"]
                },
                "name": {
                  "type": "string"
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "comment": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdByUserId": {
                  "type": "string"
                },
                "updatedByUserId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": ["person", "api_token"]
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["kind", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "updatedBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": ["person", "api_token"]
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["kind", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string"
                },
                "updatedAt": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "kind",
                "name",
                "value",
                "comment",
                "createdByUserId",
                "updatedByUserId",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "organization": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "bindings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "maxLength": 128
                },
                "organization": {
                  "type": "string",
                  "maxLength": 128
                }
              },
              "required": ["name", "organization"],
              "additionalProperties": false
            }
          },
          "platformEntries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "overriddenBy": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["local", "organization"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": ["name", "value", "description", "overriddenBy"],
              "additionalProperties": false
            }
          }
        },
        "required": ["localEntries", "organization", "bindings", "platformEntries"],
        "additionalProperties": false
      },
      "ProjectEnvSelectInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          },
          "environment": {
            "maxItems": 500,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
            },
            "description": "Organization catalogue entry names to export under their own names."
          },
          "bindings": {
            "description": "Slot-centric org bindings. Omit to clear existing remaps.",
            "maxItems": 500,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 128,
                  "description": "VM process env / slot name."
                },
                "organization": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 128,
                  "description": "Organization catalogue entry name to export into the slot."
                }
              },
              "required": ["name", "organization"]
            }
          }
        },
        "required": ["organization", "projectId", "environment"],
        "additionalProperties": false
      },
      "ProjectEnvSelectOutput": {
        "type": "object",
        "properties": {
          "localEntries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["variable", "secret"]
                },
                "name": {
                  "type": "string"
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "comment": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdByUserId": {
                  "type": "string"
                },
                "updatedByUserId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": ["person", "api_token"]
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["kind", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "updatedBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": ["person", "api_token"]
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["kind", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string"
                },
                "updatedAt": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "kind",
                "name",
                "value",
                "comment",
                "createdByUserId",
                "updatedByUserId",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "organization": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "bindings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "maxLength": 128
                },
                "organization": {
                  "type": "string",
                  "maxLength": 128
                }
              },
              "required": ["name", "organization"],
              "additionalProperties": false
            }
          }
        },
        "required": ["localEntries", "organization", "bindings"],
        "additionalProperties": false
      },
      "ProjectEnvSetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
          },
          "value": {
            "type": "string",
            "maxLength": 32768,
            "description": "The value to store. A secret value can be replaced later but never read back."
          },
          "kind": {
            "type": "string",
            "enum": ["variable", "secret"],
            "description": "\"variable\" or \"secret\". A secret value can be replaced but never read back."
          },
          "comment": {
            "description": "Optional note shown with the entry, e.g. what it is for.",
            "type": "string",
            "maxLength": 500
          }
        },
        "required": ["organization", "projectId", "name", "value", "kind"],
        "additionalProperties": false
      },
      "ProjectEnvSetOutput": {
        "type": "object",
        "properties": {
          "localEntries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["variable", "secret"]
                },
                "name": {
                  "type": "string"
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "comment": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdByUserId": {
                  "type": "string"
                },
                "updatedByUserId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": ["person", "api_token"]
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["kind", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "updatedBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": ["person", "api_token"]
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["kind", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string"
                },
                "updatedAt": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "kind",
                "name",
                "value",
                "comment",
                "createdByUserId",
                "updatedByUserId",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "organization": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "bindings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "maxLength": 128
                },
                "organization": {
                  "type": "string",
                  "maxLength": 128
                }
              },
              "required": ["name", "organization"],
              "additionalProperties": false
            }
          }
        },
        "required": ["localEntries", "organization", "bindings"],
        "additionalProperties": false
      },
      "ProjectEnvDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "projectId": {
            "type": "string",
            "minLength": 1,
            "description": "Project id, from project_list (project_publish returns it too)."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
          }
        },
        "required": ["organization", "projectId", "name"],
        "additionalProperties": false
      },
      "ProjectEnvDeleteOutput": {
        "type": "object",
        "properties": {
          "localEntries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["variable", "secret"]
                },
                "name": {
                  "type": "string"
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "comment": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdByUserId": {
                  "type": "string"
                },
                "updatedByUserId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": ["person", "api_token"]
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["kind", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "updatedBy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": ["person", "api_token"]
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": ["kind", "name"],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string"
                },
                "updatedAt": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "kind",
                "name",
                "value",
                "comment",
                "createdByUserId",
                "updatedByUserId",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "organization": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "bindings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "maxLength": 128
                },
                "organization": {
                  "type": "string",
                  "maxLength": 128
                }
              },
              "required": ["name", "organization"],
              "additionalProperties": false
            }
          }
        },
        "required": ["localEntries", "organization", "bindings"],
        "additionalProperties": false
      },
      "SiteDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "siteId": {
            "type": "string",
            "minLength": 1,
            "description": "Site id: the slug in the public URL, as returned by site_publish or site_list."
          }
        },
        "required": ["organization", "siteId"],
        "additionalProperties": false
      },
      "SiteDeleteOutput": {
        "type": "object",
        "properties": {
          "siteId": {
            "type": "string"
          }
        },
        "required": ["siteId"],
        "additionalProperties": false
      },
      "SiteReleaseInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "siteId": {
            "type": "string",
            "minLength": 1,
            "description": "Site id: the slug in the public URL, as returned by site_publish or site_list."
          }
        },
        "required": ["organization", "siteId"],
        "additionalProperties": false
      },
      "SiteReleaseOutput": {
        "type": "object",
        "properties": {
          "siteId": {
            "type": "string"
          }
        },
        "required": ["siteId"],
        "additionalProperties": false
      },
      "VmEnvGetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          }
        },
        "required": ["organization", "vm"],
        "additionalProperties": false
      },
      "VmEnvGetOutput": {
        "type": "object",
        "properties": {
          "organizationEntries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["variable", "secret"]
                },
                "scope": {
                  "type": "string",
                  "enum": ["organization", "vm"]
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "valueLength": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "valueOmittedReason": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["secret", "too_large"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "comment": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "selected": {
                  "type": "boolean"
                },
                "exportAs": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "overriddenByLocal": {
                  "type": "boolean"
                }
              },
              "required": [
                "name",
                "kind",
                "value",
                "valueLength",
                "valueOmittedReason",
                "comment",
                "selected",
                "exportAs",
                "overriddenByLocal"
              ],
              "additionalProperties": false
            }
          },
          "bindings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "organization": {
                  "type": "string"
                }
              },
              "required": ["name", "organization"],
              "additionalProperties": false
            }
          },
          "localEntries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["variable", "secret"]
                },
                "scope": {
                  "type": "string",
                  "enum": ["organization", "vm"]
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "valueLength": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "valueOmittedReason": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["secret", "too_large"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "comment": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": ["name", "kind", "value", "valueLength", "valueOmittedReason", "comment"],
              "additionalProperties": false
            }
          },
          "platformEntries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "overriddenBy": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["local", "organization"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": ["name", "value", "description", "overriddenBy"],
              "additionalProperties": false
            }
          },
          "vmRunning": {
            "type": "boolean"
          }
        },
        "required": [
          "organizationEntries",
          "bindings",
          "localEntries",
          "platformEntries",
          "vmRunning"
        ],
        "additionalProperties": false
      },
      "VmEnvSelectInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "environment": {
            "maxItems": 500,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
            },
            "description": "Organization catalogue entry names to export under their own names. Pass [] to clear plain selections."
          },
          "bindings": {
            "description": "Slot-centric org bindings: export an organization entry under a (possibly different) VM env name. Omit to clear existing remaps (full replace).",
            "maxItems": 500,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 128,
                  "description": "VM process env / slot name."
                },
                "organization": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 128,
                  "description": "Organization catalogue entry name to export into the slot."
                }
              },
              "required": ["name", "organization"]
            }
          },
          "restart": {
            "description": "When true and the VM is running, stop then start after saving so processes pick up the change. Default: sync only; already-running processes keep the old values until restarted.",
            "type": "boolean"
          }
        },
        "required": ["organization", "vm", "environment"],
        "additionalProperties": false
      },
      "VmEnvSelectOutput": {
        "type": "object",
        "properties": {
          "environment": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "requiresRestartForRunningProcesses": {
            "type": "boolean"
          },
          "restarted": {
            "type": "boolean"
          }
        },
        "required": ["environment", "requiresRestartForRunningProcesses", "restarted"],
        "additionalProperties": false
      },
      "VmEnvSetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
          },
          "value": {
            "type": "string",
            "maxLength": 32768,
            "description": "The value to store. A secret value can be replaced later but never read back."
          },
          "kind": {
            "description": "Required when creating. Use \"secret\" for credentials; secret values can be replaced but never read back. Omit when updating to keep the existing kind.",
            "type": "string",
            "enum": ["variable", "secret"]
          },
          "comment": {
            "description": "Optional note shown with the entry, e.g. what it is for.",
            "type": "string",
            "maxLength": 500
          },
          "restart": {
            "description": "When true and the VM is running, stop then start after saving so processes pick up the change. Default: sync only.",
            "type": "boolean"
          }
        },
        "required": ["organization", "vm", "name", "value"],
        "additionalProperties": false
      },
      "VmEnvSetOutput": {
        "type": "object",
        "properties": {
          "entry": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "kind": {
                "type": "string",
                "enum": ["variable", "secret"]
              },
              "scope": {
                "type": "string",
                "enum": ["organization", "vm"]
              },
              "value": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "valueLength": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "valueOmittedReason": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": ["secret", "too_large"]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "comment": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": ["name", "kind", "value", "valueLength", "valueOmittedReason", "comment"],
            "additionalProperties": false
          },
          "created": {
            "type": "boolean"
          },
          "previousKind": {
            "type": "string",
            "enum": ["variable", "secret"]
          },
          "requiresRestartForRunningProcesses": {
            "type": "boolean"
          },
          "restarted": {
            "type": "boolean"
          }
        },
        "required": ["entry", "created", "requiresRestartForRunningProcesses", "restarted"],
        "additionalProperties": false
      },
      "VmEnvDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "vm": {
            "type": "string",
            "minLength": 1,
            "description": "VM name (e.g. quiet-harbor) or id, from vm_list or vm_up. Names are unique within the organization."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
          },
          "restart": {
            "description": "When true and the VM is running, stop then start after saving so processes pick up the change. Default: sync only.",
            "type": "boolean"
          }
        },
        "required": ["organization", "vm", "name"],
        "additionalProperties": false
      },
      "VmEnvDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "requiresRestartForRunningProcesses": {
            "type": "boolean"
          },
          "restarted": {
            "type": "boolean"
          }
        },
        "required": ["ok", "requiresRestartForRunningProcesses", "restarted"],
        "additionalProperties": false
      },
      "EnvListInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "EnvListOutput": {
        "type": "object",
        "properties": {
          "entries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": ["variable", "secret"]
                },
                "scope": {
                  "type": "string",
                  "enum": ["organization", "vm"]
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "valueLength": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "valueOmittedReason": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": ["secret", "too_large"]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "comment": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": ["name", "kind", "value", "valueLength", "valueOmittedReason", "comment"],
              "additionalProperties": false
            }
          }
        },
        "required": ["entries"],
        "additionalProperties": false
      },
      "EnvGetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
          }
        },
        "required": ["organization", "name"],
        "additionalProperties": false
      },
      "EnvGetOutput": {
        "type": "object",
        "properties": {
          "entry": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "kind": {
                "type": "string",
                "enum": ["variable", "secret"]
              },
              "scope": {
                "type": "string",
                "enum": ["organization", "vm"]
              },
              "value": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "valueLength": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "valueOmittedReason": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": ["secret", "too_large"]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "comment": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": ["name", "kind", "value", "valueLength", "valueOmittedReason", "comment"],
            "additionalProperties": false
          }
        },
        "required": ["entry"],
        "additionalProperties": false
      },
      "EnvSetInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
          },
          "value": {
            "type": "string",
            "maxLength": 32768,
            "description": "The value to store. A secret value can be replaced later but never read back."
          },
          "kind": {
            "description": "Required when creating. Use \"secret\" for credentials; secret values can be replaced but never read back. Omit when updating to keep the existing kind.",
            "type": "string",
            "enum": ["variable", "secret"]
          },
          "comment": {
            "description": "Optional note shown with the entry, e.g. what it is for.",
            "type": "string",
            "maxLength": 500
          }
        },
        "required": ["organization", "name", "value"],
        "additionalProperties": false
      },
      "EnvSetOutput": {
        "type": "object",
        "properties": {
          "entry": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "kind": {
                "type": "string",
                "enum": ["variable", "secret"]
              },
              "scope": {
                "type": "string",
                "enum": ["organization", "vm"]
              },
              "value": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "valueLength": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "valueOmittedReason": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": ["secret", "too_large"]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "comment": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": ["name", "kind", "value", "valueLength", "valueOmittedReason", "comment"],
            "additionalProperties": false
          },
          "created": {
            "type": "boolean"
          },
          "previousKind": {
            "type": "string",
            "enum": ["variable", "secret"]
          }
        },
        "required": ["entry", "created"],
        "additionalProperties": false
      },
      "EnvDeleteInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Environment variable name, e.g. DATABASE_URL. Letters, digits and underscores only. Case-sensitive; stored exactly as provided."
          }
        },
        "required": ["organization", "name"],
        "additionalProperties": false
      },
      "EnvDeleteOutput": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        },
        "required": ["ok"],
        "additionalProperties": false
      },
      "RegistryCredentialsInput": {
        "type": "object",
        "properties": {
          "organization": {
            "type": "string",
            "minLength": 1,
            "description": "Organization id, slug or name, from organization_list. A name works when only one of your organizations has it. Ids survive renames; slugs and names change when the organization is renamed."
          },
          "provider": {
            "description": "Provider from provider_list. Omit to use the one vm_up would pick: the org choice, else the platform default, else the first listed provider that fits. When no provider fits, the call fails with a not-configured error.",
            "type": "string",
            "minLength": 1
          }
        },
        "required": ["organization"],
        "additionalProperties": false
      },
      "RegistryCredentialsOutput": {
        "type": "object",
        "properties": {
          "host": {
            "type": "string"
          },
          "repositoryPrefix": {
            "type": "string"
          },
          "username": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "expiresAt": {
            "type": "string"
          },
          "imageRefExample": {
            "type": "string"
          }
        },
        "required": [
          "host",
          "repositoryPrefix",
          "username",
          "password",
          "expiresAt",
          "imageRefExample"
        ],
        "additionalProperties": false
      },
      "SkillListInput": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "SkillListOutput": {
        "type": "object",
        "properties": {
          "$schema": {
            "type": "string"
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string",
                  "const": "skill-md"
                },
                "description": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": ["name", "type", "description", "url"],
              "additionalProperties": false
            }
          }
        },
        "required": ["$schema", "skills"],
        "additionalProperties": false
      },
      "SkillGetInput": {
        "type": "object",
        "properties": {
          "uri": {
            "type": "string",
            "minLength": 1,
            "description": "skill:// URI from skill_list / skill://index.json, or a skill name (github, org_1/release-notes)."
          }
        },
        "required": ["uri"],
        "additionalProperties": false
      },
      "SkillGetOutput": {
        "type": "object",
        "properties": {
          "uri": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "markdown": {
            "type": "string"
          }
        },
        "required": ["uri", "name", "description", "markdown"],
        "additionalProperties": false
      }
    }
  }
}
