{
  "openapi": "3.1.0",
  "info": {
    "title": "Spinbox API",
    "description": "The control plane's API, spin.v1, generated from its protobuf schema. Every procedure is a Connect unary call: POST a JSON body to /\u003cservice\u003e/\u003cmethod\u003e with `Content-Type: application/json` and `Authorization: Bearer \u003cAPI key\u003e`.",
    "version": "v1"
  },
  "paths": {
    "/spin.v1.AdminService/AddAllowedEmail": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "AddAllowedEmail",
        "description": "Add allowed email/domain",
        "operationId": "spin.v1.AdminService.AddAllowedEmail",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.AddAllowedEmailRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.AddAllowedEmailResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/CreateNetworkPolicy": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "CreateNetworkPolicy",
        "operationId": "spin.v1.AdminService.CreateNetworkPolicy",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CreateNetworkPolicyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CreateNetworkPolicyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/CreateResourcePreset": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "CreateResourcePreset",
        "description": "Create a resource preset",
        "operationId": "spin.v1.AdminService.CreateResourcePreset",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CreateResourcePresetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CreateResourcePresetResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/DecideConfigChange": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "DecideConfigChange",
        "description": "Apply a change the file proposes, or dismiss it. Either is remembered until the file says\n something else again. Audited with the admin who decided.",
        "operationId": "spin.v1.AdminService.DecideConfigChange",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DecideConfigChangeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DecideConfigChangeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/DeleteNetworkPolicy": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "DeleteNetworkPolicy",
        "description": "Refused while a workspace runs under the policy or it is the installation's default.",
        "operationId": "spin.v1.AdminService.DeleteNetworkPolicy",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteNetworkPolicyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteNetworkPolicyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/DeleteResourcePreset": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "DeleteResourcePreset",
        "description": "Delete a resource preset",
        "operationId": "spin.v1.AdminService.DeleteResourcePreset",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteResourcePresetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteResourcePresetResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ExplainStorageKey": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ExplainStorageKey",
        "description": "What one key in the store is, and whose: a key read off the bucket's console says nothing\n a person can act on.",
        "operationId": "spin.v1.AdminService.ExplainStorageKey",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ExplainStorageKeyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ExplainStorageKeyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetBill": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetBill",
        "description": "What the installation cost in a month, as its cloud's bill says: by day and service, what the\n month is forecast to end at, and its budget. As the control plane last read the bill - a few\n times a day (internal/controlplane/domain/bill) - never the cloud itself, where every question\n to its billing is billed.",
        "operationId": "spin.v1.AdminService.GetBill",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetBillRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetBillResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetCosts": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetCosts",
        "description": "A month of the bill shared out to the workspaces that caused it: the runners' by what each\n workspace held of them, the volumes' bucket by what its volumes kept. What nobody caused is\n said apart and never spread: the runners' capacity nobody held, the bucket's bytes no\n workspace keeps, and the platform's own cost by service (internal/controlplane/domain/finops).",
        "operationId": "spin.v1.AdminService.GetCosts",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetCostsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetCostsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetFleetVersions": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetFleetVersions",
        "description": "What is running where: this control plane, each host's runner and machine, and the\n extension releases workspaces are on. An installation is updated in halves, and this is\n the one page that says which halves it is in.",
        "operationId": "spin.v1.AdminService.GetFleetVersions",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetFleetVersionsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetFleetVersionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetInstallationSettings": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetInstallationSettings",
        "description": "Get installation settings",
        "operationId": "spin.v1.AdminService.GetInstallationSettings",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetInstallationSettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetInstallationSettingsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetMonitoring": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetMonitoring",
        "description": "The Grafana the control plane serves over the installation's metrics, and the release's\n dashboards in it.",
        "operationId": "spin.v1.AdminService.GetMonitoring",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetMonitoringRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetMonitoringResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetPlatformImages": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetPlatformImages",
        "description": "Whether the base image and the supervisor this control plane's image carries are\n published.",
        "operationId": "spin.v1.AdminService.GetPlatformImages",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetPlatformImagesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetPlatformImagesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetRegistrationMode": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetRegistrationMode",
        "description": "Get registration mode (open, whitelist, closed)",
        "operationId": "spin.v1.AdminService.GetRegistrationMode",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetRegistrationModeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetRegistrationModeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetSecuritySettings": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetSecuritySettings",
        "description": "Get security settings",
        "operationId": "spin.v1.AdminService.GetSecuritySettings",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetSecuritySettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetSecuritySettingsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetStorageSettings": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetStorageSettings",
        "description": "Where the installation's object store is. The secret is never read back.",
        "operationId": "spin.v1.AdminService.GetStorageSettings",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetStorageSettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetStorageSettingsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetStorageUsage": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetStorageUsage",
        "description": "What the store holds, by what each object is for: every volume's objects and the layers its\n commits name, with the workspace, image or extension release it is. As the storage-gc job\n last read it - daily, or when an admin runs it - never the bucket itself.",
        "operationId": "spin.v1.AdminService.GetStorageUsage",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetStorageUsageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetStorageUsageResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetTelemetryStatus": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetTelemetryStatus",
        "description": "What the collector has sent and failed to send over its last minute, as the watch on its\n machine read it from the collector itself.",
        "operationId": "spin.v1.AdminService.GetTelemetryStatus",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetTelemetryStatusRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetTelemetryStatusResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/GetVSCodeServers": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "GetVSCodeServers",
        "description": "The VS Code servers workspaces are given (the vscode-server extension): each release, and\n the publish this control plane ran since it started, if it ran one.",
        "operationId": "spin.v1.AdminService.GetVSCodeServers",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetVSCodeServersRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetVSCodeServersResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ListAllowedEmails": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ListAllowedEmails",
        "description": "List allowed emails/domains",
        "operationId": "spin.v1.AdminService.ListAllowedEmails",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListAllowedEmailsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListAllowedEmailsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ListAuditLog": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ListAuditLog",
        "description": "Read the audit log, newest first. There is no RPC that writes one: an entry is written\n by the operation it records, so a log an API could add to would be one an API could\n forge.",
        "operationId": "spin.v1.AdminService.ListAuditLog",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListAuditLogRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListAuditLogResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ListConfigChanges": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ListConfigChanges",
        "description": "What the config file says now and the installation does not, for an administrator to\n decide: the file seeds an installation once, and after that its changes are proposals.",
        "operationId": "spin.v1.AdminService.ListConfigChanges",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListConfigChangesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListConfigChangesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ListJobRuns": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ListJobRuns",
        "description": "One job's runs, newest first.",
        "operationId": "spin.v1.AdminService.ListJobRuns",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListJobRunsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListJobRunsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ListJobs": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ListJobs",
        "description": "The control plane's periodic work - backups, cleanups, the object store's garbage\n collection - with how often each runs and how its last run went.",
        "operationId": "spin.v1.AdminService.ListJobs",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListJobsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListJobsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ListRekeys": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ListRekeys",
        "description": "The disks being re-keyed, and the ones a revoked host's keys marked for it.",
        "operationId": "spin.v1.AdminService.ListRekeys",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListRekeysRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListRekeysResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ListResourcePresets": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ListResourcePresets",
        "description": "List resource presets",
        "operationId": "spin.v1.AdminService.ListResourcePresets",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListResourcePresetsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListResourcePresetsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ListUserAPIKeys": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ListUserAPIKeys",
        "description": "List another user's API keys. The secret is never stored, so this is what an admin can\n know about a key: what it is called, when it was made, when it was last used.",
        "operationId": "spin.v1.AdminService.ListUserAPIKeys",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListUserAPIKeysRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListUserAPIKeysResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/ListUsers": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "ListUsers",
        "description": "List all users",
        "operationId": "spin.v1.AdminService.ListUsers",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListUsersRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListUsersResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/PublishVSCodeServers": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "PublishVSCodeServers",
        "description": "Publish the servers of the newest stable VS Code releases, or of the commits named, as a\n new release. Answers once the publish has begun - it downloads a gigabyte - and\n GetVSCodeServers says how it goes.",
        "operationId": "spin.v1.AdminService.PublishVSCodeServers",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.PublishVSCodeServersRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.PublishVSCodeServersResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/RekeyVolume": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "RekeyVolume",
        "description": "Re-key a workspace's disk: copy it whole under a key of its own, point the workspace at the\n copy, and delete the disk - which shreds the key assumed taken and every snapshot of the disk,\n since those are what that key opens. The workspace must be stopped or quarantined. Refused for\n a disk something descends from. Audited.",
        "operationId": "spin.v1.AdminService.RekeyVolume",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RekeyVolumeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RekeyVolumeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/RemoveAllowedEmail": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "RemoveAllowedEmail",
        "description": "Remove allowed email/domain",
        "operationId": "spin.v1.AdminService.RemoveAllowedEmail",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RemoveAllowedEmailRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RemoveAllowedEmailResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/RemoveStoredVolume": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "RemoveStoredVolume",
        "description": "Remove an image, an extension release, an unclaimed volume or an orphan from the store: its\n row, then its volume, whose key is shredded; storage-gc collects its layers on its next run.\n Refused for one that is kept (StoredVolume.kept_because), one placed on a host, and a\n workspace's disk. Audited.",
        "operationId": "spin.v1.AdminService.RemoveStoredVolume",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RemoveStoredVolumeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RemoveStoredVolumeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/RetryPlatformImages": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "RetryPlatformImages",
        "description": "Look again now rather than when the next retry is due.",
        "operationId": "spin.v1.AdminService.RetryPlatformImages",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RetryPlatformImagesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RetryPlatformImagesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/RevokeUserAPIKey": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "RevokeUserAPIKey",
        "description": "Revoke another user's API key - the offboarding an admin cannot do by asking the user,\n who may already be gone. It is audited with the admin who did it.",
        "operationId": "spin.v1.AdminService.RevokeUserAPIKey",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RevokeUserAPIKeyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RevokeUserAPIKeyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/RunJobNow": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "RunJobNow",
        "description": "Run a job now rather than when it is next due. Refused while it is running: a second run\n alongside the first would do the same work twice. Audited with the admin who asked.",
        "operationId": "spin.v1.AdminService.RunJobNow",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RunJobNowRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RunJobNowResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/SetRegistrationMode": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "SetRegistrationMode",
        "description": "Set registration mode",
        "operationId": "spin.v1.AdminService.SetRegistrationMode",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetRegistrationModeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetRegistrationModeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/UntagImage": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "UntagImage",
        "description": "Take a ref off what it names: no new workspace gets those bytes by it, the disks cloned from\n them go on reading them, and a later publish under the ref tags the new bytes. Audited.",
        "operationId": "spin.v1.AdminService.UntagImage",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UntagImageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UntagImageResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/UpdateInstallationSettings": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "UpdateInstallationSettings",
        "description": "Update installation settings",
        "operationId": "spin.v1.AdminService.UpdateInstallationSettings",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateInstallationSettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateInstallationSettingsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/UpdateNetworkPolicy": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "UpdateNetworkPolicy",
        "operationId": "spin.v1.AdminService.UpdateNetworkPolicy",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateNetworkPolicyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateNetworkPolicyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/UpdateResourcePreset": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "UpdateResourcePreset",
        "description": "Update a resource preset",
        "operationId": "spin.v1.AdminService.UpdateResourcePreset",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateResourcePresetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateResourcePresetResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/UpdateSecuritySettings": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "UpdateSecuritySettings",
        "description": "Update security settings",
        "operationId": "spin.v1.AdminService.UpdateSecuritySettings",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateSecuritySettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateSecuritySettingsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/UpdateStorageSettings": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "UpdateStorageSettings",
        "description": "Set where the object store is, checked against it before it is written; every control\n plane restarts within seconds to open it. Another store while volumes exist is refused.",
        "operationId": "spin.v1.AdminService.UpdateStorageSettings",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateStorageSettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateStorageSettingsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AdminService/UpdateUser": {
      "post": {
        "tags": [
          "AdminService"
        ],
        "summary": "UpdateUser",
        "description": "Update user (can toggle is_instance_admin, disable user)",
        "operationId": "spin.v1.AdminService.UpdateUser",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateUserRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateUserResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/ApproveWorkspaceSignIn": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "ApproveWorkspaceSignIn",
        "operationId": "spin.v1.AuthService.ApproveWorkspaceSignIn",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ApproveWorkspaceSignInRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ApproveWorkspaceSignInResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/BeginWorkspaceSignIn": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "BeginWorkspaceSignIn",
        "description": "A sign-in on a workspace's host, done by the dashboard. The proxy begins it and sends the\n browser to the dashboard, which approves it for whoever is signed in there and sends the\n browser back with a one-time code; the proxy completes it with that code and the binding\n it gave the same browser. The identity provider is only ever told the dashboard's callback.",
        "operationId": "spin.v1.AuthService.BeginWorkspaceSignIn",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.BeginWorkspaceSignInRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.BeginWorkspaceSignInResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/CheckDeviceLogin": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "CheckDeviceLogin",
        "description": "Check device login status (CLI polls this)\n Returns session token once user has completed login and entered the code",
        "operationId": "spin.v1.AuthService.CheckDeviceLogin",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CheckDeviceLoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CheckDeviceLoginResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/CompleteLogin": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "CompleteLogin",
        "description": "Complete login (callback from IdP)",
        "operationId": "spin.v1.AuthService.CompleteLogin",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CompleteLoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CompleteLoginResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/CompleteWorkspaceSignIn": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "CompleteWorkspaceSignIn",
        "operationId": "spin.v1.AuthService.CompleteWorkspaceSignIn",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CompleteWorkspaceSignInRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CompleteWorkspaceSignInResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/ConfirmDeviceLogin": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "ConfirmDeviceLogin",
        "description": "Complete device login (dashboard calls this after user enters code)\n Requires authentication - links the device code to the current user",
        "operationId": "spin.v1.AuthService.ConfirmDeviceLogin",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ConfirmDeviceLoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ConfirmDeviceLoginResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/CreateAPIKey": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "CreateAPIKey",
        "description": "Create API key",
        "operationId": "spin.v1.AuthService.CreateAPIKey",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CreateAPIKeyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CreateAPIKeyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/GetCurrentUser": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "GetCurrentUser",
        "description": "Get current user info",
        "operationId": "spin.v1.AuthService.GetCurrentUser",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetCurrentUserRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetCurrentUserResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/ListAPIKeys": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "ListAPIKeys",
        "description": "List API keys",
        "operationId": "spin.v1.AuthService.ListAPIKeys",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListAPIKeysRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListAPIKeysResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/ListIdentityProviders": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "ListIdentityProviders",
        "description": "List available identity providers (for login page)\n Always includes built-in GitHub provider; additional OIDC providers from database",
        "operationId": "spin.v1.AuthService.ListIdentityProviders",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListIdentityProvidersRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListIdentityProvidersResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/Logout": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "Logout",
        "description": "Logout (invalidate session)",
        "operationId": "spin.v1.AuthService.Logout",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.LogoutRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.LogoutResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/RevokeAPIKey": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "RevokeAPIKey",
        "description": "Revoke API key",
        "operationId": "spin.v1.AuthService.RevokeAPIKey",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RevokeAPIKeyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RevokeAPIKeyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/SearchUsers": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "SearchUsers",
        "description": "Search users by name or email (for team member selection, workspace sharing)",
        "operationId": "spin.v1.AuthService.SearchUsers",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SearchUsersRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SearchUsersResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/StartDeviceLogin": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "StartDeviceLogin",
        "description": "Start device login flow (for CLI when OAuth redirect is not available)\n Returns a user code and verification URL. User visits URL and enters code.",
        "operationId": "spin.v1.AuthService.StartDeviceLogin",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.StartDeviceLoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.StartDeviceLoginResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.AuthService/StartLogin": {
      "post": {
        "tags": [
          "AuthService"
        ],
        "summary": "StartLogin",
        "description": "Start login flow with a specific identity provider\n Use \"github\" for built-in GitHub auth, or IdP ID for dynamic providers",
        "operationId": "spin.v1.AuthService.StartLogin",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.StartLoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.StartLoginResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.HostService/ActivateHost": {
      "post": {
        "tags": [
          "HostService"
        ],
        "summary": "ActivateHost",
        "description": "Activate a drained host (set to healthy, admin only)",
        "operationId": "spin.v1.HostService.ActivateHost",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ActivateHostRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ActivateHostResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.HostService/DrainHost": {
      "post": {
        "tags": [
          "HostService"
        ],
        "summary": "DrainHost",
        "description": "Set host to draining (admin only)",
        "operationId": "spin.v1.HostService.DrainHost",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DrainHostRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DrainHostResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.HostService/GetFleet": {
      "post": {
        "tags": [
          "HostService"
        ],
        "summary": "GetFleet",
        "description": "The fleet as a whole (admin only): how many hosts there are against how many the\n installation has asked its cloud for, and what it is waiting for. A fleet that scales from\n none looks broken without this - no hosts, no explanation, and a workspace that waits\n minutes for a machine to boot with nothing saying so.",
        "operationId": "spin.v1.HostService.GetFleet",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetFleetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetFleetResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.HostService/GetHost": {
      "post": {
        "tags": [
          "HostService"
        ],
        "summary": "GetHost",
        "description": "Get host details (admin only)",
        "operationId": "spin.v1.HostService.GetHost",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetHostRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetHostResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.HostService/GetHostPolicy": {
      "post": {
        "tags": [
          "HostService"
        ],
        "summary": "GetHostPolicy",
        "description": "What a host may do, as against what it is (admin only). A host reads what it *is* from\n its own environment, before it can reach this; everything else it is told, on its\n heartbeat, and it reports back the revision it is running under.",
        "operationId": "spin.v1.HostService.GetHostPolicy",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetHostPolicyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetHostPolicyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.HostService/ListHosts": {
      "post": {
        "tags": [
          "HostService"
        ],
        "summary": "ListHosts",
        "description": "List all hosts (admin only)",
        "operationId": "spin.v1.HostService.ListHosts",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListHostsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListHostsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.HostService/SetHostPolicy": {
      "post": {
        "tags": [
          "HostService"
        ],
        "summary": "SetHostPolicy",
        "operationId": "spin.v1.HostService.SetHostPolicy",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetHostPolicyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetHostPolicyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.HostService/TestHostWriteback": {
      "post": {
        "tags": [
          "HostService"
        ],
        "summary": "TestHostWriteback",
        "description": "Measures a host's disk under writeback thresholds no preset names, against the ones it holds\n (admin only). SetHostPolicy refuses such thresholds for a host until it has been tested with\n them; the test loads that host's disk for about forty seconds.",
        "operationId": "spin.v1.HostService.TestHostWriteback",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.TestHostWritebackRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.TestHostWritebackResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/GetTrace": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "GetTrace",
        "description": "GetTrace is every span of one trace, in the order they began.",
        "operationId": "spin.v1.LogService.GetTrace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetTraceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetTraceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/HistogramPlatformLogs": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "HistogramPlatformLogs",
        "description": "HistogramPlatformLogs is how many of those records each interval of the window holds, by\n severity: the chart above them.",
        "operationId": "spin.v1.LogService.HistogramPlatformLogs",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.HistogramPlatformLogsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.HistogramLogsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/HistogramWorkspaceLogs": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "HistogramWorkspaceLogs",
        "description": "HistogramWorkspaceLogs is how many of those records each interval of the window holds.",
        "operationId": "spin.v1.LogService.HistogramWorkspaceLogs",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.HistogramWorkspaceLogsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.HistogramWorkspaceLogsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/ListLogIndexes": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "ListLogIndexes",
        "description": "ListLogIndexes is every index the store keeps, as the store itself reports it: its fields,\n how long it keeps what it holds and how much it holds. An administrator's: how much each\n index holds is how busy the installation and its workspaces are.",
        "operationId": "spin.v1.LogService.ListLogIndexes",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListLogIndexesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListLogIndexesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/PlatformLogFieldValues": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "PlatformLogFieldValues",
        "description": "PlatformLogFieldValues is what one field most often is in the records a search of the\n platform's logs finds: service_name, severity_text, attributes.* or resource_attributes.*.",
        "operationId": "spin.v1.LogService.PlatformLogFieldValues",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.PlatformLogFieldValuesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.PlatformLogFieldValuesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/SearchPlatformLogs": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "SearchPlatformLogs",
        "description": "SearchPlatformLogs is what the installation's own processes logged - the control plane, the\n proxy, the runners. An administrator's: a platform's log names every workspace it touched.",
        "operationId": "spin.v1.LogService.SearchPlatformLogs",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SearchPlatformLogsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SearchLogsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/SearchTraces": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "SearchTraces",
        "description": "SearchTraces is the installation's traces whose first span matches, newest first. An\n administrator's, as the platform's logs are.",
        "operationId": "spin.v1.LogService.SearchTraces",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SearchTracesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SearchTracesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/SearchWorkspaceLogs": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "SearchWorkspaceLogs",
        "description": "SearchWorkspaceLogs is what one workspace's machine wrote to its console, where the\n installation collects it: whoever may read the workspace's console may search it.",
        "operationId": "spin.v1.LogService.SearchWorkspaceLogs",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SearchWorkspaceLogsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SearchWorkspaceLogsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/ServiceHealth": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "ServiceHealth",
        "description": "ServiceHealth is how each of the installation's services did over a window, as its traces\n and logs say it. An administrator's, as the traces are.",
        "operationId": "spin.v1.LogService.ServiceHealth",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ServiceHealthRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ServiceHealthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.LogService/WorkspaceLogFieldValues": {
      "post": {
        "tags": [
          "LogService"
        ],
        "summary": "WorkspaceLogFieldValues",
        "description": "WorkspaceLogFieldValues is the same of one workspace's, for whoever may read it.",
        "operationId": "spin.v1.LogService.WorkspaceLogFieldValues",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.WorkspaceLogFieldValuesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.WorkspaceLogFieldValuesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.RunnerTokenService/CreateRegistrationToken": {
      "post": {
        "tags": [
          "RunnerTokenService"
        ],
        "summary": "CreateRegistrationToken",
        "description": "Generate a one-time registration token (admin only)",
        "operationId": "spin.v1.RunnerTokenService.CreateRegistrationToken",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CreateRegistrationTokenRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CreateRegistrationTokenResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.RunnerTokenService/ListRegistrationTokens": {
      "post": {
        "tags": [
          "RunnerTokenService"
        ],
        "summary": "ListRegistrationTokens",
        "description": "List active registration tokens (admin only)",
        "operationId": "spin.v1.RunnerTokenService.ListRegistrationTokens",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListRegistrationTokensRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListRegistrationTokensResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.RunnerTokenService/RevokeRegistrationToken": {
      "post": {
        "tags": [
          "RunnerTokenService"
        ],
        "summary": "RevokeRegistrationToken",
        "description": "Revoke a registration token (admin only)",
        "operationId": "spin.v1.RunnerTokenService.RevokeRegistrationToken",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RevokeRegistrationTokenRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RevokeRegistrationTokenResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.RunnerTokenService/RevokeRunner": {
      "post": {
        "tags": [
          "RunnerTokenService"
        ],
        "summary": "RevokeRunner",
        "description": "Revoke a runner (admin only)",
        "operationId": "spin.v1.RunnerTokenService.RevokeRunner",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RevokeRunnerRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RevokeRunnerResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SSHKeyService/AddSSHKey": {
      "post": {
        "tags": [
          "SSHKeyService"
        ],
        "summary": "AddSSHKey",
        "description": "Upload a new SSH public key to user's account",
        "operationId": "spin.v1.SSHKeyService.AddSSHKey",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.AddSSHKeyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.AddSSHKeyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SSHKeyService/DeleteSSHKey": {
      "post": {
        "tags": [
          "SSHKeyService"
        ],
        "summary": "DeleteSSHKey",
        "description": "Delete an SSH key from user's account",
        "operationId": "spin.v1.SSHKeyService.DeleteSSHKey",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteSSHKeyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteSSHKeyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SSHKeyService/ListSSHKeys": {
      "post": {
        "tags": [
          "SSHKeyService"
        ],
        "summary": "ListSSHKeys",
        "description": "List user's SSH public keys",
        "operationId": "spin.v1.SSHKeyService.ListSSHKeys",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListSSHKeysRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListSSHKeysResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SettingsService/GetUserSettings": {
      "post": {
        "tags": [
          "SettingsService"
        ],
        "summary": "GetUserSettings",
        "description": "User settings",
        "operationId": "spin.v1.SettingsService.GetUserSettings",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetUserSettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetUserSettingsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SettingsService/UpdateUserSettings": {
      "post": {
        "tags": [
          "SettingsService"
        ],
        "summary": "UpdateUserSettings",
        "operationId": "spin.v1.SettingsService.UpdateUserSettings",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateUserSettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateUserSettingsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SettingsService/ValidateTaskfile": {
      "post": {
        "tags": [
          "SettingsService"
        ],
        "summary": "ValidateTaskfile",
        "description": "Validate Taskfile syntax",
        "operationId": "spin.v1.SettingsService.ValidateTaskfile",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ValidateTaskfileRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ValidateTaskfileResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SetupService/ChangePassword": {
      "post": {
        "tags": [
          "SetupService"
        ],
        "summary": "ChangePassword",
        "description": "Change admin password (requires auth)\n Called after initial login when force_password_change is true",
        "operationId": "spin.v1.SetupService.ChangePassword",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ChangePasswordRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ChangePasswordResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SetupService/CompleteSetup": {
      "post": {
        "tags": [
          "SetupService"
        ],
        "summary": "CompleteSetup",
        "description": "Mark setup wizard as complete (requires admin)",
        "operationId": "spin.v1.SetupService.CompleteSetup",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CompleteSetupRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CompleteSetupResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SetupService/ConfigureGitHubOAuth": {
      "post": {
        "tags": [
          "SetupService"
        ],
        "summary": "ConfigureGitHubOAuth",
        "description": "Configure GitHub OAuth credentials (requires admin)\n Encrypts and stores client_secret in the database",
        "operationId": "spin.v1.SetupService.ConfigureGitHubOAuth",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ConfigureGitHubOAuthRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ConfigureGitHubOAuthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SetupService/DisableBootstrapAdmin": {
      "post": {
        "tags": [
          "SetupService"
        ],
        "summary": "DisableBootstrapAdmin",
        "description": "Disable the bootstrap admin account (requires admin + OAuth must be configured)\n This removes password login capability for the bootstrap user",
        "operationId": "spin.v1.SetupService.DisableBootstrapAdmin",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DisableBootstrapAdminRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DisableBootstrapAdminResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SetupService/EnableDevMode": {
      "post": {
        "tags": [
          "SetupService"
        ],
        "summary": "EnableDevMode",
        "description": "Enable dev mode (requires admin)\n Creates a \"dev\" identity provider that allows login without real OAuth\n Only use for local development - not for production",
        "operationId": "spin.v1.SetupService.EnableDevMode",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.EnableDevModeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.EnableDevModeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SetupService/GetSetupStatus": {
      "post": {
        "tags": [
          "SetupService"
        ],
        "summary": "GetSetupStatus",
        "description": "Get current setup status (public - no auth required)\n Returns whether setup wizard needs to be completed",
        "operationId": "spin.v1.SetupService.GetSetupStatus",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetSetupStatusRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetSetupStatusResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SetupService/PasswordLogin": {
      "post": {
        "tags": [
          "SetupService"
        ],
        "summary": "PasswordLogin",
        "description": "Login with email/password (public - for admin bootstrap)\n Only works for users with admin_credentials",
        "operationId": "spin.v1.SetupService.PasswordLogin",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.PasswordLoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.PasswordLoginResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.ShareService/ListSharedSnapshots": {
      "post": {
        "tags": [
          "ShareService"
        ],
        "summary": "ListSharedSnapshots",
        "description": "List snapshots shared with the current user (or public)",
        "operationId": "spin.v1.ShareService.ListSharedSnapshots",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListSharedSnapshotsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListSharedSnapshotsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.ShareService/ListSnapshotShares": {
      "post": {
        "tags": [
          "ShareService"
        ],
        "summary": "ListSnapshotShares",
        "description": "List users who have access to a snapshot",
        "operationId": "spin.v1.ShareService.ListSnapshotShares",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListSnapshotSharesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListSnapshotSharesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.ShareService/SetSnapshotVisibility": {
      "post": {
        "tags": [
          "ShareService"
        ],
        "summary": "SetSnapshotVisibility",
        "description": "Set snapshot visibility (public/private)",
        "operationId": "spin.v1.ShareService.SetSnapshotVisibility",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetSnapshotVisibilityRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetSnapshotVisibilityResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.ShareService/ShareSnapshot": {
      "post": {
        "tags": [
          "ShareService"
        ],
        "summary": "ShareSnapshot",
        "description": "Share a snapshot with a specific user",
        "operationId": "spin.v1.ShareService.ShareSnapshot",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ShareSnapshotRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ShareSnapshotResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.ShareService/UnshareSnapshot": {
      "post": {
        "tags": [
          "ShareService"
        ],
        "summary": "UnshareSnapshot",
        "description": "Remove a user's access to a snapshot",
        "operationId": "spin.v1.ShareService.UnshareSnapshot",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UnshareSnapshotRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UnshareSnapshotResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SignatureService/ListPendingSignatures": {
      "post": {
        "tags": [
          "SignatureService"
        ],
        "summary": "ListPendingSignatures",
        "description": "What the caller is asked to sign: their keyring when their keys changed, and the roster of\n each team they own when its members changed.",
        "operationId": "spin.v1.SignatureService.ListPendingSignatures",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListPendingSignaturesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListPendingSignaturesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SignatureService/StartKeyringAnew": {
      "post": {
        "tags": [
          "SignatureService"
        ],
        "summary": "StartKeyringAnew",
        "description": "Start the caller's keyring anew: for a person who lost every key its newest version lists.\n The next keyring proposed lists the keys they registered since and is signed with one of\n them. Every workspace they own and every team that names them knows the old keyring, not the\n new one: their workspaces are recovered by cloning a snapshot of each into a new one, and a\n team's owner signs them in again.",
        "operationId": "spin.v1.SignatureService.StartKeyringAnew",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.StartKeyringAnewRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.StartKeyringAnewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.SignatureService/SubmitSignature": {
      "post": {
        "tags": [
          "SignatureService"
        ],
        "summary": "SubmitSignature",
        "description": "Take a document a person signed: refused unless it is the one proposed, signed by a key that\n may sign it.",
        "operationId": "spin.v1.SignatureService.SubmitSignature",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SubmitSignatureRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SubmitSignatureResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/AddMember": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "AddMember",
        "operationId": "spin.v1.TeamService.AddMember",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.AddTeamMemberRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.AddTeamMemberResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/CreateIdentityProvider": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "CreateIdentityProvider",
        "operationId": "spin.v1.TeamService.CreateIdentityProvider",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CreateTeamIdentityProviderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CreateTeamIdentityProviderResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/CreateProject": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "CreateProject",
        "description": "A team's projects: a repository and the shape of the workspace that opens it\n (CreateWorkspaceRequest.project_id). Made, changed and deleted by the team's admins, listed\n and opened by its members. A project with a workspace open on it is not deleted.",
        "operationId": "spin.v1.TeamService.CreateProject",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CreateProjectRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CreateProjectResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/CreateTeam": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "CreateTeam",
        "description": "Create a new team (can be nested under parent_id)",
        "operationId": "spin.v1.TeamService.CreateTeam",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CreateTeamRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CreateTeamResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/DeleteForge": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "DeleteForge",
        "operationId": "spin.v1.TeamService.DeleteForge",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteTeamForgeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteTeamForgeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/DeleteIdentityProvider": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "DeleteIdentityProvider",
        "operationId": "spin.v1.TeamService.DeleteIdentityProvider",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteTeamIdentityProviderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteTeamIdentityProviderResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/DeleteNetworkPolicy": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "DeleteNetworkPolicy",
        "operationId": "spin.v1.TeamService.DeleteNetworkPolicy",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteTeamNetworkPolicyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteTeamNetworkPolicyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/DeleteProject": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "DeleteProject",
        "operationId": "spin.v1.TeamService.DeleteProject",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteProjectRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteProjectResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/DeleteSecret": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "DeleteSecret",
        "operationId": "spin.v1.TeamService.DeleteSecret",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteTeamSecretRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteTeamSecretResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/DeleteTeam": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "DeleteTeam",
        "description": "Delete team (owner only, must have no children)",
        "operationId": "spin.v1.TeamService.DeleteTeam",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteTeamRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteTeamResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/GetTeam": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "GetTeam",
        "description": "Get team by ID or path",
        "operationId": "spin.v1.TeamService.GetTeam",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetTeamRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetTeamResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/ListForges": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "ListForges",
        "operationId": "spin.v1.TeamService.ListForges",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListTeamForgesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListTeamForgesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/ListIdentityProviders": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "ListIdentityProviders",
        "description": "Identity provider management (admin only)",
        "operationId": "spin.v1.TeamService.ListIdentityProviders",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListTeamIdentityProvidersRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListTeamIdentityProvidersResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/ListMembers": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "ListMembers",
        "description": "Member management",
        "operationId": "spin.v1.TeamService.ListMembers",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListTeamMembersRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListTeamMembersResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/ListPrebuilds": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "ListPrebuilds",
        "description": "A project's prebuilds, to its team's members; and a build of one of its refs now, by its\n admins, rather than at the next look.",
        "operationId": "spin.v1.TeamService.ListPrebuilds",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListPrebuildsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListPrebuildsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/ListProjects": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "ListProjects",
        "operationId": "spin.v1.TeamService.ListProjects",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListProjectsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListProjectsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/ListSecrets": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "ListSecrets",
        "operationId": "spin.v1.TeamService.ListSecrets",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListTeamSecretsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListTeamSecretsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/ListTeams": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "ListTeams",
        "description": "List teams (optionally filtered by parent)",
        "operationId": "spin.v1.TeamService.ListTeams",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListTeamsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListTeamsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/RemoveMember": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "RemoveMember",
        "operationId": "spin.v1.TeamService.RemoveMember",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RemoveTeamMemberRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RemoveTeamMemberResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/RunPrebuild": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "RunPrebuild",
        "operationId": "spin.v1.TeamService.RunPrebuild",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RunPrebuildRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RunPrebuildResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/SetForge": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "SetForge",
        "description": "A team's forges: the app it installed on its organization, from which the control plane mints\n the credential a brokered rule injecting that forge has the egress proxy set - an hour's, so a\n workspace of the team clones and pushes its private repositories with nothing of it on the disk.\n Set and deleted by the team's admins, after the forge has minted one with what was given; listed\n to its members. The app's key is never answered with again.",
        "operationId": "spin.v1.TeamService.SetForge",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetTeamForgeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetTeamForgeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/SetNetworkPolicy": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "SetNetworkPolicy",
        "description": "A team's egress policies: named, and only allowing - no rule brokers - for the workspaces of\n the team and the teams below it. Set and deleted by its admins where the installation lets\n teams declare them (team_network_policies); listed by WorkspaceService.ListNetworkPolicies.",
        "operationId": "spin.v1.TeamService.SetNetworkPolicy",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetTeamNetworkPolicyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetTeamNetworkPolicyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/SetSecret": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "SetSecret",
        "description": "A team's secrets: what a brokered network rule has the host's egress proxy add to a request,\n so a workspace of the team uses a key it never holds. Set and deleted by the team's admins,\n listed by name to its members; a value is never answered with again.",
        "operationId": "spin.v1.TeamService.SetSecret",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetTeamSecretRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetTeamSecretResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/UpdateIdentityProvider": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "UpdateIdentityProvider",
        "operationId": "spin.v1.TeamService.UpdateIdentityProvider",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateTeamIdentityProviderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateTeamIdentityProviderResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/UpdateMemberRole": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "UpdateMemberRole",
        "operationId": "spin.v1.TeamService.UpdateMemberRole",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateTeamMemberRoleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateTeamMemberRoleResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/UpdateProject": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "UpdateProject",
        "operationId": "spin.v1.TeamService.UpdateProject",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateProjectRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateProjectResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.TeamService/UpdateTeam": {
      "post": {
        "tags": [
          "TeamService"
        ],
        "summary": "UpdateTeam",
        "description": "Update team settings",
        "operationId": "spin.v1.TeamService.UpdateTeam",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateTeamRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateTeamResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/AddWorkspaceGuest": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "AddWorkspaceGuest",
        "description": "Invite a person to log in to a workspace as its guest, by their email: the owner's to ask,\n and the next access the owner signs names them. They log in once it does.",
        "operationId": "spin.v1.WorkspaceService.AddWorkspaceGuest",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.AddWorkspaceGuestRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.AddWorkspaceGuestResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/AttachVSCodeServer": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "AttachVSCodeServer",
        "description": "Give a running workspace the VS Code server of a client's commit, while it runs: published\n first when this installation has not got it and fetches servers on its own\n (InstallationSettings.vscode_fetch), refused as FAILED_PRECONDITION when it does not. Asked\n again until it answers attached.",
        "operationId": "spin.v1.WorkspaceService.AttachVSCodeServer",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.AttachVSCodeServerRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.AttachVSCodeServerResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/CheckPortAccess": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "CheckPortAccess",
        "description": "Whether one request may reach one published port. The gate in front of them.",
        "operationId": "spin.v1.WorkspaceService.CheckPortAccess",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CheckPortAccessRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CheckPortAccessResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/CheckPortPublished": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "CheckPortPublished",
        "description": "Whether a published port's name is one this installation serves, whoever may reach it: the\n proxy's on-demand TLS question, asked before any browser has a session to send.",
        "operationId": "spin.v1.WorkspaceService.CheckPortPublished",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CheckPortPublishedRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CheckPortPublishedResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/CloneWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "CloneWorkspace",
        "description": "Clone a running workspace: a snapshot of its disk, published, and a workspace created from it\n with the source's team, project and ref, size, network policies and environment, owned by the\n caller. Disk only: a clone has an identity of its own, so no memory goes with it. The snapshot\n stays, as the clone's floor. Answers once the clone exists, which takes as long as publishing\n the source's disk.",
        "operationId": "spin.v1.WorkspaceService.CloneWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CloneWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CloneWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/CreateSnapshot": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "CreateSnapshot",
        "description": "Create a snapshot of the current workspace state",
        "operationId": "spin.v1.WorkspaceService.CreateSnapshot",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CreateSnapshotRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CreateSnapshotResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/CreateWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "CreateWorkspace",
        "description": "Create a new workspace",
        "operationId": "spin.v1.WorkspaceService.CreateWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.CreateWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.CreateWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/DeleteSnapshot": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "DeleteSnapshot",
        "description": "Delete a snapshot",
        "operationId": "spin.v1.WorkspaceService.DeleteSnapshot",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteSnapshotRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteSnapshotResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/DeleteWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "DeleteWorkspace",
        "description": "Delete a workspace: into the trash, where the installation keeps one, or erased.",
        "operationId": "spin.v1.WorkspaceService.DeleteWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DeleteWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DeleteWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/DiffSnapshots": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "DiffSnapshots",
        "description": "Compare two of a workspace's snapshots file by file.",
        "operationId": "spin.v1.WorkspaceService.DiffSnapshots",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.DiffSnapshotsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.DiffSnapshotsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ExposePort": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ExposePort",
        "description": "Port exposure",
        "operationId": "spin.v1.WorkspaceService.ExposePort",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ExposePortRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ExposePortResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/GetOwnerWord": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "GetOwnerWord",
        "description": "A workspace's newest access - who logs in, consent to collect logs, the settings approved -\n with what the next must say: the people the owner invited and the settings the guest would be\n handed now, for the owner to sign. Its owner's and its guests' to read.",
        "operationId": "spin.v1.WorkspaceService.GetOwnerWord",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetOwnerWordRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetOwnerWordResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/GetWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "GetWorkspace",
        "description": "Get a specific workspace",
        "operationId": "spin.v1.WorkspaceService.GetWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/GetWorkspaceConsole": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "GetWorkspaceConsole",
        "description": "The tail of the workspace's serial console: the kernel, vminit, then the supervisor. It is\n where a machine that never came up says why, and it is read on demand from the host that\n holds it. An installation that collects consoles also keeps them, searchable for their\n retention (LogService.SearchWorkspaceLogs); one that does not keeps them on the host, since\n the console also carries what the tenant's own programs print.",
        "operationId": "spin.v1.WorkspaceService.GetWorkspaceConsole",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetWorkspaceConsoleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetWorkspaceConsoleResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/GetWorkspaceEgress": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "GetWorkspaceEgress",
        "description": "What a running workspace has actually reached beyond the node.",
        "operationId": "spin.v1.WorkspaceService.GetWorkspaceEgress",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetWorkspaceEgressRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetWorkspaceEgressResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/GetWorkspaceHistory": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "GetWorkspaceHistory",
        "description": "Get workspace history (snapshots/state changes timeline)",
        "operationId": "spin.v1.WorkspaceService.GetWorkspaceHistory",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetWorkspaceHistoryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetWorkspaceHistoryResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/GetWorkspaceIdentity": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "GetWorkspaceIdentity",
        "description": "Who the workspace is outside spin: the identity its tokens and signatures carry, the issuer a\n relying party trusts it by, and what it was cloned from.",
        "operationId": "spin.v1.WorkspaceService.GetWorkspaceIdentity",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetWorkspaceIdentityRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetWorkspaceIdentityResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/GetWorkspaceStatus": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "GetWorkspaceStatus",
        "description": "What every party believes about one workspace, and where they disagree.",
        "operationId": "spin.v1.WorkspaceService.GetWorkspaceStatus",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GetWorkspaceStatusRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GetWorkspaceStatusResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/GrantPortAccess": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "GrantPortAccess",
        "operationId": "spin.v1.WorkspaceService.GrantPortAccess",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GrantPortAccessRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GrantPortAccessResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/GrantWorkspaceResources": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "GrantWorkspaceResources",
        "description": "Give a workspace more cores and memory of its own, up to its preset's ceiling: its host\n reserves them and its machine is grown while it runs. The grant lasts until it is released\n or the workspace is deleted.",
        "operationId": "spin.v1.WorkspaceService.GrantWorkspaceResources",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.GrantWorkspaceResourcesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.GrantWorkspaceResourcesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/KeepWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "KeepWorkspace",
        "description": "Keep a running workspace awake for a while: neither the idle suspension nor the running cap\n fires before kept_until, and the question asked before one (suspends_at) is withdrawn. An\n answer with an end, never permanent: at most a day at a time (MaxKeepMinutes).",
        "operationId": "spin.v1.WorkspaceService.KeepWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.KeepWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.KeepWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ListDeletedWorkspaces": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ListDeletedWorkspaces",
        "description": "The caller's workspaces in the trash, and until when each can be undeleted.",
        "operationId": "spin.v1.WorkspaceService.ListDeletedWorkspaces",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListDeletedWorkspacesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListDeletedWorkspacesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ListExposedPorts": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ListExposedPorts",
        "operationId": "spin.v1.WorkspaceService.ListExposedPorts",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListExposedPortsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListExposedPortsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ListImages": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ListImages",
        "description": "The images a workspace can actually be created from. A client that offers a name from\n anywhere else - a constant it ships, a container registry it knows of - offers a create\n that fails, because a workspace's disk is cloned from a published image and nothing else.",
        "operationId": "spin.v1.WorkspaceService.ListImages",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListImagesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListImagesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ListNetworkPolicies": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ListNetworkPolicies",
        "description": "The network policies a workspace can be created with, as the hosts report them.",
        "operationId": "spin.v1.WorkspaceService.ListNetworkPolicies",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListNetworkPoliciesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListNetworkPoliciesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ListSnapshots": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ListSnapshots",
        "description": "List snapshots for a workspace",
        "operationId": "spin.v1.WorkspaceService.ListSnapshots",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListSnapshotsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListSnapshotsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ListWorkspaceQuarantineDenials": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ListWorkspaceQuarantineDenials",
        "description": "What a workspace attempted past its policy: the refusals its supervisor reported, newest\n first - an administrator's reading of what was tried while it was held.",
        "operationId": "spin.v1.WorkspaceService.ListWorkspaceQuarantineDenials",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListWorkspaceQuarantineDenialsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListWorkspaceQuarantineDenialsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ListWorkspaces": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ListWorkspaces",
        "description": "List workspaces for the authenticated user",
        "operationId": "spin.v1.WorkspaceService.ListWorkspaces",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ListWorkspacesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ListWorkspacesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/MoveWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "MoveWorkspace",
        "description": "Move a running workspace to another host: suspended where it runs, its processes as they\n are, and resumed there from the checkpoint, holding what it holds. Placement chooses the host,\n as it does at a start. A workspace that is not running is refused: placement decides where it\n runs at its next start.",
        "operationId": "spin.v1.WorkspaceService.MoveWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.MoveWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.MoveWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/OpenWorkspaceProxySession": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "OpenWorkspaceProxySession",
        "description": "One connection into a published port, for the proxy, when it needs a new one.",
        "operationId": "spin.v1.WorkspaceService.OpenWorkspaceProxySession",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.OpenWorkspaceProxySessionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.OpenWorkspaceProxySessionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/QuarantineWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "QuarantineWorkspace",
        "description": "Hold a workspace in quarantine: an administrator's decision, held until one releases it.\n A stopped workspace is held at once; one whose machine runs is stopped first, forced, and\n held when its host says it stopped. Its disk is kept as it was, and meanwhile its own\n person cannot start, move or delete it.",
        "operationId": "spin.v1.WorkspaceService.QuarantineWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.QuarantineWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.QuarantineWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/RecoverWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "RecoverWorkspace",
        "description": "Re-home a workspace whose host is gone, at a cost its owner accepts.",
        "operationId": "spin.v1.WorkspaceService.RecoverWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RecoverWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RecoverWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ReleaseWorkspaceQuarantine": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ReleaseWorkspaceQuarantine",
        "description": "Release what was quarantined: stopped, with its disk as it was - or, where the stop a\n quarantine asked for ended FAILED, failed as it is, and no longer held.",
        "operationId": "spin.v1.WorkspaceService.ReleaseWorkspaceQuarantine",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ReleaseWorkspaceQuarantineRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ReleaseWorkspaceQuarantineResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/ReleaseWorkspaceResources": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "ReleaseWorkspaceResources",
        "description": "Give a grant back: the workspace holds its floor again, and its machine is shrunk while it runs.",
        "operationId": "spin.v1.WorkspaceService.ReleaseWorkspaceResources",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.ReleaseWorkspaceResourcesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.ReleaseWorkspaceResourcesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/RemoveWorkspaceGuest": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "RemoveWorkspaceGuest",
        "description": "Take a guest out: refused at the control plane at once, and at the workspace once the owner\n signs an access without them.",
        "operationId": "spin.v1.WorkspaceService.RemoveWorkspaceGuest",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RemoveWorkspaceGuestRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RemoveWorkspaceGuestResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/RestoreWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "RestoreWorkspace",
        "description": "Put a stopped workspace's disk back to one of its snapshots, or to what it was created from.",
        "operationId": "spin.v1.WorkspaceService.RestoreWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RestoreWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RestoreWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/RevokePortAccess": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "RevokePortAccess",
        "operationId": "spin.v1.WorkspaceService.RevokePortAccess",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.RevokePortAccessRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.RevokePortAccessResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/SetOwnerWord": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "SetOwnerWord",
        "description": "Take an access the owner signed with a key of their keyring, and carry it to the guest:\n refused unless their newest keyring holds the key, of this workspace, at a counter past the\n one kept, saying what the first said of the workspace. The control plane writes no access;\n it only keeps and carries the owner's.",
        "operationId": "spin.v1.WorkspaceService.SetOwnerWord",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetOwnerWordRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetOwnerWordResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/SetPortAccess": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "SetPortAccess",
        "description": "Who may reach a published port, and who it is shared with.",
        "operationId": "spin.v1.WorkspaceService.SetPortAccess",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetPortAccessRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetPortAccessResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/SetWorkspaceNetworkTags": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "SetWorkspaceNetworkTags",
        "description": "Change which egress policies a workspace runs under, while it runs.",
        "operationId": "spin.v1.WorkspaceService.SetWorkspaceNetworkTags",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetWorkspaceNetworkTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetWorkspaceNetworkTagsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/SetWorkspaceNetworkWatch": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "SetWorkspaceNetworkWatch",
        "description": "Watch where a workspace connects: its host records each lookup, each destination it is let\n through to and each it is refused, with the time, into the workspace's logs.",
        "operationId": "spin.v1.WorkspaceService.SetWorkspaceNetworkWatch",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SetWorkspaceNetworkWatchRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SetWorkspaceNetworkWatchResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/StartWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "StartWorkspace",
        "description": "Start a stopped workspace on its own disk, or resume a suspended one from the memory it kept.",
        "operationId": "spin.v1.WorkspaceService.StartWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.StartWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.StartWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/StopWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "StopWorkspace",
        "description": "Stop a running workspace. Its disk is its volume, kept as it is; no snapshot is taken.",
        "operationId": "spin.v1.WorkspaceService.StopWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.StopWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.StopWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/SuspendWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "SuspendWorkspace",
        "description": "Put a running workspace down with its processes where they are: its memory and its disk\n are checkpointed and the machine is stopped, and its next start resumes that instant - on\n any host carrying the same machine. The same thing a drained host does to what it runs.\n The guest is paused from the checkpoint until it is resumed: it does nothing in between, and\n nothing it did is given up. Answered once the memory is stored and the disk published. One\n that fails after the checkpoint lets the guest run on where it was.",
        "operationId": "spin.v1.WorkspaceService.SuspendWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.SuspendWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.SuspendWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/UndeleteWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "UndeleteWorkspace",
        "description": "Take a workspace out of the trash, stopped, with its disk and snapshots as they were.",
        "operationId": "spin.v1.WorkspaceService.UndeleteWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UndeleteWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UndeleteWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/UnexposePort": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "UnexposePort",
        "operationId": "spin.v1.WorkspaceService.UnexposePort",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UnexposePortRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UnexposePortResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/UpdateWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "UpdateWorkspace",
        "description": "Update workspace properties (name, env)",
        "operationId": "spin.v1.WorkspaceService.UpdateWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.UpdateWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.UpdateWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/WaitSnapshot": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "WaitSnapshot",
        "description": "Wait for a snapshot to be published: until then it cannot be restored, cloned or diffed.",
        "operationId": "spin.v1.WorkspaceService.WaitSnapshot",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.WaitSnapshotRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.WaitSnapshotResponse"
                }
              }
            }
          }
        }
      }
    },
    "/spin.v1.WorkspaceService/WaitWorkspace": {
      "post": {
        "tags": [
          "WorkspaceService"
        ],
        "summary": "WaitWorkspace",
        "description": "Wait for a workspace to reach a state: create, start and stop are answered once they are\n asked for, and this is how a caller learns they are done without polling.",
        "operationId": "spin.v1.WorkspaceService.WaitWorkspace",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "description": "Define the version of the Connect protocol",
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": 1
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "description": "Define the timeout, in ms",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            },
            "example": 1000
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/spin.v1.WaitWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/spin.v1.WaitWorkspaceResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "connect-protocol-version": {
        "type": "number",
        "examples": [
          1
        ],
        "title": "Connect-Protocol-Version",
        "description": "Define the version of the Connect protocol",
        "const": 1
      },
      "connect-timeout-header": {
        "type": "number",
        "examples": [
          1000
        ],
        "title": "Connect-Timeout-Ms",
        "description": "Define the timeout, in ms"
      },
      "connect.error": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "examples": [
              "not_found"
            ],
            "enum": [
              "canceled",
              "unknown",
              "invalid_argument",
              "deadline_exceeded",
              "not_found",
              "already_exists",
              "permission_denied",
              "resource_exhausted",
              "failed_precondition",
              "aborted",
              "out_of_range",
              "unimplemented",
              "internal",
              "unavailable",
              "data_loss",
              "unauthenticated"
            ],
            "description": "The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]."
          },
          "message": {
            "type": "string",
            "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client."
          },
          "details": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/connect.error_details.Any"
            },
            "description": "A list of messages that carry the error details. There is no limit on the number of messages."
          }
        },
        "title": "Connect Error",
        "additionalProperties": true,
        "description": "Error type returned by Connect: https://connectrpc.com/docs/go/errors/#http-representation"
      },
      "connect.error_details.Any": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "A URL that acts as a globally unique identifier for the type of the serialized message. For example: `type.googleapis.com/google.rpc.ErrorInfo`."
          },
          "value": {
            "type": "string",
            "format": "byte",
            "description": "The Protobuf message, serialized as bytes and base64-encoded. The specific message type is identified by the `type` field."
          },
          "debug": {
            "type": "object",
            "title": "Debug",
            "additionalProperties": true,
            "description": "Deserialized error detail payload. The 'type' field indicates the schema. This field is for easier debugging and should not be relied upon for application logic."
          }
        },
        "additionalProperties": true,
        "description": "Contains an arbitrary serialized message along with a @type that describes the type of the serialized message, with an additional debug field for ConnectRPC error details."
      },
      "google.protobuf.Duration": {
        "type": "string",
        "format": "duration",
        "description": "A signed duration in seconds, with up to nine fractional digits and an `s` suffix (for example, `3s` or `-0.001s`)."
      },
      "google.protobuf.FieldMask": {
        "type": "string",
        "description": "Comma-separated field paths in lowerCamelCase (for example, `user.displayName,photo`)."
      },
      "google.protobuf.ListValue": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/google.protobuf.Value"
        },
        "description": "A JSON array whose elements may be any JSON value."
      },
      "google.protobuf.NullValue": {
        "type": "string",
        "title": "NullValue",
        "enum": [
          "NULL_VALUE"
        ],
        "description": "Represents a JSON `null`.\n\n `NullValue` is a sentinel, using an enum with only one value to represent\n the null value for the `Value` type union.\n\n A field of type `NullValue` with any value other than `0` is considered\n invalid. Most ProtoJSON serializers will emit a Value with a `null_value` set\n as a JSON `null` regardless of the integer value, and so will round trip to\n a `0` value."
      },
      "google.protobuf.Struct": {
        "type": "object",
        "additionalProperties": {
          "$ref": "#/components/schemas/google.protobuf.Value"
        },
        "description": "A JSON object whose property values may be any JSON value."
      },
      "google.protobuf.Timestamp": {
        "type": "string",
        "examples": [
          "2023-01-15T01:30:15.01Z",
          "2024-12-25T12:00:00Z"
        ],
        "format": "date-time",
        "description": "A point in time in RFC 3339 format, with up to nanosecond precision. Output uses UTC (`Z`); input may use an offset from UTC."
      },
      "google.protobuf.Value": {
        "oneOf": [
          {
            "type": "null"
          },
          {
            "type": "number"
          },
          {
            "type": "string"
          },
          {
            "type": "boolean"
          },
          {
            "type": "array"
          },
          {
            "type": "object",
            "additionalProperties": true
          }
        ],
        "description": "Any JSON value: `null`, number, string, boolean, array, or object."
      },
      "spin.v1.APIKey": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "prefix": {
            "type": "string",
            "title": "prefix",
            "description": "First 8 chars for identification"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "scopes"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "expiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "expires_at"
          },
          "lastUsedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "last_used_at"
          }
        },
        "title": "APIKey",
        "additionalProperties": false
      },
      "spin.v1.AccessPerson": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "title": "user_id"
          },
          "keyring": {
            "type": "string",
            "title": "keyring"
          },
          "name": {
            "type": "string",
            "title": "name"
          }
        },
        "title": "AccessPerson",
        "additionalProperties": false,
        "description": "AccessPerson is somebody an access names: a user, and their keyring by the version it began at\n (ownerword.Person). name is how the dashboard shows them, and no part of what is signed."
      },
      "spin.v1.ActivateHostRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "ActivateHostRequest",
        "additionalProperties": false
      },
      "spin.v1.ActivateHostResponse": {
        "type": "object",
        "properties": {
          "host": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Host"
              }
            ],
            "title": "host"
          }
        },
        "title": "ActivateHostResponse",
        "additionalProperties": false
      },
      "spin.v1.AddAllowedEmailRequest": {
        "type": "object",
        "properties": {
          "pattern": {
            "type": "string",
            "title": "pattern",
            "description": "Email address (user@example.com) or domain (example.com)"
          },
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.AllowedEmailType"
              }
            ],
            "title": "type"
          },
          "description": {
            "type": "string",
            "title": "description",
            "description": "Optional description"
          }
        },
        "title": "AddAllowedEmailRequest",
        "additionalProperties": false
      },
      "spin.v1.AddAllowedEmailResponse": {
        "type": "object",
        "properties": {
          "entry": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.AllowedEmail"
              }
            ],
            "title": "entry"
          }
        },
        "title": "AddAllowedEmailResponse",
        "additionalProperties": false
      },
      "spin.v1.AddSSHKeyRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name",
            "description": "Human-readable name"
          },
          "publicKey": {
            "type": "string",
            "title": "public_key",
            "description": "SSH public key content"
          }
        },
        "title": "AddSSHKeyRequest",
        "additionalProperties": false,
        "description": "Add user SSH key"
      },
      "spin.v1.AddSSHKeyResponse": {
        "type": "object",
        "properties": {
          "sshKey": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SSHKey"
              }
            ],
            "title": "ssh_key"
          }
        },
        "title": "AddSSHKeyResponse",
        "additionalProperties": false
      },
      "spin.v1.AddTeamMemberRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "email": {
            "type": "string",
            "title": "email"
          },
          "role": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TeamRole"
              }
            ],
            "title": "role"
          }
        },
        "title": "AddTeamMemberRequest",
        "additionalProperties": false
      },
      "spin.v1.AddTeamMemberResponse": {
        "type": "object",
        "properties": {
          "member": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TeamMember"
              }
            ],
            "title": "member"
          }
        },
        "title": "AddTeamMemberResponse",
        "additionalProperties": false
      },
      "spin.v1.AddWorkspaceGuestRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "email": {
            "type": "string",
            "title": "email"
          }
        },
        "title": "AddWorkspaceGuestRequest",
        "additionalProperties": false
      },
      "spin.v1.AddWorkspaceGuestResponse": {
        "type": "object",
        "title": "AddWorkspaceGuestResponse",
        "additionalProperties": false
      },
      "spin.v1.AllowedEmail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "pattern": {
            "type": "string",
            "title": "pattern",
            "description": "Email address or domain"
          },
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.AllowedEmailType"
              }
            ],
            "title": "type"
          },
          "description": {
            "type": "string",
            "title": "description",
            "description": "Optional description"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          }
        },
        "title": "AllowedEmail",
        "additionalProperties": false,
        "description": "Allowed email/domain entry"
      },
      "spin.v1.AllowedEmailType": {
        "type": "string",
        "title": "AllowedEmailType",
        "enum": [
          "ALLOWED_EMAIL_TYPE_UNSPECIFIED",
          "ALLOWED_EMAIL_TYPE_EMAIL",
          "ALLOWED_EMAIL_TYPE_DOMAIN"
        ],
        "description": "Allowed email type enum"
      },
      "spin.v1.ApproveWorkspaceSignInRequest": {
        "type": "object",
        "properties": {
          "request": {
            "type": "string",
            "title": "request",
            "description": "From BeginWorkspaceSignInResponse.approve_url."
          }
        },
        "title": "ApproveWorkspaceSignInRequest",
        "additionalProperties": false
      },
      "spin.v1.ApproveWorkspaceSignInResponse": {
        "type": "object",
        "properties": {
          "callbackUrl": {
            "type": "string",
            "title": "callback_url",
            "description": "The workspace host's callback with the one-time code, for the browser to be sent to."
          }
        },
        "title": "ApproveWorkspaceSignInResponse",
        "additionalProperties": false
      },
      "spin.v1.AttachVSCodeServerRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "commit": {
            "type": "string",
            "title": "commit",
            "description": "commit is 40 hex digits."
          },
          "publish": {
            "type": "boolean",
            "title": "publish",
            "description": "publish tries a publish of commit again when the last one failed; without it, that\n failure is the answer. A client sets it on its first ask, and not on those that follow."
          }
        },
        "title": "AttachVSCodeServerRequest",
        "additionalProperties": false,
        "description": "AttachVSCodeServerRequest names the server a VS Code client runs: the second line of its\n `code --version`. A publish takes minutes, far past a request, so the answer is where it\n stands, and a client asks again until the server is attached."
      },
      "spin.v1.AttachVSCodeServerResponse": {
        "type": "object",
        "properties": {
          "attached": {
            "type": "boolean",
            "title": "attached",
            "description": "attached: the workspace has the server now. Otherwise it is being published, and step says\n where that is."
          },
          "step": {
            "type": "string",
            "title": "step"
          },
          "detached": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "detached",
            "description": "detached are the servers the workspace gave up to make room, asked for longest ago."
          }
        },
        "title": "AttachVSCodeServerResponse",
        "additionalProperties": false
      },
      "spin.v1.AuditEntry": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "actorId": {
            "type": "string",
            "title": "actor_id",
            "description": "actor_id is empty for an operation nobody was signed in for - a failed login, a runner\n registering itself - and for one whose user has since been deleted."
          },
          "actorEmail": {
            "type": "string",
            "title": "actor_email",
            "description": "actor_email is empty for the same reasons, and is what the user's row says now rather\n than what it said then."
          },
          "action": {
            "type": "string",
            "title": "action"
          },
          "resourceType": {
            "type": "string",
            "title": "resource_type"
          },
          "resourceId": {
            "type": "string",
            "title": "resource_id",
            "description": "resource_id is empty for an operation with no row to point at - a failed login, a\n change to the installation's settings. resource_type still says what kind of thing it\n was about."
          },
          "details": {
            "type": "string",
            "title": "details",
            "description": "details is the JSON the operation recorded, verbatim. It has no schema: what a login\n records and what a team membership change records have nothing in common, and a reader\n that insists on a shape would have to be changed by every new action."
          },
          "ipAddress": {
            "type": "string",
            "title": "ip_address"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          }
        },
        "title": "AuditEntry",
        "additionalProperties": false,
        "description": "AuditEntry is one recorded operation, as it was recorded: the log is append-only and\n nothing here is derived at read time except the actor's email, which is joined so a\n reader is not handed a UUID to look up by hand."
      },
      "spin.v1.BaseImage": {
        "type": "object",
        "properties": {
          "ref": {
            "type": "string",
            "title": "ref"
          },
          "version": {
            "type": "string",
            "title": "version",
            "description": "The machine release it was taken from."
          },
          "publishedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "published_at"
          },
          "clones": {
            "type": "string",
            "title": "clones",
            "format": "int64",
            "description": "How many volumes were cloned from it: every workspace disk that began as it, and still is."
          },
          "untagged": {
            "type": "boolean",
            "title": "untagged",
            "description": "Its ref was taken off it: no new workspace gets it, the disks cloned from it go on reading it."
          },
          "given": {
            "type": "boolean",
            "title": "given",
            "description": "What a workspace that names no image is given now."
          },
          "pinned": {
            "type": "boolean",
            "title": "pinned",
            "description": "The one this control plane's release pins; given once it is published."
          },
          "volumeId": {
            "type": "string",
            "title": "volume_id",
            "description": "Its volume in the store, which RemoveStoredVolume takes when removable."
          },
          "removable": {
            "type": "boolean",
            "title": "removable",
            "description": "No disk was cloned from it and it is not the one given: RemoveStoredVolume untags it on the\n way and removes it."
          }
        },
        "title": "BaseImage",
        "additionalProperties": false,
        "description": "BaseImage is the base image of one machine release, as published."
      },
      "spin.v1.BeginWorkspaceSignInRequest": {
        "type": "object",
        "properties": {
          "host": {
            "type": "string",
            "title": "host",
            "description": "The workspace's host the browser asked for, as the proxy received it: \u003cname\u003e.ws.\u003cdomain\u003e.\n The code comes back to this host and to no other."
          },
          "returnPath": {
            "type": "string",
            "title": "return_path",
            "description": "Where on that host the browser goes once it is signed in: a path, never a URL."
          }
        },
        "title": "BeginWorkspaceSignInRequest",
        "additionalProperties": false
      },
      "spin.v1.BeginWorkspaceSignInResponse": {
        "type": "object",
        "properties": {
          "approveUrl": {
            "type": "string",
            "title": "approve_url",
            "description": "The dashboard's page that approves this sign-in, for the browser to be sent to."
          },
          "binding": {
            "type": "string",
            "title": "binding",
            "description": "A secret for the browser that began this sign-in, kept where only the proxy reads it:\n CompleteWorkspaceSignIn requires it with the code, so a code opened in another browser -\n one somebody was sent a link to - signs nobody in."
          }
        },
        "title": "BeginWorkspaceSignInResponse",
        "additionalProperties": false
      },
      "spin.v1.BillDay": {
        "type": "object",
        "properties": {
          "day": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "day",
            "description": "The day's first instant, UTC."
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ServiceCost"
            },
            "title": "services",
            "description": "Costliest first."
          }
        },
        "title": "BillDay",
        "additionalProperties": false
      },
      "spin.v1.BrokeredRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name"
          },
          "method": {
            "type": "string",
            "title": "method"
          },
          "path": {
            "type": "string",
            "title": "path",
            "description": "As the machine sent it, without the query."
          },
          "status": {
            "type": "integer",
            "title": "status",
            "format": "int32",
            "description": "What the real host answered; what the proxy answered for a refusal."
          },
          "bytesSent": {
            "type": "string",
            "title": "bytes_sent",
            "format": "int64"
          },
          "bytesReceived": {
            "type": "string",
            "title": "bytes_received",
            "format": "int64"
          },
          "at": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "at"
          },
          "refused": {
            "type": "string",
            "title": "refused",
            "description": "Empty for a request passed on. Otherwise why the proxy refused it: credentials (a secret or\n token the team does not hold), host (a request for another name), upgrade, method (TRACE or\n TRACK), scope (a method or path the injecting rule does not allow), authority (the cloud\n principal refused to sign it)."
          },
          "principal": {
            "type": "string",
            "title": "principal",
            "description": "Who asked: \"user\" or \"agent\", by the listener the proxy read it on."
          }
        },
        "title": "BrokeredRequest",
        "additionalProperties": false,
        "description": "BrokeredRequest is one request the egress proxy read from the workspace's machine to a brokered\n name. No header and no body: what the proxy set is the team's secret, and what the machine\n sent is its own."
      },
      "spin.v1.BurstMode": {
        "type": "string",
        "title": "BurstMode",
        "enum": [
          "BURST_MODE_UNSPECIFIED",
          "BURST_MODE_FIXED",
          "BURST_MODE_TO_PRESET",
          "BURST_MODE_TO_HOST"
        ],
        "description": "BurstMode is how a workspace of a preset may grow past what it starts with."
      },
      "spin.v1.ChangePasswordRequest": {
        "type": "object",
        "properties": {
          "currentPassword": {
            "type": "string",
            "title": "current_password"
          },
          "newPassword": {
            "type": "string",
            "title": "new_password"
          }
        },
        "title": "ChangePasswordRequest",
        "additionalProperties": false
      },
      "spin.v1.ChangePasswordResponse": {
        "type": "object",
        "title": "ChangePasswordResponse",
        "additionalProperties": false
      },
      "spin.v1.CheckDeviceLoginRequest": {
        "type": "object",
        "properties": {
          "deviceCode": {
            "type": "string",
            "title": "device_code",
            "description": "The device_code from StartDeviceLogin"
          }
        },
        "title": "CheckDeviceLoginRequest",
        "additionalProperties": false
      },
      "spin.v1.CheckDeviceLoginResponse": {
        "type": "object",
        "properties": {
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.DeviceLoginStatus"
              }
            ],
            "title": "status",
            "description": "Status of the device login"
          },
          "user": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.User"
              }
            ],
            "title": "user",
            "description": "Only set when status is DEVICE_LOGIN_STATUS_COMPLETE"
          },
          "sessionToken": {
            "type": "string",
            "title": "session_token"
          },
          "expiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "expires_at"
          }
        },
        "title": "CheckDeviceLoginResponse",
        "additionalProperties": false
      },
      "spin.v1.CheckPortAccessRequest": {
        "type": "object",
        "properties": {
          "workspaceName": {
            "type": "string",
            "title": "workspace_name",
            "description": "From the subdomain"
          },
          "port": {
            "type": "integer",
            "title": "port",
            "format": "int32"
          },
          "sessionToken": {
            "type": "string",
            "title": "session_token",
            "description": "The session token as the proxy received it, empty for a request with no session at all.\n Only a PUBLIC port is reachable that way."
          },
          "httpsBackend": {
            "type": "boolean",
            "title": "https_backend",
            "description": "As in OpenWorkspaceProxySessionRequest"
          }
        },
        "title": "CheckPortAccessRequest",
        "additionalProperties": false,
        "description": "Whether one request may reach one published port.\n\n This is the gate in front of a workspace's published ports, and it lives in the control\n plane rather than in the proxy because the levels only mean something if the party that\n decides also holds the facts. The proxy forwards the browser's session token and the\n control plane *validates* it - it does not take a user id the proxy asserts, which would\n make the proxy's word the credential."
      },
      "spin.v1.CheckPortAccessResponse": {
        "type": "object",
        "properties": {
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceProxyStatus"
              }
            ],
            "title": "status"
          },
          "allowed": {
            "type": "boolean",
            "title": "allowed"
          },
          "access": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PortAccess"
              }
            ],
            "title": "access",
            "description": "What the port's level is, so the proxy can tell a refusal that a login would fix from\n one it would not: an anonymous request to a PRIVATE port is a redirect, and a signed-in\n request to the same port is a 403 no amount of signing in changes."
          },
          "workspaceId": {
            "type": "string",
            "title": "workspace_id",
            "description": "The workspace the name was decided about, when allowed. The proxy pools connections by\n it and opens sessions for it: a name is freed by a rename and taken by someone else's\n workspace, and a connection pooled by name would carry the next request into the old one."
          }
        },
        "title": "CheckPortAccessResponse",
        "additionalProperties": false
      },
      "spin.v1.CheckPortPublishedRequest": {
        "type": "object",
        "properties": {
          "workspaceName": {
            "type": "string",
            "title": "workspace_name",
            "description": "From the subdomain"
          },
          "port": {
            "type": "integer",
            "title": "port",
            "format": "int32"
          },
          "httpsBackend": {
            "type": "boolean",
            "title": "https_backend",
            "description": "As in CheckPortAccessRequest: 3000s- is not 3000-"
          }
        },
        "title": "CheckPortPublishedRequest",
        "additionalProperties": false,
        "description": "Whether a certificate may be obtained for one workspace port's hostname.\n\n Not CheckPortAccess with no session: that asks whether an anonymous request may reach the\n port, and the answer is no for every PRIVATE and WHITELIST port, and for every PUBLIC one while\n the installation keeps ports closed to everybody - each of them a name with no certificate,\n and so no handshake for the owner or a grantee to sign in over. A certificate is for the name,\n so the question is whether the name is published at all."
      },
      "spin.v1.CheckPortPublishedResponse": {
        "type": "object",
        "properties": {
          "published": {
            "type": "boolean",
            "title": "published",
            "description": "The port is published on a workspace that is not deleted, at any level and in any state."
          }
        },
        "title": "CheckPortPublishedResponse",
        "additionalProperties": false
      },
      "spin.v1.CloneWorkspaceRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "The clone's name; generated when empty."
          }
        },
        "title": "CloneWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.CloneWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          },
          "snapshot": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Snapshot"
              }
            ],
            "title": "snapshot",
            "description": "The source's snapshot the clone was made from, which stays as the clone's floor."
          }
        },
        "title": "CloneWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.CloudAccess": {
        "type": "object",
        "properties": {
          "cloud": {
            "type": "string",
            "title": "cloud",
            "description": "The cloud: \"aws\", whose principal is an IAM role's ARN and whose requests are signed with\n SigV4."
          },
          "principal": {
            "type": "string",
            "title": "principal"
          }
        },
        "title": "CloudAccess",
        "additionalProperties": false,
        "description": "CloudAccess is a principal on a cloud a brokered rule's requests are authorized as."
      },
      "spin.v1.CompleteLoginRequest": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "title": "code",
            "description": "OAuth/OIDC code"
          },
          "state": {
            "type": "string",
            "title": "state",
            "description": "CSRF state token (contains provider info)"
          },
          "binding": {
            "type": "string",
            "title": "binding",
            "description": "StartLoginResponse.binding for this state"
          }
        },
        "title": "CompleteLoginRequest",
        "additionalProperties": false
      },
      "spin.v1.CompleteLoginResponse": {
        "type": "object",
        "properties": {
          "user": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.User"
              }
            ],
            "title": "user"
          },
          "sessionToken": {
            "type": "string",
            "title": "session_token"
          },
          "expiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "expires_at"
          }
        },
        "title": "CompleteLoginResponse",
        "additionalProperties": false
      },
      "spin.v1.CompleteSetupRequest": {
        "type": "object",
        "title": "CompleteSetupRequest",
        "additionalProperties": false
      },
      "spin.v1.CompleteSetupResponse": {
        "type": "object",
        "title": "CompleteSetupResponse",
        "additionalProperties": false
      },
      "spin.v1.CompleteWorkspaceSignInRequest": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "title": "code"
          },
          "binding": {
            "type": "string",
            "title": "binding",
            "description": "BeginWorkspaceSignInResponse.binding, as the browser presented it."
          },
          "host": {
            "type": "string",
            "title": "host",
            "description": "The host the callback arrived on, which must be the one the sign-in began on."
          }
        },
        "title": "CompleteWorkspaceSignInRequest",
        "additionalProperties": false
      },
      "spin.v1.CompleteWorkspaceSignInResponse": {
        "type": "object",
        "properties": {
          "sessionToken": {
            "type": "string",
            "title": "session_token"
          },
          "expiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "expires_at"
          },
          "returnPath": {
            "type": "string",
            "title": "return_path"
          }
        },
        "title": "CompleteWorkspaceSignInResponse",
        "additionalProperties": false
      },
      "spin.v1.ConfigChange": {
        "type": "object",
        "properties": {
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.ConfigItemKind"
              }
            ],
            "title": "kind"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "fileSays": {
            "type": "string",
            "title": "file_says",
            "description": "What the file says, as a person reads it; empty where the file no longer declares the item,\n and applying the change removes it."
          },
          "installationHas": {
            "type": "string",
            "title": "installation_has",
            "description": "What the installation has, the same way; empty where it has none."
          },
          "says": {
            "type": "string",
            "title": "says",
            "description": "The file's declaration this change is about, sent back as it came: a decision about one the\n file has changed since is refused rather than taken as about the newer one."
          },
          "since": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "since",
            "description": "When the file started saying it."
          }
        },
        "title": "ConfigChange",
        "additionalProperties": false,
        "description": "One thing the config file says differently from the installation."
      },
      "spin.v1.ConfigItemKind": {
        "type": "string",
        "title": "ConfigItemKind",
        "enum": [
          "CONFIG_ITEM_KIND_UNSPECIFIED",
          "CONFIG_ITEM_KIND_SETTING",
          "CONFIG_ITEM_KIND_EMAIL",
          "CONFIG_ITEM_KIND_PRESET",
          "CONFIG_ITEM_KIND_POLICY"
        ],
        "description": "What one item of the installation's config file is."
      },
      "spin.v1.ConfigureGitHubOAuthRequest": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string",
            "title": "client_id"
          },
          "clientSecret": {
            "type": "string",
            "title": "client_secret"
          }
        },
        "title": "ConfigureGitHubOAuthRequest",
        "additionalProperties": false
      },
      "spin.v1.ConfigureGitHubOAuthResponse": {
        "type": "object",
        "properties": {
          "callbackUrl": {
            "type": "string",
            "title": "callback_url",
            "description": "The callback URL to configure in GitHub OAuth app settings"
          }
        },
        "title": "ConfigureGitHubOAuthResponse",
        "additionalProperties": false
      },
      "spin.v1.ConfirmDeviceLoginRequest": {
        "type": "object",
        "properties": {
          "userCode": {
            "type": "string",
            "title": "user_code",
            "description": "The user code entered by the user (e.g., \"ABCD-1234\")"
          }
        },
        "title": "ConfirmDeviceLoginRequest",
        "additionalProperties": false
      },
      "spin.v1.ConfirmDeviceLoginResponse": {
        "type": "object",
        "title": "ConfirmDeviceLoginResponse",
        "additionalProperties": false,
        "description": "Empty on success"
      },
      "spin.v1.CreateAPIKeyRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "scopes",
            "description": "e.g., [\"workspace:read\", \"workspace:write\"]"
          },
          "expiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "expires_at"
          }
        },
        "title": "CreateAPIKeyRequest",
        "additionalProperties": false
      },
      "spin.v1.CreateAPIKeyResponse": {
        "type": "object",
        "properties": {
          "apiKey": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.APIKey"
              }
            ],
            "title": "api_key"
          },
          "secret": {
            "type": "string",
            "title": "secret",
            "description": "Only shown once"
          }
        },
        "title": "CreateAPIKeyResponse",
        "additionalProperties": false
      },
      "spin.v1.CreateNetworkPolicyRequest": {
        "type": "object",
        "properties": {
          "policy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.NetworkPolicyRule"
              }
            ],
            "title": "policy"
          }
        },
        "title": "CreateNetworkPolicyRequest",
        "additionalProperties": false
      },
      "spin.v1.CreateNetworkPolicyResponse": {
        "type": "object",
        "title": "CreateNetworkPolicyResponse",
        "additionalProperties": false
      },
      "spin.v1.CreateProjectRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "slug": {
            "type": "string",
            "title": "slug",
            "description": "Made from the name when empty"
          },
          "description": {
            "type": "string",
            "title": "description"
          },
          "repository": {
            "type": "string",
            "title": "repository"
          },
          "ref": {
            "type": "string",
            "title": "ref"
          },
          "image": {
            "type": "string",
            "title": "image"
          },
          "preset": {
            "type": "string",
            "title": "preset"
          },
          "networkTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "network_tags"
          },
          "prebuildRefs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "prebuild_refs"
          },
          "prebuildRebaseEvery": {
            "type": "integer",
            "title": "prebuild_rebase_every",
            "format": "int32",
            "description": "Zero is the installation's default"
          }
        },
        "title": "CreateProjectRequest",
        "additionalProperties": false
      },
      "spin.v1.CreateProjectResponse": {
        "type": "object",
        "properties": {
          "project": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Project"
              }
            ],
            "title": "project"
          }
        },
        "title": "CreateProjectResponse",
        "additionalProperties": false
      },
      "spin.v1.CreateRegistrationTokenRequest": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "title": "description",
            "description": "e.g., \"Runner for host-us-east-1\""
          },
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "Optional: scope to team (host joins team's pool)"
          },
          "expiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "expires_at",
            "description": "Default: 24h"
          },
          "reusable": {
            "type": "boolean",
            "title": "reusable",
            "description": "A pool's token, for an autoscaling group whose machines register with nobody at them: it\n is not spent by the host it registers. Short-lived and rotated is the intended use."
          },
          "hostPolicy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HostPolicy"
              }
            ],
            "title": "host_policy",
            "description": "The policy each host it registers starts with, under SetHostPolicy's rules; host_id must\n be empty, since the hosts do not exist yet."
          }
        },
        "title": "CreateRegistrationTokenRequest",
        "additionalProperties": false,
        "description": "Admin: Create registration token"
      },
      "spin.v1.CreateRegistrationTokenResponse": {
        "type": "object",
        "properties": {
          "tokenInfo": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.RegistrationToken"
              }
            ],
            "title": "token_info"
          },
          "token": {
            "type": "string",
            "title": "token",
            "description": "Full token, shown only once"
          }
        },
        "title": "CreateRegistrationTokenResponse",
        "additionalProperties": false
      },
      "spin.v1.CreateResourcePresetRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name",
            "description": "Required: display name"
          },
          "description": {
            "type": "string",
            "title": "description",
            "description": "Optional: description"
          },
          "cpuCores": {
            "type": "integer",
            "title": "cpu_cores",
            "format": "int32",
            "description": "Required: CPU cores"
          },
          "memoryMb": {
            "type": "integer",
            "title": "memory_mb",
            "format": "int32",
            "description": "Required: memory in MB"
          },
          "diskGb": {
            "type": "integer",
            "title": "disk_gb",
            "format": "int32",
            "description": "Required: disk in GB"
          },
          "burst": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.BurstMode"
              }
            ],
            "title": "burst",
            "description": "Required"
          },
          "isDefault": {
            "type": "boolean",
            "title": "is_default",
            "description": "Optional: make this the default"
          },
          "enabled": {
            "type": "boolean",
            "title": "enabled",
            "description": "Optional: enable the preset (default true)"
          },
          "sortOrder": {
            "type": "integer",
            "title": "sort_order",
            "format": "int32",
            "description": "Optional: display order"
          },
          "burstFloorCpuCores": {
            "type": "integer",
            "title": "burst_floor_cpu_cores",
            "format": "int32",
            "description": "Required for a burst mode: what its workspaces start with, at most the preset's size."
          },
          "burstFloorMemoryMb": {
            "type": "integer",
            "title": "burst_floor_memory_mb",
            "format": "int32"
          },
          "bandwidthMbps": {
            "type": "integer",
            "title": "bandwidth_mbps",
            "format": "int32",
            "description": "What a workspace of it may carry each way, in megabits a second; 0 is unshaped."
          },
          "rpoSeconds": {
            "type": "integer",
            "title": "rpo_seconds",
            "format": "int32",
            "description": "How far behind the object store a workspace of it may fall, in seconds; 0 is the\n installation's."
          }
        },
        "title": "CreateResourcePresetRequest",
        "additionalProperties": false
      },
      "spin.v1.CreateResourcePresetResponse": {
        "type": "object",
        "properties": {
          "preset": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.ResourcePreset"
              }
            ],
            "title": "preset"
          }
        },
        "title": "CreateResourcePresetResponse",
        "additionalProperties": false
      },
      "spin.v1.CreateSnapshotRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "description": {
            "type": "string",
            "title": "description",
            "description": "Optional description"
          },
          "withMemory": {
            "type": "boolean",
            "title": "with_memory",
            "description": "with_memory keeps the machine's memory too, taken at the instant the disk is sealed; the\n guest is paused for tens of milliseconds, and the call returns once the memory is written."
          }
        },
        "title": "CreateSnapshotRequest",
        "additionalProperties": false
      },
      "spin.v1.CreateSnapshotResponse": {
        "type": "object",
        "properties": {
          "snapshot": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Snapshot"
              }
            ],
            "title": "snapshot"
          }
        },
        "title": "CreateSnapshotResponse",
        "additionalProperties": false
      },
      "spin.v1.CreateTeamIdentityProviderRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "Optional: team-specific IdP (empty = system-wide)"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "providerType": {
            "type": "string",
            "title": "provider_type",
            "description": "oidc, github, google, azure-ad"
          },
          "issuerUrl": {
            "type": "string",
            "title": "issuer_url",
            "description": "For OIDC discovery"
          },
          "clientId": {
            "type": "string",
            "title": "client_id"
          },
          "clientSecret": {
            "type": "string",
            "title": "client_secret"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "scopes"
          },
          "autoJoinCelExpression": {
            "type": "string",
            "title": "auto_join_cel_expression",
            "description": "Optional: auto-add users matching this"
          },
          "roleCelExpression": {
            "type": "string",
            "title": "role_cel_expression",
            "description": "Optional: determine role from claims"
          }
        },
        "title": "CreateTeamIdentityProviderRequest",
        "additionalProperties": false
      },
      "spin.v1.CreateTeamIdentityProviderResponse": {
        "type": "object",
        "properties": {
          "provider": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TeamIdentityProvider"
              }
            ],
            "title": "provider"
          }
        },
        "title": "CreateTeamIdentityProviderResponse",
        "additionalProperties": false
      },
      "spin.v1.CreateTeamRequest": {
        "type": "object",
        "properties": {
          "parentId": {
            "type": "string",
            "title": "parent_id",
            "description": "Optional: parent team ID (empty = root team)"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "slug": {
            "type": "string",
            "title": "slug",
            "description": "Optional, generated from name if empty"
          },
          "description": {
            "type": "string",
            "title": "description"
          },
          "displayName": {
            "type": "string",
            "title": "display_name",
            "description": "Optional: human-friendly name"
          }
        },
        "title": "CreateTeamRequest",
        "additionalProperties": false,
        "description": "Team CRUD"
      },
      "spin.v1.CreateTeamResponse": {
        "type": "object",
        "properties": {
          "team": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Team"
              }
            ],
            "title": "team"
          }
        },
        "title": "CreateTeamResponse",
        "additionalProperties": false
      },
      "spin.v1.CreateWorkspaceRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name",
            "description": "Optional, generated if empty"
          },
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "Optional: team ID (personal workspace if empty)"
          },
          "image": {
            "type": "string",
            "title": "image",
            "description": "A published image (ListImages); required unless from_snapshot_id is set"
          },
          "preset": {
            "type": "string",
            "title": "preset",
            "description": "The preset it is sized by, by name (AdminService.ListResourcePresets): its cores, memory,\n disk and how it grows. Empty is the installation's default preset, or with none marked\n 1 core, 512 MB and 10 GB free. A disabled preset is refused."
          },
          "env": {
            "type": "object",
            "title": "env",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            },
            "description": "Environment variables"
          },
          "fromSnapshotId": {
            "type": "string",
            "title": "from_snapshot_id",
            "description": "Create workspace from a shared snapshot"
          },
          "networkTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "network_tags",
            "description": "network_tags are the network policies this workspace runs under, by name - the same\n idea as a GCP instance's network tags. The host's ruleset names the tag and holds the\n set of machines carrying it, so this decides which rules apply without naming a rule.\n\n Empty runs the workspace under the installation's default, and under \"offline\" where it\n declares none: a create that names nothing reaches nothing, rather than everything.\n A tag the host has no policy for fails the start rather than being ignored: a workspace\n asking for a policy the node does not have is a question with two answers, and quietly\n choosing \"run it without\" is how one ends up less contained than whoever launched it\n believes."
          },
          "projectId": {
            "type": "string",
            "title": "project_id",
            "description": "A project of a team the caller is in: the workspace is the project's - its team, image,\n preset and tags, which the request then names none of - and its guest clones the project's\n repository at ref, the project's own when empty."
          },
          "ref": {
            "type": "string",
            "title": "ref"
          },
          "requestId": {
            "type": "string",
            "title": "request_id",
            "description": "Optional, at most 128 bytes: the client's key for this create, so a retry after an answer\n it never got is answered with the workspace the first attempt made. The same key with\n another request is refused (FAILED_PRECONDITION)."
          }
        },
        "title": "CreateWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.CreateWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "CreateWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.DecideConfigChangeRequest": {
        "type": "object",
        "properties": {
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.ConfigItemKind"
              }
            ],
            "title": "kind"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "says": {
            "type": "string",
            "title": "says",
            "description": "ConfigChange.says, as listed."
          },
          "apply": {
            "type": "boolean",
            "title": "apply",
            "description": "True writes what the file says; false keeps what the installation has."
          }
        },
        "title": "DecideConfigChangeRequest",
        "additionalProperties": false
      },
      "spin.v1.DecideConfigChangeResponse": {
        "type": "object",
        "title": "DecideConfigChangeResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteNetworkPolicyRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name"
          }
        },
        "title": "DeleteNetworkPolicyRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteNetworkPolicyResponse": {
        "type": "object",
        "title": "DeleteNetworkPolicyResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteProjectRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "DeleteProjectRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteProjectResponse": {
        "type": "object",
        "title": "DeleteProjectResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteResourcePresetRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "Required: preset ID to delete"
          }
        },
        "title": "DeleteResourcePresetRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteResourcePresetResponse": {
        "type": "object",
        "title": "DeleteResourcePresetResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteSSHKeyRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "DeleteSSHKeyRequest",
        "additionalProperties": false,
        "description": "Delete user SSH key"
      },
      "spin.v1.DeleteSSHKeyResponse": {
        "type": "object",
        "title": "DeleteSSHKeyResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteSnapshotRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id"
          }
        },
        "title": "DeleteSnapshotRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteSnapshotResponse": {
        "type": "object",
        "title": "DeleteSnapshotResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamForgeRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "forge": {
            "type": "string",
            "title": "forge"
          }
        },
        "title": "DeleteTeamForgeRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamForgeResponse": {
        "type": "object",
        "title": "DeleteTeamForgeResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamIdentityProviderRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "DeleteTeamIdentityProviderRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamIdentityProviderResponse": {
        "type": "object",
        "title": "DeleteTeamIdentityProviderResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamNetworkPolicyRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "name": {
            "type": "string",
            "title": "name"
          }
        },
        "title": "DeleteTeamNetworkPolicyRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamNetworkPolicyResponse": {
        "type": "object",
        "title": "DeleteTeamNetworkPolicyResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "recursive": {
            "type": "boolean",
            "title": "recursive",
            "description": "If true, delete children too (dangerous!)"
          }
        },
        "title": "DeleteTeamRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamResponse": {
        "type": "object",
        "title": "DeleteTeamResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamSecretRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "name": {
            "type": "string",
            "title": "name"
          }
        },
        "title": "DeleteTeamSecretRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteTeamSecretResponse": {
        "type": "object",
        "title": "DeleteTeamSecretResponse",
        "additionalProperties": false
      },
      "spin.v1.DeleteWorkspaceRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "force": {
            "type": "boolean",
            "title": "force",
            "description": "Force delete regardless of state (skips state validation)"
          },
          "permanently": {
            "type": "boolean",
            "title": "permanently",
            "description": "permanently erases the workspace now - its disk, snapshots and keys - rather than putting it\n in the trash; a workspace already in the trash is erased only this way. What is erased\n cannot be undeleted: the store expires its bytes when its retention ends."
          }
        },
        "title": "DeleteWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.DeleteWorkspaceResponse": {
        "type": "object",
        "properties": {
          "trashedUntil": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "trashed_until",
            "description": "Until when it can be undeleted; unset when it was erased."
          }
        },
        "title": "DeleteWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.DeletedWorkspace": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "The name it had; another workspace may have taken it since, and an undelete then gives it\n another."
          },
          "deletedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "deleted_at"
          },
          "trashedUntil": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "trashed_until"
          }
        },
        "title": "DeletedWorkspace",
        "additionalProperties": false,
        "description": "DeletedWorkspace is a workspace in the trash."
      },
      "spin.v1.DeviceLoginStatus": {
        "type": "string",
        "title": "DeviceLoginStatus",
        "enum": [
          "DEVICE_LOGIN_STATUS_UNSPECIFIED",
          "DEVICE_LOGIN_STATUS_PENDING",
          "DEVICE_LOGIN_STATUS_COMPLETE",
          "DEVICE_LOGIN_STATUS_EXPIRED",
          "DEVICE_LOGIN_STATUS_DENIED"
        ]
      },
      "spin.v1.DiffSnapshotsRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "fromSnapshotId": {
            "type": "string",
            "title": "from_snapshot_id",
            "description": "Empty compares from what the workspace was created from."
          },
          "toSnapshotId": {
            "type": "string",
            "title": "to_snapshot_id"
          },
          "under": {
            "type": "string",
            "title": "under",
            "description": "under narrows the comparison to one path of the filesystem, from its root; empty is all of\n it. The walk starts there rather than filtering, so what is outside it costs nothing and\n does not fill the answer."
          }
        },
        "title": "DiffSnapshotsRequest",
        "additionalProperties": false,
        "description": "DiffSnapshotsRequest names two published snapshots of one workspace. The comparison runs in a\n machine of its own on a host of the control plane's choosing; the workspace need not be\n running, or on any host."
      },
      "spin.v1.DiffSnapshotsResponse": {
        "type": "object",
        "properties": {
          "changes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.FileChange"
            },
            "title": "changes",
            "description": "Every change from one snapshot to the other, a directory before what is under it."
          },
          "truncated": {
            "type": "boolean",
            "title": "truncated",
            "description": "truncated says there are more changes than one answer carries."
          }
        },
        "title": "DiffSnapshotsResponse",
        "additionalProperties": false
      },
      "spin.v1.DisableBootstrapAdminRequest": {
        "type": "object",
        "title": "DisableBootstrapAdminRequest",
        "additionalProperties": false
      },
      "spin.v1.DisableBootstrapAdminResponse": {
        "type": "object",
        "title": "DisableBootstrapAdminResponse",
        "additionalProperties": false
      },
      "spin.v1.DotfilesConfig": {
        "type": "object",
        "properties": {
          "repo": {
            "type": "string",
            "title": "repo",
            "description": "Git URL: https://github.com/user/dotfiles"
          },
          "branch": {
            "type": "string",
            "title": "branch",
            "description": "Branch to clone (default: main)"
          },
          "installCommand": {
            "type": "string",
            "title": "install_command",
            "description": "Command to run after clone (default: ./install.sh)"
          }
        },
        "title": "DotfilesConfig",
        "additionalProperties": false
      },
      "spin.v1.DrainHostRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "suspend": {
            "type": "boolean",
            "title": "suspend",
            "description": "Suspend every running workspace off the host: its memory and disk go to the object store,\n and it is resumed on whichever other host has room, on its own - or, suspended without its\n memory, on its owner's next start. Answered once each is suspended or has failed to be; a\n workspace that failed runs on as it was."
          },
          "leaveStopped": {
            "type": "boolean",
            "title": "leave_stopped",
            "description": "leave_stopped is for a drain that shrinks the fleet: the workspaces it suspends stay stopped,\n and each resumes on another host when its owner starts it. Without it they are resumed\n elsewhere at once, waiting for a host where the installation is bringing one up."
          }
        },
        "title": "DrainHostRequest",
        "additionalProperties": false
      },
      "spin.v1.DrainHostResponse": {
        "type": "object",
        "properties": {
          "host": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Host"
              }
            ],
            "title": "host"
          },
          "suspendedWorkspaceIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "suspended_workspace_ids"
          },
          "failures": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.WorkspaceSuspendFailure"
            },
            "title": "failures"
          }
        },
        "title": "DrainHostResponse",
        "additionalProperties": false
      },
      "spin.v1.EnableDevModeRequest": {
        "type": "object",
        "title": "EnableDevModeRequest",
        "additionalProperties": false
      },
      "spin.v1.EnableDevModeResponse": {
        "type": "object",
        "title": "EnableDevModeResponse",
        "additionalProperties": false
      },
      "spin.v1.ExplainStorageKeyRequest": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "title": "key"
          }
        },
        "title": "ExplainStorageKeyRequest",
        "additionalProperties": false
      },
      "spin.v1.ExplainStorageKeyResponse": {
        "type": "object",
        "properties": {
          "what": {
            "type": "string",
            "title": "what",
            "description": "What the object is, in words."
          },
          "volume": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StoredVolume"
              }
            ],
            "title": "volume",
            "description": "Whose it is, when it is a volume's."
          }
        },
        "title": "ExplainStorageKeyResponse",
        "additionalProperties": false
      },
      "spin.v1.ExposePortRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "port": {
            "type": "integer",
            "title": "port",
            "format": "int32"
          },
          "httpsBackend": {
            "type": "boolean",
            "title": "https_backend",
            "description": "See ExposedPort.https_backend"
          },
          "description": {
            "type": "string",
            "title": "description"
          },
          "access": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PortAccess"
              }
            ],
            "title": "access",
            "description": "Left unset, this is PRIVATE. Exposing a port is not the same as publishing it."
          }
        },
        "title": "ExposePortRequest",
        "additionalProperties": false
      },
      "spin.v1.ExposePortResponse": {
        "type": "object",
        "properties": {
          "exposedPort": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.ExposedPort"
              }
            ],
            "title": "exposed_port"
          }
        },
        "title": "ExposePortResponse",
        "additionalProperties": false
      },
      "spin.v1.ExposedPort": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "port": {
            "type": "integer",
            "title": "port",
            "format": "int32"
          },
          "httpsBackend": {
            "type": "boolean",
            "title": "https_backend",
            "description": "The proxy speaks TLS to this port without verifying its certificate, and only under the\n {port}s- hostname: 3000-ws and 3000s-ws are different names, and one refuses."
          },
          "description": {
            "type": "string",
            "title": "description"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "url": {
            "type": "string",
            "title": "url",
            "description": "Output only: computed URL (e.g., https://3000-dev.ws.spinbox.dev)"
          },
          "access": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PortAccess"
              }
            ],
            "title": "access"
          },
          "grants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.PortGrant"
            },
            "title": "grants",
            "description": "Who this port is granted to, when access is WHITELIST. Output only, and populated only\n for the workspace's owner - who a port is shared with is the owner's business and not\n the grantees'."
          }
        },
        "title": "ExposedPort",
        "additionalProperties": false
      },
      "spin.v1.ExtensionRelease": {
        "type": "object",
        "properties": {
          "version": {
            "type": "string",
            "title": "version",
            "description": "The release's own name: the control plane's version for the supervisor; for the VS Code\n servers, the versions it carries joined with +, unless it was named otherwise."
          },
          "releasedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "released_at"
          },
          "workspaces": {
            "type": "string",
            "title": "workspaces",
            "format": "int64",
            "description": "How many workspaces run it; one that nothing runs and is not the newest is collectable."
          },
          "newest": {
            "type": "boolean",
            "title": "newest",
            "description": "Whether a start is given this one."
          }
        },
        "title": "ExtensionRelease",
        "additionalProperties": false,
        "description": "ExtensionRelease is one release of an extension: the supervisor, or the VS Code servers."
      },
      "spin.v1.ExtensionVersion": {
        "type": "object",
        "properties": {
          "extension": {
            "type": "string",
            "title": "extension"
          },
          "version": {
            "type": "string",
            "title": "version"
          },
          "workspaces": {
            "type": "string",
            "title": "workspaces",
            "format": "int64"
          },
          "newest": {
            "type": "boolean",
            "title": "newest",
            "description": "Whether a start now would choose this release."
          }
        },
        "title": "ExtensionVersion",
        "additionalProperties": false,
        "description": "ExtensionVersion is a release and how many workspaces are on it: what an update leaves\n behind until each workspace is next started."
      },
      "spin.v1.FieldValue": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "title": "value"
          },
          "count": {
            "type": "string",
            "title": "count",
            "format": "int64"
          }
        },
        "title": "FieldValue",
        "additionalProperties": false,
        "description": "FieldValue is one value a field has, and how many of a search's records have it."
      },
      "spin.v1.FileChange": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "title": "path",
            "description": "From the filesystem's root, with a leading slash. A name holding bytes that are not UTF-8\n has them replaced here, and path_bytes holds the name as it is."
          },
          "pathBytes": {
            "type": "string",
            "title": "path_bytes",
            "format": "byte"
          },
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.FileChangeKind"
              }
            ],
            "title": "kind"
          },
          "from": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.FileState"
              }
            ],
            "title": "from",
            "description": "Unset on the side the path is not on."
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.FileState"
              }
            ],
            "title": "to"
          }
        },
        "title": "FileChange",
        "additionalProperties": false
      },
      "spin.v1.FileChangeKind": {
        "type": "string",
        "title": "FileChangeKind",
        "enum": [
          "FILE_CHANGE_KIND_UNSPECIFIED",
          "FILE_CHANGE_KIND_ADDED",
          "FILE_CHANGE_KIND_REMOVED",
          "FILE_CHANGE_KIND_MODIFIED",
          "FILE_CHANGE_KIND_TYPE_CHANGED"
        ]
      },
      "spin.v1.FileState": {
        "type": "object",
        "properties": {
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.FileType"
              }
            ],
            "title": "type"
          },
          "mode": {
            "type": "integer",
            "title": "mode",
            "description": "Permission bits, setuid, setgid and sticky included."
          },
          "uid": {
            "type": "integer",
            "title": "uid"
          },
          "gid": {
            "type": "integer",
            "title": "gid"
          },
          "size": {
            "type": "string",
            "title": "size",
            "format": "int64"
          },
          "symlinkTarget": {
            "type": "string",
            "title": "symlink_target",
            "description": "A symlink's target as stored, never followed; replaced and in symlink_target_bytes as path is."
          },
          "symlinkTargetBytes": {
            "type": "string",
            "title": "symlink_target_bytes",
            "format": "byte"
          },
          "sha256": {
            "type": "string",
            "title": "sha256",
            "description": "A regular file's content hash in lowercase hex, where its content is what changed."
          },
          "modifiedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "modified_at"
          }
        },
        "title": "FileState",
        "additionalProperties": false
      },
      "spin.v1.FileType": {
        "type": "string",
        "title": "FileType",
        "enum": [
          "FILE_TYPE_UNSPECIFIED",
          "FILE_TYPE_REGULAR",
          "FILE_TYPE_DIRECTORY",
          "FILE_TYPE_SYMLINK",
          "FILE_TYPE_OTHER"
        ]
      },
      "spin.v1.FleetHostVersion": {
        "type": "object",
        "properties": {
          "hostId": {
            "type": "string",
            "title": "host_id"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HostState"
              }
            ],
            "title": "state"
          },
          "agentVersion": {
            "type": "string",
            "title": "agent_version"
          },
          "machineVersion": {
            "type": "string",
            "title": "machine_version",
            "description": "Empty on a host with no machine, such as the mock runner."
          },
          "supported": {
            "type": "boolean",
            "title": "supported",
            "description": "Whether this control plane serves a host of that version. An unsupported host is refused\n at its next registration, with note saying why."
          },
          "note": {
            "type": "string",
            "title": "note"
          },
          "lastHeartbeat": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "last_heartbeat"
          }
        },
        "title": "FleetHostVersion",
        "additionalProperties": false,
        "description": "FleetHostVersion is one host's halves: the runner binary and the machine under it."
      },
      "spin.v1.GetBillRequest": {
        "type": "object",
        "properties": {
          "month": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "month",
            "description": "The month, as any instant in it (UTC's); unset is the month in progress."
          }
        },
        "title": "GetBillRequest",
        "additionalProperties": false
      },
      "spin.v1.GetBillResponse": {
        "type": "object",
        "properties": {
          "month": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "month",
            "description": "The month's first instant, UTC."
          },
          "readAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "read_at",
            "description": "When the bill was last read; unset where it never was - no scope (bill_scope), or a cloud\n that sends none - and then nothing below is known."
          },
          "currency": {
            "type": "string",
            "title": "currency",
            "description": "ISO 4217; every amount here is in millionths of it."
          },
          "totalMicros": {
            "type": "string",
            "title": "total_micros",
            "format": "int64",
            "description": "The month so far, every day and service."
          },
          "forecastMicros": {
            "type": [
              "string",
              "null"
            ],
            "title": "forecast_micros",
            "format": "int64",
            "description": "What the month is forecast to end at; unset where the cloud has no forecast yet."
          },
          "budgetLimitMicros": {
            "type": [
              "string",
              "null"
            ],
            "title": "budget_limit_micros",
            "format": "int64",
            "description": "The installation's budget and what the cloud counts against it; unset where it has none."
          },
          "budgetActualMicros": {
            "type": [
              "string",
              "null"
            ],
            "title": "budget_actual_micros",
            "format": "int64"
          },
          "budgetForecastMicros": {
            "type": [
              "string",
              "null"
            ],
            "title": "budget_forecast_micros",
            "format": "int64"
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.BillDay"
            },
            "title": "days",
            "description": "Oldest first."
          }
        },
        "title": "GetBillResponse",
        "additionalProperties": false
      },
      "spin.v1.GetCostsRequest": {
        "type": "object",
        "properties": {
          "month": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "month",
            "description": "The month, as any instant in it (UTC's); unset is the month in progress."
          }
        },
        "title": "GetCostsRequest",
        "additionalProperties": false
      },
      "spin.v1.GetCostsResponse": {
        "type": "object",
        "properties": {
          "month": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "month",
            "description": "The month's first instant, UTC."
          },
          "currency": {
            "type": "string",
            "title": "currency",
            "description": "ISO 4217; every amount here is in millionths of it."
          },
          "workspaces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.WorkspaceCost"
            },
            "title": "workspaces",
            "description": "Costliest first."
          },
          "idleMicros": {
            "type": "string",
            "title": "idle_micros",
            "format": "int64",
            "description": "What the runners cost that no workspace held."
          },
          "unstoredMicros": {
            "type": "string",
            "title": "unstored_micros",
            "format": "int64",
            "description": "What the volumes' bucket cost for bytes no workspace keeps: the images, what nothing\n references any more."
          },
          "platform": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ServiceCost"
            },
            "title": "platform",
            "description": "Every other cost - the control plane, the proxy, keys, logs - by service, costliest first."
          }
        },
        "title": "GetCostsResponse",
        "additionalProperties": false
      },
      "spin.v1.GetCurrentUserRequest": {
        "type": "object",
        "title": "GetCurrentUserRequest",
        "additionalProperties": false
      },
      "spin.v1.GetCurrentUserResponse": {
        "type": "object",
        "properties": {
          "user": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.User"
              }
            ],
            "title": "user"
          },
          "controlPlaneVersion": {
            "type": "string",
            "title": "control_plane_version",
            "description": "The release of the control plane that answered, which is the release of the dashboard asking:\n the bundle is served from inside that binary. It rides here rather than on an endpoint of its\n own because every session asks this once, and because a version an installation will be\n matched against known flaws by is not something to hand out unauthenticated."
          }
        },
        "title": "GetCurrentUserResponse",
        "additionalProperties": false
      },
      "spin.v1.GetFleetRequest": {
        "type": "object",
        "title": "GetFleetRequest",
        "additionalProperties": false
      },
      "spin.v1.GetFleetResponse": {
        "type": "object",
        "properties": {
          "autoscaling": {
            "type": "boolean",
            "title": "autoscaling",
            "description": "False when no group is configured: the hosts of this installation are whatever somebody\n registered by hand, and none of the numbers below mean anything."
          },
          "group": {
            "type": "string",
            "title": "group",
            "description": "The group the control plane sizes, as its cloud names it."
          },
          "desired": {
            "type": "integer",
            "title": "desired",
            "format": "int32",
            "description": "What it last asked the group for, and the most it may ask: zero of one is a fleet at rest,\n which is what an idle installation looks like."
          },
          "most": {
            "type": "integer",
            "title": "most",
            "format": "int32"
          },
          "connected": {
            "type": "integer",
            "title": "connected",
            "format": "int32",
            "description": "The hosts that are connected now, which lags desired by a machine's boot: one desired and\n none connected is a machine on its way."
          },
          "waiting": {
            "type": "integer",
            "title": "waiting",
            "format": "int32",
            "description": "Workspaces that have nowhere to run yet, and when the first of them started waiting: this\n is what makes the control plane ask for a machine."
          },
          "oldestWaiting": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "oldest_waiting"
          },
          "busy": {
            "type": "integer",
            "title": "busy",
            "format": "int32",
            "description": "Workspaces that are keeping the fleet up."
          },
          "idleMinutes": {
            "type": "integer",
            "title": "idle_minutes",
            "format": "int32",
            "description": "How long the fleet may be idle before the group is emptied, and the window in which it is\n emptied at once. Empty quiet_hours is none."
          },
          "quietHours": {
            "type": "string",
            "title": "quiet_hours"
          },
          "timeZone": {
            "type": "string",
            "title": "time_zone"
          }
        },
        "title": "GetFleetResponse",
        "additionalProperties": false,
        "description": "What an operator needs to read an empty list of hosts: whether the installation can bring one\n at all, how many it has asked for, and what is waiting. Every count is the control plane's own\n view now, not a stored one - a control plane that restarted starts counting again."
      },
      "spin.v1.GetFleetVersionsRequest": {
        "type": "object",
        "title": "GetFleetVersionsRequest",
        "additionalProperties": false
      },
      "spin.v1.GetFleetVersionsResponse": {
        "type": "object",
        "properties": {
          "controlPlaneVersion": {
            "type": "string",
            "title": "control_plane_version"
          },
          "machineVersion": {
            "type": "string",
            "title": "machine_version",
            "description": "The spin-machine release this control plane pins, which a host should be running."
          },
          "hosts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.FleetHostVersion"
            },
            "title": "hosts"
          },
          "extensions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ExtensionVersion"
            },
            "title": "extensions"
          }
        },
        "title": "GetFleetVersionsResponse",
        "additionalProperties": false
      },
      "spin.v1.GetHostPolicyRequest": {
        "type": "object",
        "properties": {
          "hostId": {
            "type": "string",
            "title": "host_id"
          }
        },
        "title": "GetHostPolicyRequest",
        "additionalProperties": false
      },
      "spin.v1.GetHostPolicyResponse": {
        "type": "object",
        "properties": {
          "policy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HostPolicy"
              }
            ],
            "title": "policy"
          },
          "writebackPresets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.WritebackPreset"
            },
            "title": "writeback_presets",
            "description": "The writeback thresholds an operator chooses from without testing them on the host, each\n with what it measured. The first is unset: what the host booted with."
          },
          "writebackTest": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WritebackTest"
              }
            ],
            "title": "writeback_test",
            "description": "The last writeback test of this host, while SetHostPolicy still takes its thresholds."
          }
        },
        "title": "GetHostPolicyResponse",
        "additionalProperties": false
      },
      "spin.v1.GetHostRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "GetHostRequest",
        "additionalProperties": false
      },
      "spin.v1.GetHostResponse": {
        "type": "object",
        "properties": {
          "host": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Host"
              }
            ],
            "title": "host"
          }
        },
        "title": "GetHostResponse",
        "additionalProperties": false
      },
      "spin.v1.GetInstallationSettingsRequest": {
        "type": "object",
        "title": "GetInstallationSettingsRequest",
        "additionalProperties": false
      },
      "spin.v1.GetInstallationSettingsResponse": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.InstallationSettings"
              }
            ],
            "title": "settings"
          }
        },
        "title": "GetInstallationSettingsResponse",
        "additionalProperties": false
      },
      "spin.v1.GetMonitoringRequest": {
        "type": "object",
        "title": "GetMonitoringRequest",
        "additionalProperties": false
      },
      "spin.v1.GetMonitoringResponse": {
        "type": "object",
        "properties": {
          "grafana": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Grafana"
              }
            ],
            "title": "grafana",
            "description": "Unset where the control plane serves none: the installation keeps no metrics, or this\n machine has no Grafana."
          }
        },
        "title": "GetMonitoringResponse",
        "additionalProperties": false
      },
      "spin.v1.GetOwnerWordRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          }
        },
        "title": "GetOwnerWordRequest",
        "additionalProperties": false
      },
      "spin.v1.GetOwnerWordResponse": {
        "type": "object",
        "properties": {
          "word": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.OwnerWord"
              }
            ],
            "title": "word",
            "description": "word is the newest the owner signed; unset for a workspace whose owner has signed none."
          },
          "owner": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.AccessPerson"
              }
            ],
            "title": "owner",
            "description": "owner is the workspace's owner, with their keyring as it is now: who signs the next. Empty\n keyring for an owner who has signed none."
          },
          "dotfiles": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.DotfilesConfig"
              }
            ],
            "title": "dotfiles",
            "description": "settings are the startup configuration the guest would be handed at its next registration:\n the owner's settings after the team's policy. A word approves them by their digest, which\n the client computes from these, as the guest does from what it is handed."
          },
          "defaultShell": {
            "type": "string",
            "title": "default_shell"
          },
          "env": {
            "type": "object",
            "title": "env",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            }
          },
          "editorSettings": {
            "type": "object",
            "title": "editor_settings",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            }
          },
          "taskfile": {
            "type": "string",
            "title": "taskfile"
          },
          "egressRoot": {
            "type": "string",
            "title": "egress_root",
            "description": "egress_root is the installation's egress root, PEM: what the guest is handed at registration,\n and trusts only when a word names its digest. A client names it only once it has held it to\n the root it pinned for the installation, never on this answer's say alone."
          },
          "identityAudiences": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "identity_audiences",
            "description": "identity_audiences is who the installation gives identities for, empty for anybody: what a\n client offers its owner to name in a word, which a host holds every token to as well."
          },
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "The workspace as its first access says it: team, image, and the snapshot and workspace it was\n cloned from. The next access says the same; the first says these."
          },
          "image": {
            "type": "string",
            "title": "image"
          },
          "parentSnapshotId": {
            "type": "string",
            "title": "parent_snapshot_id"
          },
          "parentWorkspaceId": {
            "type": "string",
            "title": "parent_workspace_id"
          },
          "guests": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.AccessPerson"
            },
            "title": "guests",
            "description": "guests are the people the owner invited, each with their keyring as it is now: who the next\n access names besides the owner. One with an empty keyring has signed none, and is named once\n they have."
          },
          "role": {
            "type": "string",
            "title": "role",
            "description": "role is the caller's: \"owner\", or \"guest\" - who reads it and signs nothing."
          },
          "repository": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.RepositoryConfig"
              }
            ],
            "title": "repository",
            "description": "repository is the one the workspace opened, part of the settings a word approves as the\n five above are: unset for a workspace that opened no project."
          },
          "prebuildClaim": {
            "type": "string",
            "title": "prebuild_claim",
            "format": "byte",
            "description": "prebuild_claim is, for a workspace opened from a prebuild, the claim the host that built it\n signed (PrebuildClaim), whose SHA-256 repository.prebuild_claim_digest is: a client verifies\n it, and that it names the repository and the commit the settings do, before its word approves\n them."
          },
          "prebuildWriters": {
            "type": "object",
            "title": "prebuild_writers",
            "additionalProperties": {
              "type": "string",
              "title": "value",
              "format": "byte"
            },
            "description": "prebuild_writers is the record of the claim's writer, by its id (writers/\u003cid\u003e.json in the\n installation's store), which the client holds to its own anchors as it does a launch claim's."
          }
        },
        "title": "GetOwnerWordResponse",
        "additionalProperties": false
      },
      "spin.v1.GetPlatformImagesRequest": {
        "type": "object",
        "title": "GetPlatformImagesRequest",
        "additionalProperties": false
      },
      "spin.v1.GetPlatformImagesResponse": {
        "type": "object",
        "properties": {
          "images": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.PlatformImage"
            },
            "title": "images",
            "description": "Empty until the object store is configured: there is nowhere to publish to."
          },
          "baseImages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.BaseImage"
            },
            "title": "base_images",
            "description": "Every base image published, one per machine release, newest first."
          },
          "supervisorReleases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ExtensionRelease"
            },
            "title": "supervisor_releases",
            "description": "Every release of the supervisor, newest first."
          },
          "agentReleases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ExtensionRelease"
            },
            "title": "agent_releases",
            "description": "Every release of the agent CLIs (Claude Code and Codex, one extension), newest first."
          }
        },
        "title": "GetPlatformImagesResponse",
        "additionalProperties": false
      },
      "spin.v1.GetRegistrationModeRequest": {
        "type": "object",
        "title": "GetRegistrationModeRequest",
        "additionalProperties": false
      },
      "spin.v1.GetRegistrationModeResponse": {
        "type": "object",
        "properties": {
          "mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.RegistrationMode"
              }
            ],
            "title": "mode"
          }
        },
        "title": "GetRegistrationModeResponse",
        "additionalProperties": false
      },
      "spin.v1.GetSecuritySettingsRequest": {
        "type": "object",
        "title": "GetSecuritySettingsRequest",
        "additionalProperties": false
      },
      "spin.v1.GetSecuritySettingsResponse": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SecuritySettings"
              }
            ],
            "title": "settings"
          }
        },
        "title": "GetSecuritySettingsResponse",
        "additionalProperties": false
      },
      "spin.v1.GetSetupStatusRequest": {
        "type": "object",
        "title": "GetSetupStatusRequest",
        "additionalProperties": false
      },
      "spin.v1.GetSetupStatusResponse": {
        "type": "object",
        "properties": {
          "needsSetup": {
            "type": "boolean",
            "title": "needs_setup",
            "description": "True until the setup wizard has been completed: where the dashboard sends everybody."
          },
          "hasOauth": {
            "type": "boolean",
            "title": "has_oauth",
            "description": "True if any OAuth/OIDC provider is configured"
          },
          "setupCompleted": {
            "type": "boolean",
            "title": "setup_completed",
            "description": "True if setup wizard has been completed"
          },
          "forcePasswordChange": {
            "type": "boolean",
            "title": "force_password_change",
            "description": "True if current admin must change their password"
          },
          "baseDomain": {
            "type": "string",
            "title": "base_domain",
            "description": "The configured base domain (if any)"
          },
          "hasBootstrapAdmin": {
            "type": "boolean",
            "title": "has_bootstrap_admin",
            "description": "True if bootstrap admin is still active (should be disabled after OAuth setup)"
          },
          "registrationMode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.RegistrationMode"
              }
            ],
            "title": "registration_mode",
            "description": "Current registration mode (open, whitelist, closed)"
          },
          "hasStorage": {
            "type": "boolean",
            "title": "has_storage",
            "description": "True if the object store is configured; until it is, no workspace can be created"
          },
          "signedIn": {
            "type": "boolean",
            "title": "signed_in",
            "description": "True if whoever asked is signed in: the wizard starts at the sign-in until they are, whatever\n the installation already has."
          },
          "development": {
            "type": "boolean",
            "title": "development",
            "description": "True for a development installation, where the mock identity provider may be enabled."
          }
        },
        "title": "GetSetupStatusResponse",
        "additionalProperties": false
      },
      "spin.v1.GetStorageSettingsRequest": {
        "type": "object",
        "title": "GetStorageSettingsRequest",
        "additionalProperties": false
      },
      "spin.v1.GetStorageSettingsResponse": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StorageSettings"
              }
            ],
            "title": "settings"
          },
          "volumesExist": {
            "type": "boolean",
            "title": "volumes_exist",
            "description": "Whether volumes exist, whose history is in this store: it can then be changed, but not\n for another bucket or directory."
          }
        },
        "title": "GetStorageSettingsResponse",
        "additionalProperties": false
      },
      "spin.v1.GetStorageUsageRequest": {
        "type": "object",
        "title": "GetStorageUsageRequest",
        "additionalProperties": false
      },
      "spin.v1.GetStorageUsageResponse": {
        "type": "object",
        "properties": {
          "volumes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.StoredVolume"
            },
            "title": "volumes",
            "description": "Heaviest first."
          },
          "unreferencedLayers": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StorageTally"
              }
            ],
            "title": "unreferenced_layers",
            "description": "Layers no commit in the store names: the storage GC's to collect."
          },
          "other": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StorageTally"
              }
            ],
            "title": "other",
            "description": "Everything outside volumes/ and layers/: the control plane's election records."
          },
          "measuredAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "measured_at"
          }
        },
        "title": "GetStorageUsageResponse",
        "additionalProperties": false
      },
      "spin.v1.GetTeamRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "ID, path (e.g., \"/engineering/backend\") or \"me\": the caller's personal team"
          }
        },
        "title": "GetTeamRequest",
        "additionalProperties": false
      },
      "spin.v1.GetTeamResponse": {
        "type": "object",
        "properties": {
          "team": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Team"
              }
            ],
            "title": "team"
          },
          "currentUserRole": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TeamRole"
              }
            ],
            "title": "current_user_role",
            "description": "Role of the requesting user in this team"
          }
        },
        "title": "GetTeamResponse",
        "additionalProperties": false
      },
      "spin.v1.GetTelemetryStatusRequest": {
        "type": "object",
        "title": "GetTelemetryStatusRequest",
        "additionalProperties": false
      },
      "spin.v1.GetTelemetryStatusResponse": {
        "type": "object",
        "properties": {
          "reportedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "reported_at",
            "description": "Unset: the watch has not reported since this control plane started - no collector, or not\n yet."
          },
          "windowSeconds": {
            "type": "integer",
            "title": "window_seconds",
            "format": "int32",
            "description": "How long the counts below are over."
          },
          "spans": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TelemetryFlow"
              }
            ],
            "title": "spans",
            "description": "Into the installation's store, after the traces policy chose which to keep."
          },
          "samples": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TelemetryFlow"
              }
            ],
            "title": "samples",
            "description": "Into the installation's store of metrics."
          }
        },
        "title": "GetTelemetryStatusResponse",
        "additionalProperties": false
      },
      "spin.v1.GetTraceRequest": {
        "type": "object",
        "properties": {
          "traceId": {
            "type": "string",
            "title": "trace_id",
            "description": "Hex, as a log record carries it."
          }
        },
        "title": "GetTraceRequest",
        "additionalProperties": false
      },
      "spin.v1.GetTraceResponse": {
        "type": "object",
        "properties": {
          "spans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Span"
            },
            "title": "spans"
          }
        },
        "title": "GetTraceResponse",
        "additionalProperties": false
      },
      "spin.v1.GetUserSettingsRequest": {
        "type": "object",
        "title": "GetUserSettingsRequest",
        "additionalProperties": false,
        "description": "User settings"
      },
      "spin.v1.GetUserSettingsResponse": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.UserSettings"
              }
            ],
            "title": "settings"
          }
        },
        "title": "GetUserSettingsResponse",
        "additionalProperties": false
      },
      "spin.v1.GetVSCodeServersRequest": {
        "type": "object",
        "title": "GetVSCodeServersRequest",
        "additionalProperties": false
      },
      "spin.v1.GetVSCodeServersResponse": {
        "type": "object",
        "properties": {
          "releases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ExtensionRelease"
            },
            "title": "releases",
            "description": "Newest first."
          },
          "publish": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.VSCodeServerPublish"
              }
            ],
            "title": "publish"
          },
          "unavailable": {
            "type": "string",
            "title": "unavailable",
            "description": "Why this control plane cannot publish - no object store, or a build with no machine tools\n to make the image with - and empty when it can."
          }
        },
        "title": "GetVSCodeServersResponse",
        "additionalProperties": false
      },
      "spin.v1.GetWorkspaceConsoleRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "lines": {
            "type": "integer",
            "title": "lines",
            "format": "int32",
            "description": "How many lines from the end; zero asks for the default. The host bounds it either way."
          }
        },
        "title": "GetWorkspaceConsoleRequest",
        "additionalProperties": false
      },
      "spin.v1.GetWorkspaceConsoleResponse": {
        "type": "object",
        "properties": {
          "lines": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "lines",
            "description": "Newest last, as the console was written."
          },
          "truncated": {
            "type": "boolean",
            "title": "truncated",
            "description": "truncated says there are lines before the first one here, so what this begins with is not\n mistaken for the start of the boot."
          },
          "hostId": {
            "type": "string",
            "title": "host_id",
            "description": "Which host answered. A console belongs to the machine that wrote it, and a workspace that\n has moved has nothing to say about the run that failed on the host it left."
          }
        },
        "title": "GetWorkspaceConsoleResponse",
        "additionalProperties": false
      },
      "spin.v1.GetWorkspaceEgressRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          }
        },
        "title": "GetWorkspaceEgressRequest",
        "additionalProperties": false,
        "description": "GetWorkspaceEgressRequest asks what a workspace has reached beyond the node. The host keeps\n the record, so the workspace has to be running on one; it is kept for six hours and survives\n a restart of the runner, not of the host."
      },
      "spin.v1.GetWorkspaceEgressResponse": {
        "type": "object",
        "properties": {
          "destinations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ObservedDestination"
            },
            "title": "destinations",
            "description": "Most traffic first, so what an allowlist has to carry is at the top."
          },
          "lookups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ResolverLookup"
            },
            "title": "lookups",
            "description": "The workspace's recent lookups its host's resolver did not answer as asked, newest first:\n \"it cannot resolve github.com\" is an upstream failing, a name pointing into the node being\n removed, or a query type refused, and this says which. Answered lookups are not kept."
          },
          "refused": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.RefusedDestination"
            },
            "title": "refused",
            "description": "What the host's drops refused the workspace in the last hour, most packets first: the\n node's own networks, or what none of its policies allows. The other half of destinations,\n and what a policy that is too narrow looks like from outside the machine."
          },
          "brokered": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.BrokeredRequest"
            },
            "title": "brokered",
            "description": "The workspace's recent requests to names its policies broker with an injection, newest\n first: what the host's egress proxy set a header on, and what it refused and why. A brokered\n name no rule injects on is relayed byte for byte and leaves no request here."
          }
        },
        "title": "GetWorkspaceEgressResponse",
        "additionalProperties": false
      },
      "spin.v1.GetWorkspaceHistoryRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "limit": {
            "type": "integer",
            "title": "limit",
            "format": "int32",
            "description": "Number of events (default: 50)"
          }
        },
        "title": "GetWorkspaceHistoryRequest",
        "additionalProperties": false
      },
      "spin.v1.GetWorkspaceHistoryResponse": {
        "type": "object",
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.WorkspaceEvent"
            },
            "title": "events"
          }
        },
        "title": "GetWorkspaceHistoryResponse",
        "additionalProperties": false
      },
      "spin.v1.GetWorkspaceIdentityRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "GetWorkspaceIdentityRequest",
        "additionalProperties": false,
        "description": "Workspace History / Timeline"
      },
      "spin.v1.GetWorkspaceIdentityResponse": {
        "type": "object",
        "properties": {
          "spiffeId": {
            "type": "string",
            "title": "spiffe_id",
            "description": "The workspace's SPIFFE ID, spiffe://\u003cdomain\u003e/t/\u003cteam\u003e/w/\u003cworkspace\u003e: every subject in it is\n under it - the user's at /u, each agent's at /a/\u003cname\u003e - so a relying party names the\n workspace by it as a prefix."
          },
          "userSubject": {
            "type": "string",
            "title": "user_subject",
            "description": "The workspace user's subject, what its tokens and signatures carry."
          },
          "issuer": {
            "type": "string",
            "title": "issuer",
            "description": "The issuer its tokens name, https://id.\u003cdomain\u003e, where the key set and the allowed signers are."
          },
          "parentSnapshotId": {
            "type": "string",
            "title": "parent_snapshot_id",
            "description": "What the workspace was cloned from: the snapshot, and the workspace whose disk it was when\n that is still there and of the same team. Empty for a workspace made from an image."
          },
          "parentWorkspaceId": {
            "type": "string",
            "title": "parent_workspace_id"
          },
          "audiences": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "audiences",
            "description": "Who the installation gives identities for; empty is anybody."
          }
        },
        "title": "GetWorkspaceIdentityResponse",
        "additionalProperties": false
      },
      "spin.v1.GetWorkspaceRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "Workspace ID or name"
          }
        },
        "title": "GetWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.GetWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "GetWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.GetWorkspaceStatusRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          }
        },
        "title": "GetWorkspaceStatusRequest",
        "additionalProperties": false,
        "description": "GetWorkspace is on the hot path - the proxy resolves every request through it - and\n serves one row; this joins four and is asked when something looks wrong."
      },
      "spin.v1.GetWorkspaceStatusResponse": {
        "type": "object",
        "properties": {
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceState"
              }
            ],
            "title": "state",
            "description": "What the control plane believes, which is what every other surface shows."
          },
          "failureReason": {
            "type": "string",
            "title": "failure_reason",
            "description": "Only when state = FAILED"
          },
          "supervisor": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SupervisorStatus"
              }
            ],
            "title": "supervisor"
          },
          "host": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceHostStatus"
              }
            ],
            "title": "host"
          },
          "volume": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceVolumeStatus"
              }
            ],
            "title": "volume"
          },
          "disagreements": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.StatusDisagreement"
            },
            "title": "disagreements",
            "description": "Where the four disagree, in the order they should be read. Empty means they agree -\n which is the answer when a workspace is simply healthy, and is worth saying."
          },
          "runtime": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceRuntime"
              }
            ],
            "title": "runtime",
            "description": "What the machine has and uses now, asked of its host. Absent - not zero - when there is no\n machine to ask about: not running, on no connected host, or a host that did not answer in\n time. Zero cores would read as a machine that has none."
          },
          "failure": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceFailure"
              }
            ],
            "title": "failure",
            "description": "Which part failed, when state = FAILED; failure_reason is the detail. Workspace.failure."
          },
          "injections": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.InjectionStatus"
            },
            "title": "injections",
            "description": "Each header a brokered rule of the workspace's policies sets, and whether what it is set\n from is there to set: a request to a brokered name is refused when it is not, and this is\n where that is seen from outside the machine."
          }
        },
        "title": "GetWorkspaceStatusResponse",
        "additionalProperties": false
      },
      "spin.v1.Grafana": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "title": "url",
            "description": "Where the control plane serves it: \"/monitoring/grafana/\"."
          },
          "dashboards": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.GrafanaDashboard"
            },
            "title": "dashboards",
            "description": "The release's, in the order they are listed."
          }
        },
        "title": "Grafana",
        "additionalProperties": false,
        "description": "Grafana is the one the control plane runs over the installation's metrics and serves to its\n administrators."
      },
      "spin.v1.GrafanaDashboard": {
        "type": "object",
        "properties": {
          "uid": {
            "type": "string",
            "title": "uid"
          },
          "title": {
            "type": "string",
            "title": "title"
          }
        },
        "title": "GrafanaDashboard",
        "additionalProperties": false
      },
      "spin.v1.GrantPortAccessRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "port": {
            "type": "integer",
            "title": "port",
            "format": "int32"
          },
          "userId": {
            "type": "string",
            "title": "user_id"
          }
        },
        "title": "GrantPortAccessRequest",
        "additionalProperties": false,
        "description": "Granting and revoking are separate from SetPortAccess because they answer a different\n question - who, rather than how many - and because revoking one person must not be\n expressible as \"send the list again minus one\", which loses a race with a second grant."
      },
      "spin.v1.GrantPortAccessResponse": {
        "type": "object",
        "properties": {
          "exposedPort": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.ExposedPort"
              }
            ],
            "title": "exposed_port"
          }
        },
        "title": "GrantPortAccessResponse",
        "additionalProperties": false
      },
      "spin.v1.GrantWorkspaceResourcesRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "cpuCores": {
            "type": "integer",
            "title": "cpu_cores",
            "format": "int32"
          },
          "memoryMb": {
            "type": "integer",
            "title": "memory_mb",
            "format": "int32"
          },
          "lasts": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Duration"
              }
            ],
            "title": "lasts",
            "description": "How long the grant lasts before it is given back on its own, from now: at least a minute.\n Unset keeps it until it is given back. Each grant says it anew: one that says nothing about\n time is kept, whatever the one before it said."
          },
          "move": {
            "type": "boolean",
            "title": "move",
            "description": "move says what to do when a running workspace's host has no room for the grant: move it to\n a host that has - suspended where it runs, its processes as they are, and resumed there from\n the checkpoint. The guest is paused from the checkpoint until it runs on the other host, which\n takes as long as storing its memory and publishing its disk. Without it such a grant is\n refused."
          }
        },
        "title": "GrantWorkspaceResourcesRequest",
        "additionalProperties": false,
        "description": "SetWorkspaceNetworkTagsRequest is the whole set a workspace should run under, not an\n addition: a request naming one tag leaves it carrying that one. Naming none means what it\n means on a create - the installation's default, and \"offline\" where it declares none - so\n there is one reading of an empty list rather than two nobody would keep straight. To ask for\n a workspace that reaches nothing, name \"offline\".\n\n Who may ask what: the workspace's owner chooses among the policies the installation\n declares, which are the same ones they could have created it with; an administrator may\n name any policy a host reports. Nothing inside the guest can ask at all - a workspace's own\n credential does not reach this, because loosening the egress of the sandbox you are in is\n the first thing something that got in would try.\n GrantWorkspaceResourcesRequest is what the workspace holds of its own from now on: at least its\n floor, and at most its ceiling where its preset has one (to_host has none but its host's room).\n Zero keeps what it holds of that one."
      },
      "spin.v1.GrantWorkspaceResourcesResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "GrantWorkspaceResourcesResponse",
        "additionalProperties": false
      },
      "spin.v1.HeaderInjection": {
        "type": "object",
        "properties": {
          "header": {
            "type": "string",
            "title": "header"
          },
          "secret": {
            "type": "string",
            "title": "secret",
            "description": "The team secret's name."
          },
          "prefix": {
            "type": "string",
            "title": "prefix",
            "description": "What goes before the value, as \"Bearer \"."
          },
          "identity": {
            "type": "string",
            "title": "identity",
            "description": "The audience of a token of the workspace's identity, issued for the proxy to present: bound\n to no key, and saying so (spin.via = egress-proxy)."
          },
          "forge": {
            "type": "string",
            "title": "forge",
            "description": "The forge whose credential for the workspace's team goes in the header, whole: \"github\" is an\n installation token of the team's GitHub App, minted by the control plane (TeamService.SetForge)."
          },
          "methods": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "methods",
            "description": "The requests the header is set on: these methods, and paths under path_prefix by whole\n segments. Another request to the rule's names is answered 403. None of either is every request."
          },
          "pathPrefix": {
            "type": "string",
            "title": "path_prefix"
          }
        },
        "title": "HeaderInjection",
        "additionalProperties": false,
        "description": "HeaderInjection is a header the egress proxy sets: header, to prefix and then a value the\n workspace never holds - a team secret's, or a token of the workspace's identity. One of the two."
      },
      "spin.v1.HealthCheckResult": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name"
          },
          "passed": {
            "type": "boolean",
            "title": "passed"
          },
          "value": {
            "type": "string",
            "title": "value",
            "description": "Actual value from check"
          },
          "message": {
            "type": "string",
            "title": "message",
            "description": "Error message if failed"
          }
        },
        "title": "HealthCheckResult",
        "additionalProperties": false
      },
      "spin.v1.HealthReport": {
        "type": "object",
        "properties": {
          "healthy": {
            "type": "boolean",
            "title": "healthy"
          },
          "checks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.HealthCheckResult"
            },
            "title": "checks"
          }
        },
        "title": "HealthReport",
        "additionalProperties": false,
        "description": "HealthReport is what the supervisor inside a workspace observes about it. Here rather\n than beside the stream that carries it, for the reason SupervisorState is here: it is\n read from both sides - reported by the supervisor on its own connection\n (spin.agent.v1), and returned to an operator by WorkspaceService.GetWorkspaceStatus.\n\n It is also what keeps the dependency between the two packages pointing one way.\n spin.v1 is the vocabulary and spin.agent.v1 is the machine surface built on it; a type\n the operator's side needs from the agent's side would make each package need the other."
      },
      "spin.v1.HistogramLogsResponse": {
        "type": "object",
        "properties": {
          "intervals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.LogInterval"
            },
            "title": "intervals"
          }
        },
        "title": "HistogramLogsResponse",
        "additionalProperties": false
      },
      "spin.v1.HistogramPlatformLogsRequest": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "title": "query"
          },
          "from": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "from"
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "to"
          },
          "intervals": {
            "type": "integer",
            "title": "intervals",
            "format": "int32",
            "description": "How many intervals to split the window into: 1 to 200, 60 when unset. Each is at least a\n second."
          }
        },
        "title": "HistogramPlatformLogsRequest",
        "additionalProperties": false
      },
      "spin.v1.HistogramWorkspaceLogsRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "query": {
            "type": "string",
            "title": "query"
          },
          "from": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "from"
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "to"
          },
          "intervals": {
            "type": "integer",
            "title": "intervals",
            "format": "int32"
          }
        },
        "title": "HistogramWorkspaceLogsRequest",
        "additionalProperties": false
      },
      "spin.v1.HistogramWorkspaceLogsResponse": {
        "type": "object",
        "properties": {
          "intervals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.LogInterval"
            },
            "title": "intervals"
          }
        },
        "title": "HistogramWorkspaceLogsResponse",
        "additionalProperties": false
      },
      "spin.v1.Host": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "address": {
            "type": "string",
            "title": "address"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HostState"
              }
            ],
            "title": "state"
          },
          "capacity": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Resources"
              }
            ],
            "title": "capacity"
          },
          "allocated": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Resources"
              }
            ],
            "title": "allocated"
          },
          "workspaceCount": {
            "type": "integer",
            "title": "workspace_count",
            "format": "int32"
          },
          "agentVersion": {
            "type": "string",
            "title": "agent_version"
          },
          "labels": {
            "type": "object",
            "title": "labels",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            }
          },
          "lastHeartbeat": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "last_heartbeat",
            "description": "last_heartbeat is whichever of this host's two channels was heard from last, and they are\n not the same thing: the command stream carries what the host can be *told* (start this,\n stop that), and the volume agent's own heartbeat renews the lease its disks are served\n under. Either refreshes this, so a fresh stamp says one of them is alive and not which."
          },
          "registeredAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "registered_at"
          },
          "connected": {
            "type": "boolean",
            "title": "connected",
            "description": "connected is the command stream, now: the half that decides whether this host can be given\n a workspace or asked to stop one. A host whose stream is gone while its volume agent keeps\n renewing reads as freshly heartbeated above and can be told nothing at all - which is the\n state an operator is looking at when they ask why a host takes no work."
          },
          "goingAway": {
            "type": "boolean",
            "title": "going_away",
            "description": "going_away is this host on its way out: a runner told the control plane it is stopping -\n an operator's restart, or the cloud taking the machine away - and it takes no new\n workspace from that moment. Nothing is written to the database for it (a state there would\n outlive the restart it described), so this is the only place an operator can see that the\n host they are looking at is leaving rather than idle."
          },
          "checks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.HostCheck"
            },
            "title": "checks",
            "description": "checks are what the host last found when it asked itself whether a workspace can run on it\n as it should, as its heartbeat said: held for as long as the host is connected, like\n going_away, and empty for a host that has said nothing yet."
          }
        },
        "title": "Host",
        "additionalProperties": false
      },
      "spin.v1.HostCheck": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name",
            "description": "name is what was checked: clock, kvm, resolver."
          },
          "ok": {
            "type": "boolean",
            "title": "ok"
          },
          "detail": {
            "type": "string",
            "title": "detail",
            "description": "detail is what it found when it is not ok, in the host's words."
          },
          "checkedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "checked_at"
          }
        },
        "title": "HostCheck",
        "additionalProperties": false,
        "description": "HostCheck is one thing a host asks itself about, at start and every few minutes: a clock that\n is not synchronised, a KVM it cannot open, a resolver that answers its workspaces nothing - each\n a host that looks healthy to every other signal and fails its workspaces."
      },
      "spin.v1.HostNetworkPolicy": {
        "type": "object",
        "properties": {
          "hostId": {
            "type": "string",
            "title": "host_id"
          },
          "rules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.NetworkRule"
            },
            "title": "rules"
          }
        },
        "title": "HostNetworkPolicy",
        "additionalProperties": false
      },
      "spin.v1.HostPolicy": {
        "type": "object",
        "properties": {
          "hostId": {
            "type": "string",
            "title": "host_id"
          },
          "shutdownGraceSeconds": {
            "type": [
              "integer",
              "null"
            ],
            "title": "shutdown_grace_seconds",
            "format": "int32",
            "description": "Seconds this host stays up after a stop signal so what it runs can be suspended off it.\n The unit's TimeoutStopSec still bounds it."
          },
          "preemptible": {
            "type": [
              "boolean",
              "null"
            ],
            "title": "preemptible",
            "description": "Whether a stop here is the machine being taken away rather than coming back."
          },
          "preemptionSource": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PreemptionSource"
              },
              {
                "type": "null"
              }
            ],
            "title": "preemption_source",
            "description": "Which cloud announces that reclaim; setting one implies preemptible."
          },
          "preemptionMetadataUrl": {
            "type": [
              "string",
              "null"
            ],
            "title": "preemption_metadata_url",
            "description": "That service's address, for a private cloud or a test."
          },
          "capacityCpuCores": {
            "type": [
              "integer",
              "null"
            ],
            "title": "capacity_cpu_cores",
            "format": "int32",
            "description": "What this host advertises to the fleet, which is not what it has: an operator holds a\n machine back by saying it has less. Unset leaves the host advertising what it detects."
          },
          "capacityMemoryMb": {
            "type": [
              "integer",
              "null"
            ],
            "title": "capacity_memory_mb",
            "format": "int32"
          },
          "capacityDiskGb": {
            "type": [
              "integer",
              "null"
            ],
            "title": "capacity_disk_gb",
            "format": "int32"
          },
          "maxWorkspaceCpuCores": {
            "type": [
              "integer",
              "null"
            ],
            "title": "max_workspace_cpu_cores",
            "format": "int32",
            "description": "The ceiling one workspace may grow to here, for the machines it starts afterwards."
          },
          "maxWorkspaceMemoryMb": {
            "type": [
              "integer",
              "null"
            ],
            "title": "max_workspace_memory_mb",
            "format": "int32"
          },
          "revision": {
            "type": "string",
            "title": "revision",
            "description": "revision names the content, and is what a host reports it is running under."
          },
          "writebackLimitBytes": {
            "type": [
              "string",
              "null"
            ],
            "title": "writeback_limit_bytes",
            "format": "int64",
            "description": "The host's writeback thresholds (spin.agent.v1.HostPolicy says why): both or neither, the\n background below the limit. Unset is what the host booted with."
          },
          "writebackBackgroundBytes": {
            "type": [
              "string",
              "null"
            ],
            "title": "writeback_background_bytes",
            "format": "int64"
          },
          "runningRevision": {
            "type": "string",
            "title": "running_revision",
            "description": "running_revision is what the host last said, empty where it has not said or is not\n connected. Different from revision is a policy still on its way, which is normal for the\n seconds after a write and a fault after that."
          },
          "maxWorkspaceIoMbPerSecond": {
            "type": [
              "integer",
              "null"
            ],
            "title": "max_workspace_io_mb_per_second",
            "format": "int32",
            "description": "What one machine may read and write per second here, in MiB and in operations, for the\n machines it starts afterwards. Unset is no bound."
          },
          "maxWorkspaceIoOpsPerSecond": {
            "type": [
              "integer",
              "null"
            ],
            "title": "max_workspace_io_ops_per_second",
            "format": "int32"
          }
        },
        "title": "HostPolicy",
        "additionalProperties": false,
        "description": "HostPolicy is what an installation decides about one host. An unset field is the\n installation saying nothing about that setting, which leaves the host on its own default -\n not the same as setting it to nothing."
      },
      "spin.v1.HostState": {
        "type": "string",
        "title": "HostState",
        "enum": [
          "HOST_STATE_UNSPECIFIED",
          "HOST_STATE_ACTIVE",
          "HOST_STATE_CORDONED",
          "HOST_STATE_DRAINING",
          "HOST_STATE_DEAD"
        ],
        "description": "HostState mirrors internal/lifecycle.HostState (§28.1) and the CHECK on hosts.state:\n one vocabulary for the fleet, whichever component is asking. Only ACTIVE takes new\n work; a CORDONED or DRAINING host keeps serving (and keeps its lease) while it is\n evacuated, and the Agent needs to be told which of the two it is.\n\n It replaces a second set of names this schema carried for the same states - HEALTHY,\n DEGRADED, OFFLINE - where DEGRADED was a word nothing branched on and no name said\n \"an operator stopped this host\"."
      },
      "spin.v1.IdentityProvider": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "\"github\" for built-in, UUIDv7 for dynamic"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "Display name (e.g., \"Sign in with Okta\")"
          },
          "providerType": {
            "type": "string",
            "title": "provider_type",
            "description": "github (built-in), oidc, google, azure-ad"
          },
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "Empty if system-wide provider"
          },
          "isDefault": {
            "type": "boolean",
            "title": "is_default",
            "description": "True for built-in GitHub provider"
          }
        },
        "title": "IdentityProvider",
        "additionalProperties": false,
        "description": "Identity provider info (returned to clients for login UI)\n Built-in provider has id=\"github\"; dynamic providers have UUIDv7 IDs"
      },
      "spin.v1.Image": {
        "type": "object",
        "properties": {
          "ref": {
            "type": "string",
            "title": "ref",
            "description": "The name a workspace asks for. It moves: a publish under it tags new bytes, and what a disk\n began as is its volume's parent snapshot, not this."
          },
          "virtualSizeBytes": {
            "type": "string",
            "title": "virtual_size_bytes",
            "format": "int64",
            "description": "What the disk cloned from it will hold before the workspace writes anything."
          },
          "publishedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "published_at",
            "description": "When the publication this ref resolves to was made."
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "What a person choosing a disk is shown: its name (\"base image\") and what it is ready for.\n An empty name is a publication made before one was asked for; show the ref."
          },
          "description": {
            "type": "string",
            "title": "description"
          }
        },
        "title": "Image",
        "additionalProperties": false,
        "description": "Image is one name a workspace can be created from: a publication in this installation's\n database that its settings also permit. It is not a container image and does not come from a\n registry - it is a volume somebody published here, which is why a name that looks like\n \"ubuntu:22.04\" is not one unless it was published under that name.\n A disk image a workspace's disk can be cloned from: a volume published in this installation,\n not a container image, and never pulled from a registry."
      },
      "spin.v1.InjectionStatus": {
        "type": "object",
        "properties": {
          "policy": {
            "type": "string",
            "title": "policy",
            "description": "The policy, by name, and the names its rule brokers."
          },
          "names": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "names"
          },
          "header": {
            "type": "string",
            "title": "header"
          },
          "from": {
            "type": "string",
            "title": "from",
            "description": "What the header is set from: a team secret by name, \"\u003cforge\u003e app\", or \"identity for\n \u003caudience\u003e\"."
          },
          "held": {
            "type": "boolean",
            "title": "held",
            "description": "Whether the team holds it: the secret is set, the forge app is set, an identity is always\n held. False is a request refused with credentials."
          }
        },
        "title": "InjectionStatus",
        "additionalProperties": false,
        "description": "InjectionStatus is one header the egress proxy sets on the workspace's requests to a brokered\n name, and whether the workspace's team holds what it is set from."
      },
      "spin.v1.InstallationSettings": {
        "type": "object",
        "properties": {
          "allowedImages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "allowed_images",
            "description": "Whitelist of allowed images (empty = all allowed)"
          },
          "maxWorkspacesPerUser": {
            "type": "integer",
            "title": "max_workspaces_per_user",
            "format": "int32",
            "description": "Maximum workspaces per user (0 = unlimited)"
          },
          "defaultNetworkTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "default_network_tags",
            "description": "What a workspace created without a network tag of its own runs under, by policy name.\n Empty means \"offline\", the policy every host has and which allows nothing: no value of\n this field means open. An installation that wants such a workspace out declares a policy\n saying what it may reach and names it here."
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          },
          "telemetryTracesKeepPercent": {
            "type": "integer",
            "title": "telemetry_traces_keep_percent",
            "format": "int32",
            "description": "What the installation's collector keeps, decided at the collector\n (internal/controlplane/domain/telemetrypolicy). A trace with an error in any span is always kept, and so\n is one slower than telemetry_traces_slow_ms (0: none is kept for being slow); of the rest,\n telemetry_traces_keep_percent, 0 to 100 and 100 until an admin says otherwise."
          },
          "telemetryTracesSlowMs": {
            "type": "integer",
            "title": "telemetry_traces_slow_ms",
            "format": "int32"
          },
          "telemetryMetricsDrop": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "telemetry_metrics_drop",
            "description": "The metrics that are not kept, by name; a pattern may begin or end with *."
          },
          "telemetryPerVolumeHistograms": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "telemetry_per_volume_histograms",
            "description": "Read only: the metrics that cost most to keep, a histogram per volume, which a surface may\n offer to drop as one."
          },
          "vscodeFetch": {
            "type": "boolean",
            "title": "vscode_fetch",
            "description": "Whether the control plane fetches VS Code servers from Microsoft on its own: the newest\n stable release, looked for daily, and the server of a client's commit the installation has\n not released. False, it fetches none, and a workspace is given the server the control plane's\n image carries or one an administrator published."
          },
          "workspaceTrashDays": {
            "type": "integer",
            "title": "workspace_trash_days",
            "format": "int32",
            "description": "How many days a deleted workspace stays in the trash, whole, for its owner to undelete\n before it is erased: 0 is no trash, and 7 is what an installation that says nothing keeps."
          },
          "identityAudiences": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "identity_audiences",
            "description": "Who a workspace's identity token may be for; empty is anybody. What the installation's\n issuer gives, not who trusts it: a relying party still decides which subjects it admits."
          },
          "volumeRpoSeconds": {
            "type": "integer",
            "title": "volume_rpo_seconds",
            "format": "int32",
            "description": "How far behind the object store a workspace's volume may fall, in seconds, where its preset\n does not say: what it commits on (v6 §11). 0 is none - it commits on its size and its\n snapshots alone - and 300 is what an installation that says nothing keeps."
          },
          "diskReservePercent": {
            "type": "integer",
            "title": "disk_reserve_percent",
            "format": "int32",
            "description": "How a host's disk is lent to workspaces. A volume holds what it wrote, not its size: a host\n is charged, per volume, the larger of disk_reserve_percent of its size and what it wrote,\n and takes new ones up to 80% of its device; disk_commit_max_percent bounds the sizes\n summed - every volume filling at once. 50 and 200 are what an installation that says\n nothing lends; 100 and 100 lends nothing past what the device holds."
          },
          "diskCommitMaxPercent": {
            "type": "integer",
            "title": "disk_commit_max_percent",
            "format": "int32"
          },
          "workspaceIdleSuspendMinutes": {
            "type": "integer",
            "title": "workspace_idle_suspend_minutes",
            "format": "int32",
            "description": "How many minutes a running workspace may go unused - nobody working over its ssh, editor or\n forwarded ports, and its cores all but still - before it is suspended with its processes,\n which its next start resumes. 0 suspends none; 60 is what an installation that says nothing\n keeps, and a week is the most."
          },
          "workspaceMaxRunningMinutes": {
            "type": "integer",
            "title": "workspace_max_running_minutes",
            "format": "int32",
            "description": "How many minutes a workspace may run at a stretch, used or not, before it is suspended the\n same way: a process that keeps its cores busy is use to the rule above, and this is what\n ends it. Counted from its machine's start, which a resume is too. 0 caps none; 720 is what\n an installation that says nothing keeps, and a week is the most."
          },
          "workspaceLeaseMaxMinutes": {
            "type": "integer",
            "title": "workspace_lease_max_minutes",
            "format": "int32",
            "description": "How many minutes a process may keep its workspace awake at a stretch (a lease:\n `spin-supervisor keep -- \u003ccmd\u003e`, a .spin.yaml task with keep_awake). While a lease is held\n and within this of its start, nobody is asked, nothing idle is suspended, and the running\n cap waits for the lease's end. 0 honours no lease; 480 is what an installation that says\n nothing keeps, and a week is the most."
          },
          "teamSecretsRole": {
            "type": "string",
            "title": "team_secrets_role",
            "description": "The IAM role a team's secret kept in Secrets Manager or Parameter Store is read under, in a\n session tagged spin-team-id with the team: its policy lets that session read only what carries\n the same tag. Empty, no secret is kept as a reference."
          },
          "agentsFetch": {
            "type": "boolean",
            "title": "agents_fetch",
            "description": "Whether the control plane fetches the agent CLIs - Claude Code and Codex - from their\n publishers on its own: the newest release of each, looked for daily. False, it fetches none,\n and a workspace is given the pair the control plane's image carries or one an administrator\n published."
          }
        },
        "title": "InstallationSettings",
        "additionalProperties": false,
        "description": "InstallationSettings contains global settings for the Spin installation"
      },
      "spin.v1.Job": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name"
          },
          "intervalSeconds": {
            "type": "string",
            "title": "interval_seconds",
            "format": "int64",
            "description": "Zero for a job only run by hand, which has no next_run_at."
          },
          "running": {
            "type": "boolean",
            "title": "running"
          },
          "nextRunAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "next_run_at",
            "description": "When the schedule next starts it."
          },
          "lastRun": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.JobRun"
              }
            ],
            "title": "last_run",
            "description": "Unset until it has run on this installation."
          },
          "lastSucceededAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "last_succeeded_at"
          }
        },
        "title": "Job",
        "additionalProperties": false
      },
      "spin.v1.JobRun": {
        "type": "object",
        "properties": {
          "runId": {
            "type": "string",
            "title": "run_id"
          },
          "job": {
            "type": "string",
            "title": "job"
          },
          "startedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "started_at"
          },
          "finishedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "finished_at",
            "description": "Unset while it runs."
          },
          "outcome": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.JobRunOutcome"
              }
            ],
            "title": "outcome"
          },
          "counts": {
            "type": "object",
            "title": "counts",
            "additionalProperties": {
              "type": "string",
              "title": "value",
              "format": "int64"
            },
            "description": "What it did, by the job's own names for it: objects deleted, bytes freed, hosts forgotten."
          },
          "error": {
            "type": "string",
            "title": "error",
            "description": "Why it failed; empty when it did not."
          },
          "traceId": {
            "type": "string",
            "title": "trace_id",
            "description": "The run's trace, empty when it was not recorded."
          },
          "askedBy": {
            "type": "string",
            "title": "asked_by",
            "description": "The admin who ran it by hand; empty for a run the schedule started."
          }
        },
        "title": "JobRun",
        "additionalProperties": false
      },
      "spin.v1.JobRunOutcome": {
        "type": "string",
        "title": "JobRunOutcome",
        "enum": [
          "JOB_RUN_OUTCOME_UNSPECIFIED",
          "JOB_RUN_OUTCOME_RUNNING",
          "JOB_RUN_OUTCOME_SUCCEEDED",
          "JOB_RUN_OUTCOME_FAILED"
        ],
        "description": "How one run of a job ended, or that it has not."
      },
      "spin.v1.KeepWorkspaceRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "lasts": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Duration"
              }
            ],
            "title": "lasts",
            "description": "How long from now it is kept awake: a minute to a day."
          }
        },
        "title": "KeepWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.KeepWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "KeepWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.ListAPIKeysRequest": {
        "type": "object",
        "properties": {
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListAPIKeysRequest",
        "additionalProperties": false
      },
      "spin.v1.ListAPIKeysResponse": {
        "type": "object",
        "properties": {
          "apiKeys": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.APIKey"
            },
            "title": "api_keys"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListAPIKeysResponse",
        "additionalProperties": false
      },
      "spin.v1.ListAllowedEmailsRequest": {
        "type": "object",
        "properties": {
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListAllowedEmailsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListAllowedEmailsResponse": {
        "type": "object",
        "properties": {
          "entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.AllowedEmail"
            },
            "title": "entries"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListAllowedEmailsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListAuditLogRequest": {
        "type": "object",
        "properties": {
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          },
          "actorId": {
            "type": "string",
            "title": "actor_id",
            "description": "Each filter is optional and they are combined with AND; an empty request is the whole\n log, newest first."
          },
          "action": {
            "type": "string",
            "title": "action"
          },
          "resourceType": {
            "type": "string",
            "title": "resource_type"
          },
          "since": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "since",
            "description": "since bounds the listing at the older end; an audit log is read forward from an\n incident, and the whole of one is not what a page wants."
          }
        },
        "title": "ListAuditLogRequest",
        "additionalProperties": false
      },
      "spin.v1.ListAuditLogResponse": {
        "type": "object",
        "properties": {
          "entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.AuditEntry"
            },
            "title": "entries"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          },
          "actions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "actions",
            "description": "actions and resource_types are every value this installation can record, so a reader\n building a filter does not have to know them. They come from the code rather than from\n a DISTINCT over the log: the log is the one table that only grows, and a vocabulary\n that is empty until something happens is a filter that is empty when it matters."
          },
          "resourceTypes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "resource_types"
          },
          "totalCapped": {
            "type": "boolean",
            "title": "total_capped",
            "description": "total_capped says page.total_count is where counting stopped, not the count: the log is\n counted up to a bound, since counting all of it is reading all of it on every page."
          }
        },
        "title": "ListAuditLogResponse",
        "additionalProperties": false
      },
      "spin.v1.ListConfigChangesRequest": {
        "type": "object",
        "title": "ListConfigChangesRequest",
        "additionalProperties": false
      },
      "spin.v1.ListConfigChangesResponse": {
        "type": "object",
        "properties": {
          "changes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ConfigChange"
            },
            "title": "changes"
          }
        },
        "title": "ListConfigChangesResponse",
        "additionalProperties": false
      },
      "spin.v1.ListDeletedWorkspacesRequest": {
        "type": "object",
        "title": "ListDeletedWorkspacesRequest",
        "additionalProperties": false
      },
      "spin.v1.ListDeletedWorkspacesResponse": {
        "type": "object",
        "properties": {
          "workspaces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.DeletedWorkspace"
            },
            "title": "workspaces"
          }
        },
        "title": "ListDeletedWorkspacesResponse",
        "additionalProperties": false
      },
      "spin.v1.ListExposedPortsRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListExposedPortsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListExposedPortsResponse": {
        "type": "object",
        "properties": {
          "ports": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ExposedPort"
            },
            "title": "ports"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListExposedPortsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListHostsRequest": {
        "type": "object",
        "properties": {
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          },
          "stateFilter": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HostState"
              }
            ],
            "title": "state_filter"
          }
        },
        "title": "ListHostsRequest",
        "additionalProperties": false,
        "description": "Admin RPCs"
      },
      "spin.v1.ListHostsResponse": {
        "type": "object",
        "properties": {
          "hosts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Host"
            },
            "title": "hosts"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListHostsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListIdentityProvidersRequest": {
        "type": "object",
        "title": "ListIdentityProvidersRequest",
        "additionalProperties": false,
        "description": "Not paginated: the login page offers every enabled provider, a set an admin configures."
      },
      "spin.v1.ListIdentityProvidersResponse": {
        "type": "object",
        "properties": {
          "providers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.IdentityProvider"
            },
            "title": "providers"
          }
        },
        "title": "ListIdentityProvidersResponse",
        "additionalProperties": false
      },
      "spin.v1.ListImagesRequest": {
        "type": "object",
        "title": "ListImagesRequest",
        "additionalProperties": false
      },
      "spin.v1.ListImagesResponse": {
        "type": "object",
        "properties": {
          "images": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Image"
            },
            "title": "images",
            "description": "One entry per name, newest publication of it, in the order a person reads a list."
          }
        },
        "title": "ListImagesResponse",
        "additionalProperties": false
      },
      "spin.v1.ListJobRunsRequest": {
        "type": "object",
        "properties": {
          "job": {
            "type": "string",
            "title": "job"
          },
          "limit": {
            "type": "integer",
            "title": "limit",
            "format": "int32",
            "description": "At most this many, newest first; zero is the default of 50."
          }
        },
        "title": "ListJobRunsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListJobRunsResponse": {
        "type": "object",
        "properties": {
          "runs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.JobRun"
            },
            "title": "runs"
          }
        },
        "title": "ListJobRunsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListJobsRequest": {
        "type": "object",
        "title": "ListJobsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListJobsResponse": {
        "type": "object",
        "properties": {
          "jobs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Job"
            },
            "title": "jobs"
          }
        },
        "title": "ListJobsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListLogIndexesRequest": {
        "type": "object",
        "title": "ListLogIndexesRequest",
        "additionalProperties": false
      },
      "spin.v1.ListLogIndexesResponse": {
        "type": "object",
        "properties": {
          "indexes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.LogIndex"
            },
            "title": "indexes"
          }
        },
        "title": "ListLogIndexesResponse",
        "additionalProperties": false
      },
      "spin.v1.ListNetworkPoliciesRequest": {
        "type": "object",
        "title": "ListNetworkPoliciesRequest",
        "additionalProperties": false
      },
      "spin.v1.ListNetworkPoliciesResponse": {
        "type": "object",
        "properties": {
          "policies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.NetworkPolicy"
            },
            "title": "policies"
          },
          "hostsEnforcing": {
            "type": "integer",
            "title": "hosts_enforcing",
            "format": "int32",
            "description": "Of the hosts connected, how many have installed what the installation declares. They are\n told on their next heartbeat, so the two differ for a moment after an apply - and go on\n differing when a host cannot install what was declared, which is the thing worth seeing."
          },
          "hostsConnected": {
            "type": "integer",
            "title": "hosts_connected",
            "format": "int32"
          }
        },
        "title": "ListNetworkPoliciesResponse",
        "additionalProperties": false
      },
      "spin.v1.ListPendingSignaturesRequest": {
        "type": "object",
        "title": "ListPendingSignaturesRequest",
        "additionalProperties": false
      },
      "spin.v1.ListPendingSignaturesResponse": {
        "type": "object",
        "properties": {
          "pending": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.PendingSignature"
            },
            "title": "pending"
          }
        },
        "title": "ListPendingSignaturesResponse",
        "additionalProperties": false
      },
      "spin.v1.ListPrebuildsRequest": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string",
            "title": "project_id"
          }
        },
        "title": "ListPrebuildsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListPrebuildsResponse": {
        "type": "object",
        "properties": {
          "prebuilds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Prebuild"
            },
            "title": "prebuilds",
            "description": "Newest first."
          }
        },
        "title": "ListPrebuildsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListProjectsRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          }
        },
        "title": "ListProjectsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListProjectsResponse": {
        "type": "object",
        "properties": {
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Project"
            },
            "title": "projects"
          }
        },
        "title": "ListProjectsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListRegistrationTokensRequest": {
        "type": "object",
        "properties": {
          "includeUsed": {
            "type": "boolean",
            "title": "include_used"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListRegistrationTokensRequest",
        "additionalProperties": false,
        "description": "Admin: List registration tokens"
      },
      "spin.v1.ListRegistrationTokensResponse": {
        "type": "object",
        "properties": {
          "tokens": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.RegistrationToken"
            },
            "title": "tokens"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListRegistrationTokensResponse",
        "additionalProperties": false
      },
      "spin.v1.ListRekeysRequest": {
        "type": "object",
        "title": "ListRekeysRequest",
        "additionalProperties": false
      },
      "spin.v1.ListRekeysResponse": {
        "type": "object",
        "properties": {
          "rekeys": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.VolumeRekey"
            },
            "title": "rekeys"
          }
        },
        "title": "ListRekeysResponse",
        "additionalProperties": false
      },
      "spin.v1.ListResourcePresetsRequest": {
        "type": "object",
        "properties": {
          "includeDisabled": {
            "type": "boolean",
            "title": "include_disabled",
            "description": "Include disabled presets (admin only)"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListResourcePresetsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListResourcePresetsResponse": {
        "type": "object",
        "properties": {
          "presets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ResourcePreset"
            },
            "title": "presets"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListResourcePresetsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListSSHKeysRequest": {
        "type": "object",
        "properties": {
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListSSHKeysRequest",
        "additionalProperties": false,
        "description": "List user SSH keys"
      },
      "spin.v1.ListSSHKeysResponse": {
        "type": "object",
        "properties": {
          "sshKeys": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.SSHKey"
            },
            "title": "ssh_keys"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListSSHKeysResponse",
        "additionalProperties": false
      },
      "spin.v1.ListSharedSnapshotsRequest": {
        "type": "object",
        "properties": {
          "includePublic": {
            "type": "boolean",
            "title": "include_public",
            "description": "false: only what was shared with the caller"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListSharedSnapshotsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListSharedSnapshotsResponse": {
        "type": "object",
        "properties": {
          "snapshots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Snapshot"
            },
            "title": "snapshots",
            "description": "Uses Snapshot from workspace.proto"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListSharedSnapshotsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListSnapshotSharesRequest": {
        "type": "object",
        "properties": {
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListSnapshotSharesRequest",
        "additionalProperties": false
      },
      "spin.v1.ListSnapshotSharesResponse": {
        "type": "object",
        "properties": {
          "shares": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.SnapshotShare"
            },
            "title": "shares"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          },
          "outsideTeam": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.OutsideShareState"
              }
            ],
            "title": "outside_team",
            "description": "outside_team is the snapshot's share outside its team: what a clone by somebody of another\n team stands on, made when the snapshot is first shared outside the team or made public. A\n clone of it outside the team is refused until it is ready."
          }
        },
        "title": "ListSnapshotSharesResponse",
        "additionalProperties": false
      },
      "spin.v1.ListSnapshotsRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListSnapshotsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListSnapshotsResponse": {
        "type": "object",
        "properties": {
          "snapshots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Snapshot"
            },
            "title": "snapshots"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListSnapshotsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListTeamForgesRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          }
        },
        "title": "ListTeamForgesRequest",
        "additionalProperties": false
      },
      "spin.v1.ListTeamForgesResponse": {
        "type": "object",
        "properties": {
          "forges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.TeamForge"
            },
            "title": "forges"
          }
        },
        "title": "ListTeamForgesResponse",
        "additionalProperties": false
      },
      "spin.v1.ListTeamIdentityProvidersRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "Empty = system-wide providers"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListTeamIdentityProvidersRequest",
        "additionalProperties": false,
        "description": "Identity provider management"
      },
      "spin.v1.ListTeamIdentityProvidersResponse": {
        "type": "object",
        "properties": {
          "providers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.TeamIdentityProvider"
            },
            "title": "providers"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListTeamIdentityProvidersResponse",
        "additionalProperties": false
      },
      "spin.v1.ListTeamMembersRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListTeamMembersRequest",
        "additionalProperties": false,
        "description": "Member management"
      },
      "spin.v1.ListTeamMembersResponse": {
        "type": "object",
        "properties": {
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.TeamMember"
            },
            "title": "members"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListTeamMembersResponse",
        "additionalProperties": false
      },
      "spin.v1.ListTeamSecretsRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          }
        },
        "title": "ListTeamSecretsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListTeamSecretsResponse": {
        "type": "object",
        "properties": {
          "secrets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.TeamSecret"
            },
            "title": "secrets"
          }
        },
        "title": "ListTeamSecretsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListTeamsRequest": {
        "type": "object",
        "properties": {
          "parentId": {
            "type": "string",
            "title": "parent_id",
            "description": "Optional: filter by parent (empty = root teams only)"
          },
          "includeAllDescendants": {
            "type": "boolean",
            "title": "include_all_descendants",
            "description": "If true, include all nested teams"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          },
          "everyTeam": {
            "type": "boolean",
            "title": "every_team",
            "description": "every_team lists the whole installation rather than the caller's own teams - the\n administration view, and only an instance admin may ask for it. It is asked for rather\n than inferred from who is calling: an admin's own Teams page should be their teams, not\n a list of everybody's personal team that they cannot get out of."
          }
        },
        "title": "ListTeamsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListTeamsResponse": {
        "type": "object",
        "properties": {
          "teams": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Team"
            },
            "title": "teams"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListTeamsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListUserAPIKeysRequest": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "title": "user_id"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListUserAPIKeysRequest",
        "additionalProperties": false
      },
      "spin.v1.ListUserAPIKeysResponse": {
        "type": "object",
        "properties": {
          "apiKeys": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.APIKey"
            },
            "title": "api_keys"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListUserAPIKeysResponse",
        "additionalProperties": false
      },
      "spin.v1.ListUsersRequest": {
        "type": "object",
        "properties": {
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          },
          "query": {
            "type": "string",
            "title": "query",
            "description": "Optional: filter by name or email"
          },
          "adminsOnly": {
            "type": "boolean",
            "title": "admins_only",
            "description": "Optional: only return admin users"
          }
        },
        "title": "ListUsersRequest",
        "additionalProperties": false
      },
      "spin.v1.ListUsersResponse": {
        "type": "object",
        "properties": {
          "users": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.User"
            },
            "title": "users"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListUsersResponse",
        "additionalProperties": false
      },
      "spin.v1.ListWorkspaceQuarantineDenialsRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id",
            "description": "The workspace's id."
          },
          "limit": {
            "type": "integer",
            "title": "limit",
            "format": "int32",
            "description": "How many of the newest to answer; the newest first."
          }
        },
        "title": "ListWorkspaceQuarantineDenialsRequest",
        "additionalProperties": false
      },
      "spin.v1.ListWorkspaceQuarantineDenialsResponse": {
        "type": "object",
        "properties": {
          "denials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.QuarantineDenial"
            },
            "title": "denials",
            "description": "Newest first."
          }
        },
        "title": "ListWorkspaceQuarantineDenialsResponse",
        "additionalProperties": false
      },
      "spin.v1.ListWorkspacesRequest": {
        "type": "object",
        "properties": {
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageRequest"
              }
            ],
            "title": "page"
          },
          "stateFilter": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceState"
              }
            ],
            "title": "state_filter",
            "description": "Optional filter by state"
          },
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "Optional filter by team (empty = all user's workspaces)"
          },
          "nameFilter": {
            "type": "string",
            "title": "name_filter",
            "description": "Optional search by name prefix"
          }
        },
        "title": "ListWorkspacesRequest",
        "additionalProperties": false
      },
      "spin.v1.ListWorkspacesResponse": {
        "type": "object",
        "properties": {
          "workspaces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Workspace"
            },
            "title": "workspaces"
          },
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PageResponse"
              }
            ],
            "title": "page"
          }
        },
        "title": "ListWorkspacesResponse",
        "additionalProperties": false
      },
      "spin.v1.LogIndex": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "retention": {
            "type": "string",
            "title": "retention",
            "description": "How long it keeps what it holds, in the store's words (\"30 days\"); empty for forever."
          },
          "timestampField": {
            "type": "string",
            "title": "timestamp_field",
            "description": "The field its records are dated by: what a search's window is over."
          },
          "defaultSearchFields": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "default_search_fields",
            "description": "What a query's bare words are searched in."
          },
          "fields": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.LogIndexField"
            },
            "title": "fields"
          },
          "documents": {
            "type": "string",
            "title": "documents",
            "format": "int64",
            "description": "What it holds: records, the splits they are kept in, and the splits' size in the bucket\n and the records' before compression."
          },
          "splits": {
            "type": "string",
            "title": "splits",
            "format": "int64"
          },
          "sizeBytes": {
            "type": "string",
            "title": "size_bytes",
            "format": "int64"
          },
          "uncompressedBytes": {
            "type": "string",
            "title": "uncompressed_bytes",
            "format": "int64"
          },
          "oldest": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "oldest",
            "description": "When its oldest and newest records are dated; unset while it holds none."
          },
          "newest": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "newest"
          }
        },
        "title": "LogIndex",
        "additionalProperties": false,
        "description": "LogIndex is one index of the store."
      },
      "spin.v1.LogIndexField": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name",
            "description": "A dotted path for a field inside an object field."
          },
          "type": {
            "type": "string",
            "title": "type",
            "description": "The store's type: text, json, u64, bool, bytes, datetime, array\u003ctext\u003e..."
          },
          "tokenizer": {
            "type": "string",
            "title": "tokenizer",
            "description": "How a text or JSON field is split into what a query matches: \"raw\" is the whole value as\n written, \"default\" is its words, lowercased. Empty for any other type."
          },
          "indexed": {
            "type": "boolean",
            "title": "indexed",
            "description": "Whether a query can match it, and whether it can be counted and ranged over fast."
          },
          "fast": {
            "type": "boolean",
            "title": "fast"
          }
        },
        "title": "LogIndexField",
        "additionalProperties": false,
        "description": "LogIndexField is one field of an index's mapping."
      },
      "spin.v1.LogInterval": {
        "type": "object",
        "properties": {
          "start": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "start"
          },
          "bySeverity": {
            "type": "object",
            "title": "by_severity",
            "additionalProperties": {
              "type": "string",
              "title": "value",
              "format": "int64"
            }
          }
        },
        "title": "LogInterval",
        "additionalProperties": false,
        "description": "LogInterval is how many records one interval holds, by severity."
      },
      "spin.v1.LogRecord": {
        "type": "object",
        "properties": {
          "time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "time"
          },
          "severity": {
            "type": "string",
            "title": "severity"
          },
          "service": {
            "type": "string",
            "title": "service",
            "description": "The process that wrote it: controlplane, runner, proxy."
          },
          "body": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Value"
              }
            ],
            "title": "body",
            "description": "What was logged: its message, or the structure it logged."
          },
          "attributes": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Struct"
              }
            ],
            "title": "attributes"
          },
          "resourceAttributes": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Struct"
              }
            ],
            "title": "resource_attributes"
          },
          "traceId": {
            "type": "string",
            "title": "trace_id",
            "description": "The trace it was written in, hex; empty for none."
          },
          "spanId": {
            "type": "string",
            "title": "span_id"
          }
        },
        "title": "LogRecord",
        "additionalProperties": false,
        "description": "LogRecord is one record as OpenTelemetry names its parts."
      },
      "spin.v1.LogoutRequest": {
        "type": "object",
        "title": "LogoutRequest",
        "additionalProperties": false
      },
      "spin.v1.LogoutResponse": {
        "type": "object",
        "title": "LogoutResponse",
        "additionalProperties": false
      },
      "spin.v1.MoveWorkspaceRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          }
        },
        "title": "MoveWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.MoveWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "MoveWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.NetworkPolicy": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name"
          },
          "hosts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.HostNetworkPolicy"
            },
            "title": "hosts",
            "description": "What each host reporting this tag says it enforces."
          },
          "declared": {
            "type": "boolean",
            "title": "declared",
            "description": "declared says the installation has this policy, and rules are what it allows. A policy with\n no hosts is declared and not yet enforced anywhere."
          },
          "rules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.NetworkRule"
            },
            "title": "rules"
          },
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "The team whose admins declared it, which only its workspaces and those of the teams below\n it may run under; empty is the installation's."
          }
        },
        "title": "NetworkPolicy",
        "additionalProperties": false,
        "description": "NetworkPolicy is a tag a workspace can be created with, and what the hosts reporting it say\n it allows. The hosts are the authority: this is what they last said they enforce."
      },
      "spin.v1.NetworkPolicyRule": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name"
          },
          "rules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.NetworkRule"
            },
            "title": "rules"
          }
        },
        "title": "NetworkPolicyRule",
        "additionalProperties": false,
        "description": "NetworkPolicyRule is a policy as an administrator writes it, in the words the config file\n takes: a name, which is a tag - letters, digits, - and _, up to 32 - and the rules it allows,\n each these destinations on these ports. A policy with no rules allows nothing."
      },
      "spin.v1.NetworkRule": {
        "type": "object",
        "properties": {
          "allow": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "allow",
            "description": "IPv4 prefixes in CIDR."
          },
          "allowNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "allow_names",
            "description": "Names, exact or with a leading \"*.\": the host opens the address its own resolver answers a\n machine with, for as long as the answer lives."
          },
          "ports": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "ports",
            "description": "Destination ports as \"443\" (TCP, which is what a bare number means), \"443/udp\", a range as\n \"8000-8100\" or \"8000-8100/udp\", or \"icmp\" for a ping. None is every port, at the\n destinations above; none of those is every destination, on these ports."
          },
          "broker": {
            "type": "boolean",
            "title": "broker",
            "description": "The host's egress proxy stands in for these names, on HTTPS only: a machine reaches them\n through it and never directly, and it adds what the machine never holds. Names only."
          },
          "inject": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.HeaderInjection"
            },
            "title": "inject",
            "description": "Headers the proxy sets on a brokered rule's requests, each from a secret of the workspace's\n team (or the nearest team above it with one by that name). Brokered rules only."
          },
          "cloud": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.CloudAccess"
              }
            ],
            "title": "cloud",
            "description": "The principal the proxy authorizes a brokered rule's requests as, on its cloud: the host takes\n its credentials as the workspace, with a token of its identity. Brokered rules naming that\n cloud's endpoints only, and not with inject."
          },
          "verifySni": {
            "type": "boolean",
            "title": "verify_sni",
            "description": "The host's egress proxy reads the TLS server name of each connection to these names and passes\n on, untouched, only one this rule names: an address shared with other names opens only these\n to a client that says which it wants. A connection with no name, or one hiding it (ECH), goes\n nowhere. Names only, on TCP, never with broker; it does not stop a client that lies."
          },
          "principal": {
            "type": "string",
            "title": "principal",
            "description": "Whose connections a brokered rule stands in for: \"agent\" (the workspace's agent, whose packets\n its guest marks), \"user\" (everything else the workspace sends), or \"any\" (empty: both). Two\n rules for one name, one per principal, each with its own injections and methods, say what the\n person may do and what the agent may. Brokered rules only: an agent reaches nothing outside\n the proxy, so a rule that is not brokered is the person's already."
          }
        },
        "title": "NetworkRule",
        "additionalProperties": false,
        "description": "NetworkRule is one thing a network policy allows: these destinations on these ports. Within a\n rule the two intersect - every destination on every port - and a policy is the union of its\n rules, so \"53/udp to one resolver and 443 to github.com\" is two rules and not a product of\n both. Here and not beside a policy for the reason HealthReport is: the control plane's policy,\n the one a host reports it enforces and the one a host is given are one vocabulary."
      },
      "spin.v1.ObservedDestination": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "title": "address"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "packets": {
            "type": "string",
            "title": "packets",
            "format": "int64",
            "description": "What the workspace sent there, every packet of every flow."
          },
          "bytes": {
            "type": "string",
            "title": "bytes",
            "format": "int64"
          },
          "protocol": {
            "type": "string",
            "title": "protocol",
            "description": "\"tcp\", \"udp\", \"icmp\", or the protocol's number."
          },
          "port": {
            "type": "integer",
            "title": "port",
            "description": "For tcp and udp; zero otherwise."
          },
          "packetsReceived": {
            "type": "string",
            "title": "packets_received",
            "format": "int64",
            "description": "What came back to the workspace from there."
          },
          "bytesReceived": {
            "type": "string",
            "title": "bytes_received",
            "format": "int64"
          }
        },
        "title": "ObservedDestination",
        "additionalProperties": false,
        "description": "ObservedDestination is one address the workspace was allowed to reach, with what the host's\n ruleset counted and the name its resolver answered with that address, where it holds one."
      },
      "spin.v1.OpenWorkspaceProxySessionRequest": {
        "type": "object",
        "properties": {
          "workspaceName": {
            "type": "string",
            "title": "workspace_name",
            "description": "From the subdomain, as CheckPortAccess takes it"
          },
          "port": {
            "type": "integer",
            "title": "port",
            "format": "int32",
            "description": "The published port inside the workspace"
          },
          "sessionToken": {
            "type": "string",
            "title": "session_token",
            "description": "The session token of whoever the connection is being opened for, validated here.\n\n It is the difference between a control plane that can refuse and one that cannot. The\n proxy gates each request in front, but this is reachable on its own, and without a\n credential to check, anything that could reach it would open a session into any\n published port of any workspace. Empty is allowed and reaches only PUBLIC ports."
          },
          "httpsBackend": {
            "type": "boolean",
            "title": "https_backend",
            "description": "The hostname's s. A port whose flag differs answers as one that is not exposed."
          },
          "workspaceId": {
            "type": "string",
            "title": "workspace_id",
            "description": "The workspace CheckPortAccess decided the request about. A name that now names another\n answers as a port that is not exposed: the session is for the workspace that was decided."
          }
        },
        "title": "OpenWorkspaceProxySessionRequest",
        "additionalProperties": false,
        "description": "Opening one connection into a published port, for the proxy.\n\n Separate from CheckPortAccess, which the proxy calls on every request to decide whether the\n browser may reach the port. This one is called only when a new connection is actually\n needed - http.Transport pools them, so a page of fifty assets opens a handful - and each\n call costs a command to the workspace's runner.\n\n The authorization is the same question CheckPortAccess answers and is asked again here\n rather than carried over: a session is a way into somebody's workspace, and the decision to\n open one belongs beside the opening."
      },
      "spin.v1.OpenWorkspaceProxySessionResponse": {
        "type": "object",
        "properties": {
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceProxyStatus"
              }
            ],
            "title": "status"
          },
          "relayUrl": {
            "type": "string",
            "title": "relay_url",
            "description": "Where the two ends of this connection meet, and the token that names it there. Set only\n when status is ACCESSIBLE. The token is single-use: one connection, one token."
          },
          "sessionToken": {
            "type": "string",
            "title": "session_token"
          },
          "httpsBackend": {
            "type": "boolean",
            "title": "https_backend",
            "description": "The flag of the row the session was authorized on: whether the proxy speaks TLS."
          }
        },
        "title": "OpenWorkspaceProxySessionResponse",
        "additionalProperties": false
      },
      "spin.v1.OutsideShareState": {
        "type": "string",
        "title": "OutsideShareState",
        "enum": [
          "OUTSIDE_SHARE_STATE_UNSPECIFIED",
          "OUTSIDE_SHARE_STATE_PREPARING",
          "OUTSIDE_SHARE_STATE_READY"
        ],
        "description": "OutsideShareState is how far a snapshot's share outside its team is."
      },
      "spin.v1.OwnerWord": {
        "type": "object",
        "properties": {
          "document": {
            "type": "string",
            "title": "document",
            "format": "byte"
          },
          "signature": {
            "type": "string",
            "title": "signature",
            "format": "byte"
          }
        },
        "title": "OwnerWord",
        "additionalProperties": false,
        "description": "OwnerWord is a workspace's access, as its owner signed it with a key of their keyring\n (internal/ownerword): document is the access as framed JSON, signature the key's SSH signature\n over it (sshsig, namespace \"spin-access\") - what `ssh-keygen -Y sign` writes, so a FIDO2 key\n signs one through ssh-agent."
      },
      "spin.v1.PageRequest": {
        "type": "object",
        "properties": {
          "pageSize": {
            "type": "integer",
            "title": "page_size",
            "format": "int32"
          },
          "pageToken": {
            "type": "string",
            "title": "page_token"
          }
        },
        "title": "PageRequest",
        "additionalProperties": false,
        "description": "Pagination for list requests"
      },
      "spin.v1.PageResponse": {
        "type": "object",
        "properties": {
          "nextPageToken": {
            "type": "string",
            "title": "next_page_token"
          },
          "totalCount": {
            "type": "integer",
            "title": "total_count",
            "format": "int32"
          }
        },
        "title": "PageResponse",
        "additionalProperties": false
      },
      "spin.v1.PasswordLoginRequest": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "title": "email"
          },
          "password": {
            "type": "string",
            "title": "password"
          }
        },
        "title": "PasswordLoginRequest",
        "additionalProperties": false
      },
      "spin.v1.PasswordLoginResponse": {
        "type": "object",
        "properties": {
          "user": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.User"
              }
            ],
            "title": "user"
          },
          "sessionToken": {
            "type": "string",
            "title": "session_token"
          },
          "expiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "expires_at"
          },
          "forcePasswordChange": {
            "type": "boolean",
            "title": "force_password_change",
            "description": "True if user must change password before proceeding"
          }
        },
        "title": "PasswordLoginResponse",
        "additionalProperties": false
      },
      "spin.v1.PendingSignature": {
        "type": "object",
        "properties": {
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SignatureKind"
              }
            ],
            "title": "kind"
          },
          "subjectId": {
            "type": "string",
            "title": "subject_id",
            "description": "subject_id is the user, the team or the workspace the document is of."
          },
          "document": {
            "type": "string",
            "title": "document",
            "format": "byte",
            "description": "document is the document to sign, as framed JSON: what the client shows and signs as it is."
          },
          "signers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "signers",
            "description": "signers are the keys, in authorized_keys form, any one of which may sign it."
          },
          "summary": {
            "type": "string",
            "title": "summary",
            "description": "summary is a line saying what it changes, for a list: the document itself is what to read."
          }
        },
        "title": "PendingSignature",
        "additionalProperties": false,
        "description": "PendingSignature is one document the caller is asked to sign."
      },
      "spin.v1.PlatformImage": {
        "type": "object",
        "properties": {
          "artifact": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PlatformImageArtifact"
              }
            ],
            "title": "artifact"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PlatformImageState"
              }
            ],
            "title": "state"
          },
          "detail": {
            "type": "string",
            "title": "detail",
            "description": "Why it failed, or why it is left alone."
          },
          "version": {
            "type": "string",
            "title": "version",
            "description": "The machine's release, or the supervisor's (the control plane's) version."
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          }
        },
        "title": "PlatformImage",
        "additionalProperties": false
      },
      "spin.v1.PlatformImageArtifact": {
        "type": "string",
        "title": "PlatformImageArtifact",
        "enum": [
          "PLATFORM_IMAGE_ARTIFACT_UNSPECIFIED",
          "PLATFORM_IMAGE_ARTIFACT_BASE",
          "PLATFORM_IMAGE_ARTIFACT_SUPERVISOR"
        ]
      },
      "spin.v1.PlatformImageState": {
        "type": "string",
        "title": "PlatformImageState",
        "enum": [
          "PLATFORM_IMAGE_STATE_UNSPECIFIED",
          "PLATFORM_IMAGE_STATE_PENDING",
          "PLATFORM_IMAGE_STATE_PUBLISHED",
          "PLATFORM_IMAGE_STATE_PUBLISHING",
          "PLATFORM_IMAGE_STATE_FAILED",
          "PLATFORM_IMAGE_STATE_UNAVAILABLE",
          "PLATFORM_IMAGE_STATE_FOREIGN"
        ]
      },
      "spin.v1.PlatformLogFieldValuesRequest": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "title": "field"
          },
          "query": {
            "type": "string",
            "title": "query"
          },
          "from": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "from"
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "to"
          },
          "limit": {
            "type": "integer",
            "title": "limit",
            "format": "int32",
            "description": "How many values, the commonest first: 1 to 100, 10 when unset."
          }
        },
        "title": "PlatformLogFieldValuesRequest",
        "additionalProperties": false
      },
      "spin.v1.PlatformLogFieldValuesResponse": {
        "type": "object",
        "properties": {
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.FieldValue"
            },
            "title": "values"
          },
          "other": {
            "type": "string",
            "title": "other",
            "format": "int64",
            "description": "How many records the search found with a value not among these."
          }
        },
        "title": "PlatformLogFieldValuesResponse",
        "additionalProperties": false
      },
      "spin.v1.PortAccess": {
        "type": "string",
        "title": "PortAccess",
        "enum": [
          "PORT_ACCESS_UNSPECIFIED",
          "PORT_ACCESS_PRIVATE",
          "PORT_ACCESS_WHITELIST",
          "PORT_ACCESS_PUBLIC"
        ],
        "description": "Who may reach a published port.\n\n Per port rather than per workspace: one workspace serves a demo anyone may see and an\n admin panel only its owner may, and a single setting for both makes the safe answer for\n one the wrong answer for the other.\n\n UNSPECIFIED is not a level and is never stored - the column's CHECK excludes it. A\n request that leaves it at proto3's zero is treated as PRIVATE, which is the direction to\n be wrong in: the cost of failing closed is a confusing error, and the cost of failing\n open is a port somebody published without meaning to."
      },
      "spin.v1.PortGrant": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "title": "user_id"
          },
          "email": {
            "type": "string",
            "title": "email",
            "description": "Output only, so a list is readable without a second lookup"
          },
          "grantedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "granted_at"
          }
        },
        "title": "PortGrant",
        "additionalProperties": false,
        "description": "One user a whitelisted port is shared with."
      },
      "spin.v1.Prebuild": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "projectId": {
            "type": "string",
            "title": "project_id"
          },
          "ref": {
            "type": "string",
            "title": "ref"
          },
          "commit": {
            "type": "string",
            "title": "commit"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PrebuildState"
              }
            ],
            "title": "state"
          },
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id"
          },
          "parentId": {
            "type": "string",
            "title": "parent_id",
            "description": "The prebuild it was built on, and how many builds it is from the image (0: built from it)."
          },
          "depth": {
            "type": "integer",
            "title": "depth",
            "format": "int32"
          },
          "image": {
            "type": "string",
            "title": "image"
          },
          "settingsDigest": {
            "type": "string",
            "title": "settings_digest",
            "description": "The SHA-256 of the settings its word approved, and of the checkout's .spin.yaml at the commit."
          },
          "claim": {
            "type": "string",
            "title": "claim",
            "format": "byte",
            "description": "What its host signed of it (PrebuildClaim), once it is ready."
          },
          "log": {
            "type": "string",
            "title": "log",
            "description": "The tail of what its build said, and why it failed."
          },
          "error": {
            "type": "string",
            "title": "error"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "builtAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "built_at"
          }
        },
        "title": "Prebuild",
        "additionalProperties": false,
        "description": "A prebuild: one build of a project's ref at a commit, and the snapshot it left."
      },
      "spin.v1.PrebuildState": {
        "type": "string",
        "title": "PrebuildState",
        "enum": [
          "PREBUILD_STATE_UNSPECIFIED",
          "PREBUILD_STATE_BUILDING",
          "PREBUILD_STATE_READY",
          "PREBUILD_STATE_FAILED",
          "PREBUILD_STATE_RETIRED"
        ]
      },
      "spin.v1.PreemptionSource": {
        "type": "string",
        "title": "PreemptionSource",
        "enum": [
          "PREEMPTION_SOURCE_UNSPECIFIED",
          "PREEMPTION_SOURCE_AWS",
          "PREEMPTION_SOURCE_GCP",
          "PREEMPTION_SOURCE_AZURE"
        ],
        "description": "PreemptionSource mirrors spin.agent.v1.PreemptionSource, which is what reaches the host."
      },
      "spin.v1.Project": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "slug": {
            "type": "string",
            "title": "slug",
            "description": "What a person names it by in the team: teams.slug's shape"
          },
          "description": {
            "type": "string",
            "title": "description"
          },
          "repository": {
            "type": "string",
            "title": "repository",
            "description": "An https URL, with nothing of a credential in it"
          },
          "ref": {
            "type": "string",
            "title": "ref",
            "description": "The branch or tag a workspace opens at unless the open names one"
          },
          "image": {
            "type": "string",
            "title": "image",
            "description": "As CreateWorkspaceRequest.image; empty is the installation's default when opened"
          },
          "preset": {
            "type": "string",
            "title": "preset",
            "description": "As CreateWorkspaceRequest.preset; empty likewise"
          },
          "networkTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "network_tags"
          },
          "workspaceCount": {
            "type": "integer",
            "title": "workspace_count",
            "format": "int32",
            "description": "Workspaces open on it, the trash included"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          },
          "prebuildRefs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "prebuild_refs",
            "description": "The refs it prebuilds (spin#480 §3): none is none. Each is built as it moves, and opening the\n project at one clones its newest ready prebuild."
          },
          "prebuildRebaseEvery": {
            "type": "integer",
            "title": "prebuild_rebase_every",
            "format": "int32",
            "description": "Every how many prebuilds of a ref one is built from the image again, rather than on the one\n before: a clone is a layer deeper than what it is cloned from."
          },
          "prebuildOwnerId": {
            "type": "string",
            "title": "prebuild_owner_id",
            "description": "Who the builds run as, for what they use: the admin who last named the refs."
          }
        },
        "title": "Project",
        "additionalProperties": false,
        "description": "A project: a repository and the shape of the workspace that opens it."
      },
      "spin.v1.PublishVSCodeServersRequest": {
        "type": "object",
        "properties": {
          "newest": {
            "type": "integer",
            "title": "newest",
            "format": "int32",
            "description": "The newest stable releases to carry: 2 is the current one and the one before it."
          },
          "commits": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "commits",
            "description": "Commits to carry besides, each the second line of `code --version`."
          }
        },
        "title": "PublishVSCodeServersRequest",
        "additionalProperties": false
      },
      "spin.v1.PublishVSCodeServersResponse": {
        "type": "object",
        "title": "PublishVSCodeServersResponse",
        "additionalProperties": false
      },
      "spin.v1.QuarantineDenial": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "title": "target",
            "description": "Where the attempt went: the destination, as the supervisor saw it (host and port)."
          },
          "details": {
            "type": "object",
            "title": "details",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            },
            "description": "What the supervisor held of it, in its own words: which user in the guest, which process,\n why the policy refused."
          },
          "at": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "at",
            "description": "When the attempt was made, as the guest clock held it."
          }
        },
        "title": "QuarantineDenial",
        "additionalProperties": false
      },
      "spin.v1.QuarantineWorkspaceRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id",
            "description": "The workspace's id."
          },
          "reason": {
            "type": "string",
            "title": "reason",
            "description": "What the administrator saw that led to holding it: kept on the audit entry for this act,\n not on the row."
          }
        },
        "title": "QuarantineWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.QuarantineWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "QuarantineWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.RateLimitSettings": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean",
            "title": "enabled",
            "description": "Enable rate limiting"
          },
          "authRequestsPerMinute": {
            "type": "integer",
            "title": "auth_requests_per_minute",
            "format": "int32",
            "description": "Auth endpoints (login, token exchange, etc.) Requests per minute for auth endpoints"
          },
          "authBurst": {
            "type": "integer",
            "title": "auth_burst",
            "format": "int32",
            "description": "Burst allowance for auth endpoints"
          },
          "apiRequestsPerMinute": {
            "type": "integer",
            "title": "api_requests_per_minute",
            "format": "int32",
            "description": "API endpoints (all other endpoints) Requests per minute for API endpoints"
          },
          "apiBurst": {
            "type": "integer",
            "title": "api_burst",
            "format": "int32",
            "description": "Burst allowance for API endpoints"
          }
        },
        "title": "RateLimitSettings",
        "additionalProperties": false,
        "description": "RateLimitSettings configures API rate limiting"
      },
      "spin.v1.RecoverWorkspaceRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "acceptDataLoss": {
            "type": "boolean",
            "title": "accept_data_loss",
            "description": "False asks what it would cost. True accepts that cost and does it."
          }
        },
        "title": "RecoverWorkspaceRequest",
        "additionalProperties": false,
        "description": "Recovering a workspace whose host is gone.\n\n StartWorkspace requires the host the workspace was placed on and refuses while it is not\n connected, so a workspace on a host that died cannot be started again - there is no\n amount of waiting or retrying that fixes it. Recovering re-homes it: the volume is taken\n from the dead host and placed on a live one, and the workspace becomes startable.\n\n The cost is everything the dead host had written and not yet published, and that cost is\n the owner's to accept rather than an operator's to impose - which is why this is an RPC\n of theirs. Called without accept_data_loss it reports the cost and changes nothing; the\n same call with it does the work.\n\n It is not automatic. A host wrongly believed dead, recovered from, is two machines\n writing one disk - which is the failure the whole lease exists to prevent. The safety is\n not in the confirmation, though: taking the volume goes through the same check an\n operator's -detach-volume does, and is refused unless the old host has been *observed* to\n have stopped. The confirmation is about the data, not about the fencing."
      },
      "spin.v1.RecoverWorkspaceResponse": {
        "type": "object",
        "properties": {
          "recovered": {
            "type": "boolean",
            "title": "recovered",
            "description": "False for a cost report, true when the workspace was re-homed."
          },
          "unpublishedSeconds": {
            "type": "string",
            "title": "unpublished_seconds",
            "format": "int64",
            "description": "What recovering costs: the work the dead host had not published, as of its last\n report, plus the time since - a host that has been silent for an hour has been writing\n for that hour too, and reporting only what it last said would understate it."
          },
          "unpublishedBytes": {
            "type": "string",
            "title": "unpublished_bytes",
            "format": "int64"
          },
          "hostLastReportedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "host_last_reported_at",
            "description": "When that report was made. The two numbers above are only as fresh as this."
          },
          "newHostId": {
            "type": "string",
            "title": "new_host_id",
            "description": "The host it now runs on. Set only when recovered."
          }
        },
        "title": "RecoverWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.RefusedDestination": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "title": "address"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "protocol": {
            "type": "string",
            "title": "protocol",
            "description": "\"tcp\", \"udp\", \"icmp\", or the protocol's number."
          },
          "port": {
            "type": "integer",
            "title": "port",
            "description": "For tcp and udp; zero otherwise."
          },
          "packets": {
            "type": "string",
            "title": "packets",
            "format": "int64"
          }
        },
        "title": "RefusedDestination",
        "additionalProperties": false
      },
      "spin.v1.RegistrationMode": {
        "type": "string",
        "title": "RegistrationMode",
        "enum": [
          "REGISTRATION_MODE_UNSPECIFIED",
          "REGISTRATION_MODE_OPEN",
          "REGISTRATION_MODE_WHITELIST",
          "REGISTRATION_MODE_CLOSED"
        ],
        "description": "Registration mode enum"
      },
      "spin.v1.RegistrationToken": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "tokenPrefix": {
            "type": "string",
            "title": "token_prefix",
            "description": "First 8 chars for identification"
          },
          "description": {
            "type": "string",
            "title": "description",
            "description": "Human-readable description"
          },
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "Optional: team scope for registered host"
          },
          "expiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "expires_at"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "createdBy": {
            "type": "string",
            "title": "created_by"
          },
          "used": {
            "type": "boolean",
            "title": "used"
          },
          "usedByHostId": {
            "type": "string",
            "title": "used_by_host_id",
            "description": "Host ID that used this token; a reusable token's last one"
          },
          "reusable": {
            "type": "boolean",
            "title": "reusable",
            "description": "A pool's token: it registers every host that presents it until it expires or is revoked."
          },
          "hostPolicy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HostPolicy"
              }
            ],
            "title": "host_policy",
            "description": "What every host it registers is told (HostPolicy without its host_id); unset tells them\n nothing, and they keep their own defaults until an operator says otherwise."
          }
        },
        "title": "RegistrationToken",
        "additionalProperties": false
      },
      "spin.v1.RekeyState": {
        "type": "string",
        "title": "RekeyState",
        "enum": [
          "REKEY_STATE_UNSPECIFIED",
          "REKEY_STATE_PENDING",
          "REKEY_STATE_COPYING",
          "REKEY_STATE_READY"
        ],
        "description": "RekeyState is how far a disk's re-key is."
      },
      "spin.v1.RekeyVolumeRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          }
        },
        "title": "RekeyVolumeRequest",
        "additionalProperties": false
      },
      "spin.v1.RekeyVolumeResponse": {
        "type": "object",
        "properties": {
          "targetVolumeId": {
            "type": "string",
            "title": "target_volume_id"
          }
        },
        "title": "RekeyVolumeResponse",
        "additionalProperties": false,
        "description": "The volume the disk is being copied into; the workspace is pointed at it once the copy is\n published."
      },
      "spin.v1.ReleaseWorkspaceQuarantineRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id",
            "description": "The workspace's id."
          }
        },
        "title": "ReleaseWorkspaceQuarantineRequest",
        "additionalProperties": false
      },
      "spin.v1.ReleaseWorkspaceQuarantineResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "ReleaseWorkspaceQuarantineResponse",
        "additionalProperties": false
      },
      "spin.v1.ReleaseWorkspaceResourcesRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          }
        },
        "title": "ReleaseWorkspaceResourcesRequest",
        "additionalProperties": false
      },
      "spin.v1.ReleaseWorkspaceResourcesResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "ReleaseWorkspaceResourcesResponse",
        "additionalProperties": false
      },
      "spin.v1.RemoveAllowedEmailRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "RemoveAllowedEmailRequest",
        "additionalProperties": false
      },
      "spin.v1.RemoveAllowedEmailResponse": {
        "type": "object",
        "title": "RemoveAllowedEmailResponse",
        "additionalProperties": false
      },
      "spin.v1.RemoveStoredVolumeRequest": {
        "type": "object",
        "properties": {
          "volumeId": {
            "type": "string",
            "title": "volume_id"
          }
        },
        "title": "RemoveStoredVolumeRequest",
        "additionalProperties": false
      },
      "spin.v1.RemoveStoredVolumeResponse": {
        "type": "object",
        "title": "RemoveStoredVolumeResponse",
        "additionalProperties": false,
        "description": "The volume's key went with it: a key no other volume holds, so its layers open for nobody."
      },
      "spin.v1.RemoveTeamMemberRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "userId": {
            "type": "string",
            "title": "user_id"
          }
        },
        "title": "RemoveTeamMemberRequest",
        "additionalProperties": false
      },
      "spin.v1.RemoveTeamMemberResponse": {
        "type": "object",
        "title": "RemoveTeamMemberResponse",
        "additionalProperties": false
      },
      "spin.v1.RemoveWorkspaceGuestRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "userId": {
            "type": "string",
            "title": "user_id"
          }
        },
        "title": "RemoveWorkspaceGuestRequest",
        "additionalProperties": false
      },
      "spin.v1.RemoveWorkspaceGuestResponse": {
        "type": "object",
        "title": "RemoveWorkspaceGuestResponse",
        "additionalProperties": false
      },
      "spin.v1.RepositoryConfig": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "title": "url"
          },
          "ref": {
            "type": "string",
            "title": "ref"
          },
          "path": {
            "type": "string",
            "title": "path"
          },
          "authorName": {
            "type": "string",
            "title": "author_name",
            "description": "Who the checkout's commits are by: the workspace's owner's name and email as the installation\n knows them, set as the checkout's own user.name and user.email - the push goes as the team's\n app, and the commit says the person. Empty is neither set."
          },
          "authorEmail": {
            "type": "string",
            "title": "author_email"
          },
          "commit": {
            "type": "string",
            "title": "commit",
            "description": "commit is the one a prebuild's build checks out and runs create at; empty for a workspace a\n person opens, which follows the ref."
          },
          "fromCommit": {
            "type": "string",
            "title": "from_commit",
            "description": "from_commit is the commit the disk's checkout already is, for a disk cloned from a prebuild:\n the guest holds the tree to it (git fsck, no tracked file changed) before it fetches."
          },
          "prebuildId": {
            "type": "string",
            "title": "prebuild_id",
            "description": "The prebuild the disk is a clone of, and the SHA-256 of the claim its host signed of it\n (PrebuildClaim): what the owner approves when the open was from one."
          },
          "prebuildClaimDigest": {
            "type": "string",
            "title": "prebuild_claim_digest"
          },
          "pullRef": {
            "type": "string",
            "title": "pull_ref",
            "description": "pull_ref is a pull request's ref as its forge serves it (refs/pull/\u003cn\u003e/head, GitLab's\n refs/merge-requests/\u003cn\u003e/head), fetched once ref is cloned and checked out as pr-\u003cn\u003e or mr-\u003cn\u003e;\n empty for a workspace that opens at ref itself."
          }
        },
        "title": "RepositoryConfig",
        "additionalProperties": false,
        "description": "The repository a workspace opened, as its guest clones it: the project's URL, the ref the\n workspace was opened at, and where on the disk it goes (projects.CheckoutPath). Part of the\n settings the owner approves, as the environment is: a disk is written to only as its owner said."
      },
      "spin.v1.ResolverLookup": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name"
          },
          "outcome": {
            "type": "string",
            "title": "outcome",
            "description": "filtered, refused, upstream_failed or malformed."
          },
          "at": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "at"
          }
        },
        "title": "ResolverLookup",
        "additionalProperties": false
      },
      "spin.v1.ResourcePreset": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "Display name (e.g., \"Small\", \"Medium\", \"Large\")"
          },
          "description": {
            "type": "string",
            "title": "description",
            "description": "Description of the preset"
          },
          "cpuCores": {
            "type": "integer",
            "title": "cpu_cores",
            "format": "int32",
            "description": "Number of CPU cores"
          },
          "memoryMb": {
            "type": "integer",
            "title": "memory_mb",
            "format": "int32",
            "description": "Memory in megabytes"
          },
          "diskGb": {
            "type": "integer",
            "title": "disk_gb",
            "format": "int32",
            "description": "Disk space in gigabytes"
          },
          "burst": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.BurstMode"
              }
            ],
            "title": "burst"
          },
          "isDefault": {
            "type": "boolean",
            "title": "is_default",
            "description": "This is the default preset"
          },
          "enabled": {
            "type": "boolean",
            "title": "enabled",
            "description": "Preset is available for selection"
          },
          "sortOrder": {
            "type": "integer",
            "title": "sort_order",
            "format": "int32",
            "description": "Display order (lower = first)"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          },
          "burstFloorCpuCores": {
            "type": "integer",
            "title": "burst_floor_cpu_cores",
            "format": "int32",
            "description": "What a workspace of a burst mode starts with; at most cpu_cores and memory_mb."
          },
          "burstFloorMemoryMb": {
            "type": "integer",
            "title": "burst_floor_memory_mb",
            "format": "int32"
          },
          "bandwidthMbps": {
            "type": "integer",
            "title": "bandwidth_mbps",
            "format": "int32",
            "description": "What a workspace of it may carry each way, in megabits a second; 0 is unshaped."
          },
          "rpoSeconds": {
            "type": "integer",
            "title": "rpo_seconds",
            "format": "int32",
            "description": "How far behind the object store a workspace of it may fall, in seconds; 0 is the\n installation's (InstallationSettings.volume_rpo_seconds)."
          }
        },
        "title": "ResourcePreset",
        "additionalProperties": false,
        "description": "ResourcePreset is a class of workspace: its size, and how a workspace of it may grow. Every\n workspace is created from one."
      },
      "spin.v1.Resources": {
        "type": "object",
        "properties": {
          "cpuCores": {
            "type": "integer",
            "title": "cpu_cores",
            "format": "int32",
            "description": "Initial CPU cores at boot (default: 1)"
          },
          "memoryMb": {
            "type": "integer",
            "title": "memory_mb",
            "format": "int32",
            "description": "Initial memory in MB at boot (default: 512)"
          },
          "diskGb": {
            "type": "integer",
            "title": "disk_gb",
            "format": "int32",
            "description": "Disk size in GB (default: 10)"
          },
          "maxCpuCores": {
            "type": "integer",
            "title": "max_cpu_cores",
            "format": "int32",
            "description": "Max CPU cores (0 = unlimited)"
          },
          "maxMemoryMb": {
            "type": "integer",
            "title": "max_memory_mb",
            "format": "int32",
            "description": "Max memory in MB (0 = unlimited)"
          },
          "bandwidthMbps": {
            "type": "integer",
            "title": "bandwidth_mbps",
            "format": "int32",
            "description": "What a workspace's network carries each way, in megabits a second (0 = unshaped): its\n preset's, held on its host by a token bucket on each way out of its machine's namespace.\n Its vsock - ssh, the editor, forwarded ports - is not shaped."
          }
        },
        "title": "Resources",
        "additionalProperties": false,
        "description": "Resource allocation for workspaces.\n Initial values (cpu_cores, memory_mb) are used at boot time.\n Max values control scaling limits:\n   - 0 = unlimited (burstable to host capacity)\n   - \u003e0 = hard limit (cannot exceed)"
      },
      "spin.v1.RestoreWorkspaceRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id",
            "description": "One of this workspace's own published snapshots. Empty restores what the workspace was\n created from - its image's snapshot as it was at creation, not the one the image names now."
          },
          "withMemory": {
            "type": "boolean",
            "title": "with_memory",
            "description": "with_memory resumes the snapshot's memory too: the workspace's processes go on from the\n instant the snapshot was taken, running or stopped before. Only for a snapshot taken with\n memory; a running workspace is resumed only on its own host."
          }
        },
        "title": "RestoreWorkspaceRequest",
        "additionalProperties": false,
        "description": "RestoreWorkspaceRequest gives a stopped workspace a new disk, cloned from snapshot_id on the\n host it already runs on, and keeps everything else about it: its name, its keys, its ports,\n its resources. The disk it had is kept too, detached, because the snapshots taken of it\n after the one restored are still the workspace's - restoring to one of those is how a\n restore is undone.\n\n What the workspace had written since its last snapshot is given up. That is the request,\n which is why a running workspace is refused rather than stopped for the caller: stopping is\n the caller saying it has nothing left to keep. With memory, the snapshot's own instant is the\n thing kept, and a running workspace is put back to it."
      },
      "spin.v1.RestoreWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "RestoreWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.RetryPlatformImagesRequest": {
        "type": "object",
        "title": "RetryPlatformImagesRequest",
        "additionalProperties": false
      },
      "spin.v1.RetryPlatformImagesResponse": {
        "type": "object",
        "title": "RetryPlatformImagesResponse",
        "additionalProperties": false
      },
      "spin.v1.RevokeAPIKeyRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "RevokeAPIKeyRequest",
        "additionalProperties": false
      },
      "spin.v1.RevokeAPIKeyResponse": {
        "type": "object",
        "title": "RevokeAPIKeyResponse",
        "additionalProperties": false
      },
      "spin.v1.RevokePortAccessRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "port": {
            "type": "integer",
            "title": "port",
            "format": "int32"
          },
          "userId": {
            "type": "string",
            "title": "user_id"
          }
        },
        "title": "RevokePortAccessRequest",
        "additionalProperties": false
      },
      "spin.v1.RevokePortAccessResponse": {
        "type": "object",
        "properties": {
          "exposedPort": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.ExposedPort"
              }
            ],
            "title": "exposed_port"
          }
        },
        "title": "RevokePortAccessResponse",
        "additionalProperties": false
      },
      "spin.v1.RevokeRegistrationTokenRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "RevokeRegistrationTokenRequest",
        "additionalProperties": false,
        "description": "Admin: Revoke registration token"
      },
      "spin.v1.RevokeRegistrationTokenResponse": {
        "type": "object",
        "title": "RevokeRegistrationTokenResponse",
        "additionalProperties": false
      },
      "spin.v1.RevokeRunnerRequest": {
        "type": "object",
        "properties": {
          "hostId": {
            "type": "string",
            "title": "host_id"
          },
          "leaveWorkspaces": {
            "type": "boolean",
            "title": "leave_workspaces",
            "description": "Revoke although workspaces are on this host. Refused without it: each such workspace can\n then run only once it is recovered onto another host (RecoverWorkspace), which gives up what\n this host had not published. A machine that may be compromised is revoked with it anyway."
          }
        },
        "title": "RevokeRunnerRequest",
        "additionalProperties": false,
        "description": "Admin: Revoke runner"
      },
      "spin.v1.RevokeRunnerResponse": {
        "type": "object",
        "title": "RevokeRunnerResponse",
        "additionalProperties": false
      },
      "spin.v1.RevokeUserAPIKeyRequest": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "title": "user_id"
          },
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "RevokeUserAPIKeyRequest",
        "additionalProperties": false
      },
      "spin.v1.RevokeUserAPIKeyResponse": {
        "type": "object",
        "title": "RevokeUserAPIKeyResponse",
        "additionalProperties": false
      },
      "spin.v1.RunJobNowRequest": {
        "type": "object",
        "properties": {
          "job": {
            "type": "string",
            "title": "job"
          }
        },
        "title": "RunJobNowRequest",
        "additionalProperties": false
      },
      "spin.v1.RunJobNowResponse": {
        "type": "object",
        "title": "RunJobNowResponse",
        "additionalProperties": false
      },
      "spin.v1.RunPrebuildRequest": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string",
            "title": "project_id"
          },
          "ref": {
            "type": "string",
            "title": "ref",
            "description": "One of the project's prebuild refs."
          }
        },
        "title": "RunPrebuildRequest",
        "additionalProperties": false
      },
      "spin.v1.RunPrebuildResponse": {
        "type": "object",
        "properties": {
          "prebuild": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Prebuild"
              }
            ],
            "title": "prebuild",
            "description": "The build, or the one already running at that commit."
          }
        },
        "title": "RunPrebuildResponse",
        "additionalProperties": false
      },
      "spin.v1.SSHKey": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "User-provided name"
          },
          "fingerprint": {
            "type": "string",
            "title": "fingerprint",
            "description": "SHA256 fingerprint"
          },
          "publicKey": {
            "type": "string",
            "title": "public_key",
            "description": "Full public key"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at",
            "description": "No last_used_at: a user's key authenticates inside the guest, over SSH, where the\n control plane is not, so the only honest answer it could give is \"unknown\". Compare\n ApiKey.last_used_at, which the control plane stamps because it is the thing being\n presented to."
          }
        },
        "title": "SSHKey",
        "additionalProperties": false,
        "description": "User's uploaded SSH public key"
      },
      "spin.v1.SearchLogsResponse": {
        "type": "object",
        "properties": {
          "records": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.LogRecord"
            },
            "title": "records"
          },
          "total": {
            "type": "string",
            "title": "total",
            "format": "int64",
            "description": "How many records the window holds that match, of which `records` is the newest `limit`."
          }
        },
        "title": "SearchLogsResponse",
        "additionalProperties": false
      },
      "spin.v1.SearchPlatformLogsRequest": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "title": "query",
            "description": "Quickwit's query language (https://quickwit.io/docs/reference/query-language). Empty is\n every record in the window."
          },
          "from": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "from",
            "description": "The window, both ends included. Unset `to` is now; unset `from` is an hour before `to`."
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "to"
          },
          "limit": {
            "type": "integer",
            "title": "limit",
            "format": "int32",
            "description": "How many records: 1 to 1000, 100 when unset."
          },
          "offset": {
            "type": "integer",
            "title": "offset",
            "format": "int32",
            "description": "How many to skip from the first: the page after the first. With limit, at most 10000."
          },
          "oldestFirst": {
            "type": "boolean",
            "title": "oldest_first",
            "description": "The oldest first rather than the newest: the window read as it happened."
          }
        },
        "title": "SearchPlatformLogsRequest",
        "additionalProperties": false
      },
      "spin.v1.SearchTracesRequest": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "title": "query",
            "description": "Quickwit's query language, over each trace's first span: service_name, span_name,\n span_attributes.*, span_status.code. Empty is every trace in the window."
          },
          "from": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "from"
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "to"
          },
          "limit": {
            "type": "integer",
            "title": "limit",
            "format": "int32",
            "description": "1 to 1000, 100 when unset."
          },
          "anySpan": {
            "type": "boolean",
            "title": "any_span",
            "description": "Search every span rather than each trace's first: a workspace's creation is the control\n plane's span inside a trace the browser began, and span_name or\n span_attributes.spin.workspace_id finds it only among all of them. Each span found is listed,\n and opens its whole trace."
          },
          "offset": {
            "type": "integer",
            "title": "offset",
            "format": "int32",
            "description": "As SearchPlatformLogsRequest's."
          }
        },
        "title": "SearchTracesRequest",
        "additionalProperties": false
      },
      "spin.v1.SearchTracesResponse": {
        "type": "object",
        "properties": {
          "roots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.Span"
            },
            "title": "roots"
          },
          "total": {
            "type": "string",
            "title": "total",
            "format": "int64"
          }
        },
        "title": "SearchTracesResponse",
        "additionalProperties": false
      },
      "spin.v1.SearchUsersRequest": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "title": "query",
            "description": "Search by name or email"
          },
          "limit": {
            "type": "integer",
            "title": "limit",
            "format": "int32",
            "description": "Max results (default 10)"
          },
          "excludeTeamId": {
            "type": "string",
            "title": "exclude_team_id",
            "description": "Exclude users already in this team"
          }
        },
        "title": "SearchUsersRequest",
        "additionalProperties": false
      },
      "spin.v1.SearchUsersResponse": {
        "type": "object",
        "properties": {
          "users": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.User"
            },
            "title": "users"
          }
        },
        "title": "SearchUsersResponse",
        "additionalProperties": false
      },
      "spin.v1.SearchWorkspaceLogsRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "query": {
            "type": "string",
            "title": "query",
            "description": "As SearchPlatformLogsRequest's: searched inside the workspace, never beyond it."
          },
          "from": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "from"
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "to"
          },
          "limit": {
            "type": "integer",
            "title": "limit",
            "format": "int32"
          },
          "offset": {
            "type": "integer",
            "title": "offset",
            "format": "int32",
            "description": "As SearchPlatformLogsRequest's."
          },
          "oldestFirst": {
            "type": "boolean",
            "title": "oldest_first",
            "description": "As SearchPlatformLogsRequest's."
          }
        },
        "title": "SearchWorkspaceLogsRequest",
        "additionalProperties": false
      },
      "spin.v1.SearchWorkspaceLogsResponse": {
        "type": "object",
        "properties": {
          "records": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.LogRecord"
            },
            "title": "records"
          },
          "total": {
            "type": "string",
            "title": "total",
            "format": "int64"
          }
        },
        "title": "SearchWorkspaceLogsResponse",
        "additionalProperties": false,
        "description": "As SearchLogsResponse, for one workspace's console."
      },
      "spin.v1.SecuritySettings": {
        "type": "object",
        "properties": {
          "rateLimit": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.RateLimitSettings"
              }
            ],
            "title": "rate_limit",
            "description": "Rate limiting configuration"
          },
          "sessionDurationHours": {
            "type": "integer",
            "title": "session_duration_hours",
            "format": "int32",
            "description": "Session configuration Session token lifetime in hours (default: 168 = 7 days)"
          },
          "allowWorkspaceSharing": {
            "type": "boolean",
            "title": "allow_workspace_sharing",
            "description": "Access control Allow users to share workspaces"
          },
          "allowPublicWorkspaces": {
            "type": "boolean",
            "title": "allow_public_workspaces",
            "description": "Allow publicly accessible workspace URLs"
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          }
        },
        "title": "SecuritySettings",
        "additionalProperties": false,
        "description": "SecuritySettings contains security-related configuration"
      },
      "spin.v1.ServiceCost": {
        "type": "object",
        "properties": {
          "service": {
            "type": "string",
            "title": "service"
          },
          "micros": {
            "type": "string",
            "title": "micros",
            "format": "int64"
          }
        },
        "title": "ServiceCost",
        "additionalProperties": false,
        "description": "What one of the cloud's services cost on one day, in millionths of the bill's currency."
      },
      "spin.v1.ServiceHealth": {
        "type": "object",
        "properties": {
          "service": {
            "type": "string",
            "title": "service"
          },
          "traces": {
            "type": "string",
            "title": "traces",
            "format": "int64"
          },
          "failedTraces": {
            "type": "string",
            "title": "failed_traces",
            "format": "int64"
          },
          "p50Millis": {
            "type": "number",
            "title": "p50_millis",
            "format": "double"
          },
          "p95Millis": {
            "type": "number",
            "title": "p95_millis",
            "format": "double"
          },
          "errorLogs": {
            "type": "string",
            "title": "error_logs",
            "format": "int64"
          },
          "intervals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ServiceInterval"
            },
            "title": "intervals"
          }
        },
        "title": "ServiceHealth",
        "additionalProperties": false,
        "description": "ServiceHealth is one service over a window: the traces begun in it - what it was asked to do -\n how many failed and how long they took, and how many errors it logged."
      },
      "spin.v1.ServiceHealthRequest": {
        "type": "object",
        "properties": {
          "from": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "from"
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "to"
          },
          "intervals": {
            "type": "integer",
            "title": "intervals",
            "format": "int32",
            "description": "As HistogramPlatformLogsRequest's."
          }
        },
        "title": "ServiceHealthRequest",
        "additionalProperties": false
      },
      "spin.v1.ServiceHealthResponse": {
        "type": "object",
        "properties": {
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.ServiceHealth"
            },
            "title": "services"
          }
        },
        "title": "ServiceHealthResponse",
        "additionalProperties": false
      },
      "spin.v1.ServiceInterval": {
        "type": "object",
        "properties": {
          "start": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "start"
          },
          "traces": {
            "type": "string",
            "title": "traces",
            "format": "int64"
          },
          "failedTraces": {
            "type": "string",
            "title": "failed_traces",
            "format": "int64"
          }
        },
        "title": "ServiceInterval",
        "additionalProperties": false
      },
      "spin.v1.SetHostPolicyRequest": {
        "type": "object",
        "properties": {
          "policy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HostPolicy"
              }
            ],
            "title": "policy",
            "description": "Sent whole: what is left unset is unset, so a write is the policy and not a patch."
          }
        },
        "title": "SetHostPolicyRequest",
        "additionalProperties": false
      },
      "spin.v1.SetHostPolicyResponse": {
        "type": "object",
        "properties": {
          "policy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HostPolicy"
              }
            ],
            "title": "policy"
          }
        },
        "title": "SetHostPolicyResponse",
        "additionalProperties": false
      },
      "spin.v1.SetOwnerWordRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "word": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.OwnerWord"
              }
            ],
            "title": "word"
          }
        },
        "title": "SetOwnerWordRequest",
        "additionalProperties": false
      },
      "spin.v1.SetOwnerWordResponse": {
        "type": "object",
        "title": "SetOwnerWordResponse",
        "additionalProperties": false
      },
      "spin.v1.SetPortAccessRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "port": {
            "type": "integer",
            "title": "port",
            "format": "int32"
          },
          "access": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.PortAccess"
              }
            ],
            "title": "access"
          }
        },
        "title": "SetPortAccessRequest",
        "additionalProperties": false
      },
      "spin.v1.SetPortAccessResponse": {
        "type": "object",
        "properties": {
          "exposedPort": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.ExposedPort"
              }
            ],
            "title": "exposed_port"
          }
        },
        "title": "SetPortAccessResponse",
        "additionalProperties": false
      },
      "spin.v1.SetRegistrationModeRequest": {
        "type": "object",
        "properties": {
          "mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.RegistrationMode"
              }
            ],
            "title": "mode"
          }
        },
        "title": "SetRegistrationModeRequest",
        "additionalProperties": false
      },
      "spin.v1.SetRegistrationModeResponse": {
        "type": "object",
        "properties": {
          "mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.RegistrationMode"
              }
            ],
            "title": "mode"
          }
        },
        "title": "SetRegistrationModeResponse",
        "additionalProperties": false
      },
      "spin.v1.SetSnapshotVisibilityRequest": {
        "type": "object",
        "properties": {
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id"
          },
          "public": {
            "type": "boolean",
            "title": "public"
          },
          "acknowledgeFindings": {
            "type": "boolean",
            "title": "acknowledge_findings",
            "description": "As ShareSnapshotRequest's: making a snapshot public gives everybody a copy of its files."
          }
        },
        "title": "SetSnapshotVisibilityRequest",
        "additionalProperties": false
      },
      "spin.v1.SetSnapshotVisibilityResponse": {
        "type": "object",
        "properties": {
          "public": {
            "type": "boolean",
            "title": "public"
          }
        },
        "title": "SetSnapshotVisibilityResponse",
        "additionalProperties": false
      },
      "spin.v1.SetTeamForgeRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "forge": {
            "type": "string",
            "title": "forge",
            "description": "netpolicy.Forges: \"github\"."
          },
          "appId": {
            "type": "string",
            "title": "app_id",
            "format": "int64",
            "description": "The GitHub App's id, and its installation on the organization the team's repositories are in."
          },
          "installationId": {
            "type": "string",
            "title": "installation_id",
            "format": "int64"
          },
          "privateKey": {
            "type": "string",
            "title": "private_key",
            "description": "The app's private key, PEM: what signs the request for an installation token. Replaces what\n the team held."
          },
          "apiUrl": {
            "type": "string",
            "title": "api_url",
            "description": "Where the forge's API is, https; empty is github.com's. A GitHub Enterprise Server's is\n https://\u003chost\u003e/api/v3."
          },
          "hosts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "hosts",
            "description": "The exact names the credential may be sent to, 1 to 16; empty is github.com and\n api.github.com. A brokered rule that injects the forge and names any other host is refused it."
          }
        },
        "title": "SetTeamForgeRequest",
        "additionalProperties": false
      },
      "spin.v1.SetTeamForgeResponse": {
        "type": "object",
        "title": "SetTeamForgeResponse",
        "additionalProperties": false
      },
      "spin.v1.SetTeamNetworkPolicyRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "rules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.NetworkRule"
            },
            "title": "rules"
          }
        },
        "title": "SetTeamNetworkPolicyRequest",
        "additionalProperties": false,
        "description": "SetTeamNetworkPolicyRequest makes the team's policy of that name, or replaces what it allows,\n whole. The name is one tag for the whole installation: one the installation or another team\n has is refused."
      },
      "spin.v1.SetTeamNetworkPolicyResponse": {
        "type": "object",
        "title": "SetTeamNetworkPolicyResponse",
        "additionalProperties": false
      },
      "spin.v1.SetTeamSecretRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "Lower-case letters, digits and dashes, starting with a letter; what a rule names it by."
          },
          "value": {
            "type": "string",
            "title": "value",
            "description": "At most 8 KiB of visible ASCII. Replaces what the name held."
          },
          "hosts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "hosts",
            "description": "The exact names the secret may be sent to, 1 to 16: a brokered rule that injects it and\n names any other host is refused it."
          },
          "ref": {
            "type": "string",
            "title": "ref",
            "description": "In place of value: the ARN of a Secrets Manager secret or a Parameter Store parameter the team\n keeps it in, read as the team (InstallationSettings.team_secrets_role) now and whenever a host\n asks for it."
          }
        },
        "title": "SetTeamSecretRequest",
        "additionalProperties": false
      },
      "spin.v1.SetTeamSecretResponse": {
        "type": "object",
        "title": "SetTeamSecretResponse",
        "additionalProperties": false
      },
      "spin.v1.SetWorkspaceNetworkTagsRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "networkTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "network_tags"
          }
        },
        "title": "SetWorkspaceNetworkTagsRequest",
        "additionalProperties": false
      },
      "spin.v1.SetWorkspaceNetworkTagsResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          },
          "droppedConnections": {
            "type": "integer",
            "title": "dropped_connections",
            "format": "int32",
            "description": "dropped_connections is how many of the machine's open connections were cut, because the\n change took a policy away and what a policy no longer allows must not survive in a socket\n that was opened before it. Zero when the change only added."
          }
        },
        "title": "SetWorkspaceNetworkTagsResponse",
        "additionalProperties": false
      },
      "spin.v1.SetWorkspaceNetworkWatchRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "watch": {
            "type": "boolean",
            "title": "watch"
          }
        },
        "title": "SetWorkspaceNetworkWatchRequest",
        "additionalProperties": false,
        "description": "SetWorkspaceNetworkWatchRequest turns the watch of a workspace's network on or off. It holds\n across stops and starts until it is turned off. What is watched goes to the workspace's logs\n as the service \"network\", where the installation collects them, and is read there by whoever\n may read the workspace's logs. The workspace's own credential cannot ask, as it cannot retag."
      },
      "spin.v1.SetWorkspaceNetworkWatchResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "SetWorkspaceNetworkWatchResponse",
        "additionalProperties": false
      },
      "spin.v1.ShareSnapshotRequest": {
        "type": "object",
        "properties": {
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id"
          },
          "email": {
            "type": "string",
            "title": "email",
            "description": "Email of user to share with"
          },
          "acknowledgeFindings": {
            "type": "boolean",
            "title": "acknowledge_findings",
            "description": "acknowledge_findings shares a snapshot whose files hold what looks like credentials. Without\n it such a share is refused, FAILED_PRECONDITION with the SecretFindings as a detail: whoever\n it is shared with gets a copy of those files."
          }
        },
        "title": "ShareSnapshotRequest",
        "additionalProperties": false
      },
      "spin.v1.ShareSnapshotResponse": {
        "type": "object",
        "title": "ShareSnapshotResponse",
        "additionalProperties": false,
        "description": "Empty whether or not the address has an account: anything else would say which."
      },
      "spin.v1.SignatureKind": {
        "type": "string",
        "title": "SignatureKind",
        "enum": [
          "SIGNATURE_KIND_UNSPECIFIED",
          "SIGNATURE_KIND_KEYRING",
          "SIGNATURE_KIND_ROSTER"
        ]
      },
      "spin.v1.SignedDocument": {
        "type": "object",
        "properties": {
          "document": {
            "type": "string",
            "title": "document",
            "format": "byte"
          },
          "signature": {
            "type": "string",
            "title": "signature",
            "format": "byte"
          }
        },
        "title": "SignedDocument",
        "additionalProperties": false,
        "description": "SignedDocument is a document as framed JSON and an SSH signature over it (sshsig) - what\n `ssh-keygen -Y sign` writes, so a FIDO2 key signs one through ssh-agent, and a passkey's\n WebAuthn assertion is one too (internal/sshauth)."
      },
      "spin.v1.Snapshot": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "description": {
            "type": "string",
            "title": "description",
            "description": "User-provided description"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "isPublic": {
            "type": "boolean",
            "title": "is_public",
            "description": "Whether snapshot is publicly visible"
          },
          "shareCount": {
            "type": "integer",
            "title": "share_count",
            "format": "int32",
            "description": "Number of users snapshot is shared with"
          },
          "accessType": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SnapshotAccessType"
              }
            ],
            "title": "access_type",
            "description": "How user has access"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SnapshotState"
              }
            ],
            "title": "state"
          },
          "withMemory": {
            "type": "boolean",
            "title": "with_memory",
            "description": "with_memory: the snapshot also kept the running machine's memory, so restoring it resumes\n the processes where they were instead of booting the disk. The memory is on the host the\n workspace ran on."
          }
        },
        "title": "Snapshot",
        "additionalProperties": false,
        "description": "A snapshot is a rotation of a workspace's volume, published as a commit. It has no name\n outside its id."
      },
      "spin.v1.SnapshotAccessType": {
        "type": "string",
        "title": "SnapshotAccessType",
        "enum": [
          "SNAPSHOT_ACCESS_TYPE_UNSPECIFIED",
          "SNAPSHOT_ACCESS_TYPE_OWNER",
          "SNAPSHOT_ACCESS_TYPE_SHARED",
          "SNAPSHOT_ACCESS_TYPE_PUBLIC"
        ],
        "description": "Access type for snapshots"
      },
      "spin.v1.SnapshotShare": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id"
          },
          "userId": {
            "type": "string",
            "title": "user_id"
          },
          "userEmail": {
            "type": "string",
            "title": "user_email"
          },
          "userName": {
            "type": "string",
            "title": "user_name"
          },
          "grantedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "granted_at"
          },
          "grantedBy": {
            "type": "string",
            "title": "granted_by"
          }
        },
        "title": "SnapshotShare",
        "additionalProperties": false,
        "description": "A share record for a snapshot"
      },
      "spin.v1.SnapshotState": {
        "type": "string",
        "title": "SnapshotState",
        "enum": [
          "SNAPSHOT_STATE_UNSPECIFIED",
          "SNAPSHOT_STATE_CREATING",
          "SNAPSHOT_STATE_PUBLISHED",
          "SNAPSHOT_STATE_FAILED",
          "SNAPSHOT_STATE_DELETING"
        ],
        "description": "How far along a snapshot is. A snapshot is taken by the host serving the volume, so it\n exists before it is usable: CREATING is the window between asking for one and the host\n reporting the commit it published."
      },
      "spin.v1.Span": {
        "type": "object",
        "properties": {
          "traceId": {
            "type": "string",
            "title": "trace_id"
          },
          "spanId": {
            "type": "string",
            "title": "span_id"
          },
          "parentSpanId": {
            "type": "string",
            "title": "parent_span_id",
            "description": "Empty for the trace's first span."
          },
          "service": {
            "type": "string",
            "title": "service"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "start": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "start"
          },
          "durationMicros": {
            "type": "string",
            "title": "duration_micros",
            "format": "int64",
            "description": "How long it took, in microseconds."
          },
          "failed": {
            "type": "boolean",
            "title": "failed",
            "description": "Whether it ended in an error, and what it said."
          },
          "statusMessage": {
            "type": "string",
            "title": "status_message"
          },
          "attributes": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Struct"
              }
            ],
            "title": "attributes"
          },
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/google.protobuf.Struct"
            },
            "title": "events",
            "description": "What happened during it, as the span recorded it: each event's name, time and attributes."
          }
        },
        "title": "Span",
        "additionalProperties": false,
        "description": "Span is one operation of a trace, as OpenTelemetry names its parts."
      },
      "spin.v1.StartDeviceLoginRequest": {
        "type": "object",
        "properties": {
          "identityProviderId": {
            "type": "string",
            "title": "identity_provider_id",
            "description": "Optional: use default if empty"
          }
        },
        "title": "StartDeviceLoginRequest",
        "additionalProperties": false
      },
      "spin.v1.StartDeviceLoginResponse": {
        "type": "object",
        "properties": {
          "deviceCode": {
            "type": "string",
            "title": "device_code",
            "description": "Secret code for CLI to poll with"
          },
          "userCode": {
            "type": "string",
            "title": "user_code",
            "description": "Short code user enters (e.g., \"ABCD-1234\")"
          },
          "verificationUrl": {
            "type": "string",
            "title": "verification_url",
            "description": "URL user visits to login"
          },
          "expiresIn": {
            "type": "integer",
            "title": "expires_in",
            "format": "int32",
            "description": "Seconds until codes expire"
          },
          "interval": {
            "type": "integer",
            "title": "interval",
            "format": "int32",
            "description": "Seconds between poll attempts"
          }
        },
        "title": "StartDeviceLoginResponse",
        "additionalProperties": false
      },
      "spin.v1.StartKeyringAnewRequest": {
        "type": "object",
        "title": "StartKeyringAnewRequest",
        "additionalProperties": false
      },
      "spin.v1.StartKeyringAnewResponse": {
        "type": "object",
        "title": "StartKeyringAnewResponse",
        "additionalProperties": false
      },
      "spin.v1.StartLoginRequest": {
        "type": "object",
        "properties": {
          "identityProviderId": {
            "type": "string",
            "title": "identity_provider_id",
            "description": "ID of the identity provider to use"
          },
          "redirectUri": {
            "type": "string",
            "title": "redirect_uri",
            "description": "Where the identity provider sends the code: the dashboard's /auth/callback, over https.\n Anything else is refused."
          }
        },
        "title": "StartLoginRequest",
        "additionalProperties": false
      },
      "spin.v1.StartLoginResponse": {
        "type": "object",
        "properties": {
          "authUrl": {
            "type": "string",
            "title": "auth_url",
            "description": "URL to redirect user to"
          },
          "state": {
            "type": "string",
            "title": "state",
            "description": "CSRF state token"
          },
          "binding": {
            "type": "string",
            "title": "binding",
            "description": "A secret for the client that began this sign-in, and for nobody else: CompleteLogin\n requires it with the state. The state and the code come back in a URL, which somebody\n who signed in to their own account can send to anybody - and without this, whoever\n opens it is signed in as them. Kept where only this client reads it, never in a URL."
          }
        },
        "title": "StartLoginResponse",
        "additionalProperties": false
      },
      "spin.v1.StartWorkspaceRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "fromDisk": {
            "type": "boolean",
            "title": "from_disk",
            "description": "Boot a suspended workspace from its disk, dropping the memory it was suspended with: what is\n left when that memory was taken on a machine no host runs now (WORKSPACE_FAILURE_MACHINE_CHANGED).\n The guest boots as from a power cut. Refused for a workspace that is not suspended."
          }
        },
        "title": "StartWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.StartWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "StartWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.StatusDisagreement": {
        "type": "object",
        "properties": {
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StatusDisagreementKind"
              }
            ],
            "title": "kind"
          },
          "detail": {
            "type": "string",
            "title": "detail",
            "description": "One sentence naming both sides and the gap between them, for a person to read. The kind\n is what a script branches on."
          }
        },
        "title": "StatusDisagreement",
        "additionalProperties": false
      },
      "spin.v1.StatusDisagreementKind": {
        "type": "string",
        "title": "StatusDisagreementKind",
        "enum": [
          "STATUS_DISAGREEMENT_KIND_UNSPECIFIED",
          "STATUS_DISAGREEMENT_KIND_SUPERVISOR_STALE",
          "STATUS_DISAGREEMENT_KIND_SUPERVISOR_ABSENT",
          "STATUS_DISAGREEMENT_KIND_HOST_UNREACHABLE",
          "STATUS_DISAGREEMENT_KIND_VOLUME_REFUSING",
          "STATUS_DISAGREEMENT_KIND_UNHEALTHY"
        ]
      },
      "spin.v1.StopWorkspaceRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "force": {
            "type": "boolean",
            "title": "force",
            "description": "Force kill instead of graceful"
          }
        },
        "title": "StopWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.StopWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "StopWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.StorageSettings": {
        "type": "object",
        "properties": {
          "bucket": {
            "type": "string",
            "title": "bucket"
          },
          "endpoint": {
            "type": "string",
            "title": "endpoint",
            "description": "Empty is the store's own service for its region."
          },
          "region": {
            "type": "string",
            "title": "region"
          },
          "accessKeyId": {
            "type": "string",
            "title": "access_key_id",
            "description": "The control plane's own credential; empty is the machine's own."
          },
          "secretSet": {
            "type": "boolean",
            "title": "secret_set",
            "description": "Whether the access key's secret is set: the secret itself is never read back."
          },
          "dir": {
            "type": "string",
            "title": "dir"
          },
          "principal": {
            "type": "string",
            "title": "principal",
            "description": "Who the control plane issues each runner's credential to the store as, as the store names it\n (for an S3 store, the role it assumes)."
          }
        },
        "title": "StorageSettings",
        "additionalProperties": false,
        "description": "StorageSettings is where the object store is: a bucket, or on one machine a directory."
      },
      "spin.v1.StorageTally": {
        "type": "object",
        "properties": {
          "objects": {
            "type": "string",
            "title": "objects",
            "format": "int64"
          },
          "bytes": {
            "type": "string",
            "title": "bytes",
            "format": "int64"
          }
        },
        "title": "StorageTally",
        "additionalProperties": false
      },
      "spin.v1.StoredVolume": {
        "type": "object",
        "properties": {
          "volumeId": {
            "type": "string",
            "title": "volume_id"
          },
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StoredVolumeKind"
              }
            ],
            "title": "kind"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "The workspace's name, the image's ref, or the extension and its version."
          },
          "workspaceId": {
            "type": "string",
            "title": "workspace_id",
            "description": "The workspace's, for a workspace's disk."
          },
          "ownerEmail": {
            "type": "string",
            "title": "owner_email"
          },
          "current": {
            "type": "boolean",
            "title": "current",
            "description": "Whether it is the workspace's disk now, rather than one it had."
          },
          "own": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StorageTally"
              }
            ],
            "title": "own",
            "description": "The descriptor, HEAD, the epoch and the commit manifests."
          },
          "layers": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StorageTally"
              }
            ],
            "title": "layers"
          },
          "checkpoints": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StorageTally"
              }
            ],
            "title": "checkpoints",
            "description": "Its checkpoints' memory and records."
          },
          "removable": {
            "type": "boolean",
            "title": "removable",
            "description": "Whether RemoveStoredVolume would take it: an image no ref names and nothing was cloned from,\n an extension release nothing runs, an unclaimed volume or an orphan."
          },
          "untaggable": {
            "type": "boolean",
            "title": "untaggable",
            "description": "An image its ref still names, which UntagImage takes the ref off."
          },
          "keptBecause": {
            "type": "string",
            "title": "kept_because",
            "description": "Why it stays, in words, where it is an image or a release that may not go."
          }
        },
        "title": "StoredVolume",
        "additionalProperties": false,
        "description": "StoredVolume is one volume in the store: what is under volumes/\u003cvolume_id\u003e/, and the layers\n its commits name under layers/."
      },
      "spin.v1.StoredVolumeKind": {
        "type": "string",
        "title": "StoredVolumeKind",
        "enum": [
          "STORED_VOLUME_KIND_UNSPECIFIED",
          "STORED_VOLUME_KIND_WORKSPACE",
          "STORED_VOLUME_KIND_IMAGE",
          "STORED_VOLUME_KIND_EXTENSION",
          "STORED_VOLUME_KIND_UNCLAIMED",
          "STORED_VOLUME_KIND_ORPHAN"
        ]
      },
      "spin.v1.SubmitSignatureRequest": {
        "type": "object",
        "properties": {
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SignatureKind"
              }
            ],
            "title": "kind"
          },
          "subjectId": {
            "type": "string",
            "title": "subject_id"
          },
          "signed": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SignedDocument"
              }
            ],
            "title": "signed"
          }
        },
        "title": "SubmitSignatureRequest",
        "additionalProperties": false
      },
      "spin.v1.SubmitSignatureResponse": {
        "type": "object",
        "title": "SubmitSignatureResponse",
        "additionalProperties": false
      },
      "spin.v1.SupervisorState": {
        "type": "string",
        "title": "SupervisorState",
        "enum": [
          "SUPERVISOR_STATE_UNSPECIFIED",
          "SUPERVISOR_STATE_INITIALIZING",
          "SUPERVISOR_STATE_READY",
          "SUPERVISOR_STATE_RUNNING_HOOK",
          "SUPERVISOR_STATE_ERROR",
          "SUPERVISOR_STATE_DISCONNECTED"
        ],
        "description": "SupervisorState is what the supervisor inside a VM is doing. Here rather than beside the\n stream that carries it, because it is read from both sides: the supervisor reports it on\n its own connection (spin.agent.v1) and an operator asks for it through\n WorkspaceService.GetWorkspaceStatus. A vocabulary with two definitions is two\n vocabularies."
      },
      "spin.v1.SupervisorStatus": {
        "type": "object",
        "properties": {
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SupervisorState"
              }
            ],
            "title": "state"
          },
          "version": {
            "type": "string",
            "title": "version"
          },
          "lastHeartbeat": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "last_heartbeat"
          },
          "connected": {
            "type": "boolean",
            "title": "connected",
            "description": "Whether a control plane holds this supervisor's stream right now. It is read from the\n durable row and not from the local connection table on purpose: a request may be served\n by a control plane other than the one the supervisor is attached to, and that one knows\n nothing about it."
          },
          "health": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HealthReport"
              }
            ],
            "title": "health"
          }
        },
        "title": "SupervisorStatus",
        "additionalProperties": false,
        "description": "What the supervisor inside the guest last reported. Absent (`connected` false with a zero\n last_heartbeat) means no supervisor of this workspace has ever reached a control plane."
      },
      "spin.v1.SuspendWorkspaceRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          }
        },
        "title": "SuspendWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.SuspendWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          },
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id",
            "description": "snapshot_id is the checkpoint the next start resumes, and a snapshot like any other: it is\n listed, it can be restored by name, and deleting it is what makes the workspace start from\n its disk instead."
          }
        },
        "title": "SuspendWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.Team": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "parentId": {
            "type": "string",
            "title": "parent_id",
            "description": "Empty if root team"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "slug": {
            "type": "string",
            "title": "slug"
          },
          "path": {
            "type": "string",
            "title": "path",
            "description": "Materialized path: \"/engineering/backend\""
          },
          "depth": {
            "type": "integer",
            "title": "depth",
            "format": "int32",
            "description": "1, 2, or 3"
          },
          "description": {
            "type": "string",
            "title": "description"
          },
          "memberCount": {
            "type": "integer",
            "title": "member_count",
            "format": "int32",
            "description": "Direct members only"
          },
          "workspaceCount": {
            "type": "integer",
            "title": "workspace_count",
            "format": "int32",
            "description": "Direct workspaces only"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          },
          "displayName": {
            "type": "string",
            "title": "display_name",
            "description": "Human-friendly name (falls back to name if empty)"
          },
          "isPersonal": {
            "type": "boolean",
            "title": "is_personal",
            "description": "Personal team for a single user (cannot be deleted or left by owner)"
          }
        },
        "title": "Team",
        "additionalProperties": false
      },
      "spin.v1.TeamForge": {
        "type": "object",
        "properties": {
          "forge": {
            "type": "string",
            "title": "forge"
          },
          "appId": {
            "type": "string",
            "title": "app_id",
            "format": "int64"
          },
          "installationId": {
            "type": "string",
            "title": "installation_id",
            "format": "int64"
          },
          "apiUrl": {
            "type": "string",
            "title": "api_url"
          },
          "hosts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "hosts"
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          }
        },
        "title": "TeamForge",
        "additionalProperties": false
      },
      "spin.v1.TeamIdentityProvider": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "providerType": {
            "type": "string",
            "title": "provider_type",
            "description": "oidc, github, google, azure-ad"
          },
          "issuerUrl": {
            "type": "string",
            "title": "issuer_url"
          },
          "autoJoinCelExpression": {
            "type": "string",
            "title": "auto_join_cel_expression",
            "description": "CEL expression for auto-membership"
          },
          "roleCelExpression": {
            "type": "string",
            "title": "role_cel_expression",
            "description": "CEL expression for role assignment"
          },
          "enabled": {
            "type": "boolean",
            "title": "enabled"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          }
        },
        "title": "TeamIdentityProvider",
        "additionalProperties": false
      },
      "spin.v1.TeamMember": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "title": "user_id"
          },
          "email": {
            "type": "string",
            "title": "email"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "role": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TeamRole"
              }
            ],
            "title": "role"
          },
          "joinedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "joined_at"
          }
        },
        "title": "TeamMember",
        "additionalProperties": false
      },
      "spin.v1.TeamRole": {
        "type": "string",
        "title": "TeamRole",
        "enum": [
          "TEAM_ROLE_UNSPECIFIED",
          "TEAM_ROLE_OWNER",
          "TEAM_ROLE_ADMIN",
          "TEAM_ROLE_MEMBER"
        ],
        "description": "Team member role enum"
      },
      "spin.v1.TeamSecret": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name"
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          },
          "hosts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "hosts"
          },
          "ref": {
            "type": "string",
            "title": "ref",
            "description": "Where the team keeps the value; empty where the control plane does."
          }
        },
        "title": "TeamSecret",
        "additionalProperties": false
      },
      "spin.v1.TelemetryFlow": {
        "type": "object",
        "properties": {
          "sent": {
            "type": "string",
            "title": "sent",
            "format": "int64"
          },
          "failed": {
            "type": "string",
            "title": "failed",
            "format": "int64"
          }
        },
        "title": "TelemetryFlow",
        "additionalProperties": false,
        "description": "TelemetryFlow is what one exporter of the collector did over the last window."
      },
      "spin.v1.TestHostWritebackRequest": {
        "type": "object",
        "properties": {
          "hostId": {
            "type": "string",
            "title": "host_id"
          },
          "limitBytes": {
            "type": "string",
            "title": "limit_bytes",
            "format": "int64",
            "description": "The candidates, as HostPolicy holds them."
          },
          "backgroundBytes": {
            "type": "string",
            "title": "background_bytes",
            "format": "int64"
          }
        },
        "title": "TestHostWritebackRequest",
        "additionalProperties": false
      },
      "spin.v1.TestHostWritebackResponse": {
        "type": "object",
        "properties": {
          "test": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WritebackTest"
              }
            ],
            "title": "test"
          }
        },
        "title": "TestHostWritebackResponse",
        "additionalProperties": false
      },
      "spin.v1.UndeleteWorkspaceRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "The workspace's id: a name is not unique among the ones in the trash."
          }
        },
        "title": "UndeleteWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.UndeleteWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "UndeleteWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.UnexposePortRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "port": {
            "type": "integer",
            "title": "port",
            "format": "int32"
          }
        },
        "title": "UnexposePortRequest",
        "additionalProperties": false
      },
      "spin.v1.UnexposePortResponse": {
        "type": "object",
        "title": "UnexposePortResponse",
        "additionalProperties": false
      },
      "spin.v1.UnshareSnapshotRequest": {
        "type": "object",
        "properties": {
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id"
          },
          "userId": {
            "type": "string",
            "title": "user_id"
          }
        },
        "title": "UnshareSnapshotRequest",
        "additionalProperties": false
      },
      "spin.v1.UnshareSnapshotResponse": {
        "type": "object",
        "title": "UnshareSnapshotResponse",
        "additionalProperties": false
      },
      "spin.v1.UntagImageRequest": {
        "type": "object",
        "properties": {
          "ref": {
            "type": "string",
            "title": "ref"
          }
        },
        "title": "UntagImageRequest",
        "additionalProperties": false
      },
      "spin.v1.UntagImageResponse": {
        "type": "object",
        "title": "UntagImageResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateInstallationSettingsRequest": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.InstallationSettings"
              }
            ],
            "title": "settings"
          },
          "updateMask": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.FieldMask"
              }
            ],
            "title": "update_mask",
            "description": "Required: only the named fields of settings are written, so a form that edits one\n setting cannot reset the others to their zero values."
          }
        },
        "title": "UpdateInstallationSettingsRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateInstallationSettingsResponse": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.InstallationSettings"
              }
            ],
            "title": "settings"
          }
        },
        "title": "UpdateInstallationSettingsResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateNetworkPolicyRequest": {
        "type": "object",
        "properties": {
          "policy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.NetworkPolicyRule"
              }
            ],
            "title": "policy"
          }
        },
        "title": "UpdateNetworkPolicyRequest",
        "additionalProperties": false,
        "description": "UpdateNetworkPolicyRequest replaces what the policy of that name allows, whole."
      },
      "spin.v1.UpdateNetworkPolicyResponse": {
        "type": "object",
        "title": "UpdateNetworkPolicyResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateProjectRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "slug": {
            "type": "string",
            "title": "slug"
          },
          "description": {
            "type": "string",
            "title": "description"
          },
          "repository": {
            "type": "string",
            "title": "repository"
          },
          "ref": {
            "type": "string",
            "title": "ref"
          },
          "image": {
            "type": "string",
            "title": "image"
          },
          "preset": {
            "type": "string",
            "title": "preset"
          },
          "networkTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "network_tags"
          },
          "prebuildRefs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "prebuild_refs"
          },
          "prebuildRebaseEvery": {
            "type": "integer",
            "title": "prebuild_rebase_every",
            "format": "int32"
          }
        },
        "title": "UpdateProjectRequest",
        "additionalProperties": false,
        "description": "Whole: every field is what the project becomes, as a form saves it."
      },
      "spin.v1.UpdateProjectResponse": {
        "type": "object",
        "properties": {
          "project": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Project"
              }
            ],
            "title": "project"
          }
        },
        "title": "UpdateProjectResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateResourcePresetRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "Required: preset ID to update"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "Optional: new display name"
          },
          "description": {
            "type": "string",
            "title": "description",
            "description": "Optional: new description"
          },
          "cpuCores": {
            "type": "integer",
            "title": "cpu_cores",
            "format": "int32",
            "description": "Optional: new CPU cores"
          },
          "memoryMb": {
            "type": "integer",
            "title": "memory_mb",
            "format": "int32",
            "description": "Optional: new memory"
          },
          "diskGb": {
            "type": "integer",
            "title": "disk_gb",
            "format": "int32",
            "description": "Optional: new disk"
          },
          "burst": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.BurstMode"
              }
            ],
            "title": "burst",
            "description": "Optional: new burst mode"
          },
          "isDefault": {
            "type": "boolean",
            "title": "is_default",
            "description": "Optional: make this the default"
          },
          "enabled": {
            "type": "boolean",
            "title": "enabled",
            "description": "Optional: enable/disable"
          },
          "sortOrder": {
            "type": "integer",
            "title": "sort_order",
            "format": "int32",
            "description": "Optional: new display order"
          },
          "burstFloorCpuCores": {
            "type": "integer",
            "title": "burst_floor_cpu_cores",
            "format": "int32",
            "description": "Optional: new burst floor"
          },
          "burstFloorMemoryMb": {
            "type": "integer",
            "title": "burst_floor_memory_mb",
            "format": "int32",
            "description": "Optional: new burst floor"
          },
          "bandwidthMbps": {
            "type": [
              "integer",
              "null"
            ],
            "title": "bandwidth_mbps",
            "format": "int32",
            "description": "Optional: a new bandwidth. Present, since zero - unshaped - is an answer and not \"keep\"."
          },
          "rpoSeconds": {
            "type": [
              "integer",
              "null"
            ],
            "title": "rpo_seconds",
            "format": "int32",
            "description": "Optional: a new RPO. Present, since zero - the installation's - is an answer and not \"keep\"."
          }
        },
        "title": "UpdateResourcePresetRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateResourcePresetResponse": {
        "type": "object",
        "properties": {
          "preset": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.ResourcePreset"
              }
            ],
            "title": "preset"
          }
        },
        "title": "UpdateResourcePresetResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateSecuritySettingsRequest": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SecuritySettings"
              }
            ],
            "title": "settings"
          }
        },
        "title": "UpdateSecuritySettingsRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateSecuritySettingsResponse": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.SecuritySettings"
              }
            ],
            "title": "settings"
          }
        },
        "title": "UpdateSecuritySettingsResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateStorageSettingsRequest": {
        "type": "object",
        "properties": {
          "bucket": {
            "type": "string",
            "title": "bucket"
          },
          "endpoint": {
            "type": "string",
            "title": "endpoint"
          },
          "region": {
            "type": "string",
            "title": "region"
          },
          "accessKeyId": {
            "type": "string",
            "title": "access_key_id"
          },
          "secretAccessKey": {
            "type": [
              "string",
              "null"
            ],
            "title": "secret_access_key",
            "description": "Absent keeps the secret there is."
          },
          "dir": {
            "type": "string",
            "title": "dir"
          },
          "principal": {
            "type": "string",
            "title": "principal"
          }
        },
        "title": "UpdateStorageSettingsRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateStorageSettingsResponse": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.StorageSettings"
              }
            ],
            "title": "settings"
          }
        },
        "title": "UpdateStorageSettingsResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateTeamIdentityProviderRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "autoJoinCelExpression": {
            "type": "string",
            "title": "auto_join_cel_expression"
          },
          "roleCelExpression": {
            "type": "string",
            "title": "role_cel_expression"
          },
          "enabled": {
            "type": "boolean",
            "title": "enabled"
          }
        },
        "title": "UpdateTeamIdentityProviderRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateTeamIdentityProviderResponse": {
        "type": "object",
        "properties": {
          "provider": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TeamIdentityProvider"
              }
            ],
            "title": "provider"
          }
        },
        "title": "UpdateTeamIdentityProviderResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateTeamMemberRoleRequest": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "userId": {
            "type": "string",
            "title": "user_id"
          },
          "role": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TeamRole"
              }
            ],
            "title": "role"
          }
        },
        "title": "UpdateTeamMemberRoleRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateTeamMemberRoleResponse": {
        "type": "object",
        "properties": {
          "member": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.TeamMember"
              }
            ],
            "title": "member"
          }
        },
        "title": "UpdateTeamMemberRoleResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateTeamRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "description": {
            "type": "string",
            "title": "description"
          },
          "displayName": {
            "type": "string",
            "title": "display_name",
            "description": "Human-friendly name"
          }
        },
        "title": "UpdateTeamRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateTeamResponse": {
        "type": "object",
        "properties": {
          "team": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Team"
              }
            ],
            "title": "team"
          }
        },
        "title": "UpdateTeamResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateUserRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "Required: user ID"
          },
          "isInstanceAdmin": {
            "type": [
              "boolean",
              "null"
            ],
            "title": "is_instance_admin",
            "description": "Toggle admin status"
          },
          "disabled": {
            "type": [
              "boolean",
              "null"
            ],
            "title": "disabled",
            "description": "Disable/enable user"
          },
          "disabledReason": {
            "type": [
              "string",
              "null"
            ],
            "title": "disabled_reason",
            "description": "Reason for disabling (shown to user)"
          }
        },
        "title": "UpdateUserRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateUserResponse": {
        "type": "object",
        "properties": {
          "user": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.User"
              }
            ],
            "title": "user"
          }
        },
        "title": "UpdateUserResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateUserSettingsRequest": {
        "type": "object",
        "properties": {
          "dotfiles": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.DotfilesConfig"
              }
            ],
            "title": "dotfiles"
          },
          "startupTaskfile": {
            "type": "string",
            "title": "startup_taskfile"
          },
          "defaultShell": {
            "type": "string",
            "title": "default_shell"
          },
          "editorSettings": {
            "type": "object",
            "title": "editor_settings",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            }
          },
          "defaultEnv": {
            "type": "object",
            "title": "default_env",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            }
          }
        },
        "title": "UpdateUserSettingsRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateUserSettingsResponse": {
        "type": "object",
        "properties": {
          "settings": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.UserSettings"
              }
            ],
            "title": "settings"
          }
        },
        "title": "UpdateUserSettingsResponse",
        "additionalProperties": false
      },
      "spin.v1.UpdateWorkspaceRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "Required: workspace ID or name"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "Optional: new name"
          },
          "env": {
            "type": "object",
            "title": "env",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            },
            "description": "Optional: replace environment variables"
          },
          "wakeOnAccess": {
            "type": [
              "boolean",
              "null"
            ],
            "title": "wake_on_access",
            "description": "Note: resource changes require stop/start Optional: Workspace.wake_on_access"
          }
        },
        "title": "UpdateWorkspaceRequest",
        "additionalProperties": false
      },
      "spin.v1.UpdateWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "UpdateWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.User": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "email": {
            "type": "string",
            "title": "email"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "avatarUrl": {
            "type": "string",
            "title": "avatar_url"
          },
          "subscriptionTier": {
            "type": "string",
            "title": "subscription_tier"
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "isInstanceAdmin": {
            "type": "boolean",
            "title": "is_instance_admin"
          },
          "disabled": {
            "type": "boolean",
            "title": "disabled"
          },
          "disabledReason": {
            "type": "string",
            "title": "disabled_reason"
          }
        },
        "title": "User",
        "additionalProperties": false
      },
      "spin.v1.UserSettings": {
        "type": "object",
        "properties": {
          "dotfiles": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.DotfilesConfig"
              }
            ],
            "title": "dotfiles"
          },
          "startupTaskfile": {
            "type": "string",
            "title": "startup_taskfile",
            "description": "Inline Taskfile YAML"
          },
          "defaultShell": {
            "type": "string",
            "title": "default_shell",
            "description": "e.g., /bin/bash, /bin/zsh"
          },
          "editorSettings": {
            "type": "object",
            "title": "editor_settings",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            },
            "description": "IDE preferences"
          },
          "defaultEnv": {
            "type": "object",
            "title": "default_env",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            },
            "description": "Environment variables"
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          }
        },
        "title": "UserSettings",
        "additionalProperties": false
      },
      "spin.v1.VSCodeServerPublish": {
        "type": "object",
        "properties": {
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.VSCodeServerPublishState"
              }
            ],
            "title": "state"
          },
          "step": {
            "type": "string",
            "title": "step",
            "description": "Which part is running, while it works."
          },
          "detail": {
            "type": "string",
            "title": "detail",
            "description": "Why it failed."
          },
          "version": {
            "type": "string",
            "title": "version",
            "description": "What it released, once it has."
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          }
        },
        "title": "VSCodeServerPublish",
        "additionalProperties": false,
        "description": "VSCodeServerPublish is this control plane's publish: the last one, or the one under way."
      },
      "spin.v1.VSCodeServerPublishState": {
        "type": "string",
        "title": "VSCodeServerPublishState",
        "enum": [
          "VS_CODE_SERVER_PUBLISH_STATE_UNSPECIFIED",
          "VS_CODE_SERVER_PUBLISH_STATE_IDLE",
          "VS_CODE_SERVER_PUBLISH_STATE_WORKING",
          "VS_CODE_SERVER_PUBLISH_STATE_PUBLISHED",
          "VS_CODE_SERVER_PUBLISH_STATE_FAILED"
        ]
      },
      "spin.v1.ValidateTaskfileRequest": {
        "type": "object",
        "properties": {
          "taskfileContent": {
            "type": "string",
            "title": "taskfile_content"
          }
        },
        "title": "ValidateTaskfileRequest",
        "additionalProperties": false,
        "description": "Taskfile validation"
      },
      "spin.v1.ValidateTaskfileResponse": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean",
            "title": "valid"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "errors"
          },
          "taskNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "task_names",
            "description": "List of defined tasks"
          }
        },
        "title": "ValidateTaskfileResponse",
        "additionalProperties": false
      },
      "spin.v1.VolumeRekey": {
        "type": "object",
        "properties": {
          "volumeId": {
            "type": "string",
            "title": "volume_id"
          },
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "workspaceName": {
            "type": "string",
            "title": "workspace_name"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.RekeyState"
              }
            ],
            "title": "state"
          },
          "hostId": {
            "type": "string",
            "title": "host_id",
            "description": "The host copying it, empty while pending."
          },
          "reason": {
            "type": "string",
            "title": "reason"
          }
        },
        "title": "VolumeRekey",
        "additionalProperties": false,
        "description": "VolumeRekey is a workspace's disk to re-key or being re-keyed."
      },
      "spin.v1.WaitSnapshotRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "snapshotId": {
            "type": "string",
            "title": "snapshot_id"
          },
          "timeoutSeconds": {
            "type": "integer",
            "title": "timeout_seconds",
            "format": "int32",
            "description": "At most 600; zero is 300."
          }
        },
        "title": "WaitSnapshotRequest",
        "additionalProperties": false,
        "description": "WaitSnapshotRequest waits for one of a workspace's snapshots to be published. FAILED_PRECONDITION\n when it failed or is being deleted; DEADLINE_EXCEEDED when timeout_seconds pass first."
      },
      "spin.v1.WaitSnapshotResponse": {
        "type": "object",
        "properties": {
          "snapshot": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Snapshot"
              }
            ],
            "title": "snapshot"
          }
        },
        "title": "WaitSnapshotResponse",
        "additionalProperties": false
      },
      "spin.v1.WaitWorkspaceRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceState"
              }
            ],
            "title": "state"
          },
          "timeoutSeconds": {
            "type": "integer",
            "title": "timeout_seconds",
            "format": "int32",
            "description": "At most 600; zero is 300."
          }
        },
        "title": "WaitWorkspaceRequest",
        "additionalProperties": false,
        "description": "A workspace's state is held by four parties that can disagree, and the disagreement is\n the diagnosis. The control plane has a lifecycle state it set; the supervisor inside the\n guest reports what it is doing and how it is; the host either heartbeats or does not; the\n volume either serves the disk or refuses with a reason. Asking any one of them alone\n produces the two failures this answers: a workspace the control plane calls RUNNING whose\n supervisor stopped reporting ten minutes ago, and one that looks broken because its host\n is unreachable, which is a different repair.\n\n It is its own RPC and not fields on GetWorkspace because those are different questions.\n WaitWorkspaceRequest names the state to wait for: RUNNING or STOPPED.\n\n Answered with the workspace once it is in that state. Refused as soon as waiting cannot end\n there: FAILED_PRECONDITION with the failure reason when the workspace failed, or when it is\n neither in that state nor wanted in it (a stop was asked for while waiting for RUNNING).\n DEADLINE_EXCEEDED when timeout_seconds pass first."
      },
      "spin.v1.WaitWorkspaceResponse": {
        "type": "object",
        "properties": {
          "workspace": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Workspace"
              }
            ],
            "title": "workspace"
          }
        },
        "title": "WaitWorkspaceResponse",
        "additionalProperties": false
      },
      "spin.v1.Workspace": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "teamId": {
            "type": "string",
            "title": "team_id",
            "description": "Every workspace has one: its owner's personal team unless another was named"
          },
          "hostId": {
            "type": "string",
            "title": "host_id"
          },
          "image": {
            "type": "string",
            "title": "image",
            "description": "Container image used for this workspace"
          },
          "resources": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.Resources"
              }
            ],
            "title": "resources"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceState"
              }
            ],
            "title": "state"
          },
          "url": {
            "type": "string",
            "title": "url",
            "description": "Output only: https://{name}.{base domain}; empty until setup records a domain"
          },
          "env": {
            "type": "object",
            "title": "env",
            "additionalProperties": {
              "type": "string",
              "title": "value"
            }
          },
          "createdAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "created_at"
          },
          "updatedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "updated_at"
          },
          "snapshotCount": {
            "type": "integer",
            "title": "snapshot_count",
            "format": "int32",
            "description": "Number of snapshots in history"
          },
          "failureReason": {
            "type": "string",
            "title": "failure_reason",
            "description": "Reason for failure (only set when state=FAILED)"
          },
          "networkTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "network_tags",
            "description": "The network policies this workspace runs under, by name. Read back because what a\n workspace may reach is worth seeing without asking the host that enforces it."
          },
          "hostConnected": {
            "type": "boolean",
            "title": "host_connected",
            "description": "host_connected says the host this workspace is on is talking to the control plane now.\n\n A workspace's state is its host's last word, and a host that stops talking stops\n correcting it: RUNNING is not transitional, so nothing fails it and nothing moves it, and\n a workspace whose machine died with its host reads as healthy for ever. The honest answer\n is not a different state - a host that cannot be reached may be running the machine\n perfectly well behind a broken network - but to say that the state is old and why.\n\n False for a workspace with no host at all (a stopped one), so read it beside the state."
          },
          "waitingReason": {
            "type": "string",
            "title": "waiting_reason",
            "description": "waiting_reason is why a WAITING workspace has no host yet, as of the last attempt to place\n it: which runner was full of what, or that none is connected. Empty in every other state."
          },
          "failure": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceFailure"
              }
            ],
            "title": "failure",
            "description": "failure is which part failed when state=FAILED, UNSPECIFIED in every other state: what a\n client says a person can do is decided by it, and failure_reason is the detail."
          },
          "networkWatch": {
            "type": "boolean",
            "title": "network_watch",
            "description": "network_watch says its host records where it connects into its logs\n (SetWorkspaceNetworkWatch)."
          },
          "floorCpuCores": {
            "type": "integer",
            "title": "floor_cpu_cores",
            "format": "int32",
            "description": "What its preset started it at. resources.cpu_cores and memory_mb are what it holds now, and\n above these they are a grant (GrantWorkspaceResources)."
          },
          "floorMemoryMb": {
            "type": "integer",
            "title": "floor_memory_mb",
            "format": "int32"
          },
          "grantExpiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "grant_expires_at",
            "description": "When its grant is given back on its own; unset for one kept until it is given back, and for\n a workspace holding none."
          },
          "quarantineHeld": {
            "type": "boolean",
            "title": "quarantine_held",
            "description": "quarantine_held says a quarantine holds it: in force (state QUARANTINED), or asked for and\n its stop still on the way or ended FAILED. Until an administrator releases it, its own\n person cannot start, move or delete it, whatever the state says."
          },
          "progress": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceProgress"
              }
            ],
            "title": "progress",
            "description": "progress is where a transition is while one is under way - CREATING, STARTING, STOPPING,\n WAITING - and unset at rest: which attempt, why the one before failed, what the host is doing\n now, since when and until when before the control plane gives up on it."
          },
          "allowedActions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.WorkspaceAction"
            },
            "title": "allowed_actions",
            "description": "allowed_actions are what the server takes from this workspace as it is: its state, a\n quarantine's hold, and the failure it ended in. A client offers these and no others."
          },
          "failureSummary": {
            "type": "string",
            "title": "failure_summary",
            "description": "failure_summary says in a sentence what failed when state=FAILED, decided by failure: what\n a client shows above failure_reason, so the dashboard and the CLI say the same thing. What to\n do next is each client's, from allowed_actions."
          },
          "readyAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "ready_at",
            "description": "ready_at is when the workspace's supervisor answered for its current run: the workspace is\n usable, not only its machine handed off. Unset before, and while it is not running."
          },
          "traceId": {
            "type": "string",
            "title": "trace_id",
            "description": "trace_id is the trace of the request that asked for its current generation, which runs through\n the host's operation and the state it reported. Empty when that request was not sampled."
          },
          "durability": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceDurability"
              }
            ],
            "title": "durability",
            "description": "durability is how much of what runs is in the object store. Answered by GetWorkspace only,\n and only for a workspace with a volume: a listing does not ask every volume."
          },
          "role": {
            "type": "string",
            "title": "role",
            "description": "role is the caller's in it: \"owner\", or \"guest\" - who may connect, see it and open its\n ports, and nothing that changes it."
          },
          "accessSigned": {
            "type": "boolean",
            "title": "access_signed",
            "description": "access_signed is whether its owner has signed an access of it: nobody logs in until then."
          },
          "memoryMachineGone": {
            "type": "boolean",
            "title": "memory_machine_gone",
            "description": "memory_machine_gone says it is suspended with memory taken on a machine no host of the\n installation registers now (WORKSPACE_FAILURE_MACHINE_CHANGED): a start cannot resume it, and\n WORKSPACE_ACTION_START_FROM_DISK, which drops the memory, is what is offered instead."
          },
          "suspendsAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "suspends_at",
            "description": "The question before a suspension: when the installation suspends it unless somebody keeps it\n (KeepWorkspace), asked ten minutes ahead, and which of the two suspensions is due\n (WORKSPACE_EVENT_TYPE_IDLE_SUSPENDED or WORKSPACE_EVENT_TYPE_RUNNING_CAP_SUSPENDED). Unset\n while none is due within the warning: somebody used it since, or it is kept."
          },
          "suspendsFor": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceEventType"
              }
            ],
            "title": "suspends_for"
          },
          "keptUntil": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "kept_until",
            "description": "An answer: kept awake until then, and neither suspension fires before it."
          },
          "leases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.WorkspaceLease"
            },
            "title": "leases",
            "description": "The leases its processes hold, as its supervisor last reported them: while one is held\n and within the installation's workspace_lease_max_minutes of its start, nobody is asked,\n nothing idle is suspended, and the running cap waits for the lease's end."
          },
          "projectId": {
            "type": "string",
            "title": "project_id",
            "description": "The project it opened and the ref it was opened at; empty for a workspace that opened none."
          },
          "ref": {
            "type": "string",
            "title": "ref"
          },
          "wakeOnAccess": {
            "type": "boolean",
            "title": "wake_on_access",
            "description": "Suspended, it is resumed by a signed-in visitor of one of its published ports\n (OpenWorkspaceProxySession). Never by an anonymous one: that would undo the idle suspension\n for whoever has a public port's URL."
          }
        },
        "title": "Workspace",
        "additionalProperties": false
      },
      "spin.v1.WorkspaceAction": {
        "type": "string",
        "title": "WorkspaceAction",
        "enum": [
          "WORKSPACE_ACTION_UNSPECIFIED",
          "WORKSPACE_ACTION_START",
          "WORKSPACE_ACTION_STOP",
          "WORKSPACE_ACTION_FORCE_STOP",
          "WORKSPACE_ACTION_DELETE",
          "WORKSPACE_ACTION_FORCE_DELETE",
          "WORKSPACE_ACTION_SUSPEND",
          "WORKSPACE_ACTION_START_FROM_DISK"
        ],
        "description": "WorkspaceAction is an act a person can ask of a workspace."
      },
      "spin.v1.WorkspaceCost": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "name": {
            "type": "string",
            "title": "name"
          },
          "teamId": {
            "type": "string",
            "title": "team_id"
          },
          "teamName": {
            "type": "string",
            "title": "team_name",
            "description": "Empty where the team was deleted since."
          },
          "ownerId": {
            "type": "string",
            "title": "owner_id"
          },
          "ownerEmail": {
            "type": "string",
            "title": "owner_email",
            "description": "Empty where the owner was deleted since."
          },
          "computeMicros": {
            "type": "string",
            "title": "compute_micros",
            "format": "int64",
            "description": "Its share of the runners: what it held of them."
          },
          "storageMicros": {
            "type": "string",
            "title": "storage_micros",
            "format": "int64",
            "description": "Its share of the volumes' bucket: what its volumes kept."
          },
          "sentBytes": {
            "type": "string",
            "title": "sent_bytes",
            "format": "int64",
            "description": "What its traffic came to in the month: its machine's network out and back, and its sessions -\n ssh, the editor, forwarded ports - through the relay, both ways. Counted, not yet costed."
          },
          "receivedBytes": {
            "type": "string",
            "title": "received_bytes",
            "format": "int64"
          },
          "forwardedBytes": {
            "type": "string",
            "title": "forwarded_bytes",
            "format": "int64"
          }
        },
        "title": "WorkspaceCost",
        "additionalProperties": false,
        "description": "What one workspace cost in the month, in millionths of the bill's currency, and whose it was on\n the last day it cost anything."
      },
      "spin.v1.WorkspaceDurability": {
        "type": "object",
        "properties": {
          "lastPublishedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "last_published_at",
            "description": "last_published_at is when its last commit reached the object store, as its host last said."
          },
          "unpublishedSeconds": {
            "type": "string",
            "title": "unpublished_seconds",
            "format": "int64",
            "description": "What is written and not yet published, as of the host's report plus the time since."
          },
          "unpublishedBytes": {
            "type": "string",
            "title": "unpublished_bytes",
            "format": "int64"
          },
          "stalled": {
            "type": "boolean",
            "title": "stalled",
            "description": "stalled says publishing has not kept up with the bound it runs to (the volume's RPO)."
          },
          "reportedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "reported_at",
            "description": "reported_at is the host's report these are as of."
          }
        },
        "title": "WorkspaceDurability",
        "additionalProperties": false,
        "description": "WorkspaceDurability is what of a running workspace is published, so it survives its host."
      },
      "spin.v1.WorkspaceEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceEventType"
              }
            ],
            "title": "type"
          },
          "timestamp": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "timestamp"
          },
          "details": {
            "type": "string",
            "title": "details",
            "description": "Additional info (JSON)"
          }
        },
        "title": "WorkspaceEvent",
        "additionalProperties": false,
        "description": "Timeline event for workspace state changes"
      },
      "spin.v1.WorkspaceEventType": {
        "type": "string",
        "title": "WorkspaceEventType",
        "enum": [
          "WORKSPACE_EVENT_TYPE_UNSPECIFIED",
          "WORKSPACE_EVENT_TYPE_CREATED",
          "WORKSPACE_EVENT_TYPE_STARTED",
          "WORKSPACE_EVENT_TYPE_STOPPED",
          "WORKSPACE_EVENT_TYPE_SNAPSHOT_CREATED",
          "WORKSPACE_EVENT_TYPE_DELETED",
          "WORKSPACE_EVENT_TYPE_FAILED",
          "WORKSPACE_EVENT_TYPE_RESTORED",
          "WORKSPACE_EVENT_TYPE_RESUMED",
          "WORKSPACE_EVENT_TYPE_BOOTED",
          "WORKSPACE_EVENT_TYPE_QUARANTINED",
          "WORKSPACE_EVENT_TYPE_UNQUARANTINED",
          "WORKSPACE_EVENT_TYPE_PLACED",
          "WORKSPACE_EVENT_TYPE_TRASHED",
          "WORKSPACE_EVENT_TYPE_UNDELETED",
          "WORKSPACE_EVENT_TYPE_MOVED",
          "WORKSPACE_EVENT_TYPE_DISPLACED",
          "WORKSPACE_EVENT_TYPE_STOP_BACKUP_FAILED",
          "WORKSPACE_EVENT_TYPE_IDLE_SUSPENDED",
          "WORKSPACE_EVENT_TYPE_RUNNING_CAP_SUSPENDED",
          "WORKSPACE_EVENT_TYPE_SUSPENSION_DUE",
          "WORKSPACE_EVENT_TYPE_KEPT",
          "WORKSPACE_EVENT_TYPE_UNRESPONSIVE"
        ]
      },
      "spin.v1.WorkspaceFailure": {
        "type": "string",
        "title": "WorkspaceFailure",
        "enum": [
          "WORKSPACE_FAILURE_UNSPECIFIED",
          "WORKSPACE_FAILURE_VOLUME",
          "WORKSPACE_FAILURE_EXTENSION",
          "WORKSPACE_FAILURE_NETWORK",
          "WORKSPACE_FAILURE_RESOURCES",
          "WORKSPACE_FAILURE_MACHINE",
          "WORKSPACE_FAILURE_GUEST",
          "WORKSPACE_FAILURE_RELEASE_GONE",
          "WORKSPACE_FAILURE_EXITED",
          "WORKSPACE_FAILURE_STOP",
          "WORKSPACE_FAILURE_TIMED_OUT",
          "WORKSPACE_FAILURE_NO_HOST",
          "WORKSPACE_FAILURE_MACHINE_CHANGED"
        ],
        "description": "WorkspaceFailure is why a FAILED workspace failed: which part of its run, closed so what a\n person can do about it - and a failure rate split by the repair it needs - is decided by the\n kind rather than by the text of an error. The reason beside it is the detail.\n\n One enum for the client and the host's report (spin.agent.v1.ObservedWorkspace): the kind a\n person is shown is the one the host named, with no second list to keep in step."
      },
      "spin.v1.WorkspaceHostStatus": {
        "type": "object",
        "properties": {
          "hostId": {
            "type": "string",
            "title": "host_id"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.HostState"
              }
            ],
            "title": "state"
          },
          "lastHeartbeat": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "last_heartbeat"
          }
        },
        "title": "WorkspaceHostStatus",
        "additionalProperties": false,
        "description": "Whether the machine's host is reachable at all. A workspace cannot be healthier than the\n host under it, and \"my workspace is broken\" is most often this."
      },
      "spin.v1.WorkspaceLease": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name",
            "description": "name is the command, or the .spin.yaml task, that holds it."
          },
          "since": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "since"
          },
          "until": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "until",
            "description": "until is when the lease stops counting whether or not the process lives: since plus the\n installation's workspace_lease_max_minutes."
          }
        },
        "title": "WorkspaceLease",
        "additionalProperties": false,
        "description": "WorkspaceLease is a process in the workspace keeping it awake while it lives."
      },
      "spin.v1.WorkspaceLogFieldValuesRequest": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "field": {
            "type": "string",
            "title": "field"
          },
          "query": {
            "type": "string",
            "title": "query"
          },
          "from": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "from"
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "to"
          },
          "limit": {
            "type": "integer",
            "title": "limit",
            "format": "int32"
          }
        },
        "title": "WorkspaceLogFieldValuesRequest",
        "additionalProperties": false
      },
      "spin.v1.WorkspaceLogFieldValuesResponse": {
        "type": "object",
        "properties": {
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/spin.v1.FieldValue"
            },
            "title": "values"
          },
          "other": {
            "type": "string",
            "title": "other",
            "format": "int64"
          }
        },
        "title": "WorkspaceLogFieldValuesResponse",
        "additionalProperties": false
      },
      "spin.v1.WorkspacePhase": {
        "type": "string",
        "title": "WorkspacePhase",
        "enum": [
          "WORKSPACE_PHASE_UNSPECIFIED",
          "WORKSPACE_PHASE_DISK",
          "WORKSPACE_PHASE_EXTENSIONS",
          "WORKSPACE_PHASE_NETWORK",
          "WORKSPACE_PHASE_MACHINE",
          "WORKSPACE_PHASE_FIRST_BOOT",
          "WORKSPACE_PHASE_GUEST",
          "WORKSPACE_PHASE_BACKUP"
        ],
        "description": "WorkspacePhase is what a host is doing to bring a workspace up."
      },
      "spin.v1.WorkspaceProgress": {
        "type": "object",
        "properties": {
          "attempt": {
            "type": "integer",
            "title": "attempt",
            "format": "int32",
            "description": "attempt is the host's attempt at the current generation, from 1, and attempts how many it\n makes before the workspace fails. Zero before the host has made one."
          },
          "attempts": {
            "type": "integer",
            "title": "attempts",
            "format": "int32"
          },
          "lastFailure": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspaceFailure"
              }
            ],
            "title": "last_failure",
            "description": "Why the attempt before this one failed, while this one is in progress: what a retry hides."
          },
          "lastReason": {
            "type": "string",
            "title": "last_reason"
          },
          "phase": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WorkspacePhase"
              }
            ],
            "title": "phase",
            "description": "phase is what the host is doing now; UNSPECIFIED when it has not said."
          },
          "since": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "since",
            "description": "since is when the transition began, and deadline when the control plane gives up on it - a\n wait for a host, or a start or a stop the host does not finish - and fails the workspace."
          },
          "deadline": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "deadline"
          }
        },
        "title": "WorkspaceProgress",
        "additionalProperties": false,
        "description": "WorkspaceProgress is a transition under way."
      },
      "spin.v1.WorkspaceProxyStatus": {
        "type": "string",
        "title": "WorkspaceProxyStatus",
        "enum": [
          "WORKSPACE_PROXY_STATUS_UNSPECIFIED",
          "WORKSPACE_PROXY_STATUS_ACCESSIBLE",
          "WORKSPACE_PROXY_STATUS_NOT_RUNNING",
          "WORKSPACE_PROXY_STATUS_NOT_FOUND",
          "WORKSPACE_PROXY_STATUS_PORT_NOT_EXPOSED",
          "WORKSPACE_PROXY_STATUS_WAKING"
        ],
        "description": "Proxy status for workspace access"
      },
      "spin.v1.WorkspaceRuntime": {
        "type": "object",
        "properties": {
          "cpuCores": {
            "type": "integer",
            "title": "cpu_cores",
            "format": "int32"
          },
          "memoryBytes": {
            "type": "string",
            "title": "memory_bytes",
            "format": "int64"
          },
          "memoryUsedBytes": {
            "type": "string",
            "title": "memory_used_bytes",
            "format": "int64"
          },
          "cpuSeconds": {
            "type": "number",
            "title": "cpu_seconds",
            "format": "double"
          },
          "machineStartedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "machine_started_at"
          }
        },
        "title": "WorkspaceRuntime",
        "additionalProperties": false,
        "description": "WorkspaceRuntime is a running workspace's machine as its host measures it from outside the\n guest. Answers \"is my workspace out of memory\" and \"did it get the cores it borrowed\" for the\n one person asking, which no metric may: those are labelled by host, never by workspace."
      },
      "spin.v1.WorkspaceState": {
        "type": "string",
        "title": "WorkspaceState",
        "enum": [
          "WORKSPACE_STATE_UNSPECIFIED",
          "WORKSPACE_STATE_CREATING",
          "WORKSPACE_STATE_STARTING",
          "WORKSPACE_STATE_RUNNING",
          "WORKSPACE_STATE_STOPPING",
          "WORKSPACE_STATE_STOPPED",
          "WORKSPACE_STATE_FAILED",
          "WORKSPACE_STATE_DELETED",
          "WORKSPACE_STATE_WAITING",
          "WORKSPACE_STATE_QUARANTINED"
        ],
        "description": "Workspace states"
      },
      "spin.v1.WorkspaceSuspendFailure": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "title": "workspace_id"
          },
          "error": {
            "type": "string",
            "title": "error"
          }
        },
        "title": "WorkspaceSuspendFailure",
        "additionalProperties": false
      },
      "spin.v1.WorkspaceVolumeStatus": {
        "type": "object",
        "properties": {
          "volumeId": {
            "type": "string",
            "title": "volume_id"
          },
          "state": {
            "type": "string",
            "title": "state"
          },
          "refusal": {
            "type": "string",
            "title": "refusal"
          },
          "refusalDetail": {
            "type": "string",
            "title": "refusal_detail"
          }
        },
        "title": "WorkspaceVolumeStatus",
        "additionalProperties": false,
        "description": "Whether the disk under the workspace is being served. `refusal` is the token an alert\n keys on; `refusal_detail` is the sentence the agent sent with it."
      },
      "spin.v1.WritebackPreset": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "title": "name",
            "description": "name is how the preset is told apart; label is how a person is shown it."
          },
          "label": {
            "type": "string",
            "title": "label"
          },
          "limitBytes": {
            "type": "string",
            "title": "limit_bytes",
            "format": "int64",
            "description": "Both zero is unset."
          },
          "backgroundBytes": {
            "type": "string",
            "title": "background_bytes",
            "format": "int64"
          },
          "measured": {
            "type": "string",
            "title": "measured",
            "description": "measured is what it did, in words."
          }
        },
        "title": "WritebackPreset",
        "additionalProperties": false,
        "description": "WritebackPreset is a pair of writeback thresholds measured on a Spin OS metal host (NVMe, a\n 4 KiB write+fsync in one workspace beside another writing 2 GiB flat out)."
      },
      "spin.v1.WritebackRun": {
        "type": "object",
        "properties": {
          "writerBytesPerSecond": {
            "type": "string",
            "title": "writer_bytes_per_second",
            "format": "int64"
          },
          "probeP50Us": {
            "type": "string",
            "title": "probe_p50_us",
            "format": "int64"
          },
          "probeP99Us": {
            "type": "string",
            "title": "probe_p99_us",
            "format": "int64"
          },
          "probeMaxUs": {
            "type": "string",
            "title": "probe_max_us",
            "format": "int64"
          },
          "probes": {
            "type": "integer",
            "title": "probes",
            "format": "int32"
          }
        },
        "title": "WritebackRun",
        "additionalProperties": false,
        "description": "WritebackRun mirrors spin.agent.v1.WritebackRun, which is what the host reports."
      },
      "spin.v1.WritebackTest": {
        "type": "object",
        "properties": {
          "hostId": {
            "type": "string",
            "title": "host_id"
          },
          "limitBytes": {
            "type": "string",
            "title": "limit_bytes",
            "format": "int64"
          },
          "backgroundBytes": {
            "type": "string",
            "title": "background_bytes",
            "format": "int64"
          },
          "candidate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WritebackRun"
              }
            ],
            "title": "candidate",
            "description": "candidate ran under the thresholds above, current under the ones the host held."
          },
          "current": {
            "allOf": [
              {
                "$ref": "#/components/schemas/spin.v1.WritebackRun"
              }
            ],
            "title": "current"
          },
          "testedAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "tested_at"
          },
          "expiresAt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/google.protobuf.Timestamp"
              }
            ],
            "title": "expires_at"
          }
        },
        "title": "WritebackTest",
        "additionalProperties": false,
        "description": "WritebackTest is one TestHostWriteback: the thresholds tested, both runs, and until when\n SetHostPolicy takes those thresholds for that host on the strength of it."
      }
    }
  },
  "security": [],
  "tags": [
    {
      "name": "AuthService"
    },
    {
      "name": "AdminService",
      "description": "AdminService manages installation-wide settings, user management, and resource presets\n Only accessible to instance administrators --- Installation Settings ---"
    },
    {
      "name": "HostService"
    },
    {
      "name": "LogService",
      "description": "LogService is what the installation logged, as its store of logs and traces keeps it\n (internal/logstore). Every search is confined by the control plane to what the caller may see;\n what the caller types is searched inside that and cannot widen it."
    },
    {
      "name": "RunnerTokenService"
    },
    {
      "name": "SettingsService"
    },
    {
      "name": "SetupService",
      "description": "SetupService handles initial platform setup and admin bootstrap.\n Most endpoints require admin authentication, except GetSetupStatus and PasswordLogin."
    },
    {
      "name": "WorkspaceService"
    },
    {
      "name": "ShareService",
      "description": "ShareService manages snapshot sharing\n Snapshots can be shared with specific users or made public\n Users can create new workspaces from shared snapshots"
    },
    {
      "name": "SignatureService",
      "description": "SignatureService is what only people sign of themselves: who a user's keys are and who a team's\n members are. A host holds every workspace's access to these (internal/roster), so a control\n plane that is taken can say neither which keys are somebody's nor who is in a team. A\n workspace's access is signed through WorkspaceService.SetOwnerWord.\n\n The control plane proposes each document from what it holds - a key registered, a member added -\n and keeps what was signed; it signs nothing. A client shows a person what they are signing and\n signs it with a key of theirs: `spin sign`, with the keys ssh-agent holds, or the terminal's\n page, with a passkey."
    },
    {
      "name": "SSHKeyService",
      "description": "SSHKeyService is the user's own keys, as a registry: the ones a client offers when the owner\n signs a workspace's word (OwnerWord), and the anchor a create may name. A key here logs in to\n nothing on its own - only a key the owner's word for a workspace lists does, there."
    },
    {
      "name": "TeamService"
    }
  ]
}