{"consumes":["application/json"],"produces":["application/json"],"swagger":"2.0","info":{"description":"JSON request bodies are limited to 4 MiB of encoded bytes and must contain\nexactly one object matching the endpoint schema. Unknown fields, null, and\ntrailing data return 400. Oversized bodies return 413 before mutation.\nControl actions accept an empty body or an empty JSON object.\n\nPermission order: viewer < deployer < maintainer < admin.\nDeployers can start existing releases, retry, re-run, and cancel deployments.\nMaintainers can author content and execute runbooks within admin boundaries.\nProject membership and token ceilings also limit each operation.\nExplicit-role tokens cannot manage API tokens.\nUnrestricted global tokens can change their owner's local password with\ncurrent-password verification, including for Viewer and Deployer owners.\n\nRequests use the host, port, and scheme that serve this specification.","title":"durpdeploy REST API.","version":"1.0.0"},"basePath":"/api/v1","paths":{"/admin/agents":{"get":{"tags":["admin-agents"],"summary":"List agents.","operationId":"listAgents","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AgentListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/agents/pair":{"post":{"tags":["admin-agents"],"summary":"Pair an agent.","operationId":"pairAgent","parameters":[{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/PairAgentRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/PairAgentResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"503":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/agents/{id}":{"get":{"tags":["admin-agents"],"summary":"Get an agent and its labels.","operationId":"getAgent","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AgentDetailResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["admin-agents"],"summary":"Delete an agent from the inventory, retaining deployment history.","operationId":"deleteAgent","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/agents/{id}/drain":{"post":{"tags":["admin-agents"],"summary":"Stop new claims without cancelling issued work. Repeated calls are harmless.","operationId":"drainAgent","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/agents/{id}/environments":{"post":{"tags":["admin-agents"],"summary":"Assign an environment routing label to an agent.","operationId":"addAgentEnvironment","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/AgentEnvironmentRequest"}}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["admin-agents"],"summary":"Remove an environment routing label from an agent.","operationId":"deleteAgentEnvironment","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/AgentEnvironmentRequest"}}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/agents/{id}/labels":{"post":{"tags":["admin-agents"],"summary":"Add an agent label.","operationId":"addAgentLabel","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/AgentLabelRequest"}}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["admin-agents"],"summary":"Delete an agent label.","operationId":"deleteAgentLabel","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/AgentLabelRequest"}}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/agents/{id}/resume":{"post":{"tags":["admin-agents"],"summary":"Resume new claims. Repeated calls are harmless.","operationId":"resumeAgent","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/agents/{id}/retry-pair":{"post":{"tags":["admin-agents"],"summary":"Retry pairing an agent.","operationId":"retryPairAgent","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/PairAgentRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/PairAgentResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"503":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/agents/{id}/revoke":{"post":{"tags":["admin-agents"],"summary":"Revoke an agent.","operationId":"revokeAgent","parameters":[{"type":"string","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}}},"security":[{"bearer":[]}]}},"/admin/audit":{"get":{"produces":["application/json"],"tags":["admin"],"summary":"List audit log entries.","operationId":"auditLog","parameters":[{"type":"string","x-go-name":"User","description":"Exact current actor name or email. ASCII case is ignored.","name":"user","in":"query"},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"UserID","name":"user_id","in":"query"},{"type":"string","x-go-name":"Action","name":"action","in":"query"},{"type":"string","x-go-name":"EntityType","name":"entity_type","in":"query"}],"responses":{"200":{"description":"AuditLogListResponse is a list of audit log entries.","schema":{"$ref":"#/definitions/AuditLogListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/database-security":{"get":{"produces":["application/json"],"tags":["admin"],"summary":"Get configured database transport security and warnings.","operationId":"databaseSecurity","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DatabaseSecurityResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/db-tables":{"get":{"produces":["application/json"],"tags":["admin"],"summary":"List database tables.","operationId":"dbTables","responses":{"200":{"description":"DbTableListResponse is a list of SQLite table names.","schema":{"$ref":"#/definitions/DbTableListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/maintenance":{"post":{"tags":["admin"],"summary":"Run maintenance tasks.","operationId":"maintenance","responses":{"200":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/notifications":{"get":{"produces":["application/json"],"tags":["admin"],"operationId":"listNotifications","responses":{"200":{"description":"NotificationEventListResponse is a list of notification events.","schema":{"$ref":"#/definitions/NotificationEventListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/notifications/settings":{"get":{"produces":["application/json"],"tags":["admin"],"operationId":"getNotificationSettings","responses":{"200":{"description":"GlobalNotification holds the global notification settings.","schema":{"$ref":"#/definitions/GlobalNotification"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["admin"],"operationId":"updateNotificationSettings","responses":{"200":{"description":"GlobalNotification holds the global notification settings.","schema":{"$ref":"#/definitions/GlobalNotification"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/secret-exports":{"post":{"description":"Require an instance administrator and a global bearer token with admin permission.\nOpen approval_url in a browser as the same user. Confirm the selected scope.\nReauthenticate with the local password or OAuth/OIDC, including required MFA.\nEach export requires new authentication. The request expires after five minutes.\nKeep claim_token private. It is returned once and never belongs in a URL.","tags":["variables"],"summary":"Request an export of secret-marked project or shared lifecycle variables.","operationId":"requestSecretExport","parameters":[{"name":"body","in":"body","required":true,"schema":{"type":"object","required":["scope","scope_id"],"properties":{"scope":{"type":"string","enum":["project","lifecycle"]},"scope_id":{"type":"integer","format":"int64","minimum":1}}}}],"responses":{"201":{"description":"Pending export. No secret values are returned.","schema":{"type":"object","properties":{"approval_url":{"description":"Relative browser URL. This identifier does not authorize a download.","type":"string"},"claim_token":{"description":"Single-use download credential. Store it securely until approval.","type":"string"},"expires_at":{"type":"integer","format":"int64"},"id":{"type":"string"}}}},"400":{"description":"Invalid request or scope."},"401":{"description":"Missing or invalid bearer token."},"403":{"description":"Instance administrator and global token required."},"404":{"description":"Project or lifecycle not found."},"413":{"description":"Request exceeds the JSON body limit."},"500":{"description":"Export request failed."}}}},"/admin/secret-exports/{exportId}/download":{"post":{"description":"Require the original bearer token and claim_token after browser reauthentication.\nThe approving browser session must remain valid. Logout invalidates approval.\nProject administrators without the global admin role cannot export secrets.\nOrdinary variable reads remain masked. Non-secret variables and snapshots are excluded.\nSuccessful downloads generate an audit event without secret values.","tags":["variables"],"summary":"Download an approved export once as a JSON attachment.","operationId":"downloadSecretExport","parameters":[{"type":"string","name":"exportId","in":"path","required":true},{"name":"body","in":"body","required":true,"schema":{"type":"object","required":["claim_token"],"properties":{"claim_token":{"type":"string"}}}}],"responses":{"200":{"description":"JSON attachment. Cache-Control is no-store.","schema":{"type":"object","properties":{"scope":{"type":"string"},"scope_id":{"type":"integer","format":"int64"},"variables":{"type":"array","items":{"type":"object","properties":{"environment_id":{"type":"integer","format":"int64","x-nullable":true},"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"value":{"description":"Plaintext secret value.","type":"string"}}}}}}},"400":{"description":"Invalid JSON body."},"401":{"description":"Missing or invalid bearer token."},"403":{"description":"Instance administrator and global token required."},"404":{"description":"Export is unapproved, expired, canceled, consumed, or bound to different credentials."},"413":{"description":"Request exceeds the JSON body limit."},"500":{"description":"Export failed. No partial export is returned."}}}},"/admin/stats":{"get":{"produces":["application/json"],"tags":["admin"],"summary":"Get server stats.","operationId":"stats","responses":{"200":{"description":"ServerStatsResponse contains aggregate counts.","schema":{"$ref":"#/definitions/ServerStatsResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/tokens":{"get":{"produces":["application/json"],"tags":["admin-tokens"],"summary":"List all API tokens (admin only).","operationId":"listAllTokens","parameters":[{"type":"integer","format":"int64","x-go-name":"UserID","name":"user_id","in":"query"},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"TokenListResponse is a list of API tokens.","schema":{"$ref":"#/definitions/TokenListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/tokens/{id}":{"delete":{"tags":["admin-tokens"],"summary":"Revoke any API token by ID (admin only).","operationId":"revokeAnyToken","parameters":[{"type":"string","x-go-name":"TokenID","description":"The API token ID.","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/users":{"get":{"produces":["application/json"],"tags":["admin-users"],"summary":"List all users.","operationId":"adminListUsers","parameters":[{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"UserListResponse is a list of users.","schema":{"$ref":"#/definitions/UserListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["admin-users"],"summary":"Create a user.","operationId":"adminCreateUser","parameters":[{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/UserRequest"}}],"responses":{"201":{"description":"User is a user account.","schema":{"$ref":"#/definitions/User"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/admin/users/{id}":{"get":{"produces":["application/json"],"tags":["admin-users"],"summary":"Get a user.","operationId":"adminGetUser","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"User is a user account.","schema":{"$ref":"#/definitions/User"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["admin-users"],"summary":"Update a user.","operationId":"adminUpdateUser","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/UserRequest"}}],"responses":{"200":{"description":"User is a user account.","schema":{"$ref":"#/definitions/User"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["admin-users"],"summary":"Delete a user.","operationId":"adminDeleteUser","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments":{"get":{"produces":["application/json"],"tags":["deployments"],"summary":"List deployments in projects accessible to the caller. Global admins see all projects.","operationId":"listAllDeployments","parameters":[{"type":"integer","format":"int64","description":"Positive project ID; inaccessible or nonexistent projects return an empty list.","name":"project_id","in":"query"}],"responses":{"200":{"description":"DeploymentListResponse is the paginated envelope for ListDeployments.","schema":{"$ref":"#/definitions/DeploymentListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/activity":{"get":{"tags":["deployments"],"summary":"Deployment counts for the last 14 UTC calendar days, including today.","operationId":"deploymentActivity","responses":{"200":{"description":"DeploymentActivityDay contains counts by current status for one UTC date.","schema":{"type":"array","items":{"$ref":"#/definitions/DeploymentActivityDay"}}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}":{"get":{"produces":["application/json"],"tags":["deployments"],"summary":"Get a deployment.","operationId":"getDeployment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"Deployment represents a release executing against an environment.","schema":{"$ref":"#/definitions/Deployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/approve":{"post":{"tags":["deployments"],"operationId":"approveDeployment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"Deployment represents a release executing against an environment.","schema":{"$ref":"#/definitions/Deployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/artifact-gates":{"get":{"tags":["deployments"],"summary":"List checksum-bound artifact reviews. Sensitive contents are omitted.","operationId":"listArtifactGates","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"$ref":"#/responses/ArtifactGateListResponse"},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/artifact-gates/{stepIndex}/approve":{"post":{"tags":["deployments"],"summary":"Approve this exact artifact revision and resume. Administrator only.","operationId":"approveArtifactGate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"StepIndex","description":"Zero-based generation step index.","name":"stepIndex","in":"path","required":true},{"name":"Body","in":"body","required":true,"schema":{"type":"object","required":["revision","sha256"],"properties":{"revision":{"type":"integer","format":"int64","x-go-name":"Revision"},"sha256":{"type":"string","x-go-name":"SHA256"}}}}],"responses":{"200":{"description":"Decision accepted"},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/artifact-gates/{stepIndex}/artifact":{"get":{"produces":["application/octet-stream"],"tags":["deployments"],"summary":"Download the exact sensitive artifact. Viewers cannot download artifacts.","operationId":"downloadArtifactGate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"StepIndex","description":"Zero-based generation step index.","name":"stepIndex","in":"path","required":true}],"responses":{"200":{"description":"Verified binary artifact"},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/artifact-gates/{stepIndex}/reject":{"post":{"tags":["deployments"],"summary":"Reject this exact artifact revision. Administrator only.","operationId":"rejectArtifactGate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"StepIndex","description":"Zero-based generation step index.","name":"stepIndex","in":"path","required":true},{"name":"Body","in":"body","required":true,"schema":{"type":"object","required":["revision","sha256"],"properties":{"revision":{"type":"integer","format":"int64","x-go-name":"Revision"},"sha256":{"type":"string","x-go-name":"SHA256"}}}}],"responses":{"200":{"description":"Decision accepted"},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/artifact-gates/{stepIndex}/review":{"get":{"description":"Review metadata is not independent verification of the saved plan.","tags":["deployments"],"summary":"Read redacted Terraform resource changes supplied by the step. Writers only.","operationId":"reviewArtifactGate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"StepIndex","description":"Zero-based generation step index.","name":"stepIndex","in":"path","required":true}],"responses":{"200":{"$ref":"#/responses/ArtifactGateReviewResponse"},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/cancel":{"post":{"tags":["deployments"],"summary":"Cancel a running deployment.","operationId":"cancelDeployment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"Deployment represents a release executing against an environment.","schema":{"$ref":"#/definitions/Deployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/events":{"get":{"produces":["text/event-stream"],"tags":["deployments"],"summary":"Stream deployment events as Server-Sent Events.","operationId":"deploymentEvents","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"StreamResponse is a server-sent event stream.","schema":{"$ref":"#/definitions/StreamResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/logs":{"get":{"produces":["application/json"],"tags":["deployments"],"summary":"List deployment step logs.","operationId":"listDeploymentLogs","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"DeploymentLogListResponse is a list of deployment log entries.","schema":{"$ref":"#/definitions/DeploymentLogListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/logs.txt":{"get":{"produces":["text/plain"],"tags":["logs"],"summary":"Export deployment logs as text.","operationId":"exportLogs","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"TextResponse is a plain text response.","schema":{"$ref":"#/definitions/TextResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/logs/page":{"get":{"description":"Text fields over 16 KiB are shortened. Use next_before for older rows.","tags":["logs"],"summary":"Read log previews within 500 rows and 1 MiB, ordered by increasing ID.","operationId":"pageDeploymentLogs","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"minimum":1,"type":"integer","format":"int64","x-go-name":"Before","description":"Return rows older than this ID. Omit to read the latest page.","name":"before","in":"query"}],"responses":{"200":{"description":"LogPage contains a bounded history window in increasing log-ID order.","schema":{"$ref":"#/definitions/LogPage"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}}}},"/deployments/{id}/logs/stream":{"get":{"description":"Stream deployment logs. The format=structured SSE option emits indexed\nstep logs and lifecycle states, supports after and Last-Event-ID cursors,\nand ends with a complete event. Default SSE and NDJSON remain text streams.\nAdd preview=true to structured streams for marked 16 KiB display previews.","produces":["text/event-stream","application/x-ndjson"],"tags":["logs"],"operationId":"streamLogs","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"string","x-go-name":"Format","description":"Format is sse, ndjson, or structured (SSE with step metadata).","name":"format","in":"query"},{"minimum":0,"type":"integer","format":"int64","x-go-name":"After","description":"Replay events with an ID greater than this cursor (structured only).","name":"after","in":"query"},{"type":"string","x-go-name":"LastEventID","description":"Reconnection cursor; overrides after (structured only).","name":"Last-Event-ID","in":"header"},{"type":"boolean","x-go-name":"Preview","description":"Bound structured display text to 16 KiB. Defaults to false.","name":"preview","in":"query"}],"responses":{"200":{"description":"StreamResponse is a server-sent event stream.","schema":{"$ref":"#/definitions/StreamResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/logs/{logId}":{"get":{"produces":["application/json"],"tags":["logs"],"summary":"Get a single deployment log entry.","operationId":"getLog","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"LogID","description":"The log entry ID.","name":"logId","in":"path","required":true}],"responses":{"200":{"description":"DeploymentLog is a single step log entry.","schema":{"$ref":"#/definitions/DeploymentLog"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/redeploy":{"post":{"tags":["deployments"],"operationId":"redeployDeployment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"201":{"description":"Deployment represents a release executing against an environment.","schema":{"$ref":"#/definitions/Deployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/retry":{"post":{"description":"Recheck lifecycle promotion and approval gates before retrying.","tags":["deployments"],"summary":"Retry a failed or cancelled deployment.","operationId":"retryDeployment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"201":{"description":"Deployment represents a release executing against an environment.","schema":{"$ref":"#/definitions/Deployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/rollback":{"get":{"tags":["deployments"],"summary":"Preview the latest prior successful different release in the same project and environment.","operationId":"previewRollback","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RollbackPreview"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"tags":["deployments"],"summary":"Create an audited deployment of the confirmed rollback target. Normal gates and approvals apply.","operationId":"rollbackDeployment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"name":"Body","in":"body","required":true,"schema":{"$ref":"#/definitions/rollbackRequest"}}],"responses":{"201":{"description":"Deployment represents a release executing against an environment.","schema":{"$ref":"#/definitions/Deployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/staging":{"get":{"tags":["deployments"],"summary":"List active staging transfer metadata. File contents are omitted.","operationId":"listDeploymentStaging","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"$ref":"#/responses/StagingListResponse"},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/status":{"get":{"produces":["application/json"],"tags":["deployments"],"operationId":"getDeploymentStatus","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"DeploymentStatusResponse is the status payload for GetDeploymentStatus.","schema":{"$ref":"#/definitions/DeploymentStatusResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/deployments/{id}/verification":{"get":{"tags":["deployments"],"summary":"Get the snapshotted verification check and its outcome.","operationId":"getDeploymentVerification","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DeploymentVerification"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/environments":{"get":{"produces":["application/json"],"tags":["environments"],"summary":"List all environments.","operationId":"listEnvironments","parameters":[{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"EnvironmentListResponse is a list of environments.","schema":{"$ref":"#/definitions/EnvironmentListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["environments"],"summary":"Create a new environment.","operationId":"createEnvironment","parameters":[{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/EnvironmentRequest"}}],"responses":{"201":{"description":"Environment represents a deployment target.","schema":{"$ref":"#/definitions/Environment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/environments/{id}":{"get":{"produces":["application/json"],"tags":["environments"],"summary":"Get an environment by ID.","operationId":"getEnvironment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"Environment represents a deployment target.","schema":{"$ref":"#/definitions/Environment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["environments"],"summary":"Update an environment.","operationId":"updateEnvironment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/EnvironmentRequest"}}],"responses":{"200":{"description":"Environment represents a deployment target.","schema":{"$ref":"#/definitions/Environment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"description":"Delete an environment.","tags":["environments"],"summary":"Global admin only; deletion also removes scoped shared variables.","operationId":"deleteEnvironment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/healthz":{"get":{"tags":["health"],"summary":"Public API liveness probe. This does not check database connectivity.","operationId":"healthzAPI","responses":{"200":{"description":"The HTTP API is running.","schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}},"400":{"description":"Unexpected request body."},"413":{"description":"Request body exceeds the encoded byte ceiling."}},"security":[]}},"/lifecycles":{"get":{"produces":["application/json"],"tags":["lifecycles"],"summary":"List all lifecycles.","operationId":"listLifecycles","parameters":[{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"LifecycleListResponse is a list of lifecycles.","schema":{"$ref":"#/definitions/LifecycleListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["lifecycles"],"summary":"Create a new lifecycle.","operationId":"createLifecycle","parameters":[{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/LifecycleRequest"}}],"responses":{"201":{"description":"Lifecycle represents a deployment promotion pipeline.","schema":{"$ref":"#/definitions/Lifecycle"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/lifecycles/{id}":{"get":{"produces":["application/json"],"tags":["lifecycles"],"summary":"Get a lifecycle with its stages.","operationId":"getLifecycle","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"LifecycleResponse is the detailed lifecycle payload.","schema":{"$ref":"#/definitions/LifecycleResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["lifecycles"],"summary":"Delete a lifecycle and its shared variables. Global admin only.","operationId":"deleteLifecycle","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}}}},"/lifecycles/{id}/save":{"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["lifecycles"],"summary":"Save a lifecycle name and description.","operationId":"saveLifecycle","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/LifecycleRequest"}}],"responses":{"200":{"description":"LifecycleResponse is the detailed lifecycle payload.","schema":{"$ref":"#/definitions/LifecycleResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/lifecycles/{id}/stages":{"post":{"description":"Positive sort_order values select an unoccupied position, including gaps.\nOmitted, zero, and negative sort_order values append after the highest position.","consumes":["application/json"],"produces":["application/json"],"tags":["lifecycles"],"summary":"Add a stage to a lifecycle. Global admin only.","operationId":"addLifecycleStage","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/LifecycleStageRequest"}}],"responses":{"201":{"description":"LifecycleStage is a single stage in a lifecycle.","schema":{"$ref":"#/definitions/LifecycleStage"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/lifecycles/{id}/stages/reorder":{"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["lifecycles"],"summary":"Reorder lifecycle stages. Global admin only.","operationId":"reorderLifecycleStages","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ReorderStagesRequest"}}],"responses":{"200":{"description":"LifecycleStageListResponse is a list of lifecycle stages.","schema":{"$ref":"#/definitions/LifecycleStageListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/lifecycles/{id}/stages/{stageId}":{"patch":{"consumes":["application/json"],"produces":["application/json"],"tags":["lifecycles"],"summary":"Update a lifecycle stage. Global admin only.","operationId":"updateLifecycleStage","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"StageID","description":"The lifecycle stage ID.","name":"stageId","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/LifecycleStageRequest"}}],"responses":{"200":{"description":"LifecycleStage is a single stage in a lifecycle.","schema":{"$ref":"#/definitions/LifecycleStage"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/lifecycles/{id}/stages/{stageId}/delete":{"post":{"tags":["lifecycles"],"summary":"Delete a lifecycle stage. Global admin only.","operationId":"deleteLifecycleStage","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"StageID","description":"The lifecycle stage ID.","name":"stageId","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/lifecycles/{id}/variables":{"get":{"produces":["application/json"],"tags":["variables"],"summary":"List shared lifecycle variables. Global admin only.","operationId":"listLifecycleVariables","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/LifecycleVariableList"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["variables"],"summary":"Create a shared lifecycle variable. Global admin only.","operationId":"createLifecycleVariable","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/VariableRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/LifecycleVariable"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/lifecycles/{id}/variables/{varId}":{"get":{"produces":["application/json"],"tags":["variables"],"summary":"Get a masked shared lifecycle variable. Global admin only.","operationId":"getLifecycleVariable","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ID","name":"varId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/LifecycleVariable"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["variables"],"summary":"Update a shared lifecycle variable. Blank values preserve existing secrets. Global admin only.","operationId":"updateLifecycleVariable","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ID","name":"varId","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/VariableRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/LifecycleVariable"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"produces":["application/json"],"tags":["variables"],"summary":"Delete a shared variable. Future deployments stop inheriting it; active deployments retain captured values. Global admin only.","operationId":"deleteLifecycleVariable","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ID","name":"varId","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/project-groups":{"get":{"description":"Scoped tokens see only groups containing selected, accessible projects.","produces":["application/json"],"tags":["project-groups"],"summary":"List groups containing accessible projects. Global administrators also see empty groups.","operationId":"listProjectGroups","parameters":[{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ProjectGroupListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"description":"Names are trimmed, case-insensitively unique, and limited to 100 characters. Ungrouped is reserved.","consumes":["application/json"],"produces":["application/json"],"tags":["project-groups"],"summary":"Create a shared group. Requires a global administrator and a global token with an Admin ceiling.","operationId":"createProjectGroup","parameters":[{"name":"Body","in":"body","required":true,"schema":{"$ref":"#/definitions/ProjectGroupRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/ProjectGroup"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/project-groups/{id}":{"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["project-groups"],"summary":"Rename a shared group. Requires a global administrator and a global token with an Admin ceiling.","operationId":"updateProjectGroup","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"name":"Body","in":"body","required":true,"schema":{"$ref":"#/definitions/ProjectGroupRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ProjectGroup"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["project-groups"],"summary":"Delete a group and move its projects to Ungrouped. Requires a global administrator and global Admin token.","operationId":"deleteProjectGroup","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"Deleted"},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/project-templates":{"get":{"tags":["project-templates"],"summary":"List project templates accessible through current source-project membership.","operationId":"listProjectTemplates","parameters":[{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ProjectTemplateListResponse"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}}},"security":[{"bearer":[]}]}},"/projects":{"get":{"produces":["application/json"],"tags":["projects"],"summary":"List projects the authenticated user can access.","operationId":"listProjects","parameters":[{"type":"string","x-go-name":"Query","description":"Search project names and descriptions. Matching ignores ASCII case.","name":"q","in":"query"},{"type":"integer","format":"int64","x-go-name":"GroupID","description":"Omit for all groups. Use 0 for Ungrouped or a positive group ID.","name":"group_id","in":"query"},{"enum":["newest","name","name_desc"],"type":"string","default":"name","x-go-name":"Sort","description":"Name A-Z by default. Use newest for creation time or name_desc for reverse name order.","name":"sort","in":"query"},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"ProjectListResponse is a list of projects.","schema":{"$ref":"#/definitions/ProjectListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["projects"],"summary":"Create a new project. Lifecycle assignment requires a global admin.","operationId":"createProject","parameters":[{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ProjectRequest"}}],"responses":{"201":{"description":"ProjectResponse is the JSON shape for a project.","schema":{"$ref":"#/definitions/ProjectResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}":{"get":{"produces":["application/json"],"tags":["projects"],"summary":"Get a project by ID.","operationId":"getProject","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"ProjectResponse is the JSON shape for a project.","schema":{"$ref":"#/definitions/ProjectResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["projects"],"summary":"Update a project. Only a global admin can assign a different lifecycle.","operationId":"updateProject","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ProjectRequest"}}],"responses":{"200":{"description":"ProjectResponse is the JSON shape for a project.","schema":{"$ref":"#/definitions/ProjectResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["projects"],"summary":"Delete a project.","operationId":"deleteProject","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/deployments":{"get":{"produces":["application/json"],"tags":["deployments"],"summary":"List deployments for a project.","operationId":"listDeployments","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ProjectID","name":"project_id","in":"query"},{"type":"integer","format":"int64","x-go-name":"EnvID","name":"env_id","in":"query"},{"type":"string","x-go-name":"Status","name":"status","in":"query"},{"type":"integer","format":"int64","x-go-name":"From","name":"from","in":"query"},{"type":"integer","format":"int64","x-go-name":"To","name":"to","in":"query"},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"DeploymentListResponse is the paginated envelope for ListDeployments.","schema":{"$ref":"#/definitions/DeploymentListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["deployments"],"summary":"Start a deployment.","operationId":"createDeployment","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/DeploymentScheduleRequest"}},{"type":"string","x-go-name":"Key","description":"Optional key containing 1 to 255 visible ASCII characters.\nKeys are scoped to the user, project, and operation, with no expiry.\nMatching retries return the original 201 response and Idempotency-Replayed: true.\nReuse with different input returns 409. Failed creations do not consume keys.","name":"Idempotency-Key","in":"header"}],"responses":{"201":{"description":"Deployment represents a release executing against an environment.","schema":{"$ref":"#/definitions/Deployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/group":{"put":{"description":"Requires project authoring permission. Group membership does not grant project access.","consumes":["application/json"],"produces":["application/json"],"tags":["projects"],"summary":"Assign a project to a visible group, or send group_id null for Ungrouped.","operationId":"moveProjectGroup","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"name":"Body","in":"body","required":true,"schema":{"$ref":"#/definitions/ProjectGroupAssignment"}}],"responses":{"200":{"description":"ProjectResponse is the JSON shape for a project.","schema":{"$ref":"#/definitions/ProjectResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/members":{"get":{"produces":["application/json"],"tags":["members"],"summary":"List members of a project.","operationId":"listMembers","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"ProjectMemberListResponse is a list of project members.","schema":{"$ref":"#/definitions/ProjectMemberListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["members"],"summary":"Add a member to a project.","operationId":"addMember","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ProjectMemberRequest"}}],"responses":{"201":{"description":"ProjectMember is a single user membership on a project.","schema":{"$ref":"#/definitions/ProjectMember"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/members/{userId}":{"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["members"],"summary":"Change a project member's role.","operationId":"updateMemberRole","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"UserID","description":"The user ID.","name":"userId","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ProjectMemberRoleRequest"}}],"responses":{"200":{"description":"ProjectMember is a single user membership on a project.","schema":{"$ref":"#/definitions/ProjectMember"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["members"],"summary":"Remove a member from a project.","operationId":"removeMember","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"UserID","description":"The user ID.","name":"userId","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/notifications":{"get":{"produces":["application/json"],"tags":["projects"],"summary":"Get project notification settings.","operationId":"getProjectNotifications","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"ProjectNotificationResponse is the notification settings for a project.","schema":{"$ref":"#/definitions/ProjectNotificationResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["projects"],"summary":"Update project notification settings.","operationId":"updateProjectNotifications","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ProjectNotificationRequest"}}],"responses":{"200":{"description":"ProjectNotificationResponse is the notification settings for a project.","schema":{"$ref":"#/definitions/ProjectNotificationResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/package-repository":{"get":{"tags":["artifacts"],"summary":"Read the active project repository, or null when no package is configured.","operationId":"getPackageRepository","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PackageRepositoryResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}}},"put":{"description":"A blank credential preserves the secret only when URL template, auth type, and username are unchanged.","tags":["artifacts"],"summary":"Configure and activate the project repository. Replacing its source preserves existing pins.","operationId":"savePackageRepository","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"name":"Body","in":"body","required":true,"schema":{"$ref":"#/definitions/PackageRepositoryRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PackageRepositoryResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}}},"delete":{"tags":["artifacts"],"summary":"Disable packages for future snapshots. Source records needed by existing pins are retained.","operationId":"removePackageRepository","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"Removed"},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}}}},"/projects/{id}/package-repository/test":{"post":{"description":"Size is the compressed ZIP byte count. Failure does not claim that the package is missing.","tags":["artifacts"],"summary":"Download and validate one version using the saved repository credentials, without creating a release.","operationId":"testPackageRepository","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"name":"Body","in":"body","required":true,"schema":{"$ref":"#/definitions/PackageTestRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PackageTestResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}},"502":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}}}},"/projects/{id}/project-templates":{"get":{"tags":["project-templates"],"summary":"List templates owned by an accessible source project.","operationId":"listSourceProjectTemplates","parameters":[{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"},{"type":"integer","format":"int64","x-go-name":"ID","description":"Source project ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ProjectTemplateListResponse"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["project-templates"],"summary":"Save an independent project snapshot without secret values or credentials.","operationId":"saveProjectTemplate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"Source project ID.","name":"id","in":"path","required":true},{"name":"Body","in":"body","required":true,"schema":{"$ref":"#/definitions/saveProjectTemplateRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/ProjectTemplateResponse"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/project-templates/{templateId}":{"get":{"tags":["project-templates"],"summary":"Preview copied defaults, secret definitions, steps, and references.","operationId":"previewProjectTemplate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"Source project ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ID","description":"Template ID within the source project.","name":"templateId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ProjectTemplateResponse"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/project-templates/{templateId}/projects":{"post":{"description":"Scoped tokens cannot create projects. Lifecycle assignment requires a global administrator.","consumes":["application/json"],"produces":["application/json"],"tags":["project-templates"],"summary":"Create a project atomically with explicit mappings and fresh secrets and credentials.","operationId":"applyProjectTemplate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"Source project ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ID","description":"Template ID within the source project.","name":"templateId","in":"path","required":true},{"description":"Use snapshot variable keys for variable_values.\nUse source environment IDs for environment_mappings.\nUse one-based step positions for agent_selectors overrides.\nSupply all secret values and package credentials independently.\nSet reviewed to true after reviewing the preview.","name":"Body","in":"body","required":true,"schema":{"$ref":"#/definitions/ApplyProjectTemplate"}}],"responses":{"201":{"description":"ProjectResponse is the JSON shape for a project.","schema":{"$ref":"#/definitions/ProjectResponse"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/releases":{"get":{"produces":["application/json"],"tags":["releases"],"summary":"List releases for a project.","operationId":"listReleases","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"ReleaseListResponse is a list of releases.","schema":{"$ref":"#/definitions/ReleaseListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["releases"],"summary":"Create a release snapshot for a project.","operationId":"createRelease","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ReleaseRequest"}},{"type":"string","x-go-name":"Key","description":"Optional key containing 1 to 255 visible ASCII characters.\nKeys are scoped to the user, project, and operation, with no expiry.\nMatching retries return the original 201 response and Idempotency-Replayed: true.\nReuse with different input returns 409. Failed creations do not consume keys.","name":"Idempotency-Key","in":"header"}],"responses":{"201":{"description":"Release is a refreshable snapshot of project steps and variables.","schema":{"$ref":"#/definitions/Release"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/releases/{relId}":{"get":{"produces":["application/json"],"tags":["releases"],"summary":"Get a release with its variable snapshots.","operationId":"getRelease","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RelID","description":"The release ID.","name":"relId","in":"path","required":true}],"responses":{"200":{"description":"ReleaseWithVariablesResponse is the detailed release payload.","schema":{"$ref":"#/definitions/ReleaseWithVariablesResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"description":"Active or unconfirmed deployments prevent deletion.","tags":["releases"],"summary":"Delete a release, its schedules, and completed deployment history.","operationId":"deleteRelease","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RelID","description":"The release ID.","name":"relId","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/releases/{relId}/artifact":{"get":{"tags":["artifacts"],"summary":"Read a release's attached ZIP; pending means no validated pull yet.","operationId":"getReleaseArtifact","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RelID","name":"relId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ReleaseArtifactResponse"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}}}}},"/projects/{id}/releases/{relId}/refresh":{"post":{"produces":["application/json"],"tags":["releases"],"summary":"Refresh a release snapshot from current project steps and variables.","operationId":"refreshRelease","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RelID","description":"The release ID.","name":"relId","in":"path","required":true}],"responses":{"200":{"description":"Release is a refreshable snapshot of project steps and variables.","schema":{"$ref":"#/definitions/Release"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/runbook-executions":{"get":{"tags":["runbooks"],"summary":"List runbook execution history.","operationId":"listRunbookExecutions","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RunbookExecutionListResponse"}}}}},"/projects/{id}/runbook-executions/{executionId}":{"get":{"tags":["runbooks"],"summary":"Read a runbook execution.","operationId":"getRunbookExecution","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ExecutionID","name":"executionId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RunbookExecutionDetail"}}}}},"/projects/{id}/runbook-executions/{executionId}/approve":{"post":{"tags":["runbooks"],"summary":"Approve and start a pending runbook execution.","operationId":"approveRunbookExecution","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ExecutionID","name":"executionId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RunbookStateResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}}}}},"/projects/{id}/runbook-executions/{executionId}/cancel":{"post":{"tags":["runbooks"],"summary":"Cancel a running runbook execution.","operationId":"cancelRunbookExecution","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ExecutionID","name":"executionId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RunbookStateResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}}}}},"/projects/{id}/runbook-executions/{executionId}/logs":{"get":{"tags":["runbooks"],"summary":"Read persisted runbook logs in execution order.","operationId":"listRunbookLogs","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ExecutionID","name":"executionId","in":"path","required":true}],"responses":{"200":{"description":"DeploymentLogListResponse is a list of deployment log entries.","schema":{"$ref":"#/definitions/DeploymentLogListResponse"}}}}},"/projects/{id}/runbook-executions/{executionId}/logs.txt":{"get":{"produces":["text/plain"],"tags":["runbooks"],"summary":"Export all persisted runbook logs as text.","operationId":"exportRunbookLogs","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ExecutionID","name":"executionId","in":"path","required":true}],"responses":{"200":{"description":"TextResponse is a plain text response.","schema":{"$ref":"#/definitions/TextResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}}}},"/projects/{id}/runbook-executions/{executionId}/logs/page":{"get":{"tags":["runbooks"],"summary":"Read a bounded runbook log page. Use next_before for older rows.","operationId":"pageRunbookLogs","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ExecutionID","name":"executionId","in":"path","required":true},{"minimum":1,"type":"integer","format":"int64","x-go-name":"Before","description":"Return rows older than this ID. Omit to read the latest page.","name":"before","in":"query"}],"responses":{"200":{"description":"LogPage contains a bounded history window in increasing log-ID order.","schema":{"$ref":"#/definitions/LogPage"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}}}},"/projects/{id}/runbook-executions/{executionId}/logs/stream":{"get":{"produces":["text/event-stream","application/x-ndjson"],"tags":["runbooks"],"summary":"Stream persisted and live runbook logs.","operationId":"streamRunbookLogs","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ExecutionID","name":"executionId","in":"path","required":true},{"type":"string","x-go-name":"Format","description":"Format is sse, ndjson, or structured.","name":"format","in":"query"},{"type":"boolean","x-go-name":"Preview","description":"Bound structured display text to 16 KiB. Defaults to false.","name":"preview","in":"query"}],"responses":{"200":{"description":"StreamResponse is a server-sent event stream.","schema":{"$ref":"#/definitions/StreamResponse"}}}}},"/projects/{id}/runbook-executions/{executionId}/retry":{"post":{"tags":["runbooks"],"summary":"Retry the pinned version of a completed runbook execution.","operationId":"retryRunbookExecution","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ExecutionID","name":"executionId","in":"path","required":true}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/RunbookExecution"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}}}}},"/projects/{id}/runbooks":{"get":{"tags":["runbooks"],"summary":"List project runbooks.","operationId":"listRunbooks","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RunbookListResponse"}}}},"post":{"consumes":["application/json"],"tags":["runbooks"],"summary":"Create a runbook and its first immutable version.","operationId":"createRunbook","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/RunbookSaveRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/RunbookSaveResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}}}}},"/projects/{id}/runbooks/{runbookId}":{"get":{"tags":["runbooks"],"summary":"Read a runbook and its saved versions.","operationId":"getRunbook","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RunbookID","name":"runbookId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RunbookDetailResponse"}}}},"put":{"consumes":["application/json"],"tags":["runbooks"],"summary":"Save the next immutable version of a runbook.","operationId":"saveRunbookVersion","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RunbookID","name":"runbookId","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/RunbookSaveRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/RunbookSaveResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}}}},"delete":{"description":"Saved versions, backing releases, artifact pins, completed executions, and\nlogs remain for history. Future execution and retry are blocked.\nDeleted names remain reserved. Finish or cancel unfinished executions and\nconfirm cleanup before deletion. A repeated deletion returns 404.","tags":["runbooks"],"summary":"Delete a runbook from active lists and disable its schedules.","operationId":"deleteRunbook","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RunbookID","name":"runbookId","in":"path","required":true}],"responses":{"204":{"description":"Runbook deleted"},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}}}},"/projects/{id}/runbooks/{runbookId}/executions":{"post":{"consumes":["application/json"],"tags":["runbooks"],"summary":"Run one concrete version against a project environment.","operationId":"executeRunbook","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RunbookID","name":"runbookId","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/RunbookExecuteRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/RunbookExecution"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}}}}},"/projects/{id}/runbooks/{runbookId}/schedules":{"get":{"tags":["runbooks"],"summary":"List runbook schedules.","operationId":"listRunbookSchedules","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RunbookID","name":"runbookId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RunbookScheduleListResponse"}}}},"post":{"consumes":["application/json"],"tags":["runbooks"],"summary":"Schedule a pinned version or the latest saved version.","operationId":"createRunbookSchedule","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RunbookID","name":"runbookId","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/RunbookScheduleRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/RunbookSchedule"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}}}}},"/projects/{id}/runbooks/{runbookId}/schedules/{scheduleId}/disable":{"post":{"tags":["runbooks"],"summary":"Disable a runbook schedule.","operationId":"disableRunbookSchedule","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RunbookID","name":"runbookId","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"ScheduleID","name":"scheduleId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RunbookScheduleStateResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}}}}},"/projects/{id}/runbooks/{runbookId}/versions/{versionId}":{"get":{"tags":["runbooks"],"summary":"Read an immutable runbook version.","operationId":"getRunbookVersion","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"RunbookID","name":"runbookId","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"VersionID","name":"versionId","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RunbookVersionResponse"}}}}},"/projects/{id}/schedules":{"get":{"produces":["application/json"],"tags":["schedules"],"summary":"List scheduled deployments for a project.","operationId":"listSchedules","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"ScheduledDeploymentListResponse is a list of scheduled deployments.","schema":{"$ref":"#/definitions/ScheduledDeploymentListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["schedules"],"summary":"Create a scheduled deployment.","operationId":"createSchedule","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ScheduleRequest"}}],"responses":{"201":{"description":"ScheduledDeployment is a cron-driven deployment configuration.","schema":{"$ref":"#/definitions/ScheduledDeployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/schedules/{schedId}":{"get":{"produces":["application/json"],"tags":["schedules"],"summary":"Get a scheduled deployment.","operationId":"getSchedule","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"SchedID","description":"The schedule ID.","name":"schedId","in":"path","required":true}],"responses":{"200":{"description":"ScheduledDeployment is a cron-driven deployment configuration.","schema":{"$ref":"#/definitions/ScheduledDeployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["schedules"],"summary":"Update a scheduled deployment.","operationId":"updateSchedule","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"SchedID","description":"The schedule ID.","name":"schedId","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ScheduleRequest"}}],"responses":{"200":{"description":"ScheduledDeployment is a cron-driven deployment configuration.","schema":{"$ref":"#/definitions/ScheduledDeployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["schedules"],"summary":"Delete a scheduled deployment.","operationId":"deleteSchedule","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"SchedID","description":"The schedule ID.","name":"schedId","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/schedules/{schedId}/toggle":{"post":{"produces":["application/json"],"tags":["schedules"],"summary":"Toggle active state of a scheduled deployment.","operationId":"toggleSchedule","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"SchedID","description":"The schedule ID.","name":"schedId","in":"path","required":true}],"responses":{"200":{"description":"ScheduledDeployment is a cron-driven deployment configuration.","schema":{"$ref":"#/definitions/ScheduledDeployment"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/steps":{"get":{"produces":["application/json"],"tags":["steps"],"summary":"List steps for a project.","operationId":"listSteps","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"StepListResponse is a list of project steps.","schema":{"$ref":"#/definitions/StepListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["steps"],"summary":"Create a project step.","operationId":"createStep","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/StepRequest"}}],"responses":{"201":{"description":"Step is an executable script step within a project.","schema":{"$ref":"#/definitions/Step"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/steps/reorder":{"patch":{"consumes":["application/json"],"produces":["application/json"],"tags":["steps"],"summary":"Reorder project steps.","operationId":"reorderSteps","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/ReorderStepsRequest"}}],"responses":{"200":{"description":"StepListResponse is a list of project steps.","schema":{"$ref":"#/definitions/StepListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/steps/{stepId}":{"get":{"produces":["application/json"],"tags":["steps"],"summary":"Get a project step.","operationId":"getStep","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"StepID","description":"The step ID.","name":"stepId","in":"path","required":true}],"responses":{"200":{"description":"Step is an executable script step within a project.","schema":{"$ref":"#/definitions/Step"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["steps"],"summary":"Update a project step.","operationId":"updateStep","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"StepID","description":"The step ID.","name":"stepId","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/StepRequest"}}],"responses":{"200":{"description":"Step is an executable script step within a project.","schema":{"$ref":"#/definitions/Step"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["steps"],"summary":"Delete a project step.","operationId":"deleteStep","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"StepID","description":"The step ID.","name":"stepId","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/template-library":{"get":{"tags":["template-library"],"summary":"Browse curated templates within an authorized project. Supports scoped tokens.","operationId":"listProjectLibraryTemplates","parameters":[{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"},{"type":"integer","format":"int64","x-go-name":"ID","description":"Destination project ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/LibraryTemplateListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/template-library/{slug}":{"get":{"tags":["template-library"],"summary":"Preview a curated template within an authorized project. Supports scoped tokens.","operationId":"previewProjectLibraryTemplate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"Destination project ID.","name":"id","in":"path","required":true},{"type":"string","x-go-name":"Slug","description":"Curated template slug from the library list.","name":"slug","in":"path","required":true}],"responses":{"200":{"description":"LibraryTemplate is bundled with the binary. Applying it creates independent\nproject records, rather than references to a mutable library definition.","schema":{"$ref":"#/definitions/LibraryTemplate"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/template-library/{slug}/apply":{"post":{"description":"Requires effective Maintainer permission. Conflicts do not overwrite configuration.","consumes":["application/json"],"produces":["application/json"],"tags":["template-library"],"summary":"Append editable steps and encrypted variables atomically. Never starts work.","operationId":"applyLibraryTemplate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"Destination project ID.","name":"id","in":"path","required":true},{"type":"string","x-go-name":"Slug","description":"Curated template slug from the library list.","name":"slug","in":"path","required":true},{"description":"Supply the preview version, reviewed=true, and variable keys.\nHost templates require agent labels. Server-container templates omit labels.\nEvery matching agent runs the steps. Use a unique label for a single host.\nTerraform requires TF_CONTAINER_IMAGE and TF_CONFIG_DIR and pauses before apply.","name":"Body","in":"body","required":true,"schema":{"$ref":"#/definitions/ApplyLibraryTemplate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/LibraryApplyResult"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/templates-picker":{"get":{"produces":["application/json"],"tags":["templates"],"summary":"List step templates for the picker.","operationId":"templatesPicker","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"StepTemplateListResponse is a list of step templates.","schema":{"$ref":"#/definitions/StepTemplateListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/variables":{"get":{"produces":["application/json"],"tags":["variables"],"summary":"List variables for a project.","operationId":"listVariables","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"EnvironmentID","name":"environment_id","in":"query"},{"type":"boolean","x-go-name":"SecretOnly","name":"secret_only","in":"query"},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"VariableListResponse is a list of variables.","schema":{"$ref":"#/definitions/VariableListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["variables"],"summary":"Create a project variable.","operationId":"createVariable","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/VariableRequest"}}],"responses":{"201":{"description":"VariableResponse is the JSON shape for a variable.","schema":{"$ref":"#/definitions/VariableResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/variables/available":{"get":{"description":"Secret values are null. Requires project access. Does not inspect snapshots or host environments.","produces":["application/json"],"tags":["variables"],"summary":"Inspect current configured and conditional runtime variables for step authoring.","operationId":"availableVariables","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"EnvironmentID","description":"Omit for scope alternatives rather than an effective environment.","name":"environment_id","in":"query"},{"type":"integer","format":"int64","x-go-name":"StepID","description":"Saved step must belong to this project. Draft fields override its metadata.","name":"step_id","in":"query"},{"enum":["bash","pwsh","powershell","python3"],"type":"string","x-go-name":"Interpreter","name":"interpreter","in":"query"},{"enum":["local","agent"],"type":"string","x-go-name":"ExecutionTarget","name":"execution_target","in":"query"},{"enum":["host","container"],"type":"string","x-go-name":"AgentExecutionMode","description":"Local requires host; agent accepts host or container.","name":"agent_execution_mode","in":"query"},{"type":"string","x-go-name":"VariableNames","description":"Comma-separated names. Explicit empty selects all configured variables.","name":"variable_names","in":"query"}],"responses":{"200":{"description":"AvailableVariables describes current authoring definitions, not snapshots.","schema":{"$ref":"#/definitions/AvailableVariables"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/variables/inherited":{"get":{"produces":["application/json"],"tags":["variables"],"summary":"List inherited lifecycle variables and project overrides. Requires project membership; secret values are masked.","operationId":"listInheritedVariables","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/InheritedVariableList"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/projects/{id}/variables/{varId}":{"get":{"produces":["application/json"],"tags":["variables"],"summary":"Get a project variable.","operationId":"getVariable","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"VarID","description":"The variable ID.","name":"varId","in":"path","required":true}],"responses":{"200":{"description":"VariableResponse is the JSON shape for a variable.","schema":{"$ref":"#/definitions/VariableResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["variables"],"summary":"Update a project variable.","operationId":"updateVariable","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"VarID","description":"The variable ID.","name":"varId","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/VariableRequest"}}],"responses":{"200":{"description":"VariableResponse is the JSON shape for a variable.","schema":{"$ref":"#/definitions/VariableResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["variables"],"summary":"Delete a project variable.","operationId":"deleteVariable","parameters":[{"enum":["inherit"],"type":"string","x-go-name":"Reset","description":"Set to inherit to remove every project value with this name and scope,\nincluding legacy duplicate unscoped rows. Other scopes are retained.","name":"reset","in":"query"},{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"type":"integer","format":"int64","x-go-name":"VarID","description":"The variable ID.","name":"varId","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/template-library":{"get":{"tags":["template-library"],"summary":"List curated step and workflow templates. Global tokens only.","operationId":"listLibraryTemplates","parameters":[{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/LibraryTemplateListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}}},"security":[{"bearer":[]}]}},"/template-library/{slug}":{"get":{"tags":["template-library"],"summary":"Preview every script, variable, dependency, and permission. Global tokens only.","operationId":"previewLibraryTemplate","parameters":[{"type":"string","x-go-name":"Slug","description":"Curated template slug from the library list.","name":"slug","in":"path","required":true}],"responses":{"200":{"description":"LibraryTemplate is bundled with the binary. Applying it creates independent\nproject records, rather than references to a mutable library definition.","schema":{"$ref":"#/definitions/LibraryTemplate"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}}},"security":[{"bearer":[]}]}},"/templates":{"get":{"produces":["application/json"],"tags":["templates"],"summary":"List all step templates.","operationId":"listTemplates","parameters":[{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"StepTemplateListResponse is a list of step templates.","schema":{"$ref":"#/definitions/StepTemplateListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["templates"],"summary":"Create a step template.","operationId":"createTemplate","parameters":[{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/StepTemplateRequest"}}],"responses":{"201":{"description":"StepTemplate is a reusable step template.","schema":{"$ref":"#/definitions/StepTemplate"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/templates/{id}":{"get":{"produces":["application/json"],"tags":["templates"],"summary":"Get a step template.","operationId":"getTemplate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"StepTemplate is a reusable step template.","schema":{"$ref":"#/definitions/StepTemplate"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"put":{"consumes":["application/json"],"produces":["application/json"],"tags":["templates"],"summary":"Update a step template.","operationId":"updateTemplate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/StepTemplateRequest"}}],"responses":{"200":{"description":"StepTemplate is a reusable step template.","schema":{"$ref":"#/definitions/StepTemplate"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"409":{"description":"Conflict error response.","schema":{"$ref":"#/definitions/ConflictError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"delete":{"tags":["templates"],"summary":"Delete a step template.","operationId":"deleteTemplate","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/templates/{id}/history":{"get":{"produces":["application/json"],"tags":["templates"],"summary":"List version history for a step template.","operationId":"getTemplateHistory","parameters":[{"type":"integer","format":"int64","x-go-name":"ID","description":"The resource ID.","name":"id","in":"path","required":true}],"responses":{"200":{"description":"StepTemplateVersionListResponse is a list of step template versions.","schema":{"$ref":"#/definitions/StepTemplateVersionListResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/tokens":{"get":{"produces":["application/json"],"tags":["tokens"],"summary":"List API tokens for the authenticated user.","operationId":"listTokens","parameters":[{"type":"integer","format":"int64","x-go-name":"UserID","name":"user_id","in":"query"},{"type":"integer","format":"int64","x-go-name":"Limit","name":"limit","in":"query"},{"type":"integer","format":"int64","x-go-name":"Offset","name":"offset","in":"query"}],"responses":{"200":{"description":"TokenListResponse is a list of API tokens.","schema":{"$ref":"#/definitions/TokenListResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"post":{"consumes":["application/json"],"produces":["application/json"],"tags":["tokens"],"summary":"Create a new API token.","operationId":"createToken","parameters":[{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/CreateTokenRequest"}}],"responses":{"201":{"description":"CreateTokenResponse returns the plaintext token once.","schema":{"$ref":"#/definitions/CreateTokenResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/tokens/{id}":{"delete":{"tags":["tokens"],"summary":"Revoke the authenticated user's API token.","operationId":"revokeToken","parameters":[{"type":"string","x-go-name":"TokenID","description":"The API token ID.","name":"id","in":"path","required":true}],"responses":{"204":{"description":"EmptyResponse is returned for no-content endpoints.","schema":{"$ref":"#/definitions/EmptyResponse"}},"400":{"description":"Bad request error response.","schema":{"$ref":"#/definitions/BadRequestError"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"413":{"description":"Request body exceeds the 4 MiB encoded byte ceiling.","schema":{"$ref":"#/definitions/RequestEntityTooLargeError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]},"patch":{"description":"Scoped tokens and tokens with permission ceilings cannot manage tokens.","consumes":["application/json"],"produces":["application/json"],"tags":["tokens"],"summary":"Replace an owned token's explicit scope, role, and project selection.","operationId":"updateTokenScope","parameters":[{"type":"string","x-go-name":"TokenID","description":"The API token ID.","name":"id","in":"path","required":true},{"x-go-name":"Body","name":"body","in":"body","required":true,"schema":{"$ref":"#/definitions/TokenScopeResponse"}}],"responses":{"200":{"description":"TokenScopeResponse identifies a token's permission ceiling.","schema":{"$ref":"#/definitions/TokenScopeResponse"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"403":{"description":"Forbidden error response.","schema":{"$ref":"#/definitions/ForbiddenError"}},"404":{"description":"Not found error response.","schema":{"$ref":"#/definitions/NotFoundError"}},"422":{"description":"Validation error response.","schema":{"$ref":"#/definitions/ValidationError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/users/me":{"get":{"produces":["application/json"],"tags":["users"],"summary":"Get the currently authenticated user.","operationId":"getCurrentUser","responses":{"200":{"description":"User is a user account.","schema":{"$ref":"#/definitions/User"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}},"500":{"description":"Server error response.","schema":{"$ref":"#/definitions/ServerError"}}},"security":[{"bearer":[]}]}},"/users/me/password":{"post":{"description":"Require an unrestricted global bearer token and the current password.\nAll roles can change their own password. Project-scoped and explicit-role\ntokens cannot use this operation. Browser sessions and pending MFA challenges\nare invalidated atomically. API tokens and enrolled factors remain valid.\nSSO-only accounts must change their password with their identity provider.\nNew passwords must leave room for all three password fields, email, and CSRF\nwithin the 64 KiB encoded browser form limit. Line breaks are not allowed.","tags":["users"],"summary":"Change the authenticated local user's password.","operationId":"changeOwnPassword","parameters":[{"name":"body","in":"body","required":true,"schema":{"type":"object","required":["current_password","new_password","password_confirmation"],"properties":{"current_password":{"type":"string","format":"password"},"new_password":{"type":"string","format":"password","minLength":8},"password_confirmation":{"type":"string","format":"password"}},"additionalProperties":false}}],"responses":{"204":{"description":"Password changed. Sign in again in all browsers."},"400":{"description":"Invalid JSON body."},"401":{"description":"Missing, invalid, expired, or revoked bearer token."},"403":{"description":"Token has a project scope or permission ceiling."},"413":{"description":"Request body exceeds the encoded byte ceiling."},"422":{"description":"Invalid current password, missing local password, or invalid new password."},"500":{"description":"Password update failed. The transaction preserves the original state."}}}},"/version":{"get":{"tags":["system"],"summary":"Get the server executable's software version, build number, and source commit.","operationId":"getVersion","responses":{"200":{"description":"Info describes the executable, independently of agent wire protocols.","schema":{"$ref":"#/definitions/BuildInfo"}},"401":{"description":"Unauthorized error response.","schema":{"$ref":"#/definitions/UnauthorizedError"}}},"security":[{"bearer":[]}]}}},"definitions":{"Agent":{"type":"object","properties":{"administrative_status":{"type":"string","x-go-name":"AdministrativeStatus"},"agent_protocol":{"$ref":"#/definitions/swaggerSQLNullString"},"agent_version":{"$ref":"#/definitions/swaggerSQLNullString"},"certificate_fingerprint":{"$ref":"#/definitions/swaggerSQLNullString"},"compatibility":{"type":"string","x-go-name":"Compatibility"},"container_interpreters":{"type":"array","items":{"type":"string"},"x-go-name":"ContainerInterpreters"},"container_runtimes":{"type":"array","items":{"type":"string"},"x-go-name":"ContainerRuntimes"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"current_work":{"type":"array","items":{"$ref":"#/definitions/swaggerAgentWork"},"x-go-name":"CurrentWork"},"draining":{"type":"boolean","x-go-name":"Draining"},"endpoint":{"type":"string","x-go-name":"Endpoint"},"execution_modes":{"type":"array","items":{"type":"string"},"x-go-name":"ExecutionModes"},"health":{"type":"string","x-go-name":"Health"},"id":{"type":"string","x-go-name":"ID"},"interpreters":{"type":"array","items":{"type":"string"},"x-go-name":"Interpreters"},"last_error":{"$ref":"#/definitions/swaggerAgentError"},"last_heartbeat_at":{"$ref":"#/definitions/swaggerSQLNullInteger"},"last_successful_deployment":{"$ref":"#/definitions/swaggerAgentSuccess"},"name":{"type":"string","x-go-name":"Name"},"queued_work":{"type":"integer","format":"int64","x-go-name":"QueuedWork"},"recommended_agent_version":{"type":"string","x-go-name":"RecommendedAgentVersion"},"revoked_at":{"$ref":"#/definitions/swaggerSQLNullInteger"},"server_version":{"type":"string","x-go-name":"ServerVersion"},"status":{"type":"string","x-go-name":"Status"},"updated_at":{"type":"integer","format":"int64","x-go-name":"UpdatedAt"}},"x-go-name":"swaggerAgent","x-go-package":"durpdeploy/internal/handler/api"},"AgentDetailResponse":{"type":"object","properties":{"agent":{"$ref":"#/definitions/Agent"},"environment_labels":{"type":"array","items":{"$ref":"#/definitions/Environment"},"x-go-name":"EnvironmentLabels"},"labels":{"type":"array","items":{"type":"string"},"x-go-name":"Labels"}},"x-go-name":"swaggerAgentDetailResponse","x-go-package":"durpdeploy/internal/handler/api"},"AgentEnvironmentRequest":{"type":"object","properties":{"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"}},"x-go-name":"swaggerAgentEnvironmentRequest","x-go-package":"durpdeploy/internal/handler/api"},"AgentLabelRequest":{"type":"object","properties":{"label":{"type":"string","x-go-name":"Label"}},"x-go-name":"swaggerAgentLabelRequest","x-go-package":"durpdeploy/internal/handler/api"},"AgentListResponse":{"type":"array","items":{"$ref":"#/definitions/Agent"},"x-go-name":"swaggerAgentListResponse","x-go-package":"durpdeploy/internal/handler/api"},"ApplyLibraryTemplate":{"type":"object","properties":{"agent_selectors":{"type":"array","items":{"type":"string"},"x-go-name":"AgentSelectors"},"reviewed":{"type":"boolean","x-go-name":"Reviewed"},"variable_values":{"type":"object","additionalProperties":{"type":"string"},"x-go-name":"VariableValues"},"version":{"type":"string","x-go-name":"Version"}},"x-go-package":"durpdeploy/internal/repository"},"ApplyProjectTemplate":{"type":"object","properties":{"agent_selectors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"x-go-name":"AgentSelectors"},"description":{"type":"string","x-go-name":"Description"},"environment_mappings":{"type":"object","additionalProperties":{"type":"integer","format":"int64"},"x-go-name":"EnvironmentMappings"},"lifecycle_id":{"type":"integer","format":"int64","x-go-name":"LifecycleID"},"name":{"type":"string","x-go-name":"Name"},"package_repository":{"$ref":"#/definitions/ProjectTemplatePackage"},"reviewed":{"type":"boolean","x-go-name":"Reviewed"},"variable_values":{"type":"object","additionalProperties":{"type":"string"},"x-go-name":"VariableValues"}},"x-go-package":"durpdeploy/internal/repository"},"ArtifactGateInfo":{"type":"object","properties":{"approved_at":{"type":"integer","format":"int64","x-go-name":"ApprovedAt"},"approved_by":{"type":"integer","format":"int64","x-go-name":"ApprovedBy"},"bundle_sha256":{"type":"string","x-go-name":"BundleSHA256"},"bundle_size":{"type":"integer","format":"int64","x-go-name":"BundleSize"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"decision_ready":{"type":"boolean","x-go-name":"DecisionReady"},"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"expires_at":{"type":"integer","format":"int64","x-go-name":"ExpiresAt"},"review":{"$ref":"#/definitions/GateReview"},"review_format":{"type":"string","x-go-name":"ReviewFormat"},"review_source":{"type":"string","x-go-name":"ReviewSource"},"review_verified":{"type":"boolean","x-go-name":"ReviewVerified"},"revision":{"type":"integer","format":"int64","x-go-name":"Revision"},"sha256":{"type":"string","x-go-name":"SHA256"},"status":{"type":"string","x-go-name":"Status"},"step_index":{"type":"integer","format":"int64","x-go-name":"StepIndex"}},"x-go-package":"durpdeploy/views/pages"},"AuditLog":{"type":"object","title":"AuditLog is a recorded state-changing action.","properties":{"action":{"type":"string","x-go-name":"Action"},"actor_email":{"type":"string","x-go-name":"ActorEmail"},"actor_name":{"type":"string","x-go-name":"ActorName"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"details":{"type":"string","x-go-name":"Details"},"entity_id":{"type":"integer","format":"int64","x-go-name":"EntityID"},"entity_type":{"type":"string","x-go-name":"EntityType"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"target_url":{"description":"Relative web URL. Empty without an unambiguous supported target record.","type":"string","x-go-name":"TargetURL"},"user_id":{"type":"integer","format":"int64","x-go-name":"UserID"}},"x-go-name":"swaggerAuditLog","x-go-package":"durpdeploy/internal/handler/api"},"AuditLogListResponse":{"type":"array","title":"AuditLogListResponse is a list of audit log entries.","items":{"$ref":"#/definitions/AuditLog"},"x-go-name":"swaggerAuditLogListResponse","x-go-package":"durpdeploy/internal/handler/api"},"AuditLogParams":{"type":"object","title":"AuditLogParams filters the audit log list.","properties":{"action":{"type":"string","x-go-name":"Action"},"entity_type":{"type":"string","x-go-name":"EntityType"},"limit":{"type":"integer","format":"int64","x-go-name":"Limit"},"user":{"description":"Exact current actor name or email. ASCII case is ignored.","type":"string","x-go-name":"User"},"user_id":{"type":"integer","format":"int64","x-go-name":"UserID"}},"x-go-name":"swaggerAuditLogParams","x-go-package":"durpdeploy/internal/handler/api"},"AvailableVariables":{"type":"object","title":"AvailableVariables describes current authoring definitions, not snapshots.","properties":{"configured":{"type":"array","items":{"$ref":"#/definitions/VariableDefinition"},"x-go-name":"Configured"},"context":{"$ref":"#/definitions/VariableContext"},"environments":{"type":"array","items":{"$ref":"#/definitions/VariableEnvironment"},"x-go-name":"Environments"},"predefined":{"type":"array","items":{"$ref":"#/definitions/VariableDefinition"},"x-go-name":"Predefined"},"warnings":{"type":"array","items":{"type":"string"},"x-go-name":"Warnings"}},"x-go-package":"durpdeploy/internal/repository"},"BadRequestError":{"type":"object","title":"Bad request error response.","properties":{"error":{"type":"string","x-go-name":"Error"}},"x-go-name":"swaggerBadRequestError","x-go-package":"durpdeploy/internal/handler/api"},"BuildInfo":{"type":"object","title":"Info describes the executable, independently of agent wire protocols.","properties":{"build_number":{"type":"string","x-go-name":"BuildNumber"},"commit":{"type":"string","x-go-name":"Commit"},"modified":{"type":"boolean","x-go-name":"Modified"},"version":{"type":"string","x-go-name":"Version"}},"x-go-name":"Info","x-go-package":"durpdeploy/internal/buildinfo"},"ConflictError":{"type":"object","title":"Conflict error response.","properties":{"error":{"type":"string","x-go-name":"Error"}},"x-go-name":"swaggerConflictError","x-go-package":"durpdeploy/internal/handler/api"},"CreateTokenRequest":{"type":"object","title":"CreateTokenRequest is the body for CreateToken.","properties":{"name":{"type":"string","x-go-name":"Name"},"project_ids":{"type":"array","items":{"type":"integer","format":"int64"},"x-go-name":"ProjectIDs"},"role":{"description":"Viewer, deployer, maintainer, or admin. This ceiling cannot increase owner permissions.","type":"string","x-go-name":"Role"},"scope":{"description":"Omit grant fields for legacy global creation. Scoped selections must be nonempty.\nBoth global and scoped tokens support an explicit permission ceiling.","type":"string","x-go-name":"Scope"}},"x-go-name":"swaggerCreateTokenRequest","x-go-package":"durpdeploy/internal/handler/api"},"CreateTokenResponse":{"type":"object","title":"CreateTokenResponse returns the plaintext token once.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"id":{"type":"string","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"prefix":{"type":"string","x-go-name":"Prefix"},"project_ids":{"type":"array","items":{"type":"integer","format":"int64"},"x-go-name":"ProjectIDs"},"role":{"type":"string","x-go-name":"Role"},"scope":{"type":"string","x-go-name":"Scope"},"token_id":{"type":"string","x-go-name":"TokenID"}},"x-go-name":"swaggerCreateTokenResponse","x-go-package":"durpdeploy/internal/handler/api"},"DatabaseSecurityResponse":{"type":"object","properties":{"backend":{"type":"string","x-go-name":"Backend"},"policy":{"type":"string","x-go-name":"Policy"},"warning":{"type":"string","x-go-name":"Warning"}},"x-go-name":"swaggerDatabaseSecurityResponse","x-go-package":"durpdeploy/internal/handler/api"},"DbTableListResponse":{"type":"array","title":"DbTableListResponse is a list of SQLite table names.","items":{"type":"string"},"x-go-name":"swaggerDbTableListResponse","x-go-package":"durpdeploy/internal/handler/api"},"Deployment":{"type":"object","title":"Deployment represents a release executing against an environment.","properties":{"active_deployment_id":{"type":"integer","format":"int64","x-go-name":"ActiveDeploymentID"},"active_work_url":{"type":"string","x-go-name":"ActiveWorkURL"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"finished_at":{"type":"integer","format":"int64","x-go-name":"FinishedAt"},"forced":{"type":"integer","format":"int64","x-go-name":"Forced"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"note":{"type":"string","x-go-name":"Note"},"provenance":{"$ref":"#/definitions/ReleaseSource"},"queue_position":{"type":"integer","format":"int64","x-go-name":"QueuePosition"},"release_id":{"type":"integer","format":"int64","x-go-name":"ReleaseID"},"started_at":{"type":"integer","format":"int64","x-go-name":"StartedAt"},"status":{"type":"string","x-go-name":"Status"}},"x-go-name":"swaggerDeployment","x-go-package":"durpdeploy/internal/handler/api"},"DeploymentActivityDay":{"type":"object","title":"DeploymentActivityDay contains counts by current status for one UTC date.","properties":{"counts":{"type":"object","additionalProperties":{"type":"integer","format":"int64"},"x-go-name":"Counts"},"date":{"type":"string","x-go-name":"Date"}},"x-go-name":"deploymentActivityDay","x-go-package":"durpdeploy/internal/handler/api"},"DeploymentListItem":{"type":"object","title":"DeploymentListItem is the enriched row returned by ListDeployments.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"environment_name":{"type":"string","x-go-name":"EnvironmentName"},"finished_at":{"type":"integer","format":"int64","x-go-name":"FinishedAt"},"forced":{"type":"integer","format":"int64","x-go-name":"Forced"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"note":{"type":"string","x-go-name":"Note"},"project_name":{"type":"string","x-go-name":"ProjectName"},"release_id":{"type":"integer","format":"int64","x-go-name":"ReleaseID"},"release_version":{"type":"string","x-go-name":"ReleaseVersion"},"started_at":{"type":"integer","format":"int64","x-go-name":"StartedAt"},"status":{"type":"string","x-go-name":"Status"}},"x-go-name":"swaggerDeploymentListItem","x-go-package":"durpdeploy/internal/handler/api"},"DeploymentListResponse":{"type":"object","title":"DeploymentListResponse is the paginated envelope for ListDeployments.","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/DeploymentListItem"},"x-go-name":"Items"},"limit":{"type":"integer","format":"int64","x-go-name":"Limit"},"offset":{"type":"integer","format":"int64","x-go-name":"Offset"},"total":{"type":"integer","format":"int64","x-go-name":"Total"}},"x-go-name":"swaggerDeploymentListResponse","x-go-package":"durpdeploy/internal/handler/api"},"DeploymentLog":{"type":"object","title":"DeploymentLog is a single step log entry.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"line":{"type":"string","x-go-name":"Line"},"step_name":{"type":"string","x-go-name":"StepName"}},"x-go-name":"swaggerDeploymentLog","x-go-package":"durpdeploy/internal/handler/api"},"DeploymentLogListResponse":{"type":"array","title":"DeploymentLogListResponse is a list of deployment log entries.","items":{"$ref":"#/definitions/DeploymentLog"},"x-go-name":"swaggerDeploymentLogListResponse","x-go-package":"durpdeploy/internal/handler/api"},"DeploymentScheduleRequest":{"type":"object","title":"DeploymentScheduleRequest is the body for scheduling a deployment.","properties":{"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"force":{"type":"boolean","x-go-name":"Force"},"note":{"type":"string","x-go-name":"Note"},"release_id":{"type":"integer","format":"int64","x-go-name":"ReleaseID"}},"x-go-name":"swaggerDeploymentScheduleRequest","x-go-package":"durpdeploy/internal/handler/api"},"DeploymentStagingSnapshot":{"type":"object","properties":{"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"producer":{"type":"string","x-go-name":"Producer"},"sha256":{"type":"string","x-go-name":"Sha256"},"size":{"type":"integer","format":"int64","x-go-name":"Size"},"step_index":{"type":"integer","format":"int64","x-go-name":"StepIndex"}},"x-go-package":"durpdeploy/internal/db"},"DeploymentStatusResponse":{"type":"object","title":"DeploymentStatusResponse is the status payload for GetDeploymentStatus.","properties":{"active_deployment_id":{"type":"integer","format":"int64","x-go-name":"ActiveDeploymentID"},"active_work_url":{"type":"string","x-go-name":"ActiveWorkURL"},"queue_position":{"type":"integer","format":"int64","x-go-name":"QueuePosition"},"status":{"type":"string","x-go-name":"Status"},"waiting_for_agents":{"type":"boolean","x-go-name":"WaitingForAgents"}},"x-go-name":"swaggerDeploymentStatusResponse","x-go-package":"durpdeploy/internal/handler/api"},"DeploymentVerification":{"type":"object","properties":{"finished_at":{"$ref":"#/definitions/NullInt64"},"started_at":{"$ref":"#/definitions/NullInt64"},"status":{"type":"string","x-go-name":"Status"},"timeout_seconds":{"type":"integer","format":"int64","x-go-name":"TimeoutSeconds"},"type":{"type":"string","x-go-name":"Type"}},"x-go-name":"verificationResponse","x-go-package":"durpdeploy/internal/handler/api"},"EmptyResponse":{"type":"object","title":"EmptyResponse is returned for no-content endpoints.","x-go-name":"swaggerEmptyResponse","x-go-package":"durpdeploy/internal/handler/api"},"Environment":{"type":"object","title":"Environment represents a deployment target.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"description":{"type":"string","x-go-name":"Description"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"tags":{"type":"string","x-go-name":"Tags"},"verification_target":{"description":"Admin-only; omitted from responses for other roles.","type":"string","x-go-name":"VerificationTarget"},"verification_timeout_seconds":{"type":"integer","format":"int64","x-go-name":"VerificationTimeoutSeconds"},"verification_type":{"type":"string","x-go-name":"VerificationType"}},"x-go-name":"swaggerEnvironment","x-go-package":"durpdeploy/internal/handler/api"},"EnvironmentListResponse":{"type":"array","title":"EnvironmentListResponse is a list of environments.","items":{"$ref":"#/definitions/Environment"},"x-go-name":"swaggerEnvironmentListResponse","x-go-package":"durpdeploy/internal/handler/api"},"EnvironmentRequest":{"type":"object","title":"EnvironmentRequest is the body for create/update environment.","properties":{"description":{"type":"string","x-go-name":"Description"},"name":{"type":"string","x-go-name":"Name"},"tags":{"type":"string","x-go-name":"Tags"},"verification_target":{"type":"string","x-go-name":"VerificationTarget"},"verification_timeout_seconds":{"type":"integer","format":"int64","x-go-name":"VerificationTimeoutSeconds"},"verification_type":{"type":"string","x-go-name":"VerificationType"}},"x-go-name":"swaggerEnvironmentRequest","x-go-package":"durpdeploy/internal/handler/api"},"ErrorResponse":{"type":"object","title":"Generic error response.","properties":{"error":{"type":"string","x-go-name":"Error"}},"x-go-name":"swaggerErrorResponse","x-go-package":"durpdeploy/internal/handler/api"},"ForbiddenError":{"type":"object","title":"Forbidden error response.","properties":{"error":{"type":"string","x-go-name":"Error"}},"x-go-name":"swaggerForbiddenError","x-go-package":"durpdeploy/internal/handler/api"},"GateReview":{"type":"object","title":"GateReview deliberately exposes counts only, never names, values or outputs.","properties":{"create":{"type":"integer","format":"int64","x-go-name":"Create"},"delete":{"type":"integer","format":"int64","x-go-name":"Delete"},"read":{"type":"integer","format":"int64","x-go-name":"Read"},"update":{"type":"integer","format":"int64","x-go-name":"Update"}},"x-go-package":"durpdeploy/internal/artifact"},"GlobalNotification":{"type":"object","title":"GlobalNotification holds the global notification settings.","properties":{"discord_webhook_url":{"type":"string","x-go-name":"DiscordWebhookURL"},"discord_webhook_url_configured":{"type":"boolean","x-go-name":"DiscordWebhookURLConfigured"},"gotify_token":{"type":"string","x-go-name":"GotifyToken"},"gotify_token_configured":{"type":"boolean","x-go-name":"GotifyTokenConfigured"},"gotify_url":{"type":"string","x-go-name":"GotifyURL"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"notify_emails":{"type":"string","x-go-name":"NotifyEmails"},"slack_webhook_url":{"type":"string","x-go-name":"SlackWebhookURL"},"slack_webhook_url_configured":{"type":"boolean","x-go-name":"SlackWebhookURLConfigured"},"updated_at":{"type":"integer","format":"int64","x-go-name":"UpdatedAt"}},"x-go-name":"swaggerGlobalNotification","x-go-package":"durpdeploy/internal/handler/api"},"GlobalNotificationRequest":{"type":"object","title":"GlobalNotificationRequest is the body for global notification settings.","properties":{"clear_discord_webhook_url":{"type":"boolean","x-go-name":"ClearDiscordWebhookURL"},"clear_gotify_token":{"type":"boolean","x-go-name":"ClearGotifyToken"},"clear_slack_webhook_url":{"type":"boolean","x-go-name":"ClearSlackWebhookURL"},"discord_webhook_url":{"type":"string","x-go-name":"DiscordWebhookURL"},"gotify_token":{"type":"string","x-go-name":"GotifyToken"},"gotify_url":{"type":"string","x-go-name":"GotifyURL"},"notify_emails":{"type":"string","x-go-name":"NotifyEmails"},"slack_webhook_url":{"type":"string","x-go-name":"SlackWebhookURL"}},"x-go-name":"swaggerGlobalNotificationRequest","x-go-package":"durpdeploy/internal/handler/api"},"InheritedVariable":{"type":"object","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"lifecycle_id":{"type":"integer","format":"int64","x-go-name":"LifecycleID"},"lifecycle_name":{"type":"string","x-go-name":"LifecycleName"},"name":{"type":"string","x-go-name":"Name"},"override":{"$ref":"#/definitions/VariableResponse"},"secret":{"type":"integer","format":"int64","x-go-name":"Secret"},"value":{"description":"Empty when Secret is 1.","type":"string","x-go-name":"Value"}},"x-go-name":"swaggerInheritedVariable","x-go-package":"durpdeploy/internal/handler/api"},"InheritedVariableList":{"type":"array","items":{"$ref":"#/definitions/InheritedVariable"},"x-go-name":"swaggerInheritedVariableList","x-go-package":"durpdeploy/internal/handler/api"},"LibraryApplyResult":{"type":"object","properties":{"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"slug":{"type":"string","x-go-name":"Slug"},"steps_created":{"type":"integer","format":"int64","x-go-name":"StepsCreated"},"variables_created":{"type":"integer","format":"int64","x-go-name":"VariablesCreated"},"version":{"type":"string","x-go-name":"Version"}},"x-go-package":"durpdeploy/internal/repository"},"LibraryTemplate":{"description":"LibraryTemplate is bundled with the binary. Applying it creates independent\nproject records, rather than references to a mutable library definition.","type":"object","properties":{"configuration":{"type":"object","additionalProperties":{"$ref":"#/definitions/LibraryVariableConfig"},"x-go-name":"Configuration"},"dependencies":{"type":"array","items":{"type":"string"},"x-go-name":"Dependencies"},"kind":{"type":"string","x-go-name":"Kind"},"permissions":{"type":"array","items":{"type":"string"},"x-go-name":"Permissions"},"slug":{"type":"string","x-go-name":"Slug"},"snapshot":{"$ref":"#/definitions/ProjectTemplateSnapshot"},"version":{"type":"string","x-go-name":"Version"}},"x-go-package":"durpdeploy/internal/repository"},"LibraryTemplateListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/LibraryTemplate"},"x-go-name":"Items"},"limit":{"type":"integer","format":"int64","x-go-name":"Limit"},"offset":{"type":"integer","format":"int64","x-go-name":"Offset"},"total":{"type":"integer","format":"int64","x-go-name":"Total"}},"x-go-package":"durpdeploy/internal/handler/api"},"LibraryVariableConfig":{"type":"object","properties":{"description":{"type":"string","x-go-name":"Description"},"format":{"type":"string","x-go-name":"Format"},"required":{"type":"boolean","x-go-name":"Required"}},"x-go-package":"durpdeploy/internal/repository"},"Lifecycle":{"type":"object","title":"Lifecycle represents a deployment promotion pipeline.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"description":{"type":"string","x-go-name":"Description"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"}},"x-go-name":"swaggerLifecycle","x-go-package":"durpdeploy/internal/handler/api"},"LifecycleListResponse":{"type":"array","title":"LifecycleListResponse is a list of lifecycles.","items":{"$ref":"#/definitions/Lifecycle"},"x-go-name":"swaggerLifecycleListResponse","x-go-package":"durpdeploy/internal/handler/api"},"LifecycleRequest":{"type":"object","title":"LifecycleRequest is the body for create/update lifecycle.","properties":{"description":{"type":"string","x-go-name":"Description"},"name":{"type":"string","x-go-name":"Name"}},"x-go-name":"swaggerLifecycleRequest","x-go-package":"durpdeploy/internal/handler/api"},"LifecycleResponse":{"type":"object","title":"LifecycleResponse is the detailed lifecycle payload.","properties":{"lifecycle":{"$ref":"#/definitions/Lifecycle"},"stages":{"type":"array","items":{"$ref":"#/definitions/LifecycleStage"},"x-go-name":"Stages"}},"x-go-name":"swaggerLifecycleResponse","x-go-package":"durpdeploy/internal/handler/api"},"LifecycleStage":{"type":"object","title":"LifecycleStage is a single stage in a lifecycle.","properties":{"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"lifecycle_id":{"type":"integer","format":"int64","x-go-name":"LifecycleID"},"requires_approval":{"type":"integer","format":"int64","x-go-name":"RequiresApproval"},"sort_order":{"type":"integer","format":"int64","x-go-name":"SortOrder"}},"x-go-name":"swaggerLifecycleStage","x-go-package":"durpdeploy/internal/handler/api"},"LifecycleStageListResponse":{"type":"array","title":"LifecycleStageListResponse is a list of lifecycle stages.","items":{"$ref":"#/definitions/LifecycleStage"},"x-go-name":"swaggerLifecycleStageListResponse","x-go-package":"durpdeploy/internal/handler/api"},"LifecycleStageRequest":{"type":"object","title":"LifecycleStageRequest is the body for add/update lifecycle stage.","properties":{"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"requires_approval":{"type":"boolean","x-go-name":"RequiresApproval"},"sort_order":{"type":"integer","format":"int64","x-go-name":"SortOrder"}},"x-go-name":"swaggerLifecycleStageRequest","x-go-package":"durpdeploy/internal/handler/api"},"LifecycleVariable":{"type":"object","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"lifecycle_id":{"type":"integer","format":"int64","x-go-name":"LifecycleID"},"name":{"type":"string","x-go-name":"Name"},"secret":{"type":"integer","format":"int64","x-go-name":"Secret"},"value":{"description":"Empty when Secret is 1.","type":"string","x-go-name":"Value"}},"x-go-name":"swaggerLifecycleVariable","x-go-package":"durpdeploy/internal/handler/api"},"LifecycleVariableList":{"type":"array","items":{"$ref":"#/definitions/LifecycleVariable"},"x-go-name":"swaggerLifecycleVariableList","x-go-package":"durpdeploy/internal/handler/api"},"ListAccessibleProjectTemplatesRow":{"type":"object","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"created_by":{"$ref":"#/definitions/NullInt64"},"description":{"type":"string","x-go-name":"Description"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"source_project_id":{"type":"integer","format":"int64","x-go-name":"SourceProjectID"},"source_project_name":{"type":"string","x-go-name":"SourceProjectName"}},"x-go-package":"durpdeploy/internal/db"},"LogEntry":{"type":"object","title":"LogEntry is a single line of deployment log output.","properties":{"line":{"type":"string","x-go-name":"Line"},"step":{"type":"string","x-go-name":"Step"},"ts":{"type":"integer","format":"int64","x-go-name":"TS"}},"x-go-name":"swaggerLogEntry","x-go-package":"durpdeploy/internal/handler/api"},"LogLineListResponse":{"type":"array","title":"LogLineListResponse is a list of streamed log lines.","items":{"$ref":"#/definitions/LogEntry"},"x-go-name":"swaggerLogLineListResponse","x-go-package":"durpdeploy/internal/handler/api"},"LogPage":{"type":"object","title":"LogPage contains a bounded history window in increasing log-ID order.","properties":{"before":{"description":"Requested exclusive upper ID. Zero selects the latest page.","type":"integer","format":"int64","x-go-name":"Before"},"byte_limit":{"description":"Maximum JSON response size in bytes, including the envelope (1048576).","type":"integer","format":"int64","x-go-name":"ByteLimit"},"items":{"type":"array","items":{"$ref":"#/definitions/LogPageEntry"},"x-go-name":"Items"},"last_id":{"description":"Highest returned ID. Use this as the live stream's after cursor.","type":"integer","format":"int64","x-go-name":"LastID"},"limit":{"description":"Maximum number of returned rows (500).","type":"integer","format":"int64","x-go-name":"Limit"},"line_byte_limit":{"description":"Maximum UTF-8 bytes per displayed text field, including markers (16384).","type":"integer","format":"int64","x-go-name":"LineByteLimit"},"next_before":{"description":"Exclusive cursor for the next older page. Zero means no older rows.","type":"integer","format":"int64","x-go-name":"NextBefore"}},"x-go-name":"swaggerLogPage","x-go-package":"durpdeploy/internal/handler/api"},"LogPageEntry":{"type":"object","title":"LogPageEntry is a persisted log row, including nullable step metadata.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"line":{"type":"string","x-go-name":"Line"},"step_index":{"$ref":"#/definitions/NullInt64"},"step_name":{"$ref":"#/definitions/NullString"},"step_state":{"$ref":"#/definitions/NullString"},"truncated":{"description":"True when display text was shortened. Full output remains in exports.","type":"boolean","x-go-name":"Truncated"}},"x-go-name":"swaggerLogPageEntry","x-go-package":"durpdeploy/internal/handler/api"},"LogStreamParams":{"type":"object","title":"LogStreamParams controls the log stream format.","properties":{"format":{"description":"Format is sse or ndjson; deployment streams also support structured SSE.","type":"string","x-go-name":"Format"}},"x-go-name":"swaggerLogStreamParams","x-go-package":"durpdeploy/internal/handler/api"},"NotFoundError":{"type":"object","title":"Not found error response.","properties":{"error":{"type":"string","x-go-name":"Error"}},"x-go-name":"swaggerNotFoundError","x-go-package":"durpdeploy/internal/handler/api"},"NotificationEvent":{"type":"object","title":"NotificationEvent is a fired notification record.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"event_type":{"type":"string","x-go-name":"EventType"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"message":{"type":"string","x-go-name":"Message"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"results":{"type":"string","x-go-name":"Results"}},"x-go-name":"swaggerNotificationEvent","x-go-package":"durpdeploy/internal/handler/api"},"NotificationEventListResponse":{"type":"array","title":"NotificationEventListResponse is a list of notification events.","items":{"$ref":"#/definitions/NotificationEvent"},"x-go-name":"swaggerNotificationEventListResponse","x-go-package":"durpdeploy/internal/handler/api"},"NullInt64":{"description":"NullInt64 implements the [Scanner] interface so\nit can be used as a scan destination, similar to [NullString].","type":"object","title":"NullInt64 represents an int64 that may be null.","properties":{"Int64":{"type":"integer","format":"int64"},"Valid":{"type":"boolean"}},"x-go-package":"database/sql"},"NullString":{"description":"var s NullString\nerr := db.QueryRow(\"SELECT name FROM foo WHERE id=?\", id).Scan(&s)\n...\nif s.Valid {\nuse s.String\n} else {\nNULL value\n}","type":"object","title":"NullString represents a string that may be null.\nNullString implements the [Scanner] interface so\nit can be used as a scan destination:","properties":{"String":{"type":"string"},"Valid":{"type":"boolean"}},"x-go-package":"database/sql"},"PackageRepositoryRequest":{"type":"object","properties":{"auth_type":{"type":"string","x-go-name":"AuthType"},"credential":{"type":"string","x-go-name":"Credential"},"url_template":{"type":"string","x-go-name":"URLTemplate"},"username":{"type":"string","x-go-name":"Username"}},"x-go-name":"packageRepositoryRequest","x-go-package":"durpdeploy/internal/handler/api"},"PackageRepositoryResponse":{"type":"object","properties":{"auth_type":{"type":"string","x-go-name":"AuthType"},"credential_configured":{"type":"boolean","x-go-name":"CredentialConfigured"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"url_template":{"type":"string","x-go-name":"URLTemplate"},"username":{"type":"string","x-go-name":"Username"}},"x-go-name":"packageRepositoryResponse","x-go-package":"durpdeploy/internal/handler/api"},"PackageTestRequest":{"type":"object","properties":{"version":{"type":"string","x-go-name":"Version"}},"x-go-name":"packageTestRequest","x-go-package":"durpdeploy/internal/handler/api"},"PackageTestResponse":{"type":"object","properties":{"exists":{"type":"boolean","x-go-name":"Exists"},"sha256":{"type":"string","x-go-name":"SHA256"},"size":{"type":"integer","format":"int64","x-go-name":"Size"},"url":{"type":"string","x-go-name":"URL"},"version":{"type":"string","x-go-name":"Version"}},"x-go-name":"packageTestResponse","x-go-package":"durpdeploy/internal/handler/api"},"PaginatedResponse":{"type":"object","title":"Paginated list envelope.","properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":{}},"x-go-name":"Items"},"limit":{"type":"integer","format":"int64","x-go-name":"Limit"},"offset":{"type":"integer","format":"int64","x-go-name":"Offset"},"total":{"type":"integer","format":"int64","x-go-name":"Total"}},"x-go-name":"swaggerPaginatedResponse","x-go-package":"durpdeploy/internal/handler/api"},"PairAgentRequest":{"type":"object","properties":{"address":{"type":"string","x-go-name":"Address"},"code":{"type":"string","x-go-name":"Code"},"fingerprint":{"type":"string","x-go-name":"Fingerprint"}},"x-go-name":"swaggerPairAgentRequest","x-go-package":"durpdeploy/internal/handler/api"},"PairAgentResponse":{"type":"object","properties":{"agent_id":{"type":"string","x-go-name":"AgentID"},"state":{"type":"string","x-go-name":"State"}},"x-go-name":"swaggerPairAgentResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectGroup":{"type":"object","properties":{"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"}},"x-go-name":"projectGroupResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectGroupAssignment":{"type":"object","required":["group_id"],"properties":{"group_id":{"description":"Send null to move the project to Ungrouped. This field is required.","type":"integer","format":"int64","x-go-name":"GroupID","x-nullable":true}},"x-go-name":"projectGroupAssignment","x-go-package":"durpdeploy/internal/handler/api"},"ProjectGroupListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"project_count":{"type":"integer","format":"int64","x-go-name":"ProjectCount"}}},"x-go-name":"Items"},"limit":{"type":"integer","format":"int64","x-go-name":"Limit"},"offset":{"type":"integer","format":"int64","x-go-name":"Offset"},"total":{"type":"integer","format":"int64","x-go-name":"Total"}},"x-go-name":"projectGroupListResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectGroupRequest":{"type":"object","properties":{"name":{"type":"string","x-go-name":"Name"}},"x-go-name":"projectGroupRequest","x-go-package":"durpdeploy/internal/handler/api"},"ProjectListResponse":{"type":"object","title":"ProjectListResponse is a list of projects.","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/ProjectResponse"},"x-go-name":"Items"},"limit":{"type":"integer","format":"int64","x-go-name":"Limit"},"offset":{"type":"integer","format":"int64","x-go-name":"Offset"},"total":{"type":"integer","format":"int64","x-go-name":"Total"}},"x-go-name":"swaggerProjectListResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectMember":{"type":"object","title":"ProjectMember is a single user membership on a project.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"role":{"type":"string","x-go-name":"Role"},"user_id":{"type":"integer","format":"int64","x-go-name":"UserID"}},"x-go-name":"swaggerProjectMember","x-go-package":"durpdeploy/internal/handler/api"},"ProjectMemberListResponse":{"type":"array","title":"ProjectMemberListResponse is a list of project members.","items":{"$ref":"#/definitions/ProjectMemberResponse"},"x-go-name":"swaggerProjectMemberListResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectMemberRequest":{"type":"object","title":"ProjectMemberRequest is the body for adding a project member.","properties":{"role":{"type":"string","x-go-name":"Role"},"user_id":{"type":"integer","format":"int64","x-go-name":"UserID"}},"x-go-name":"swaggerProjectMemberRequest","x-go-package":"durpdeploy/internal/handler/api"},"ProjectMemberResponse":{"type":"object","title":"ProjectMemberResponse is the JSON shape for project membership.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"email":{"type":"string","x-go-name":"Email"},"name":{"type":"string","x-go-name":"Name"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"role":{"type":"string","x-go-name":"Role"},"user_id":{"type":"integer","format":"int64","x-go-name":"UserID"}},"x-go-name":"swaggerProjectMemberResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectMemberRoleRequest":{"type":"object","title":"ProjectMemberRoleRequest updates a member's role.","properties":{"role":{"type":"string","x-go-name":"Role"}},"x-go-name":"swaggerProjectMemberRoleRequest","x-go-package":"durpdeploy/internal/handler/api"},"ProjectNotificationRequest":{"type":"object","title":"ProjectNotificationRequest updates a project's notification settings.","properties":{"clear_discord_webhook_url":{"type":"boolean","x-go-name":"ClearDiscordWebhookURL"},"clear_gotify_token":{"type":"boolean","x-go-name":"ClearGotifyToken"},"clear_slack_webhook_url":{"type":"boolean","x-go-name":"ClearSlackWebhookURL"},"discord_webhook_url":{"type":"string","x-go-name":"DiscordWebhookURL"},"gotify_token":{"type":"string","x-go-name":"GotifyToken"},"gotify_url":{"type":"string","x-go-name":"GotifyURL"},"notify_emails":{"type":"string","x-go-name":"NotifyEmails"},"slack_webhook_url":{"type":"string","x-go-name":"SlackWebhookURL"}},"x-go-name":"swaggerProjectNotificationRequest","x-go-package":"durpdeploy/internal/handler/api"},"ProjectNotificationResponse":{"type":"object","title":"ProjectNotificationResponse is the notification settings for a project.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"description":{"type":"string","x-go-name":"Description"},"discord_webhook_url":{"type":"string","x-go-name":"DiscordWebhookURL"},"discord_webhook_url_configured":{"type":"boolean","x-go-name":"DiscordWebhookURLConfigured"},"gotify_token":{"type":"string","x-go-name":"GotifyToken"},"gotify_token_configured":{"type":"boolean","x-go-name":"GotifyTokenConfigured"},"gotify_url":{"type":"string","x-go-name":"GotifyURL"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"notify_emails":{"type":"string","x-go-name":"NotifyEmails"},"slack_webhook_url":{"type":"string","x-go-name":"SlackWebhookURL"},"slack_webhook_url_configured":{"type":"boolean","x-go-name":"SlackWebhookURLConfigured"}},"x-go-name":"swaggerProjectNotificationResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectRequest":{"type":"object","title":"ProjectRequest is the body for create/update project.","properties":{"description":{"type":"string","x-go-name":"Description"},"lifecycle_id":{"type":"integer","format":"int64","x-go-name":"LifecycleID"},"name":{"type":"string","x-go-name":"Name"}},"x-go-name":"swaggerProjectRequest","x-go-package":"durpdeploy/internal/handler/api"},"ProjectResponse":{"type":"object","title":"ProjectResponse is the JSON shape for a project.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"description":{"type":"string","x-go-name":"Description"},"discord_webhook_url":{"type":"string","x-go-name":"DiscordWebhookURL"},"discord_webhook_url_configured":{"type":"boolean","x-go-name":"DiscordWebhookURLConfigured"},"gotify_token":{"type":"string","x-go-name":"GotifyToken"},"gotify_token_configured":{"type":"boolean","x-go-name":"GotifyTokenConfigured"},"gotify_url":{"type":"string","x-go-name":"GotifyURL"},"group_id":{"type":"integer","format":"int64","x-go-name":"GroupID","x-nullable":true},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"lifecycle_id":{"type":"integer","format":"int64","x-go-name":"LifecycleID"},"name":{"type":"string","x-go-name":"Name"},"notify_emails":{"type":"string","x-go-name":"NotifyEmails"},"slack_webhook_url":{"type":"string","x-go-name":"SlackWebhookURL"},"slack_webhook_url_configured":{"type":"boolean","x-go-name":"SlackWebhookURLConfigured"}},"x-go-name":"swaggerProjectResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectTemplateListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/ListAccessibleProjectTemplatesRow"},"x-go-name":"Items"},"limit":{"type":"integer","format":"int64","x-go-name":"Limit"},"offset":{"type":"integer","format":"int64","x-go-name":"Offset"},"total":{"type":"integer","format":"int64","x-go-name":"Total"}},"x-go-name":"swaggerProjectTemplateListResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectTemplatePackage":{"type":"object","properties":{"auth_type":{"type":"string","x-go-name":"AuthType"},"credential":{"type":"string","x-go-name":"Credential"},"url_template":{"type":"string","x-go-name":"URLTemplate"},"username":{"type":"string","x-go-name":"Username"}},"x-go-package":"durpdeploy/internal/repository"},"ProjectTemplateResponse":{"type":"object","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"description":{"type":"string","x-go-name":"Description"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"snapshot":{"$ref":"#/definitions/ProjectTemplateSnapshot"},"source_project_id":{"type":"integer","format":"int64","x-go-name":"SourceProjectID"}},"x-go-name":"projectTemplateResponse","x-go-package":"durpdeploy/internal/handler/api"},"ProjectTemplateSnapshot":{"type":"object","title":"ProjectTemplateSnapshot excludes credentials and execution history by construction.","properties":{"description":{"type":"string","x-go-name":"Description"},"lifecycle_name":{"type":"string","x-go-name":"LifecycleName"},"name":{"type":"string","x-go-name":"Name"},"package_repository":{"$ref":"#/definitions/Repository"},"steps":{"type":"array","items":{"$ref":"#/definitions/ProjectTemplateStep"},"x-go-name":"Steps"},"variables":{"type":"array","items":{"$ref":"#/definitions/ProjectTemplateVariable"},"x-go-name":"Variables"}},"x-go-package":"durpdeploy/internal/repository"},"ProjectTemplateStep":{"type":"object","properties":{"agent_execution_mode":{"type":"string","x-go-name":"AgentExecutionMode"},"agent_selectors":{"type":"array","items":{"type":"string"},"x-go-name":"AgentSelectors"},"approval_artifact_path":{"type":"string","x-go-name":"ApprovalArtifactPath"},"approval_review_format":{"type":"string","x-go-name":"ApprovalReviewFormat"},"approval_review_path":{"type":"string","x-go-name":"ApprovalReviewPath"},"container_image":{"type":"string","x-go-name":"ContainerImage"},"execution_target":{"type":"string","x-go-name":"ExecutionTarget"},"interpreter":{"type":"string","x-go-name":"Interpreter"},"max_retries":{"type":"integer","format":"int64","x-go-name":"MaxRetries"},"name":{"type":"string","x-go-name":"Name"},"network_mode":{"type":"string","x-go-name":"NetworkMode"},"script_body":{"type":"string","x-go-name":"ScriptBody"},"sort_order":{"type":"integer","format":"int64","x-go-name":"SortOrder"},"timeout_seconds":{"type":"integer","format":"int64","x-go-name":"TimeoutSeconds"},"variable_names":{"type":"array","items":{"type":"string"},"x-go-name":"VariableNames"}},"x-go-package":"durpdeploy/internal/repository"},"ProjectTemplateVariable":{"type":"object","properties":{"default":{"type":"string","x-go-name":"Default"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"environment_name":{"type":"string","x-go-name":"EnvironmentName"},"key":{"type":"string","x-go-name":"Key"},"name":{"type":"string","x-go-name":"Name"},"secret":{"type":"boolean","x-go-name":"Secret"}},"x-go-package":"durpdeploy/internal/repository"},"Release":{"type":"object","title":"Release is a refreshable snapshot of project steps and variables.","properties":{"artifact_ref":{"description":"Public HTTPS URL or artifact identifier, including OCI SHA-256 references.","type":"string","x-go-name":"ArtifactRef"},"ci_run_url":{"type":"string","x-go-name":"CIRunURL"},"commit_sha":{"description":"Full hexadecimal SHA-1 or SHA-256 commit identifier.","type":"string","x-go-name":"CommitSHA"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"repository_url":{"type":"string","x-go-name":"RepositoryURL"},"snapshot_locked":{"description":"Deprecated: retained for compatibility; does not prevent refresh.","type":"integer","format":"int64","x-deprecated":true,"x-go-name":"SnapshotLocked"},"steps_json":{"type":"string","x-go-name":"StepsJSON"},"version":{"type":"string","x-go-name":"Version"}},"x-go-name":"swaggerRelease","x-go-package":"durpdeploy/internal/handler/api"},"ReleaseArtifactResponse":{"type":"object","properties":{"pending":{"type":"boolean","x-go-name":"Pending"},"release_id":{"type":"integer","format":"int64","x-go-name":"ReleaseID"},"repository_id":{"type":"integer","format":"int64","x-go-name":"RepositoryID"},"sha256":{"type":"string","x-go-name":"SHA256"},"size":{"type":"integer","format":"int64","x-go-name":"Size"},"source_release_id":{"type":"integer","format":"int64","x-go-name":"SourceReleaseID"},"url":{"type":"string","x-go-name":"URL"},"version":{"type":"string","x-go-name":"Version"}},"x-go-name":"releaseArtifactResponse","x-go-package":"durpdeploy/internal/handler/api"},"ReleaseListResponse":{"type":"array","title":"ReleaseListResponse is a list of releases.","items":{"$ref":"#/definitions/Release"},"x-go-name":"swaggerReleaseListResponse","x-go-package":"durpdeploy/internal/handler/api"},"ReleaseRequest":{"type":"object","title":"ReleaseRequest is the body for create release.","properties":{"artifact_ref":{"description":"Public HTTPS URL or artifact identifier, including OCI SHA-256 references.","type":"string","x-go-name":"ArtifactRef"},"ci_run_url":{"type":"string","x-go-name":"CIRunURL"},"commit_sha":{"description":"Full hexadecimal SHA-1 or SHA-256 commit identifier.","type":"string","x-go-name":"CommitSHA"},"repository_url":{"type":"string","x-go-name":"RepositoryURL"},"version":{"description":"Attached packages are downloaded and pinned on the first deployment pull.","type":"string","x-go-name":"Version"}},"x-go-name":"swaggerReleaseRequest","x-go-package":"durpdeploy/internal/handler/api"},"ReleaseSource":{"description":"URL fields require HTTPS without userinfo, query parameters, or fragments.\nFields accept at most 2048 bytes without whitespace or control characters.\nCredentials and recognized secret formats are rejected.","type":"object","title":"ReleaseSource contains optional, immutable public source identifiers.","properties":{"artifact_ref":{"description":"Public HTTPS URL or artifact identifier, including OCI SHA-256 references.","type":"string","x-go-name":"ArtifactRef"},"ci_run_url":{"type":"string","x-go-name":"CIRunURL"},"commit_sha":{"description":"Full hexadecimal SHA-1 or SHA-256 commit identifier.","type":"string","x-go-name":"CommitSHA"},"repository_url":{"type":"string","x-go-name":"RepositoryURL"}},"x-go-name":"swaggerReleaseSource","x-go-package":"durpdeploy/internal/handler/api"},"ReleaseVariableResponse":{"description":"Value is always a string. It is an empty string whenever Secret\nis 1 or the variable has no stored value; ordinary reads never\nreturn secret plaintext (issue #29).","type":"object","title":"ReleaseVariableResponse is a variable snapshot in a release.","properties":{"environment_id":{"$ref":"#/definitions/swaggerSQLNullInteger"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"release_id":{"type":"integer","format":"int64","x-go-name":"ReleaseID"},"secret":{"type":"integer","format":"int64","x-go-name":"Secret"},"value":{"type":"string","x-go-name":"Value"}},"x-go-name":"swaggerReleaseVariableResponse","x-go-package":"durpdeploy/internal/handler/api"},"ReleaseWithVariablesResponse":{"type":"object","title":"ReleaseWithVariablesResponse is the detailed release payload.","properties":{"artifact_ref":{"description":"Public HTTPS URL or artifact identifier, including OCI SHA-256 references.","type":"string","x-go-name":"ArtifactRef"},"ci_run_url":{"type":"string","x-go-name":"CIRunURL"},"commit_sha":{"description":"Full hexadecimal SHA-1 or SHA-256 commit identifier.","type":"string","x-go-name":"CommitSHA"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"repository_url":{"type":"string","x-go-name":"RepositoryURL"},"steps_json":{"type":"string","x-go-name":"StepsJSON"},"variables":{"type":"array","items":{"$ref":"#/definitions/ReleaseVariableResponse"},"x-go-name":"Variables"},"version":{"type":"string","x-go-name":"Version"}},"x-go-name":"swaggerReleaseWithVariablesResponse","x-go-package":"durpdeploy/internal/handler/api"},"ReorderStagesRequest":{"type":"object","title":"ReorderStagesRequest reorders lifecycle stages.","properties":{"stage_ids":{"type":"array","items":{"type":"integer","format":"int64"},"x-go-name":"StageIDs"}},"x-go-name":"swaggerReorderStagesRequest","x-go-package":"durpdeploy/internal/handler/api"},"ReorderStepsRequest":{"type":"object","title":"ReorderStepsRequest reorders project steps.","properties":{"step_ids":{"type":"array","items":{"type":"integer","format":"int64"},"x-go-name":"StepIDs"}},"x-go-name":"swaggerReorderStepsRequest","x-go-package":"durpdeploy/internal/handler/api"},"Repository":{"type":"object","properties":{"auth_type":{"type":"string","x-go-name":"AuthType"},"url_template":{"type":"string","x-go-name":"URLTemplate"},"username":{"type":"string","x-go-name":"Username"}},"x-go-package":"durpdeploy/internal/artifact"},"RequestEntityTooLargeError":{"type":"object","title":"Request body exceeds the 4 MiB encoded byte ceiling.","properties":{"error":{"type":"string","x-go-name":"Error"}},"x-go-name":"swaggerRequestEntityTooLargeError","x-go-package":"durpdeploy/internal/handler/api"},"RollbackPreview":{"type":"object","properties":{"blocked":{"type":"boolean","x-go-name":"Blocked"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"environment_name":{"type":"string","x-go-name":"EnvironmentName"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"reason":{"type":"string","x-go-name":"Reason"},"requires_approval":{"type":"boolean","x-go-name":"RequiresApproval"},"source_deployment_id":{"type":"integer","format":"int64","x-go-name":"SourceDeploymentID"},"source_release_id":{"type":"integer","format":"int64","x-go-name":"SourceReleaseID"},"source_version":{"type":"string","x-go-name":"SourceVersion"},"target_deployment_id":{"type":"integer","format":"int64","x-go-name":"TargetDeploymentID"},"target_release_id":{"type":"integer","format":"int64","x-go-name":"TargetReleaseID"},"target_version":{"type":"string","x-go-name":"TargetVersion"}},"x-go-package":"durpdeploy/internal/repository"},"Runbook":{"type":"object","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"deleted_at":{"$ref":"#/definitions/swaggerSQLNullInteger"},"description":{"type":"string","x-go-name":"Description"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"}},"x-go-name":"swaggerRunbook","x-go-package":"durpdeploy/internal/handler/api"},"RunbookDetailResponse":{"type":"object","properties":{"runbook":{"$ref":"#/definitions/Runbook"},"versions":{"type":"array","items":{"$ref":"#/definitions/RunbookVersion"},"x-go-name":"Versions"}},"x-go-name":"swaggerRunbookDetailResponse","x-go-package":"durpdeploy/internal/handler/api"},"RunbookExecuteRequest":{"type":"object","properties":{"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"version_id":{"type":"integer","format":"int64","x-go-name":"VersionID"}},"x-go-name":"swaggerRunbookExecuteRequest","x-go-package":"durpdeploy/internal/handler/api"},"RunbookExecution":{"type":"object","properties":{"actor_user_id":{"$ref":"#/definitions/swaggerSQLNullInteger"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"runbook_version_id":{"type":"integer","format":"int64","x-go-name":"RunbookVersionID"},"schedule_id":{"$ref":"#/definitions/swaggerSQLNullInteger"}},"x-go-name":"swaggerRunbookExecution","x-go-package":"durpdeploy/internal/handler/api"},"RunbookExecutionDetail":{"type":"object","properties":{"active_deployment_id":{"type":"integer","format":"int64","x-go-name":"ActiveDeploymentID"},"active_work_url":{"type":"string","x-go-name":"ActiveWorkURL"},"actor_user_id":{"$ref":"#/definitions/swaggerSQLNullInteger"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"environment_name":{"type":"string","x-go-name":"EnvironmentName"},"finished_at":{"$ref":"#/definitions/swaggerSQLNullInteger"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"queue_position":{"type":"integer","format":"int64","x-go-name":"QueuePosition"},"runbook_deleted_at":{"$ref":"#/definitions/swaggerSQLNullInteger"},"runbook_id":{"type":"integer","format":"int64","x-go-name":"RunbookID"},"runbook_name":{"type":"string","x-go-name":"RunbookName"},"runbook_version_id":{"type":"integer","format":"int64","x-go-name":"RunbookVersionID"},"schedule_id":{"$ref":"#/definitions/swaggerSQLNullInteger"},"started_at":{"$ref":"#/definitions/swaggerSQLNullInteger"},"status":{"type":"string","x-go-name":"Status"},"version":{"type":"integer","format":"int64","x-go-name":"Version"}},"x-go-name":"swaggerRunbookExecutionDetail","x-go-package":"durpdeploy/internal/handler/api"},"RunbookExecutionListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/RunbookExecutionDetail"},"x-go-name":"Items"},"limit":{"type":"integer","format":"int64","x-go-name":"Limit"},"offset":{"type":"integer","format":"int64","x-go-name":"Offset"},"total":{"type":"integer","format":"int64","x-go-name":"Total"}},"x-go-name":"swaggerRunbookExecutionListResponse","x-go-package":"durpdeploy/internal/handler/api"},"RunbookListResponse":{"type":"array","items":{"$ref":"#/definitions/Runbook"},"x-go-name":"swaggerRunbookListResponse","x-go-package":"durpdeploy/internal/handler/api"},"RunbookSaveRequest":{"type":"object","properties":{"artifact_release_id":{"type":"integer","format":"int64","x-go-name":"ArtifactReleaseID"},"description":{"type":"string","x-go-name":"Description"},"keep_artifact_pin":{"type":"boolean","x-go-name":"KeepArtifactPin"},"name":{"type":"string","x-go-name":"Name"},"steps":{"type":"array","items":{"$ref":"#/definitions/RunbookStep"},"x-go-name":"Steps"}},"x-go-name":"swaggerRunbookSaveRequest","x-go-package":"durpdeploy/internal/handler/api"},"RunbookSaveResponse":{"type":"object","properties":{"runbook":{"$ref":"#/definitions/Runbook"},"version":{"$ref":"#/definitions/RunbookVersion"}},"x-go-name":"swaggerRunbookSaveResponse","x-go-package":"durpdeploy/internal/handler/api"},"RunbookSchedule":{"type":"object","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"cron":{"type":"string","x-go-name":"Cron"},"enabled":{"type":"integer","format":"int64","x-go-name":"Enabled"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"last_error":{"type":"string","x-go-name":"LastError"},"last_fired_at":{"$ref":"#/definitions/swaggerSQLNullInteger"},"next_run_at":{"type":"integer","format":"int64","x-go-name":"NextRunAt"},"runbook_id":{"type":"integer","format":"int64","x-go-name":"RunbookID"},"version_id":{"$ref":"#/definitions/swaggerSQLNullInteger"}},"x-go-name":"swaggerRunbookSchedule","x-go-package":"durpdeploy/internal/handler/api"},"RunbookScheduleListResponse":{"type":"array","items":{"$ref":"#/definitions/RunbookSchedule"},"x-go-name":"swaggerRunbookScheduleListResponse","x-go-package":"durpdeploy/internal/handler/api"},"RunbookScheduleRequest":{"type":"object","properties":{"cron":{"type":"string","x-go-name":"Cron"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"version_id":{"type":"integer","format":"int64","x-go-name":"VersionID"}},"x-go-name":"swaggerRunbookScheduleRequest","x-go-package":"durpdeploy/internal/handler/api"},"RunbookScheduleStateResponse":{"type":"object","properties":{"enabled":{"type":"boolean","x-go-name":"Enabled"}},"x-go-name":"swaggerRunbookScheduleStateResponse","x-go-package":"durpdeploy/internal/handler/api"},"RunbookStateResponse":{"type":"object","properties":{"status":{"type":"string","x-go-name":"Status"}},"x-go-name":"swaggerRunbookStateResponse","x-go-package":"durpdeploy/internal/handler/api"},"RunbookStep":{"type":"object","properties":{"agent_execution_mode":{"type":"string","x-go-name":"AgentExecutionMode"},"agent_selectors":{"type":"array","items":{"type":"string"},"x-go-name":"AgentSelectors"},"approval_artifact_path":{"type":"string","x-go-name":"ApprovalArtifactPath"},"approval_review_format":{"type":"string","x-go-name":"ApprovalReviewFormat"},"approval_review_path":{"type":"string","x-go-name":"ApprovalReviewPath"},"container_image":{"type":"string","x-go-name":"ContainerImage"},"execution_target":{"type":"string","x-go-name":"ExecutionTarget"},"interpreter":{"type":"string","x-go-name":"Interpreter"},"max_retries":{"type":"integer","format":"int64","x-go-name":"MaxRetries"},"name":{"type":"string","x-go-name":"Name"},"network_mode":{"type":"string","x-go-name":"NetworkMode"},"script_body":{"type":"string","x-go-name":"ScriptBody"},"sort_order":{"type":"integer","format":"int64","x-go-name":"SortOrder"},"timeout_seconds":{"type":"integer","format":"int64","x-go-name":"TimeoutSeconds"},"variable_names":{"type":"array","items":{"type":"string"},"x-go-name":"VariableNames"}},"x-go-name":"swaggerRunbookStep","x-go-package":"durpdeploy/internal/handler/api"},"RunbookVersion":{"type":"object","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"release_id":{"type":"integer","format":"int64","x-go-name":"ReleaseID"},"runbook_id":{"type":"integer","format":"int64","x-go-name":"RunbookID"},"version":{"type":"integer","format":"int64","x-go-name":"Version"}},"x-go-name":"swaggerRunbookVersion","x-go-package":"durpdeploy/internal/handler/api"},"RunbookVersionResponse":{"type":"object","properties":{"artifact":{"$ref":"#/definitions/ReleaseArtifactResponse"},"steps":{"type":"array","items":{"$ref":"#/definitions/RunbookStep"},"x-go-name":"Steps"},"version":{"$ref":"#/definitions/RunbookVersion"}},"x-go-name":"swaggerRunbookVersionResponse","x-go-package":"durpdeploy/internal/handler/api"},"ScheduleRequest":{"type":"object","title":"ScheduleRequest is the body for create/update scheduled deployment.","properties":{"active":{"description":"Active is an alias for enabled; either is accepted.","type":"boolean","x-go-name":"Active"},"cron":{"type":"string","x-go-name":"Cron"},"cron_expr":{"description":"Deprecated: alias for cron. Prefer cron in new callers.","type":"string","x-deprecated":true,"x-go-name":"CronExpr"},"enabled":{"type":"boolean","x-go-name":"Enabled"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"note":{"type":"string","x-go-name":"Note"},"release_id":{"type":"integer","format":"int64","x-go-name":"ReleaseID"}},"x-go-name":"swaggerScheduleRequest","x-go-package":"durpdeploy/internal/handler/api"},"ScheduledDeployment":{"type":"object","title":"ScheduledDeployment is a cron-driven deployment configuration.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"cron":{"type":"string","x-go-name":"Cron"},"enabled":{"type":"integer","format":"int64","x-go-name":"Enabled"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"last_error":{"type":"string","x-go-name":"LastError"},"last_fired_at":{"type":"integer","format":"int64","x-go-name":"LastFiredAt"},"next_run_at":{"type":"integer","format":"int64","x-go-name":"NextRunAt"},"note":{"type":"string","x-go-name":"Note"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"release_id":{"type":"integer","format":"int64","x-go-name":"ReleaseID"},"updated_at":{"type":"integer","format":"int64","x-go-name":"UpdatedAt"}},"x-go-name":"swaggerScheduledDeployment","x-go-package":"durpdeploy/internal/handler/api"},"ScheduledDeploymentListResponse":{"type":"array","title":"ScheduledDeploymentListResponse is a list of scheduled deployments.","items":{"$ref":"#/definitions/ScheduledDeployment"},"x-go-name":"swaggerScheduledDeploymentListResponse","x-go-package":"durpdeploy/internal/handler/api"},"ServerError":{"type":"object","title":"Server error response.","properties":{"error":{"type":"string","x-go-name":"Error"}},"x-go-name":"swaggerServerError","x-go-package":"durpdeploy/internal/handler/api"},"ServerStatsResponse":{"type":"object","title":"ServerStatsResponse contains aggregate counts.","properties":{"deployments":{"type":"integer","format":"int64","x-go-name":"Deployments"},"projects":{"type":"integer","format":"int64","x-go-name":"Projects"},"users":{"type":"integer","format":"int64","x-go-name":"Users"}},"x-go-name":"swaggerServerStatsResponse","x-go-package":"durpdeploy/internal/handler/api"},"SpecResponse":{"type":"object","title":"SpecResponse is the raw OpenAPI JSON spec.","x-go-name":"swaggerSpecResponse","x-go-package":"durpdeploy/internal/handler/api"},"StatusResponse":{"type":"object","title":"Status message response.","properties":{"status":{"type":"string","x-go-name":"Status"}},"x-go-name":"swaggerStatusResponse","x-go-package":"durpdeploy/internal/handler/api"},"Step":{"type":"object","title":"Step is an executable script step within a project.","properties":{"agent_execution_mode":{"type":"string","x-go-name":"AgentExecutionMode"},"agent_selectors":{"type":"array","items":{"type":"string"},"x-go-name":"AgentSelectors"},"approval_artifact_path":{"type":"string","x-go-name":"ApprovalArtifactPath"},"approval_review_format":{"type":"string","x-go-name":"ApprovalReviewFormat"},"approval_review_path":{"type":"string","x-go-name":"ApprovalReviewPath"},"container_image":{"description":"Container image required for local steps and agent container mode.","type":"string","x-go-name":"ContainerImage"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"execution_target":{"type":"string","x-go-name":"ExecutionTarget"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"interpreter":{"type":"string","x-go-name":"Interpreter"},"max_retries":{"type":"integer","format":"int64","x-go-name":"MaxRetries"},"name":{"type":"string","x-go-name":"Name"},"network_mode":{"type":"string","x-go-name":"NetworkMode"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"script_body":{"type":"string","x-go-name":"ScriptBody"},"sort_order":{"type":"integer","format":"int64","x-go-name":"SortOrder"},"timeout_seconds":{"type":"integer","format":"int64","x-go-name":"TimeoutSeconds"},"variable_names":{"description":"Optional variable-name restriction. Empty passes all variables.","type":"array","items":{"type":"string"},"x-go-name":"VariableNames"}},"x-go-name":"swaggerStep","x-go-package":"durpdeploy/internal/handler/api"},"StepListResponse":{"type":"array","title":"StepListResponse is a list of project steps.","items":{"$ref":"#/definitions/Step"},"x-go-name":"swaggerStepListResponse","x-go-package":"durpdeploy/internal/handler/api"},"StepRequest":{"type":"object","title":"StepRequest is the body for create/update step.","properties":{"agent_execution_mode":{"type":"string","x-go-name":"AgentExecutionMode"},"agent_selectors":{"type":"array","items":{"type":"string"},"x-go-name":"AgentSelectors"},"approval_artifact_path":{"type":"string","x-go-name":"ApprovalArtifactPath"},"approval_review_format":{"type":"string","x-go-name":"ApprovalReviewFormat"},"approval_review_path":{"type":"string","x-go-name":"ApprovalReviewPath"},"container_image":{"description":"Required for local steps and agent container mode; rejected for agent host mode.","type":"string","x-go-name":"ContainerImage"},"execution_target":{"type":"string","x-go-name":"ExecutionTarget"},"interpreter":{"type":"string","x-go-name":"Interpreter"},"max_retries":{"type":"integer","format":"int64","x-go-name":"MaxRetries"},"name":{"type":"string","x-go-name":"Name"},"network_mode":{"type":"string","x-go-name":"NetworkMode"},"script_body":{"type":"string","x-go-name":"ScriptBody"},"sort_order":{"type":"integer","format":"int64","x-go-name":"SortOrder"},"timeout_seconds":{"type":"integer","format":"int64","x-go-name":"TimeoutSeconds"},"variable_names":{"description":"Optional variable-name restriction. Empty passes all variables;\nentries must be identifiers without duplicates.","type":"array","items":{"type":"string"},"x-go-name":"VariableNames"}},"x-go-name":"swaggerStepRequest","x-go-package":"durpdeploy/internal/handler/api"},"StepTemplate":{"type":"object","title":"StepTemplate is a reusable step template.","properties":{"agent_execution_mode":{"type":"string","x-go-name":"AgentExecutionMode"},"agent_selectors":{"type":"array","items":{"type":"string"},"x-go-name":"AgentSelectors"},"approval_artifact_path":{"type":"string","x-go-name":"ApprovalArtifactPath"},"approval_review_format":{"type":"string","x-go-name":"ApprovalReviewFormat"},"approval_review_path":{"type":"string","x-go-name":"ApprovalReviewPath"},"container_image":{"type":"string","x-go-name":"ContainerImage"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"execution_target":{"type":"string","x-go-name":"ExecutionTarget"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"interpreter":{"type":"string","x-go-name":"Interpreter"},"name":{"type":"string","x-go-name":"Name"},"network_mode":{"type":"string","x-go-name":"NetworkMode"},"script_body":{"type":"string","x-go-name":"ScriptBody"},"variable_names":{"type":"array","items":{"type":"string"},"x-go-name":"VariableNames"}},"x-go-name":"swaggerStepTemplate","x-go-package":"durpdeploy/internal/handler/api"},"StepTemplateListResponse":{"type":"array","title":"StepTemplateListResponse is a list of step templates.","items":{"$ref":"#/definitions/StepTemplate"},"x-go-name":"swaggerStepTemplateListResponse","x-go-package":"durpdeploy/internal/handler/api"},"StepTemplateRequest":{"type":"object","title":"StepTemplateRequest is the body for create/update step template.","properties":{"agent_execution_mode":{"type":"string","x-go-name":"AgentExecutionMode"},"agent_selectors":{"type":"array","items":{"type":"string"},"x-go-name":"AgentSelectors"},"approval_artifact_path":{"type":"string","x-go-name":"ApprovalArtifactPath"},"approval_review_format":{"type":"string","x-go-name":"ApprovalReviewFormat"},"approval_review_path":{"type":"string","x-go-name":"ApprovalReviewPath"},"container_image":{"description":"Required for local steps and agent container mode; rejected for agent host mode.","type":"string","x-go-name":"ContainerImage"},"execution_target":{"type":"string","x-go-name":"ExecutionTarget"},"interpreter":{"type":"string","x-go-name":"Interpreter"},"name":{"type":"string","x-go-name":"Name"},"network_mode":{"type":"string","x-go-name":"NetworkMode"},"script_body":{"type":"string","x-go-name":"ScriptBody"},"variable_names":{"description":"Optional variable-name restriction. Empty passes all variables;\nentries must be identifiers without duplicates.","type":"array","items":{"type":"string"},"x-go-name":"VariableNames"}},"x-go-name":"swaggerStepTemplateRequest","x-go-package":"durpdeploy/internal/handler/api"},"StepTemplateVersion":{"type":"object","title":"StepTemplateVersion is a historical version of a step template.","properties":{"agent_execution_mode":{"type":"string","x-go-name":"AgentExecutionMode"},"agent_selectors":{"type":"array","items":{"type":"string"},"x-go-name":"AgentSelectors"},"approval_artifact_path":{"type":"string","x-go-name":"ApprovalArtifactPath"},"approval_review_format":{"type":"string","x-go-name":"ApprovalReviewFormat"},"approval_review_path":{"type":"string","x-go-name":"ApprovalReviewPath"},"container_image":{"type":"string","x-go-name":"ContainerImage"},"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"execution_target":{"type":"string","x-go-name":"ExecutionTarget"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"interpreter":{"type":"string","x-go-name":"Interpreter"},"name":{"type":"string","x-go-name":"Name"},"network_mode":{"type":"string","x-go-name":"NetworkMode"},"script_body":{"type":"string","x-go-name":"ScriptBody"},"template_id":{"type":"integer","format":"int64","x-go-name":"TemplateID"},"variable_names":{"type":"array","items":{"type":"string"},"x-go-name":"VariableNames"},"version_number":{"type":"integer","format":"int64","x-go-name":"VersionNumber"}},"x-go-name":"swaggerStepTemplateVersion","x-go-package":"durpdeploy/internal/handler/api"},"StepTemplateVersionListResponse":{"type":"array","title":"StepTemplateVersionListResponse is a list of step template versions.","items":{"$ref":"#/definitions/StepTemplateVersion"},"x-go-name":"swaggerStepTemplateVersionListResponse","x-go-package":"durpdeploy/internal/handler/api"},"StreamResponse":{"type":"object","title":"StreamResponse is a server-sent event stream.","properties":{"data":{"type":"string","x-go-name":"Data"}},"x-go-name":"swaggerStreamResponse","x-go-package":"durpdeploy/internal/handler/api"},"SwaggerUIResponse":{"type":"object","title":"SwaggerUIResponse is the swagger-ui HTML page.","x-go-name":"swaggerUIResponse","x-go-package":"durpdeploy/internal/handler/api"},"TerraformResourceChange":{"type":"object","properties":{"actions":{"type":"array","items":{"type":"string"},"x-go-name":"Actions"},"address":{"type":"string","x-go-name":"Address"},"after":{"type":"string","x-go-name":"After"},"before":{"type":"string","x-go-name":"Before"},"omitted_fields":{"type":"array","items":{"type":"string"},"x-go-name":"OmittedFields"}},"x-go-package":"durpdeploy/internal/artifact"},"TerraformReviewResponse":{"type":"object","properties":{"preview_truncated":{"type":"boolean","x-go-name":"PreviewTruncated"},"resources":{"type":"array","items":{"$ref":"#/definitions/TerraformResourceChange"},"x-go-name":"Resources"},"resources_omitted":{"type":"integer","format":"int64","x-go-name":"ResourcesOmitted"},"review_source":{"type":"string","x-go-name":"ReviewSource"},"review_verified":{"type":"boolean","x-go-name":"ReviewVerified"}},"x-go-package":"durpdeploy/internal/artifact"},"TextResponse":{"type":"object","title":"TextResponse is a plain text response.","properties":{"Body":{"type":"string"}},"x-go-name":"swaggerTextResponse","x-go-package":"durpdeploy/internal/handler/api"},"TokenListResponse":{"type":"array","title":"TokenListResponse is a list of API tokens.","items":{"$ref":"#/definitions/TokenResponse"},"x-go-name":"swaggerTokenListResponse","x-go-package":"durpdeploy/internal/handler/api"},"TokenResponse":{"type":"object","title":"TokenResponse is the token representation returned by list endpoints.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"email":{"type":"string","x-go-name":"Email"},"expires_at":{"type":"integer","format":"int64","x-go-name":"ExpiresAt"},"id":{"type":"string","x-go-name":"ID"},"last_used_at":{"type":"integer","format":"int64","x-go-name":"LastUsedAt"},"name":{"type":"string","x-go-name":"Name"},"prefix":{"type":"string","x-go-name":"Prefix"},"project_ids":{"type":"array","items":{"type":"integer","format":"int64"},"x-go-name":"ProjectIDs"},"revoked_at":{"type":"integer","format":"int64","x-go-name":"RevokedAt"},"role":{"type":"string","x-go-name":"Role"},"scope":{"type":"string","x-go-name":"Scope"},"user_id":{"type":"integer","format":"int64","x-go-name":"UserID"},"user_name":{"type":"string","x-go-name":"UserName"}},"x-go-name":"swaggerTokenResponse","x-go-package":"durpdeploy/internal/handler/api"},"TokenScopeResponse":{"type":"object","title":"TokenScopeResponse identifies a token's permission ceiling.","properties":{"project_ids":{"type":"array","items":{"type":"integer","format":"int64"},"x-go-name":"ProjectIDs"},"role":{"type":"string","x-go-name":"Role"},"scope":{"type":"string","x-go-name":"Scope"}},"x-go-name":"swaggerTokenScopeResponse","x-go-package":"durpdeploy/internal/handler/api"},"UnauthorizedError":{"type":"object","title":"Unauthorized error response.","properties":{"error":{"type":"string","x-go-name":"Error"}},"x-go-name":"swaggerUnauthorizedError","x-go-package":"durpdeploy/internal/handler/api"},"User":{"type":"object","title":"User is a user account.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"email":{"type":"string","x-go-name":"Email"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"last_login_at":{"type":"integer","format":"int64","x-go-name":"LastLoginAt"},"name":{"type":"string","x-go-name":"Name"},"role":{"type":"string","x-go-name":"Role"},"updated_at":{"type":"integer","format":"int64","x-go-name":"UpdatedAt"}},"x-go-name":"swaggerUser","x-go-package":"durpdeploy/internal/handler/api"},"UserListResponse":{"type":"array","title":"UserListResponse is a list of users.","items":{"$ref":"#/definitions/UserResponse"},"x-go-name":"swaggerUserListResponse","x-go-package":"durpdeploy/internal/handler/api"},"UserRequest":{"type":"object","title":"UserRequest is the body for create/update user.","properties":{"email":{"type":"string","x-go-name":"Email"},"name":{"type":"string","x-go-name":"Name"},"password":{"type":"string","x-go-name":"Password"},"role":{"type":"string","x-go-name":"Role"}},"x-go-name":"swaggerUserRequest","x-go-package":"durpdeploy/internal/handler/api"},"UserResponse":{"type":"object","title":"UserResponse is the JSON shape for a user.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"email":{"type":"string","x-go-name":"Email"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"last_login_at":{"type":"integer","format":"int64","x-go-name":"LastLoginAt"},"name":{"type":"string","x-go-name":"Name"},"one_time_password":{"type":"string","x-go-name":"OneTimePassword"},"role":{"type":"string","x-go-name":"Role"},"updated_at":{"type":"integer","format":"int64","x-go-name":"UpdatedAt"}},"x-go-name":"swaggerUserResponse","x-go-package":"durpdeploy/internal/handler/api"},"ValidationError":{"type":"object","title":"Validation error response.","properties":{"error":{"type":"string","x-go-name":"Error"}},"x-go-name":"swaggerValidationError","x-go-package":"durpdeploy/internal/handler/api"},"Variable":{"type":"object","title":"Variable is a project or environment-scoped variable.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"secret":{"type":"integer","format":"int64","x-go-name":"Secret"},"value":{"type":"string","x-go-name":"Value"}},"x-go-name":"swaggerVariable","x-go-package":"durpdeploy/internal/handler/api"},"VariableContext":{"type":"object","title":"VariableContext contains only draft metadata, never script text or values.","properties":{"agent_execution_mode":{"type":"string","x-go-name":"AgentMode"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"execution_target":{"type":"string","x-go-name":"Target"},"interpreter":{"type":"string","x-go-name":"Interpreter"},"variable_names":{"type":"array","items":{"type":"string"},"x-go-name":"VariableNames"}},"x-go-package":"durpdeploy/internal/repository"},"VariableDefinition":{"type":"object","title":"VariableDefinition is display data. Secret values are never decrypted.","properties":{"description":{"type":"string","x-go-name":"Description"},"effective":{"type":"boolean","x-go-name":"Effective"},"environment_id":{"description":"Null for unscoped defaults and runtime variables.","type":"integer","format":"int64","x-go-name":"EnvironmentID","x-nullable":true},"key":{"type":"string","x-go-name":"Key"},"name":{"type":"string","x-go-name":"Name"},"overridden_by":{"type":"string","x-go-name":"OverriddenBy"},"reason":{"type":"string","x-go-name":"Reason"},"reference":{"type":"string","x-go-name":"Reference"},"scope":{"type":"string","x-go-name":"Scope"},"secret":{"type":"boolean","x-go-name":"Secret"},"source":{"type":"string","x-go-name":"Source"},"source_name":{"type":"string","x-go-name":"SourceName"},"status":{"type":"string","x-go-name":"Status"},"value":{"description":"Null for secrets and runtime values assigned at execution.","type":"string","x-go-name":"Value","x-nullable":true}},"x-go-package":"durpdeploy/internal/repository"},"VariableEnvironment":{"type":"object","title":"VariableEnvironment deliberately contains no environment configuration.","properties":{"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"}},"x-go-package":"durpdeploy/internal/repository"},"VariableListResponse":{"type":"array","title":"VariableListResponse is a list of variables.","items":{"$ref":"#/definitions/VariableResponse"},"x-go-name":"swaggerVariableListResponse","x-go-package":"durpdeploy/internal/handler/api"},"VariableRequest":{"description":"On update, an empty value with secret=true keeps the stored secret\n(the API never returns secret plaintext, so clients send the masked\nread-back unchanged); set secret=false to clear it.","type":"object","title":"VariableRequest is the body for create/update variable.","properties":{"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"name":{"type":"string","x-go-name":"Name"},"secret":{"type":"boolean","x-go-name":"Secret"},"value":{"type":"string","x-go-name":"Value"}},"x-go-name":"swaggerVariableRequest","x-go-package":"durpdeploy/internal/handler/api"},"VariableResponse":{"description":"Value is always an empty string when Secret is 1: ordinary reads\nnever return secret plaintext (issue #29).","type":"object","title":"VariableResponse is the JSON shape for a variable.","properties":{"created_at":{"type":"integer","format":"int64","x-go-name":"CreatedAt"},"environment_id":{"type":"integer","format":"int64","x-go-name":"EnvironmentID"},"id":{"type":"integer","format":"int64","x-go-name":"ID"},"name":{"type":"string","x-go-name":"Name"},"project_id":{"type":"integer","format":"int64","x-go-name":"ProjectID"},"secret":{"type":"integer","format":"int64","x-go-name":"Secret"},"value":{"type":"string","x-go-name":"Value"}},"x-go-name":"swaggerVariableResponse","x-go-package":"durpdeploy/internal/handler/api"},"rollbackRequest":{"type":"object","properties":{"target_deployment_id":{"type":"integer","format":"int64","x-go-name":"TargetDeploymentID"}},"x-go-package":"durpdeploy/internal/handler/api"},"saveProjectTemplateRequest":{"type":"object","properties":{"description":{"type":"string","x-go-name":"Description"},"name":{"type":"string","x-go-name":"Name"}},"x-go-package":"durpdeploy/internal/handler/api"},"swaggerAgentError":{"type":"object","properties":{"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"finished_at":{"$ref":"#/definitions/swaggerSQLNullInteger"},"reason":{"type":"string","x-go-name":"Reason"},"state":{"type":"string","x-go-name":"State"},"step_index":{"type":"integer","format":"int64","x-go-name":"StepIndex"}},"x-go-package":"durpdeploy/internal/handler/api"},"swaggerAgentSuccess":{"type":"object","properties":{"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"finished_at":{"$ref":"#/definitions/swaggerSQLNullInteger"}},"x-go-package":"durpdeploy/internal/handler/api"},"swaggerAgentWork":{"type":"object","properties":{"deployment_id":{"type":"integer","format":"int64","x-go-name":"DeploymentID"},"state":{"type":"string","x-go-name":"State"},"step_index":{"type":"integer","format":"int64","x-go-name":"StepIndex"}},"x-go-package":"durpdeploy/internal/handler/api"},"swaggerSQLNullInteger":{"type":"object","properties":{"Int64":{"type":"integer","format":"int64"},"Valid":{"type":"boolean"}},"x-go-package":"durpdeploy/internal/handler/api"},"swaggerSQLNullString":{"type":"object","properties":{"String":{"type":"string"},"Valid":{"type":"boolean"}},"x-go-package":"durpdeploy/internal/handler/api"}},"responses":{"ArtifactGateListResponse":{"description":"","schema":{"type":"array","items":{"$ref":"#/definitions/ArtifactGateInfo"}}},"ArtifactGateReviewResponse":{"description":"","schema":{"$ref":"#/definitions/TerraformReviewResponse"}},"StagingListResponse":{"description":"","schema":{"type":"array","items":{"$ref":"#/definitions/DeploymentStagingSnapshot"}}}},"securityDefinitions":{"bearer":{"type":"apiKey","name":"Authorization","in":"header"}},"security":[{"bearer":[]}]}