{"components":{"schemas":{"handlers.backupResponse":{"properties":{"completed_at":{"type":"string"},"created_at":{"type":"string"},"database_id":{"type":"string"},"error":{"type":"string"},"id":{"type":"string"},"size_bytes":{"type":"integer"},"status":{"type":"string"},"triggered_by":{"type":"string"}},"type":"object"},"handlers.createDatabaseRequest":{"properties":{"client_mode_enabled":{"description":"Pointer so an absent field decays to the column default (false)\nwithout ambiguity between absent and explicit-false. Post-creation\ntoggling lives at POST /databases/:id/client-access/{enable,disable}\n(shipped in 7c), not on this create request.","type":"boolean"},"function_id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"handlers.createDatabaseResponse":{"properties":{"client_mode_enabled":{"type":"boolean"},"host":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"token":{"type":"string"}},"type":"object"},"handlers.databaseResponse":{"properties":{"client_mode_enabled":{"type":"boolean"},"created_at":{"type":"string"},"function_id":{"type":"string"},"host":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"pg_database":{"type":"string"},"pg_user":{"type":"string"},"status":{"type":"string"}},"type":"object"},"models.BuildJobListResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/models.BuildJobResponse"},"type":"array","uniqueItems":false}},"type":"object"},"models.BuildJobResponse":{"properties":{"cancel_requested":{"type":"boolean"},"commit_sha":{"type":"string"},"error":{"type":"string"},"exit_code":{"type":"integer"},"finished_at":{"type":"string"},"git_ref":{"type":"string"},"id":{"type":"string"},"organization_id":{"type":"string"},"queued_at":{"type":"string"},"repo_url":{"type":"string"},"started_at":{"type":"string"},"status":{"type":"string"}},"type":"object"},"models.BuildLogEntry":{"properties":{"done":{"description":"terminal marker (no output)","type":"boolean"},"id":{"description":"Redis stream entry id","type":"string"},"output":{"description":"raw build output chunk","type":"string"}},"type":"object"},"models.BuildLogsResponse":{"properties":{"logs":{"items":{"$ref":"#/components/schemas/models.BuildLogEntry"},"type":"array","uniqueItems":false}},"type":"object"},"models.ComputeUploadRequest":{"properties":{"organization_id":{"type":"string"}},"required":["organization_id"],"type":"object"},"models.ComputeUploadResponse":{"properties":{"binary_url":{"type":"string"},"expires_at":{"type":"string"},"upload_url":{"type":"string"}},"type":"object"},"models.CreateBuildJobRequest":{"properties":{"commit_sha":{"type":"string"},"git_ref":{"type":"string"},"org_id":{"type":"string"},"repo_url":{"type":"string"},"spec":{"items":{"type":"integer"},"type":"array","uniqueItems":false}},"required":["org_id","spec"],"type":"object"},"models.CustomDomainActivateRequest":{"properties":{"domain":{"type":"string"}},"required":["domain"],"type":"object"},"models.CustomDomainActivateResponse":{"properties":{"domain":{"type":"string"},"external_url":{"type":"string"},"message":{"type":"string"},"service_id":{"type":"string"},"verification_status":{"$ref":"#/components/schemas/models.CustomDomainStatus"}},"type":"object"},"models.CustomDomainInitRequest":{"properties":{"domain":{"type":"string"},"organization_id":{"type":"string"},"path":{"type":"string"},"verify_ownership":{"type":"boolean"},"vm_id":{"type":"string"},"vm_port":{"maximum":65535,"minimum":1,"type":"integer"}},"required":["domain"],"type":"object"},"models.CustomDomainInitResponse":{"properties":{"a_record_ip":{"type":"string"},"domain":{"type":"string"},"instructions":{"type":"string"},"txt_record_name":{"type":"string"},"txt_record_value":{"type":"string"},"verification_token":{"type":"string"},"verify_ownership":{"type":"boolean"}},"type":"object"},"models.CustomDomainListResponse":{"properties":{"domains":{"items":{"$ref":"#/components/schemas/models.Domain"},"type":"array","uniqueItems":false}},"type":"object"},"models.CustomDomainStatus":{"enum":["pending","verified","failed","active"],"type":"string","x-enum-varnames":["DomainStatusPending","DomainStatusVerified","DomainStatusFailed","DomainStatusActive"]},"models.CustomDomainStatusResponse":{"properties":{"a_record_ip":{"type":"string"},"created_at":{"type":"string"},"domain":{"type":"string"},"function_id":{"type":"string"},"id":{"type":"string"},"owner_org_id":{"type":"string"},"owner_user_id":{"type":"string"},"path":{"type":"string"},"service_id":{"type":"string"},"target_type":{"$ref":"#/components/schemas/models.DomainTargetType"},"updated_at":{"type":"string"},"user_id":{"type":"string"},"verification_status":{"$ref":"#/components/schemas/models.CustomDomainStatus"},"verification_token":{"type":"string"},"verified_at":{"type":"string"},"verify_ownership":{"type":"boolean"},"vm_id":{"type":"string"},"vm_port":{"type":"integer"}},"type":"object"},"models.Domain":{"properties":{"created_at":{"type":"string"},"domain":{"type":"string"},"function_id":{"type":"string"},"id":{"type":"string"},"owner_org_id":{"type":"string"},"owner_user_id":{"type":"string"},"path":{"type":"string"},"service_id":{"type":"string"},"target_type":{"$ref":"#/components/schemas/models.DomainTargetType"},"updated_at":{"type":"string"},"user_id":{"type":"string"},"verification_status":{"$ref":"#/components/schemas/models.CustomDomainStatus"},"verification_token":{"type":"string"},"verified_at":{"type":"string"},"verify_ownership":{"type":"boolean"},"vm_id":{"type":"string"},"vm_port":{"type":"integer"}},"type":"object"},"models.DomainAlreadyLinkedResponse":{"properties":{"current_target":{"type":"string"},"error":{"type":"string"},"message":{"type":"string"}},"type":"object"},"models.DomainLinkRequest":{"properties":{"function_id":{"type":"string"},"path":{"type":"string"},"vm_id":{"type":"string"},"vm_port":{"maximum":65535,"minimum":1,"type":"integer"}},"type":"object"},"models.DomainTargetType":{"enum":["vm","serverless"],"type":"string","x-enum-varnames":["TargetTypeVM","TargetTypeServerless"]},"models.ErrorResponse":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"},"models.GitRepoSpec":{"properties":{"branch":{"type":"string"},"path":{"description":"Path is the optional destination directory. When empty, the repo is\ncloned to /home/user/<repo_name>. A relative path is taken relative to\n/home/user; an absolute path is used as-is.","type":"string"},"url":{"type":"string"}},"required":["url"],"type":"object"},"models.UsageHistoryResponse":{"properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"sessions":{"items":{"$ref":"#/components/schemas/models.UsageSessionResponse"},"type":"array","uniqueItems":false}},"type":"object"},"models.UsageSessionResponse":{"properties":{"cost_per_hour":{"type":"number"},"duration_minutes":{"type":"number"},"end_reason":{"type":"string"},"ended_at":{"type":"string"},"id":{"type":"integer"},"memory_mb":{"type":"integer"},"started_at":{"type":"string"},"total_cost_billed":{"type":"number"},"vcpu_count":{"type":"integer"},"vm_id":{"type":"string"}},"type":"object"},"models.VMCreateRequest":{"properties":{"env":{"additionalProperties":{"type":"string"},"description":"Env injects caller-supplied environment variables into the VM at creation\n(#222 — agent-api vault environment_variable credentials). Written as\nsource='provision' (never returned by GET /env, write-only), validated like\nuser env (reserved prefixes + LD_*/PATH/IFS + value safety) and rejected if\na key uses a reserved system prefix. The VALUES are secrets — never logged.","type":"object"},"folder_id":{"description":"Workspace folder mounting (optional)","type":"string"},"git_branch":{"type":"string"},"git_repo_url":{"description":"Git clone on creation (optional). GitRepoURL/GitBranch are the legacy\nsingle-repo fields; GitRepos clones multiple repos. When both are set,\nthe legacy repo is cloned first and duplicate URLs are de-duplicated.","type":"string"},"git_repos":{"items":{"$ref":"#/components/schemas/models.GitRepoSpec"},"type":"array","uniqueItems":false},"name":{"type":"string"},"skip_folder_create":{"description":"SkipFolderCreate suppresses auto-creating a workspace folder when FolderID is\nempty (a workspace VM then gets skills + workspace-sync wiring but no folder).\nSet by ephemeral provisioners (build-api resolveVM); folders are synced only\nwhen an explicit folder_id is passed in, never auto-created.","type":"boolean"},"template_id":{"type":"string"},"vm_id":{"type":"string"}},"type":"object"}},"securitySchemes":{"BearerAuth":{"bearerFormat":"JWT","description":"Supabase JWT Bearer token","scheme":"bearer","type":"http"}}},"info":{"description":"VM orchestration API for Firecracker microVMs.","title":"Infra API","version":"1.0"},"externalDocs":{"description":"","url":""},"paths":{"/api/v1/build/jobs":{"get":{"operationId":"listBuildJobs","parameters":[{"description":"Organization id","in":"query","name":"org_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.BuildJobListResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"}},"security":[{"BearerAuth":[]}],"summary":"List build jobs","tags":["build"]},"post":{"description":"Validates the spec and enqueues a queued build job. The\ndispatcher (build-machines P2) runs it on an ephemeral VM.","operationId":"createBuildJob","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/models.CreateBuildJobRequest","summary":"request","description":"Build job"}]}}},"description":"Build job","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.BuildJobResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Too Many Requests"}},"security":[{"BearerAuth":[]}],"summary":"Submit a build job","tags":["build"]}},"/api/v1/build/jobs/{id}":{"get":{"operationId":"getBuildJob","parameters":[{"description":"Build job id","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.BuildJobResponse"}}},"description":"OK"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Get a build job","tags":["build"]}},"/api/v1/build/jobs/{id}/cancel":{"post":{"description":"Flags the job for cancellation (or cancels it outright if still\nqueued). Idempotent on a terminal job.","operationId":"cancelBuildJob","parameters":[{"description":"Build job id","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.BuildJobResponse"}}},"description":"OK"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Cancel a build job","tags":["build"]}},"/api/v1/build/jobs/{id}/logs":{"get":{"description":"Returns the most recent log lines. Phase-A logs are\nRedis-stream-only and ephemeral (durable tail is P3).","operationId":"getBuildJobLogs","parameters":[{"description":"Build job id","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Max lines (default 500)","in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.BuildLogsResponse"}}},"description":"OK"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Get build job logs","tags":["build"]}},"/api/v1/build/jobs/{id}/logs/stream":{"get":{"description":"SSE live-tail. Accepts ?token= for EventSource auth.","operationId":"streamBuildJobLogs","parameters":[{"description":"Build job id","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Stream id to resume from (default newest)","in":"query","name":"from","schema":{"type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"type":"string"}}},"description":"event stream"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Stream build job logs","tags":["build"]}},"/api/v1/compute/uploads":{"post":{"description":"Returns a 30-min signed PUT URL plus the canonical binary_url","operationId":"createUpload","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/models.ComputeUploadRequest","summary":"request","description":"Upload metadata"}]}}},"description":"Upload metadata","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ComputeUploadResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Issue a signed upload URL for a compute binary","tags":["compute"]}},"/api/v1/databases":{"get":{"description":"Returns all databases for the authenticated user","operationId":"listDatabases","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/handlers.databaseResponse"},"type":"array"}}},"description":"OK"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List databases","tags":["databases"]},"post":{"description":"Provisions a managed Postgres database in a Firecracker VM","operationId":"createDatabase","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/handlers.createDatabaseRequest","summary":"request","description":"Database creation parameters"}]}}},"description":"Database creation parameters","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/handlers.createDatabaseResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Create a database","tags":["databases"]}},"/api/v1/databases/{db_id}":{"delete":{"description":"Deletes a database, its VM, service routes, and linked function env vars","operationId":"deleteDatabase","parameters":[{"description":"Database ID","in":"path","name":"db_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"}},"type":"object"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Delete a database","tags":["databases"]},"get":{"description":"Returns a single database by ID","operationId":"getDatabase","parameters":[{"description":"Database ID","in":"path","name":"db_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/handlers.databaseResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Get a database","tags":["databases"]}},"/api/v1/databases/{db_id}/backups":{"get":{"description":"Returns all backups for the specified database","operationId":"listBackups","parameters":[{"description":"Database ID","in":"path","name":"db_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/handlers.backupResponse"},"type":"array"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List backups","tags":["databases"]},"post":{"description":"Triggers a pg_dump backup for the specified database","operationId":"createBackup","parameters":[{"description":"Database ID","in":"path","name":"db_id","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/handlers.backupResponse"}}},"description":"Accepted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Create a backup","tags":["databases"]}},"/api/v1/databases/{db_id}/backups/{backup_id}":{"delete":{"description":"Deletes the backup file from GCS and the metadata record","operationId":"deleteBackup","parameters":[{"description":"Database ID","in":"path","name":"db_id","required":true,"schema":{"type":"string"}},{"description":"Backup ID","in":"path","name":"backup_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"}},"type":"object"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Delete a backup","tags":["databases"]},"get":{"description":"Returns a single backup by ID","operationId":"getBackup","parameters":[{"description":"Database ID","in":"path","name":"db_id","required":true,"schema":{"type":"string"}},{"description":"Backup ID","in":"path","name":"backup_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/handlers.backupResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Get a backup","tags":["databases"]}},"/api/v1/databases/{db_id}/backups/{backup_id}/restore":{"post":{"description":"Restores the database from the specified backup (destructive)","operationId":"restoreBackup","parameters":[{"description":"Database ID","in":"path","name":"db_id","required":true,"schema":{"type":"string"}},{"description":"Backup ID","in":"path","name":"backup_id","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"}},"type":"object"}}},"description":"Accepted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Restore from backup","tags":["databases"]}},"/api/v1/databases/{db_id}/client-access/disable":{"post":{"description":"Restores master-token-only auth on db-proxy.","operationId":"disableClientAccess","parameters":[{"description":"Database ID","in":"path","name":"db_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/handlers.databaseResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Disable client-access on a database","tags":["databases"]}},"/api/v1/databases/{db_id}/client-access/enable":{"post":{"description":"Activates JWT + anon auth on db-proxy for an existing DB.","operationId":"enableClientAccess","parameters":[{"description":"Database ID","in":"path","name":"db_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/handlers.databaseResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Enable client-access on a database","tags":["databases"]}},"/api/v1/domains":{"get":{"operationId":"listDomains","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.CustomDomainListResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List custom domains","tags":["domains"]},"post":{"description":"Begins custom domain registration and returns DNS instructions","operationId":"initiateDomain","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/models.CustomDomainInitRequest","summary":"request","description":"Domain registration"}]}}},"description":"Domain registration","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.CustomDomainInitResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"}},"security":[{"BearerAuth":[]}],"summary":"Initiate custom domain","tags":["domains"]}},"/api/v1/domains/activate":{"post":{"description":"Verifies DNS records and activates the domain","operationId":"activateDomain","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/models.CustomDomainActivateRequest","summary":"request","description":"Domain to activate"}]}}},"description":"Domain to activate","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.CustomDomainActivateResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Activate custom domain","tags":["domains"]}},"/api/v1/domains/{domain}":{"delete":{"operationId":"deleteDomain","parameters":[{"description":"Domain name","in":"path","name":"domain","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Delete custom domain","tags":["domains"]},"get":{"description":"Returns the status and DNS info for a custom domain","operationId":"getDomainStatus","parameters":[{"description":"Domain name","in":"path","name":"domain","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.CustomDomainStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Get domain status","tags":["domains"]}},"/api/v1/domains/{domain}/link":{"delete":{"operationId":"unlinkDomain","parameters":[{"description":"Domain name","in":"path","name":"domain","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Unlink custom domain","tags":["domains"]},"post":{"description":"Attaches a registered domain to either a serverless function\n(function_id) or a VM service (vm_id + vm_port). The domain\nmust not already be linked; unlink first.","operationId":"linkDomain","parameters":[{"description":"Domain name","in":"path","name":"domain","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/models.DomainLinkRequest","summary":"request","description":"Link target"}]}}},"description":"Link target","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.CustomDomainActivateResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.DomainAlreadyLinkedResponse"}}},"description":"Conflict"}},"security":[{"BearerAuth":[]}],"summary":"Link custom domain to a target","tags":["domains"]}},"/api/v1/github/app-info":{"get":{"description":"Returns app name, installation URL, and OAuth details","operationId":"getGitHubAppInfo","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"app_name":{"type":"string"},"client_id":{"type":"string"},"installation_url":{"type":"string"}},"type":"object"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get GitHub App info","tags":["github"]}},"/api/v1/github/disconnect":{"delete":{"description":"Removes the user's stored GitHub token","operationId":"disconnectGitHub","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"}},"type":"object"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Disconnect GitHub","tags":["github"]}},"/api/v1/github/repos":{"get":{"description":"Lists GitHub repositories accessible to the user","operationId":"getUserRepositories","parameters":[{"description":"Page number","in":"query","name":"page","schema":{"type":"integer"}},{"description":"Items per page (max 100)","in":"query","name":"per_page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"repos":{"items":{"properties":{"full_name":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List user repositories","tags":["github"]}},"/api/v1/github/repos/{owner}/{repo}/branches":{"get":{"description":"Lists all branches for a GitHub repository","operationId":"getRepoBranches","parameters":[{"description":"Repository owner","in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"description":"Repository name","in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"branches":{"items":{"properties":{"name":{"type":"string"},"protected":{"type":"boolean"}},"type":"object"},"type":"array"},"owner":{"type":"string"},"repo":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List repo branches","tags":["github"]}},"/api/v1/github/repositories/create":{"post":{"description":"Creates a GitHub repository using the user's linked account","operationId":"createRepositoryFromSupabase","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"description":{"type":"string"},"name":{"type":"string"},"private":{"type":"boolean"}},"title":"request","type":"object"}]}}},"description":"Repo details","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"html_url":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"}},"type":"object"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Create GitHub repository","tags":["github"]}},"/api/v1/github/save-token":{"post":{"description":"Exchanges an OAuth code for a token and stores it","operationId":"saveGitHubToken","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"code":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"OAuth code","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Save GitHub token","tags":["github"]}},"/api/v1/github/status":{"get":{"description":"Checks GitHub account linkage and app installation status","operationId":"getGitHubStatus","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"connected":{"type":"boolean"},"installed":{"type":"boolean"},"username":{"type":"string"}},"type":"object"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Get GitHub status","tags":["github"]}},"/api/v1/github/token-info":{"get":{"description":"Returns scopes and user info for the stored token","operationId":"getGitHubTokenInfo","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"scopes":{"type":"string"},"token_preview":{"type":"string"}},"type":"object"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Get GitHub token info","tags":["github"]}},"/api/v1/organizations/{org_id}/domains":{"get":{"description":"Returns every domain (any target type) owned by the org.","operationId":"listForOrg","parameters":[{"description":"Organization ID","in":"path","name":"org_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.CustomDomainListResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List domains for an organization","tags":["domains"]}},"/api/v1/proxies":{"post":{"description":"Registers a proxy entry that exposes a VM-internal port at a public hostname via Traefik","operationId":"registerProxy","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"deployment_type":{"type":"string"},"domain":{"type":"string"},"path":{"type":"string"},"service_name":{"type":"string"},"vm_id":{"type":"string"},"vm_port":{"type":"integer"}},"title":"request","type":"object"}]}}},"description":"Service registration","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"deployment_type":{"type":"string"},"external_url":{"type":"string"},"id":{"type":"string"},"service_name":{"type":"string"},"vm_id":{"type":"string"},"vm_port":{"type":"integer"}},"type":"object"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Register a proxy entry","tags":["proxies"]}},"/api/v1/proxies/vm/{vm_id}":{"get":{"operationId":"listProxies","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"services":{"items":{"properties":{"external_url":{"type":"string"},"id":{"type":"string"},"service_name":{"type":"string"}},"type":"object"},"type":"array"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"List proxy entries for VM","tags":["proxies"]}},"/api/v1/proxies/{id}":{"delete":{"description":"Removes a registered proxy entry and its Traefik routes","operationId":"unregisterProxy","parameters":[{"description":"Service ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Unregister a proxy entry","tags":["proxies"]}},"/api/v1/usage":{"get":{"description":"Returns paginated VM compute usage sessions","operationId":"getUsage","parameters":[{"description":"Page size (default 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Offset (default 0)","in":"query","name":"offset","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.UsageHistoryResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Get usage history","tags":["usage"]}},"/api/v1/vms":{"get":{"operationId":"listVMs","responses":{"200":{"content":{"application/json":{"schema":{"items":{"properties":{"ip_address":{"type":"string"},"status":{"type":"string"},"vm_id":{"type":"string"}},"type":"object"},"type":"array"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List user VMs","tags":["vms"]},"post":{"description":"Creates a new Firecracker microVM from a template","operationId":"createVM","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/models.VMCreateRequest","summary":"request","description":"VM creation parameters"}]}}},"description":"VM creation parameters","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"ip_address":{"type":"string"},"memory_mb":{"type":"integer"},"name":{"type":"string"},"node_id":{"type":"string"},"status":{"type":"string"},"user_id":{"type":"string"},"vcpu_count":{"type":"integer"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"},"503":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Service Unavailable"}},"security":[{"BearerAuth":[]}],"summary":"Create a VM","tags":["vms"]}},"/api/v1/vms/external/{external_ref}":{"get":{"description":"Retrieves a VM by its external reference identifier","operationId":"getVMByExternalRef","parameters":[{"description":"External reference","in":"path","name":"external_ref","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"external_ref":{"type":"string"},"status":{"type":"string"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Get VM by external ref","tags":["vms"]}},"/api/v1/vms/sandbox":{"post":{"description":"Creates a sandbox VM, executes code, and returns the result. VM auto-deletes after TTL.","operationId":"createVMAndRunCommand","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"args":{"items":{"type":"string"},"type":"array"},"code":{"type":"string"},"command":{"type":"string"},"language":{"type":"string"},"timeout":{"type":"integer"},"ttl":{"type":"integer"}},"title":"request","type":"object"}]}}},"description":"Sandbox request","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"command":{"properties":{"exit_code":{"type":"integer"},"stderr":{"type":"string"},"stdout":{"type":"string"}},"type":"object"},"ttl":{"type":"integer"},"vm":{"properties":{"status":{"type":"string"},"vm_id":{"type":"string"}},"type":"object"}},"type":"object"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"},"503":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Service Unavailable"}},"security":[{"BearerAuth":[]}],"summary":"Create sandbox VM","tags":["vms"]}},"/api/v1/vms/{vm_id}":{"delete":{"description":"Deletes a specific VM and cleans up associated resources","operationId":"deleteVM","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Delete a VM","tags":["vms"]},"get":{"description":"Retrieves information about a specific VM","operationId":"getVM","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ip_address":{"type":"string"},"status":{"type":"string"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Get a VM","tags":["vms"]}},"/api/v1/vms/{vm_id}/env":{"get":{"operationId":"listEnv","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}},{"description":"Only \\","in":"query","name":"source","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"env":{"type":"object"}},"type":"object"}}},"description":"OK"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"}},"security":[{"BearerAuth":[]}],"summary":"List VM env vars","tags":["vm-env"]},"patch":{"operationId":"patchEnv","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}},{"description":"plaintext|sensitive|secret; omit to leave existing keys' visibility unchanged","in":"query","name":"visibility","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"title":"body","type":"object"}}},"description":"KEY=VALUE map","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"env":{"type":"object"},"warning":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"}},"security":[{"BearerAuth":[]}],"summary":"Upsert VM env vars","tags":["vm-env"]},"put":{"operationId":"replaceEnv","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}},{"description":"plaintext|sensitive|secret (default sensitive)","in":"query","name":"visibility","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"title":"body","type":"object"}}},"description":"KEY=VALUE map","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"env":{"type":"object"},"warning":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"}},"security":[{"BearerAuth":[]}],"summary":"Replace VM env vars","tags":["vm-env"]}},"/api/v1/vms/{vm_id}/env/refresh-system":{"post":{"operationId":"refreshSystemEnv","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"status":{"type":"string"},"warning":{"type":"string"}},"type":"object"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Gateway"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Service Unavailable"}},"security":[{"BearerAuth":[]}],"summary":"Refresh a VM's system GitHub credentials","tags":["vm-env"]}},"/api/v1/vms/{vm_id}/env/sync-session":{"delete":{"operationId":"desyncSession","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"status":{"type":"string"},"warning":{"type":"string"}},"type":"object"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Remove a VM's synced ccp session","tags":["vm-env"]},"post":{"operationId":"syncSession","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"status":{"type":"string"},"warning":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Sync the caller's ccp session into a VM","tags":["vm-env"]}},"/api/v1/vms/{vm_id}/env/{key}":{"delete":{"operationId":"deleteEnv","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}},{"description":"Env var key","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"env":{"type":"object"},"warning":{"type":"string"}},"type":"object"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Delete a VM env var","tags":["vm-env"]},"get":{"operationId":"getEnv","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}},{"description":"Env var key","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"key":{"type":"string"},"value":{"type":"string"},"visibility":{"type":"string"}},"type":"object"}}},"description":"OK"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}},"description":"Not Found"}},"security":[{"BearerAuth":[]}],"summary":"Get a VM env var value","tags":["vm-env"]}},"/api/v1/vms/{vm_id}/envd/delete":{"post":{"description":"Deletes a file or directory on a VM","operationId":"deleteFile","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"path":{"type":"string"},"recursive":{"type":"boolean"}},"title":"request","type":"object"}]}}},"description":"File path","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"path":{"type":"string"},"success":{"type":"boolean"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Delete file","tags":["envd"]}},"/api/v1/vms/{vm_id}/envd/exec":{"post":{"description":"Executes a command on a VM via envd","operationId":"executeCommand","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"args":{"items":{"type":"string"},"type":"array"},"background":{"type":"boolean"},"command":{"type":"string"},"timeout":{"type":"integer"},"working_dir":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"Command","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"background":{"type":"boolean"},"duration":{"type":"string"},"error":{"type":"string"},"exit_code":{"type":"integer"},"process_id":{"type":"string"},"stderr":{"type":"string"},"stdout":{"type":"string"},"timeout":{"type":"boolean"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Execute command","tags":["envd"]}},"/api/v1/vms/{vm_id}/envd/health":{"get":{"description":"Checks if envd is healthy on a VM","operationId":"checkEnvdHealth","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"status":{"type":"string"},"version":{"type":"string"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Check envd health","tags":["envd"]}},"/api/v1/vms/{vm_id}/envd/install-packages":{"post":{"description":"Installs system packages on the VM using apt-get","operationId":"installPackages","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"packages":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"update_first":{"type":"boolean"}},"title":"request","type":"object"}]}}},"description":"Packages","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Install packages","tags":["envd"]}},"/api/v1/vms/{vm_id}/envd/list":{"post":{"description":"Lists directory contents on a VM with optional recursion","operationId":"listDirectory","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"max_depth":{"type":"integer"},"max_entries":{"type":"integer"},"path":{"type":"string"},"recursive":{"type":"boolean"},"show_hidden":{"type":"boolean"}},"title":"request","type":"object"}]}}},"description":"List options","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"entries":{"items":{"properties":{"is_dir":{"type":"boolean"},"name":{"type":"string"},"path":{"type":"string"},"size":{"type":"integer"}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List directory","tags":["envd"]}},"/api/v1/vms/{vm_id}/envd/ls":{"get":{"description":"GET-based directory listing with query parameters","operationId":"listDirectorySimple","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}},{"description":"Directory path (default: /home/user)","in":"query","name":"path","schema":{"type":"string"}},{"description":"Recursive listing","in":"query","name":"recursive","schema":{"type":"boolean"}},{"description":"Show hidden files","in":"query","name":"show_hidden","schema":{"type":"boolean"}},{"description":"Max recursion depth","in":"query","name":"max_depth","schema":{"type":"integer"}},{"description":"Max entries to return","in":"query","name":"max_entries","schema":{"type":"integer"}},{"description":"Use default ignore patterns","in":"query","name":"use_default_ignores","schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"entries":{"items":{"properties":{"is_dir":{"type":"boolean"},"name":{"type":"string"},"path":{"type":"string"},"size":{"type":"integer"}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List directory (simple)","tags":["envd"]}},"/api/v1/vms/{vm_id}/envd/mkdir":{"post":{"description":"Creates a directory on a VM","operationId":"createDirectory","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"mode":{"type":"string"},"path":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"Directory path","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"path":{"type":"string"},"success":{"type":"boolean"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Create directory","tags":["envd"]}},"/api/v1/vms/{vm_id}/envd/read":{"post":{"description":"Reads a file from a VM","operationId":"readFile","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"path":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"File path","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"content":{"type":"string"},"path":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Read file","tags":["envd"]}},"/api/v1/vms/{vm_id}/envd/update-system":{"post":{"description":"Runs apt-get update and upgrade on the VM","operationId":"updateSystem","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"timeout":{"type":"integer"}},"title":"request","type":"object"}]}}},"description":"Options","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Update system","tags":["envd"]}},"/api/v1/vms/{vm_id}/envd/write":{"post":{"description":"Writes a file to a VM (content must be base64-encoded)","operationId":"writeFile","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"content":{"type":"string"},"mode":{"type":"string"},"path":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"File content (base64)","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"path":{"type":"string"},"success":{"type":"boolean"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Write file","tags":["envd"]}},"/api/v1/vms/{vm_id}/external-ref":{"put":{"description":"Sets or updates the external reference for a VM","operationId":"updateVMExternalRef","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"external_ref":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"External ref","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"external_ref":{"type":"string"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Update VM external ref","tags":["vms"]}},"/api/v1/vms/{vm_id}/git/clone":{"post":{"description":"Clones a git repository into the VM","operationId":"clone","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"branch":{"type":"string"},"depth":{"type":"integer"},"repo_url":{"type":"string"},"timeout":{"type":"integer"},"working_dir":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"Clone options","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"stderr":{"type":"string"},"stdout":{"type":"string"},"success":{"type":"boolean"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Clone repository","tags":["git"]}},"/api/v1/vms/{vm_id}/git/commit-push":{"post":{"description":"Commits and pushes changes to a git repository","operationId":"commitPush","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"branch":{"type":"string"},"commit_message":{"type":"string"},"remote_url":{"type":"string"},"repo_name":{"type":"string"},"timeout":{"type":"integer"},"working_dir":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"Options","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"stderr":{"type":"string"},"stdout":{"type":"string"},"success":{"type":"boolean"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Commit and push","tags":["git"]}},"/api/v1/vms/{vm_id}/git/init":{"post":{"description":"Initializes a git repository in the VM working directory","operationId":"init","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"branch":{"type":"string"},"working_dir":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"Init options","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"stderr":{"type":"string"},"stdout":{"type":"string"},"success":{"type":"boolean"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Init git repository","tags":["git"]}},"/api/v1/vms/{vm_id}/git/init-commit-push":{"post":{"description":"Initializes a git repo, creates a GitHub repo, and pushes","operationId":"initCommitPush","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"branch":{"type":"string"},"description":{"type":"string"},"private":{"type":"boolean"},"repo_name":{"type":"string"},"timeout":{"type":"integer"},"working_dir":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"Options","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"stderr":{"type":"string"},"stdout":{"type":"string"},"success":{"type":"boolean"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Init, commit, and push","tags":["git"]}},"/api/v1/vms/{vm_id}/github":{"delete":{"description":"Removes all GitHub repository links from a VM","operationId":"unlinkGitHubRepoFromVM","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Unlink GitHub repos from VM","tags":["vms-github"]}},"/api/v1/vms/{vm_id}/github/create":{"post":{"description":"Creates a new GitHub repository and links it to the VM","operationId":"createAndLinkGitHubRepoToVM","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"description":{"type":"string"},"private":{"type":"boolean"},"repo_name":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"Repo details","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"github_repo":{"properties":{"id":{"type":"string"},"repo_url":{"type":"string"}},"type":"object"},"message":{"type":"string"}},"type":"object"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Create and link GitHub repo","tags":["vms-github"]}},"/api/v1/vms/{vm_id}/github/repos":{"get":{"operationId":"listGitHubReposForVM","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"repos":{"items":{"properties":{"id":{"type":"string"},"repo_name":{"type":"string"},"repo_url":{"type":"string"}},"type":"object"},"type":"array"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"List GitHub repos for VM","tags":["vms-github"]}},"/api/v1/vms/{vm_id}/github/repos/{repo_id}":{"delete":{"description":"Removes a specific GitHub repository link from a VM","operationId":"deleteGitHubRepo","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}},{"description":"Repo ID","in":"path","name":"repo_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Delete GitHub repo link","tags":["vms-github"]}},"/api/v1/vms/{vm_id}/pause":{"post":{"description":"Pauses a running VM and creates a snapshot","operationId":"pauseVM","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"snapshot_path":{"type":"string"},"status":{"type":"string"},"success":{"type":"boolean"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Pause a VM","tags":["vms"]}},"/api/v1/vms/{vm_id}/resume":{"post":{"description":"Resumes a paused VM from its snapshot","operationId":"resumeVM","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ip_address":{"type":"string"},"status":{"type":"string"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Resume a VM","tags":["vms"]}},"/api/v1/vms/{vm_id}/ssh/keys":{"post":{"description":"Adds an SSH public key to a VM's authorized_keys","operationId":"addSSHKey","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"comment":{"type":"string"},"public_key":{"type":"string"}},"title":"request","type":"object"}]}}},"description":"SSH key","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"success":{"type":"boolean"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Add SSH key to VM","tags":["ssh"]}},"/api/v1/vms/{vm_id}/start":{"post":{"description":"Starts a stopped or paused VM","operationId":"startVM","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ip_address":{"type":"string"},"status":{"type":"string"},"vm_id":{"type":"string"}},"type":"object"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Start a VM","tags":["vms"]}},"/api/v1/vms/{vm_id}/upload-files":{"post":{"description":"Downloads files from signed URLs into /mnt/uploads inside a VM","operationId":"uploadFilesToVM","parameters":[{"description":"VM ID","in":"path","name":"vm_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"properties":{"files":{"items":{"properties":{"filename":{"type":"string"},"url":{"type":"string"}},"type":"object"},"type":"array"}},"title":"request","type":"object"}]}}},"description":"Files to upload","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"failed":{"items":{"properties":{"error":{"type":"string"},"filename":{"type":"string"}},"type":"object"},"type":"array"},"uploaded":{"items":{"properties":{"filename":{"type":"string"},"path":{"type":"string"}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"type":"object"}}},"description":"Internal Server Error"}},"security":[{"BearerAuth":[]}],"summary":"Upload files to a VM","tags":["vms"]}},"/health":{"get":{"operationId":"healthCheck","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"status":{"type":"string"},"time":{"type":"string"}},"type":"object"}}},"description":"OK"}},"summary":"Health check","tags":["system"]}}},"openapi":"3.1.0","servers":[{"description":"Production","url":"https://api.clusterbase.dev"}]}