{"openapi":"3.1.0","info":{"title":"LeiOS API","description":"Unified LeiOS API. Endpoints are scoped by resource and gated by per-route permission checks.","version":"1.1.0"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Enter your bearer token in the format **Bearer &lt;token&gt;**"}},"responses":{"undefined":{"description":"Authentication information is missing or invalid"}}},"security":[{"bearerAuth":[]}],"servers":[{"url":"http://localhost:12151/v1/","description":"Local development server"},{"url":"https://api.leios.dev/v1/","description":"Production server"}],"x-tagGroups":[{"name":"Resources","tags":["Publishers","Publishers / Members","Packages","Packages / Releases","Packages / Stable Promotion Requests","Packages / Role Assignments","Users"]},{"name":"Admin","tags":["Admin / Users","Admin / OS Releases","Admin / Tasks","Admin / Stable Promotion Requests"]},{"name":"Account & Authentication","tags":["Account","Account / API Keys","Authentication"]}],"tags":[{"name":"Publishers","description":"Manage publishers (organizations) and their members."},{"name":"Publishers / Members","x-displayName":"Members","summary":"Members","parent":"Publishers","description":"Manage members of a publisher."},{"name":"Packages","description":"Manage packages owned by publishers."},{"name":"Packages / Releases","x-displayName":"Releases","summary":"Releases","parent":"Packages","description":"Manage package releases."},{"name":"Packages / Stable Promotion Requests","x-displayName":"Stable Promotion Requests","summary":"Stable Promotion Requests","parent":"Packages","description":"Request promotion of package releases to stable."},{"name":"Packages / Role Assignments","x-displayName":"Role Assignments","summary":"Role Assignments","parent":"Packages","description":"Per-package role overrides that elevate a user above their publisher-level role."},{"name":"Admin / Users","x-displayName":"Users","summary":"Users","parent":"Admin","description":"Site-admin user management."},{"name":"Admin / OS Releases","x-displayName":"OS Releases","summary":"OS Releases","parent":"Admin","description":"Site-admin OS release management."},{"name":"Admin / Tasks","x-displayName":"Tasks","summary":"Tasks","parent":"Admin","description":"Site-admin scheduled task management."},{"name":"Admin / Stable Promotion Requests","x-displayName":"Stable Promotion Requests","summary":"Stable Promotion Requests","parent":"Admin","description":"Site-admin global stable promotion request decisions."},{"name":"Account","description":"Endpoints for user account management"},{"name":"Account / API Keys","x-displayName":"API Keys","summary":"API Keys","parent":"Account","description":"Endpoints for managing account API keys"},{"name":"Authentication","description":"Endpoints for authentication and authorization"},{"name":"Users","description":"Public user search, allowing authenticated users to find other users."}],"paths":{"/auth/login":{"post":{"operationId":"postAuthLogin","summary":"User Login","description":"Authenticate a user with their username and password","tags":["Authentication"],"responses":{"200":{"description":"Login successful","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Login successful"},"data":{"type":"object","properties":{"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_role":{"type":"string","enum":["admin","developer","user"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expires_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"token":{"type":"string"}},"required":["user_id","user_role","created_at","expires_at","token"]}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"401":{"description":"Invalid username or password / You are already authenticated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"Invalid username or password / You are already authenticated"}},"required":["success","code","message"]}}}},"429":{"description":"Too many login attempts. Try again later.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":429},"message":{"type":"string","const":"Too many login attempts. Try again later."}},"required":["success","code","message"]}}}}},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"password":{"type":"string"}},"required":["username","password"]}}}}}},"/auth/session":{"get":{"operationId":"getAuthSession","summary":"Get Current Session","description":"Retrieve the current user's session information","tags":["Authentication"],"responses":{"200":{"description":"Session info retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Session info retrieved successfully"},"data":{"type":"object","properties":{"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_role":{"type":"string","enum":["admin","developer","user"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expires_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["user_id","user_role","created_at","expires_at"]}},"required":["success","code","message","data"]}}}},"401":{"description":"Unauthorized: Invalid or missing session token / Your Auth Context is not a session","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"Unauthorized: Invalid or missing session token / Your Auth Context is not a session"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/auth/logout":{"post":{"operationId":"postAuthLogout","summary":"User Logout","description":"Invalidate the current user's session","tags":["Authentication"],"responses":{"200":{"description":"Logout successful","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Logout successful"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"401":{"description":"Unauthorized: Invalid or missing session token / Your Auth Context is not a session","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"Unauthorized: Invalid or missing session token / Your Auth Context is not a session"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/auth/reset-password":{"post":{"operationId":"postAuthResetPassword","summary":"Reset your password for reset token","description":"Reset your password using a valid reset token","tags":["Authentication"],"responses":{"200":{"description":"Password has been reset successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Password has been reset successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"401":{"description":"You are already authenticated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"You are already authenticated"}},"required":["success","code","message"]}}}}},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reset_token":{"type":"string","minLength":1},"new_password":{"type":"string","minLength":8,"maxLength":50,"pattern":"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$","description":"New password for the account"}},"required":["reset_token","new_password"]}}}}}},"/auth/reset-password/request":{"post":{"operationId":"postAuthResetPasswordRequest","summary":"Request Password Reset","description":"Request a password reset for a user using their username","tags":["Authentication"],"responses":{"200":{"description":"If the username exists, a password reset has been requested","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"If the username exists, a password reset has been requested"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"401":{"description":"You are already authenticated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"You are already authenticated"}},"required":["success","code","message"]}}}}},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["email"]}}}}}},"/account":{"get":{"operationId":"getAccount","summary":"Get account information","description":"Retrieve information about the authenticated user's account.","tags":["Account"],"responses":{"200":{"description":"Account information retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Account information retrieved successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"username":{"type":"string"},"display_name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["admin","developer","user"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","username","display_name","email","role","created_at"]}},"required":["success","code","message","data"]}}}},"401":{"description":"Your Auth Context is not a session","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"Your Auth Context is not a session"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]},"put":{"operationId":"putAccount","summary":"Update account information","description":"Update information about the authenticated user's account.","tags":["Account"],"responses":{"200":{"description":"Account information updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Account information updated successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"401":{"description":"Your Auth Context is not a session","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"Your Auth Context is not a session"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"username":{"type":"string","minLength":5,"maxLength":40,"pattern":"^(?!.*[.-]{2})(?!.*--)(?!.*\\.\\.)[a-z0-9](?:[a-z0-9._-]{3,38}[a-z0-9_])?$"},"display_name":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}}},{"type":"object","properties":{"current_password":{"type":"string","minLength":1,"description":"Current password — required to confirm account changes"}},"required":["current_password"]}]}}}}},"delete":{"operationId":"deleteAccount","summary":"Delete account","description":"Permanently delete the authenticated user's account.","tags":["Account"],"responses":{"200":{"description":"Account deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Account deleted successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"401":{"description":"Your Auth Context is not a session","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"Your Auth Context is not a session"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/account/password":{"put":{"operationId":"putAccountPassword","summary":"Change account password","description":"Change the password of the authenticated user's account.","tags":["Account"],"responses":{"200":{"description":"Password changed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Password changed successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Current password is incorrect / Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Current password is incorrect / Syntax or validation error in request"}},"required":["success","code","message"]}}}},"401":{"description":"Your Auth Context is not a session","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"Your Auth Context is not a session"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"current_password":{"type":"string","description":"Current password of the account"},"new_password":{"type":"string","minLength":8,"maxLength":50,"pattern":"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$","description":"New password for the account"}},"required":["current_password","new_password"]}}}}}},"/account/apikeys":{"get":{"operationId":"getAccountApikeys","summary":"Get all API keys","description":"Retrieve all API keys for the authenticated user's account.","tags":["Account / API Keys"],"responses":{"200":{"description":"API keys retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"API keys retrieved successfully"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"description":{"type":"string"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expires_at":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["id","description","created_at","expires_at"]}}},"required":["success","code","message","data"]}}}}},"security":[{"bearerAuth":[]}]},"post":{"operationId":"postAccountApikeys","summary":"Create a new API key","description":"Create a new API key for the authenticated user's account.","tags":["Account / API Keys"],"responses":{"200":{"description":"API key created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"API key created successfully"},"data":{"type":"object","properties":{"id":{"type":"string"},"token":{"type":"string"}},"required":["id","token"]}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string","minLength":1,"maxLength":255},"expires_at":{"anyOf":[{"type":"string","const":"7d","title":"7 days"},{"type":"string","const":"30d","title":"30 days"},{"type":"string","const":"90d","title":"90 days"},{"type":"string","const":"180d","title":"180 days"},{"type":"string","const":"365d","title":"365 days"},{"type":"null","const":null,"title":"No expiration"}]}},"required":["description","expires_at"]}}}}}},"/account/apikeys/{apiKeyID}":{"get":{"operationId":"getAccountApikeysByApiKeyID","parameters":[{"in":"path","name":"apiKeyID","schema":{"type":"string","minLength":1,"maxLength":255},"required":true}],"summary":"Get API key details","description":"Retrieve details of a specific API key by its ID for the authenticated user's account.","tags":["Account / API Keys"],"responses":{"200":{"description":"API key retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"API key retrieved successfully"},"data":{"type":"object","properties":{"id":{"type":"string"},"description":{"type":"string"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expires_at":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["id","description","created_at","expires_at"]}},"required":["success","code","message","data"]}}}},"404":{"description":"API key not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"API key not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]},"delete":{"operationId":"deleteAccountApikeysByApiKeyID","parameters":[{"in":"path","name":"apiKeyID","schema":{"type":"string","minLength":1,"maxLength":255},"required":true}],"summary":"Delete an API key","description":"Delete an API key by its ID for the authenticated user's account.","tags":["Account / API Keys"],"responses":{"200":{"description":"API key deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"API key deleted successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"404":{"description":"API key not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"API key not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/publishers":{"get":{"operationId":"getPublishers","summary":"List publishers","description":"Retrieve a list of all publishers matching the search criteria.","tags":["Publishers"],"responses":{"200":{"description":"Publishers retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Publishers retrieved successfully"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"display_name":{"type":"string"},"description":{"type":"string"},"homepage_url":{"type":"string"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maintainer_contact_name":{"type":"string"},"maintainer_contact_email":{"type":"string"}},"required":["id","name","display_name","description","homepage_url","created_at","maintainer_contact_name","maintainer_contact_email"]}}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}}},"security":[],"parameters":[{"in":"query","name":"limit","schema":{"default":10,"type":"integer","minimum":1,"maximum":100}},{"in":"query","name":"offset","schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},{"in":"query","name":"searchString","schema":{"type":"string","minLength":3}},{"in":"query","name":"onlyMembershipByMe","schema":{"default":false,"type":"boolean"}}]},"post":{"operationId":"postPublishers","summary":"Create publisher","description":"Create a new publisher. Creator becomes the owner.","tags":["Publishers"],"responses":{"201":{"description":"Publisher created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":201},"message":{"type":"string","const":"Publisher created successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["id"]}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"Authentication required"}},"required":["success","code","message"]}}}},"409":{"description":"Publisher with this name already exists","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":409},"message":{"type":"string","const":"Publisher with this name already exists"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"display_name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1,"maxLength":500},"homepage_url":{"type":"string","maxLength":500,"format":"uri"},"maintainer_contact_name":{"type":"string","minLength":1,"maxLength":254},"maintainer_contact_email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","display_name","description","homepage_url","maintainer_contact_name","maintainer_contact_email"]}}}}}},"/publishers/{publisherName}":{"get":{"operationId":"getPublishersByPublisherName","parameters":[{"in":"path","name":"publisherName","schema":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"required":true}],"summary":"Get publisher","description":"Retrieve details of a specific publisher.","tags":["Publishers"],"responses":{"200":{"description":"Publisher retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Publisher retrieved successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"display_name":{"type":"string"},"description":{"type":"string"},"homepage_url":{"type":"string"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maintainer_contact_name":{"type":"string"},"maintainer_contact_email":{"type":"string"}},"required":["id","name","display_name","description","homepage_url","created_at","maintainer_contact_name","maintainer_contact_email"]}},"required":["success","code","message","data"]}}}},"404":{"description":"Publisher not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Publisher not found"}},"required":["success","code","message"]}}}}},"security":[]},"put":{"operationId":"putPublishersByPublisherName","parameters":[{"in":"path","name":"publisherName","schema":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"required":true}],"summary":"Update publisher","description":"Update publisher details. Requires publisher.update permission.","tags":["Publishers"],"responses":{"200":{"description":"Publisher updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Publisher updated successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to update this publisher","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to update this publisher"}},"required":["success","code","message"]}}}},"404":{"description":"Publisher not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Publisher not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"display_name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1,"maxLength":500},"homepage_url":{"type":"string","maxLength":500,"format":"uri"},"maintainer_contact_name":{"type":"string","minLength":1,"maxLength":254},"maintainer_contact_email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}}}}}}},"delete":{"operationId":"deletePublishersByPublisherName","parameters":[{"in":"path","name":"publisherName","schema":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"required":true}],"summary":"Delete publisher","description":"Delete a publisher. Only the publisher owner (or site admin) can delete, and the publisher must have no packages.","tags":["Publishers"],"responses":{"200":{"description":"Publisher deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Publisher deleted successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Cannot delete publisher with existing packages","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Cannot delete publisher with existing packages"}},"required":["success","code","message"]}}}},"403":{"description":"Only the publisher owner can delete this publisher","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"Only the publisher owner can delete this publisher"}},"required":["success","code","message"]}}}},"404":{"description":"Publisher not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Publisher not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/publishers/{publisherName}/transfer-ownership":{"post":{"operationId":"postPublishersByPublisherNameTransferOwnership","parameters":[{"in":"path","name":"publisherName","schema":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"required":true}],"summary":"Transfer publisher ownership","description":"Transfer ownership of a publisher to another user. Only the current owner (or site admin) can perform this action.","tags":["Publishers"],"responses":{"200":{"description":"Publisher ownership transferred successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Publisher ownership transferred successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"Only the current owner can transfer ownership","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"Only the current owner can transfer ownership"}},"required":["success","code","message"]}}}},"404":{"description":"Publisher not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Publisher not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"new_owner_user_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["new_owner_user_id"]}}}}}},"/publishers/{publisherName}/members":{"get":{"operationId":"getPublishersByPublisherNameMembers","parameters":[{"in":"path","name":"publisherName","schema":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"required":true}],"summary":"List members","description":"Retrieve all members of a publisher. Hidden members are only visible to other members and site admins.","tags":["Publishers / Members"],"responses":{"200":{"description":"Members retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Members retrieved successfully"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"role":{"type":"string","enum":["ADMIN","MAINTAINER","DEVELOPER","VIEWER"]},"is_publicly_hidden":{"type":"boolean"},"added_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_username":{"type":"string"},"user_display_name":{"type":"string"}},"required":["id","user_id","role","is_publicly_hidden","added_at","user_username","user_display_name"]}}},"required":["success","code","message","data"]}}}}},"security":[]},"post":{"operationId":"postPublishersByPublisherNameMembers","parameters":[{"in":"path","name":"publisherName","schema":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"required":true}],"summary":"Add member","description":"Add a new member to a publisher with the given role.","tags":["Publishers / Members"],"responses":{"201":{"description":"Member added successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":201},"message":{"type":"string","const":"Member added successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["id"]}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to manage members","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to manage members"}},"required":["success","code","message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"User not found"}},"required":["success","code","message"]}}}},"409":{"description":"User is already a member","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":409},"message":{"type":"string","const":"User is already a member"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"user_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"role":{"type":"string","enum":["ADMIN","MAINTAINER","DEVELOPER","VIEWER"]},"is_publicly_hidden":{"default":false,"type":"boolean"}},"required":["user_id","role"]}}}}}},"/publishers/{publisherName}/members/{userId}":{"get":{"operationId":"getPublishersByPublisherNameMembersByUserId","parameters":[{"in":"path","name":"publisherName","schema":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"required":true},{"in":"path","name":"userId","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Get member by ID","description":"Retrieve a single publisher member by their user ID.","tags":["Publishers / Members"],"responses":{"200":{"description":"Member retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Member retrieved successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"role":{"type":"string","enum":["ADMIN","MAINTAINER","DEVELOPER","VIEWER"]},"is_publicly_hidden":{"type":"boolean"},"added_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_username":{"type":"string"},"user_display_name":{"type":"string"}},"required":["id","user_id","role","is_publicly_hidden","added_at","user_username","user_display_name"]}},"required":["success","code","message","data"]}}}},"404":{"description":"Member not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Member not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]},"put":{"operationId":"putPublishersByPublisherNameMembersByUserId","parameters":[{"in":"path","name":"publisherName","schema":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"required":true},{"in":"path","name":"userId","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Update member","description":"Update a publisher member's role or visibility. Cannot modify the publisher owner's membership.","tags":["Publishers / Members"],"responses":{"200":{"description":"Member updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Member updated successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to manage members","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to manage members"}},"required":["success","code","message"]}}}},"404":{"description":"Member not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Member not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["ADMIN","MAINTAINER","DEVELOPER","VIEWER"]},"is_publicly_hidden":{"type":"boolean"}}}}}}},"delete":{"operationId":"deletePublishersByPublisherNameMembersByUserId","parameters":[{"in":"path","name":"publisherName","schema":{"type":"string","minLength":2,"maxLength":50,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"required":true},{"in":"path","name":"userId","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Remove member","description":"Remove a member from a publisher. The publisher owner cannot be removed — transfer ownership first.","tags":["Publishers / Members"],"responses":{"200":{"description":"Member removed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Member removed successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Cannot remove the publisher owner","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Cannot remove the publisher owner"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to manage members","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to manage members"}},"required":["success","code","message"]}}}},"404":{"description":"Member not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Member not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/packages":{"get":{"operationId":"getPackages","summary":"List packages","description":"Retrieve a list of packages, optionally filtered by publisher or search string.","tags":["Packages"],"responses":{"200":{"description":"Packages retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Packages retrieved successfully"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"publisher_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"fullname":{"type":"string"},"top_level_alias":{"anyOf":[{"type":"string"},{"type":"null"}]},"display_name":{"type":"string"},"description":{"type":"string"},"homepage_url":{"type":"string"},"flags":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"array","items":{}}]},"requires_patching":{"type":"boolean"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"latest_stable_release":{"type":"object","properties":{"amd64":{"anyOf":[{"type":"string"},{"type":"null"}]},"arm64":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["amd64","arm64"]},"latest_testing_release":{"type":"object","properties":{"amd64":{"anyOf":[{"type":"string"},{"type":"null"}]},"arm64":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["amd64","arm64"]}},"required":["id","publisher_id","name","fullname","top_level_alias","display_name","description","homepage_url","flags","requires_patching","created_at","latest_stable_release","latest_testing_release"]}}},"required":["success","code","message","data"]}}}}},"security":[],"parameters":[{"in":"query","name":"limit","schema":{"default":10,"type":"integer","minimum":1,"maximum":100}},{"in":"query","name":"offset","schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},{"in":"query","name":"searchString","schema":{"type":"string","minLength":3}},{"in":"query","name":"publisherID","schema":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"in":"query","name":"publisherName","schema":{"type":"string","minLength":1}},{"in":"query","name":"onlyMembershipByMe","schema":{"default":false,"type":"boolean"}}]},"post":{"operationId":"postPackages","summary":"Create a new package","description":"Create a new package under the given publisher. Requires packages.create permission on that publisher.","tags":["Packages"],"responses":{"201":{"description":"Package created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":201},"message":{"type":"string","const":"Package created successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to create packages in this publisher","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to create packages in this publisher"}},"required":["success","code","message"]}}}},"404":{"description":"Publisher not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Publisher not found"}},"required":["success","code","message"]}}}},"409":{"description":"Package with this name already exists in this publisher","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":409},"message":{"type":"string","const":"Package with this name already exists in this publisher"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"publisher_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string","minLength":2,"maxLength":200,"pattern":"^[a-z0-9][a-z0-9.-]*[a-z0-9]$"},"display_name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1,"maxLength":500},"homepage_url":{"type":"string","maxLength":500,"format":"uri"},"requires_patching":{"default":false,"type":"boolean"}},"required":["publisher_id","name","display_name","description","homepage_url"]}}}}}},"/packages/{fullPackageName}":{"get":{"operationId":"getPackagesByFullPackageName","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true}],"summary":"Get package details","description":"Retrieve details of a specific package.","tags":["Packages"],"responses":{"200":{"description":"Package retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Package retrieved successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"publisher_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"fullname":{"type":"string"},"top_level_alias":{"anyOf":[{"type":"string"},{"type":"null"}]},"display_name":{"type":"string"},"description":{"type":"string"},"homepage_url":{"type":"string"},"flags":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"array","items":{}}]},"requires_patching":{"type":"boolean"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"latest_stable_release":{"type":"object","properties":{"amd64":{"anyOf":[{"type":"string"},{"type":"null"}]},"arm64":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["amd64","arm64"]},"latest_testing_release":{"type":"object","properties":{"amd64":{"anyOf":[{"type":"string"},{"type":"null"}]},"arm64":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["amd64","arm64"]}},"required":["id","publisher_id","name","fullname","top_level_alias","display_name","description","homepage_url","flags","requires_patching","created_at","latest_stable_release","latest_testing_release"]}},"required":["success","code","message","data"]}}}},"404":{"description":"Package with specified name not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Package with specified name not found"}},"required":["success","code","message"]}}}}},"security":[]},"put":{"operationId":"putPackagesByFullPackageName","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true}],"summary":"Update package details","description":"Update details of a specific package. Requires packages.update permission.","tags":["Packages"],"responses":{"200":{"description":"Package updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Package updated successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"System-managed packages cannot be updated / You do not have permission to update this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"System-managed packages cannot be updated / You do not have permission to update this package"}},"required":["success","code","message"]}}}},"404":{"description":"Package with specified name not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Package with specified name not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"display_name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1,"maxLength":500},"homepage_url":{"type":"string","maxLength":500,"format":"uri"},"requires_patching":{"default":false,"type":"boolean"}}}}}}},"delete":{"operationId":"deletePackagesByFullPackageName","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true}],"summary":"Delete a package","description":"Delete a specific package and its releases. Requires packages.delete permission.","tags":["Packages"],"responses":{"200":{"description":"Package deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Package deleted successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"403":{"description":"System-managed packages cannot be deleted / You do not have permission to delete this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"System-managed packages cannot be deleted / You do not have permission to delete this package"}},"required":["success","code","message"]}}}},"404":{"description":"Package with specified name not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Package with specified name not found"}},"required":["success","code","message"]}}}},"500":{"description":"Failed to delete package from Aptly repositories","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":500},"message":{"type":"string","const":"Failed to delete package from Aptly repositories"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/packages/{fullPackageName}/releases":{"get":{"operationId":"getPackagesByFullPackageNameReleases","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true}],"summary":"List all package releases","description":"Retrieve a list of all releases for the specified package.","tags":["Packages / Releases"],"responses":{"200":{"description":"Package releases retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Package releases retrieved successfully"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"version_with_leios_patch":{"type":"string"},"architectures":{"type":"object","properties":{"amd64":{"type":"boolean"},"arm64":{"type":"boolean"},"is_all":{"type":"boolean"}},"required":["amd64","arm64","is_all"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"changelog":{"type":"string"}},"required":["id","version_with_leios_patch","architectures","created_at","changelog"]}}},"required":["success","code","message","data"]}}}}},"security":[]},"post":{"operationId":"postPackagesByFullPackageNameReleases","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true}],"summary":"Create a new package release","description":"Create a new release for the specified package. Requires packages.releases.publish permission.","tags":["Packages / Releases"],"responses":{"201":{"description":"Package release created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":201},"message":{"type":"string","const":"Package release created successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to publish releases for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to publish releases for this package"}},"required":["success","code","message"]}}}},"409":{"description":"Package release with this version already exists","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":409},"message":{"type":"string","const":"Package release with this version already exists"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"version_with_leios_patch":{"type":"string","pattern":"^(?:[0-9][0-9A-Za-z.+~\\-]*leios\\d+(?:\\.\\d+){0,2}|(?!.*leios)[0-9][0-9A-Za-z.+~\\-]*)$"},"changelog":{"type":"string","minLength":1,"maxLength":10000}},"required":["version_with_leios_patch","changelog"]}}}}}},"/packages/{fullPackageName}/releases/{version_with_leios_patch}/stable-promotion-requests":{"get":{"operationId":"listReleaseStablePromotionRequests","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"version_with_leios_patch","schema":{"type":"string","pattern":"^(?:[0-9][0-9A-Za-z.+~\\-]*leios\\d+(?:\\.\\d+){0,2}|(?!.*leios)[0-9][0-9A-Za-z.+~\\-]*)$"},"required":true},{"in":"query","name":"status","schema":{"type":"string","enum":["pending","approved","denied"]}}],"summary":"List stable promotion requests for a release","description":"Retrieve a list of stable promotion requests for the specified release.","tags":["Packages / Stable Promotion Requests"],"responses":{"200":{"description":"Stable promotion requests retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Stable promotion requests retrieved successfully"},"data":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_release_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","const":"pending"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"admin_note":{"type":"null"},"package_name":{"type":"string"},"package_release_version":{"type":"string"}},"required":["id","package_id","package_release_id","status","created_at","admin_note","package_name","package_release_version"]},{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_release_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","const":"approved"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}]},"package_name":{"type":"string"},"package_release_version":{"type":"string"}},"required":["id","package_id","package_release_id","status","created_at","admin_note","package_name","package_release_version"]},{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_release_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","const":"denied"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}]},"package_name":{"type":"string"},"package_release_version":{"type":"string"}},"required":["id","package_id","package_release_id","status","created_at","admin_note","package_name","package_release_version"]}]}}},"required":["success","code","message","data"]}}}}},"security":[]},"post":{"operationId":"createReleaseStablePromotionRequest","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"version_with_leios_patch","schema":{"type":"string","pattern":"^(?:[0-9][0-9A-Za-z.+~\\-]*leios\\d+(?:\\.\\d+){0,2}|(?!.*leios)[0-9][0-9A-Za-z.+~\\-]*)$"},"required":true}],"summary":"Create a stable promotion request for a release","description":"Submit a request for the specified release to be promoted to stable. Requires packages.releases.requestStable permission.","tags":["Packages / Stable Promotion Requests"],"responses":{"201":{"description":"Stable promotion request submitted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":201},"message":{"type":"string","const":"Stable promotion request submitted"},"data":{"type":"object","properties":{"id":{"type":"number"}},"required":["id"]}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to request stable promotions for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to request stable promotions for this package"}},"required":["success","code","message"]}}}},"409":{"description":"A request already exists for this release or the release is already stable","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":409},"message":{"type":"string","const":"A request already exists for this release or the release is already stable"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}}}},"/packages/{fullPackageName}/releases/{version_with_leios_patch}/stable-promotion-requests/{stablePromotionRequestID}":{"get":{"operationId":"getReleaseStablePromotionRequest","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"version_with_leios_patch","schema":{"type":"string","pattern":"^(?:[0-9][0-9A-Za-z.+~\\-]*leios\\d+(?:\\.\\d+){0,2}|(?!.*leios)[0-9][0-9A-Za-z.+~\\-]*)$"},"required":true},{"in":"path","name":"stablePromotionRequestID","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Get a stable promotion request for a release","description":"Retrieve details of a specific stable promotion request for the specified release.","tags":["Packages / Stable Promotion Requests"],"responses":{"200":{"description":"Stable promotion request retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Stable promotion request retrieved successfully"},"data":{"anyOf":[{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_release_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","const":"pending"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"admin_note":{"type":"null"},"package_name":{"type":"string"},"package_release_version":{"type":"string"}},"required":["id","package_id","package_release_id","status","created_at","admin_note","package_name","package_release_version"]},{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_release_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","const":"approved"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}]},"package_name":{"type":"string"},"package_release_version":{"type":"string"}},"required":["id","package_id","package_release_id","status","created_at","admin_note","package_name","package_release_version"]},{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_release_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","const":"denied"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}]},"package_name":{"type":"string"},"package_release_version":{"type":"string"}},"required":["id","package_id","package_release_id","status","created_at","admin_note","package_name","package_release_version"]}]}},"required":["success","code","message","data"]}}}}},"security":[]},"delete":{"operationId":"deleteReleaseStablePromotionRequest","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"version_with_leios_patch","schema":{"type":"string","pattern":"^(?:[0-9][0-9A-Za-z.+~\\-]*leios\\d+(?:\\.\\d+){0,2}|(?!.*leios)[0-9][0-9A-Za-z.+~\\-]*)$"},"required":true},{"in":"path","name":"stablePromotionRequestID","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Delete a stable promotion request for a release","description":"Delete a specific stable promotion request for the specified release. Requires packages.releases.requestStable permission.","tags":["Packages / Stable Promotion Requests"],"responses":{"200":{"description":"Stable promotion request deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Stable promotion request deleted successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"403":{"description":"You do not have permission to delete stable promotion requests for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to delete stable promotion requests for this package"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/packages/{fullPackageName}/releases/{version_with_leios_patch}":{"get":{"operationId":"getPackagesByFullPackageNameReleasesByVersionWithLeiosPatch","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"version_with_leios_patch","schema":{"type":"string","pattern":"^(?:[0-9][0-9A-Za-z.+~\\-]*leios\\d+(?:\\.\\d+){0,2}|(?!.*leios)[0-9][0-9A-Za-z.+~\\-]*)$"},"required":true}],"summary":"Get package release details","description":"Retrieve details of a specific package release.","tags":["Packages / Releases"],"responses":{"200":{"description":"Package release retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Package release retrieved successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"version_with_leios_patch":{"type":"string"},"architectures":{"type":"object","properties":{"amd64":{"type":"boolean"},"arm64":{"type":"boolean"},"is_all":{"type":"boolean"}},"required":["amd64","arm64","is_all"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"changelog":{"type":"string"}},"required":["id","version_with_leios_patch","architectures","created_at","changelog"]}},"required":["success","code","message","data"]}}}},"404":{"description":"Package release with specified version not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Package release with specified version not found"}},"required":["success","code","message"]}}}}},"security":[]},"put":{"operationId":"putPackagesByFullPackageNameReleasesByVersionWithLeiosPatch","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"version_with_leios_patch","schema":{"type":"string","pattern":"^(?:[0-9][0-9A-Za-z.+~\\-]*leios\\d+(?:\\.\\d+){0,2}|(?!.*leios)[0-9][0-9A-Za-z.+~\\-]*)$"},"required":true}],"summary":"Update a package release","description":"Update details of a specific package release. Requires packages.releases.update permission.","tags":["Packages / Releases"],"responses":{"200":{"description":"Package release updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Package release updated successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to update releases for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to update releases for this package"}},"required":["success","code","message"]}}}},"404":{"description":"Package release with specified version not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Package release with specified version not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"changelog":{"type":"string","minLength":1,"maxLength":10000}}}}}}},"delete":{"operationId":"deletePackagesByFullPackageNameReleasesByVersionWithLeiosPatch","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"version_with_leios_patch","schema":{"type":"string","pattern":"^(?:[0-9][0-9A-Za-z.+~\\-]*leios\\d+(?:\\.\\d+){0,2}|(?!.*leios)[0-9][0-9A-Za-z.+~\\-]*)$"},"required":true}],"summary":"Delete a package release","description":"Delete a specific package release. Requires packages.releases.delete permission.","tags":["Packages / Releases"],"responses":{"200":{"description":"Package release deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Package release deleted successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"403":{"description":"You do not have permission to delete releases for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to delete releases for this package"}},"required":["success","code","message"]}}}},"404":{"description":"Package release with specified version not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Package release with specified version not found"}},"required":["success","code","message"]}}}},"500":{"description":"Failed to delete release from Aptly repositories","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":500},"message":{"type":"string","const":"Failed to delete release from Aptly repositories"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/packages/{fullPackageName}/releases/{version_with_leios_patch}/{arch}":{"post":{"operationId":"postPackagesByFullPackageNameReleasesByVersionWithLeiosPatchByArch","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"version_with_leios_patch","schema":{"type":"string","pattern":"^(?:[0-9][0-9A-Za-z.+~\\-]*leios\\d+(?:\\.\\d+){0,2}|(?!.*leios)[0-9][0-9A-Za-z.+~\\-]*)$"},"required":true},{"in":"path","name":"arch","schema":{"type":"string","enum":["amd64","arm64","all"]},"required":true}],"summary":"Upload package release file for architecture and release into testing repository","description":"Upload a release file for the specified package and architecture.","tags":["Packages / Releases"],"responses":{"201":{"description":"Package release file uploaded successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":201},"message":{"type":"string","const":"Package release file uploaded successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to publish releases for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to publish releases for this package"}},"required":["success","code","message"]}}}},"409":{"description":"Package release already contains a release for this architecture","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":409},"message":{"type":"string","const":"Package release already contains a release for this architecture"}},"required":["success","code","message"]}}}},"500":{"description":"Failed to upload and verify package release asset","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":500},"message":{"type":"string","const":"Failed to upload and verify package release asset"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","contentEncoding":"binary","minLength":1,"maxLength":1073741824}},"required":["file"]}}}}}},"/packages/{fullPackageName}/role-assignments":{"get":{"operationId":"getPackagesByFullPackageNameRoleAssignments","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true}],"summary":"List package role assignments","description":"List all per-package role assignments for this package. Requires members.invite permission on the parent publisher.","tags":["Packages / Role Assignments"],"responses":{"200":{"description":"Role assignments retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Role assignments retrieved successfully"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"role":{"type":"string","enum":["ADMIN","MAINTAINER","DEVELOPER","VIEWER"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_username":{"type":"string"},"user_display_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"publisher_role":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","package_id","user_id","role","created_at","user_username","user_display_name","publisher_role"]}}},"required":["success","code","message","data"]}}}},"403":{"description":"You do not have permission to view role assignments for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to view role assignments for this package"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]},"post":{"operationId":"postPackagesByFullPackageNameRoleAssignments","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true}],"summary":"Create package role assignment","description":"Grant a user a package-scoped role. The new role must be strictly higher than the user's existing publisher-level role. Requires members.updateRole permission on the parent publisher.","tags":["Packages / Role Assignments"],"responses":{"201":{"description":"Role assignment created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":201},"message":{"type":"string","const":"Role assignment created successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to manage role assignments for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to manage role assignments for this package"}},"required":["success","code","message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"User not found"}},"required":["success","code","message"]}}}},"409":{"description":"User already has a role assignment for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":409},"message":{"type":"string","const":"User already has a role assignment for this package"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"user_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"role":{"type":"string","enum":["ADMIN","MAINTAINER","DEVELOPER","VIEWER"]}},"required":["user_id","role"]}}}}}},"/packages/{fullPackageName}/role-assignments/{userId}":{"put":{"operationId":"putPackagesByFullPackageNameRoleAssignmentsByUserId","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"userId","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Update package role assignment","description":"Update an existing package-scoped role for a user. The new role must be strictly higher than the user's publisher-level role.","tags":["Packages / Role Assignments"],"responses":{"200":{"description":"Role assignment updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Role assignment updated successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"403":{"description":"You do not have permission to manage role assignments for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to manage role assignments for this package"}},"required":["success","code","message"]}}}},"404":{"description":"Role assignment not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Role assignment not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["ADMIN","MAINTAINER","DEVELOPER","VIEWER"]}},"required":["role"]}}}}},"delete":{"operationId":"deletePackagesByFullPackageNameRoleAssignmentsByUserId","parameters":[{"in":"path","name":"fullPackageName","schema":{"type":"string"},"required":true},{"in":"path","name":"userId","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Delete package role assignment","description":"Remove a package-scoped role assignment. Requires members.updateRole permission on the parent publisher.","tags":["Packages / Role Assignments"],"responses":{"200":{"description":"Role assignment deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Role assignment deleted successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"403":{"description":"You do not have permission to manage role assignments for this package","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":403},"message":{"type":"string","const":"You do not have permission to manage role assignments for this package"}},"required":["success","code","message"]}}}},"404":{"description":"Role assignment not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Role assignment not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/admin/users":{"get":{"operationId":"getAdminUsers","summary":"List users","description":"Retrieve LeiOS accounts with optional role and search filters.","tags":["Admin / Users"],"responses":{"200":{"description":"Users retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Users retrieved successfully"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"username":{"type":"string"},"display_name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["admin","developer","user"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","username","display_name","email","role","created_at"]}}},"required":["success","code","message","data"]}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"role","schema":{"type":"string","enum":["admin","developer","user"]}},{"in":"query","name":"search","schema":{"type":"string","minLength":1,"maxLength":64}},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100}},{"in":"query","name":"offset","schema":{"type":"integer","minimum":0,"maximum":9007199254740991}}]},"post":{"operationId":"postAdminUsers","summary":"Create user","description":"Provision a new LeiOS account with the desired role.","tags":["Admin / Users"],"responses":{"201":{"description":"User created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":201},"message":{"type":"string","const":"User created successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"username":{"type":"string"},"display_name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["admin","developer","user"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","username","display_name","email","role","created_at"]}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"409":{"description":"Conflict: Username or email already exists","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":409},"message":{"type":"string","const":"Conflict: Username or email already exists"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","minLength":5,"maxLength":40,"pattern":"^(?!.*[.-]{2})(?!.*--)(?!.*\\.\\.)[a-z0-9](?:[a-z0-9._-]{3,38}[a-z0-9_])?$"},"display_name":{"type":"string","minLength":1,"maxLength":64},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["admin","developer","user"]},"password":{"type":"string","minLength":8,"maxLength":128}},"required":["username","display_name","email","password"]}}}}}},"/admin/users/{userId}":{"get":{"operationId":"getAdminUsersByUserId","parameters":[{"in":"path","name":"userId","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Get user","description":"Retrieve details for a specific LeiOS account.","tags":["Admin / Users"],"responses":{"200":{"description":"User retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"User retrieved successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"username":{"type":"string"},"display_name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["admin","developer","user"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","username","display_name","email","role","created_at"]}},"required":["success","code","message","data"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"User not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]},"put":{"operationId":"putAdminUsersByUserId","parameters":[{"in":"path","name":"userId","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Update user","description":"Modify profile fields or role for a LeiOS account.","tags":["Admin / Users"],"responses":{"200":{"description":"User updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"User updated successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"username":{"type":"string"},"display_name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["admin","developer","user"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","username","display_name","email","role","created_at"]}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"User not found"}},"required":["success","code","message"]}}}},"409":{"description":"Conflict: Username or email already exists","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":409},"message":{"type":"string","const":"Conflict: Username or email already exists"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"display_name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["admin","developer","user"]}}}}}}},"delete":{"operationId":"deleteAdminUsersByUserId","parameters":[{"in":"path","name":"userId","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Delete user","description":"Permanently remove a LeiOS account after verifying the user does not own any publishers.","tags":["Admin / Users"],"responses":{"200":{"description":"User deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"User deleted successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Cannot delete user while they own publishers","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Cannot delete user while they own publishers"}},"required":["success","code","message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"User not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/admin/users/{userId}/password":{"put":{"operationId":"putAdminUsersByUserIdPassword","parameters":[{"in":"path","name":"userId","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Reset user password","description":"Set a new password for a LeiOS account and revoke active sessions.","tags":["Admin / Users"],"responses":{"200":{"description":"Password reset successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Password reset successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"User not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","minLength":8,"maxLength":50,"pattern":"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$","description":"New password for the account"}},"required":["password"]}}}}}},"/admin/os-releases":{"get":{"operationId":"getAdminOsReleases","summary":"List OS releases","description":"Retrieve all OS releases.","tags":["Admin / OS Releases"],"responses":{"200":{"description":"OS releases retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"OS releases retrieved"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"version":{"type":"string"},"changelog":{"type":"string"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"published_at":{"anyOf":[{"type":"number"},{"type":"null"}]},"publishing_status":{"type":"string","enum":["pending","running","paused","failed","completed"]}},"required":["id","version","changelog","created_at","published_at","publishing_status"]}}},"required":["success","code","message","data"]}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"limit","schema":{"default":10,"type":"integer","minimum":1,"maximum":100}},{"in":"query","name":"offset","schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},{"in":"query","name":"order","schema":{"default":"newest","type":"string","enum":["newest","oldest"]}}]},"post":{"operationId":"postAdminOsReleases","summary":"Create OS release (async)","description":"Enqueue creation of an OS release and publishing to the live repo.","tags":["Admin / OS Releases"],"responses":{"202":{"description":"OS release creation task enqueued","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":202},"message":{"type":"string","const":"OS release creation task enqueued"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"version":{"type":"string"},"changelog":{"type":"string"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"published_at":{"anyOf":[{"type":"number"},{"type":"null"}]},"publishing_status":{"type":"string","enum":["pending","running","paused","failed","completed"]}},"required":["id","version","changelog","created_at","published_at","publishing_status"]}},"required":["success","code","message","data"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"changelog":{"type":"string","minLength":1,"maxLength":10000}},"required":["changelog"]}}}}}},"/admin/os-releases/{version}":{"get":{"operationId":"getAdminOsReleasesByVersion","parameters":[{"in":"path","name":"version","schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{3}$"},"required":true}],"summary":"Get OS release","description":"Retrieve a specific OS release by version.","tags":["Admin / OS Releases"],"responses":{"200":{"description":"OS release retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"OS release retrieved"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"version":{"type":"string"},"changelog":{"type":"string"},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"published_at":{"anyOf":[{"type":"number"},{"type":"null"}]},"publishing_status":{"type":"string","enum":["pending","running","paused","failed","completed"]}},"required":["id","version","changelog","created_at","published_at","publishing_status"]}},"required":["success","code","message","data"]}}}},"404":{"description":"OS release not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"OS release not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]},"put":{"operationId":"putAdminOsReleasesByVersion","parameters":[{"in":"path","name":"version","schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{3}$"},"required":true}],"summary":"Update OS release","description":"Update details of a specific OS release by version.","tags":["Admin / OS Releases"],"responses":{"200":{"description":"OS release updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"OS release updated successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"404":{"description":"OS release not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"OS release not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"changelog":{"type":"string","minLength":1,"maxLength":10000}}}}}}}},"/admin/os-releases/{version}/publishing-logs":{"get":{"operationId":"getAdminOsReleasesByVersionPublishingLogs","parameters":[{"in":"path","name":"version","schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{3}$"},"required":true}],"summary":"Get OS release publishing logs","description":"Retrieve publishing logs of a specific OS release by version.","tags":["Admin / OS Releases"],"responses":{"200":{"description":"Publishing logs retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Publishing logs retrieved"},"data":{"type":"object","properties":{"logs":{"type":"string"}},"required":["logs"]}},"required":["success","code","message","data"]}}}},"404":{"description":"OS release not found / Log file not found for this OS release publishing task","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"OS release not found / Log file not found for this OS release publishing task"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/admin/tasks":{"get":{"operationId":"getAdminTasks","summary":"List scheduled tasks","description":"Retrieve all scheduled tasks.","tags":["Admin / Tasks"],"responses":{"200":{"description":"Scheduled tasks retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Scheduled tasks retrieved"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"storeLogs":{"type":"boolean"},"status":{"type":"string","enum":["pending","running","paused","failed","completed"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"finished_at":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"result":{"anyOf":[{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"array","items":{}}]},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","storeLogs","status","created_at","finished_at","result","message"]}}},"required":["success","code","message","data"]}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"limit","schema":{"default":10,"type":"integer","minimum":1,"maximum":100}},{"in":"query","name":"offset","schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},{"in":"query","name":"order","schema":{"default":"newest","type":"string","enum":["newest","oldest"]}},{"in":"query","name":"searchString","schema":{"type":"string","minLength":3}}]}},"/admin/tasks/{taskID}":{"get":{"operationId":"getAdminTasksByTaskID","parameters":[{"in":"path","name":"taskID","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Task ID"},"required":true}],"summary":"Get scheduled task","description":"Retrieve details of a specific scheduled task by its ID.","tags":["Admin / Tasks"],"responses":{"200":{"description":"Task retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Task retrieved successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"storeLogs":{"type":"boolean"},"status":{"type":"string","enum":["pending","running","paused","failed","completed"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"finished_at":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"result":{"anyOf":[{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"array","items":{}}]},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","storeLogs","status","created_at","finished_at","result","message"]}},"required":["success","code","message","data"]}}}},"404":{"description":"Task with specified ID not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Task with specified ID not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/admin/tasks/{taskID}/logs":{"get":{"operationId":"getAdminTasksByTaskIDLogs","parameters":[{"in":"path","name":"taskID","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Task ID"},"required":true}],"summary":"Get scheduled task logs","description":"Retrieve logs of a specific scheduled task by its ID.","tags":["Admin / Tasks"],"responses":{"200":{"description":"Task logs retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Task logs retrieved successfully"},"data":{"type":"object","properties":{"logs":{"type":"string"}},"required":["logs"]}},"required":["success","code","message","data"]}}}},"400":{"description":"Logs are not stored for this task","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Logs are not stored for this task"}},"required":["success","code","message"]}}}},"404":{"description":"Task with specified ID not found / Log file not found for this task","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Task with specified ID not found / Log file not found for this task"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/admin/stable-promotion-requests":{"get":{"operationId":"getAdminStablePromotionRequests","summary":"List stable promotion requests","description":"Retrieve a list of all stable promotion requests for packages.","tags":["Admin / Stable Promotion Requests"],"responses":{"200":{"description":"Stable promotion requests retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Stable promotion requests retrieved successfully"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_release_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","enum":["pending","approved","denied"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}]},"package_name":{"type":"string"},"package_release_version":{"type":"string"}},"required":["id","package_id","package_release_id","status","created_at","admin_note","package_name","package_release_version"]}}},"required":["success","code","message","data"]}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"limit","schema":{"default":10,"type":"integer","minimum":1,"maximum":100}},{"in":"query","name":"offset","schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},{"in":"query","name":"order","schema":{"default":"newest","type":"string","enum":["newest","oldest"]}}]}},"/admin/stable-promotion-requests/{stablePromotionRequestID}":{"get":{"operationId":"getAdminStablePromotionRequestsByStablePromotionRequestID","parameters":[{"in":"path","name":"stablePromotionRequestID","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Get stable promotion request details","description":"Retrieve details of a specific stable promotion request.","tags":["Admin / Stable Promotion Requests"],"responses":{"200":{"description":"Stable promotion request retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Stable promotion request retrieved successfully"},"data":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"package_release_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","enum":["pending","approved","denied"]},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}]},"package_name":{"type":"string"},"package_release_version":{"type":"string"}},"required":["id","package_id","package_release_id","status","created_at","admin_note","package_name","package_release_version"]}},"required":["success","code","message","data"]}}}},"404":{"description":"Stable promotion request not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Stable promotion request not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}]}},"/admin/stable-promotion-requests/{stablePromotionRequestID}/decide":{"post":{"operationId":"postAdminStablePromotionRequestsByStablePromotionRequestIDDecide","parameters":[{"in":"path","name":"stablePromotionRequestID","schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"required":true}],"summary":"Decide on a stable promotion request","description":"Approve or reject a stable promotion request for a package.","tags":["Admin / Stable Promotion Requests"],"responses":{"200":{"description":"Decided on stable promotion request successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Decided on stable promotion request successfully"},"data":{"type":"null"}},"required":["success","code","message","data"]}}}},"400":{"description":"Bad Request: Syntax or validation error in request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":400},"message":{"type":"string","const":"Bad Request: Syntax or validation error in request"}},"required":["success","code","message"]}}}},"404":{"description":"Stable promotion request not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":404},"message":{"type":"string","const":"Stable promotion request not found"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["approved","denied"]},"admin_note":{"type":"string"}},"required":["status","admin_note"]}}}}}},"/users/search":{"get":{"operationId":"getUsersSearch","summary":"Search users","description":"Search for LeiOS users by username or display name. Only returns minimal public info. Requires authentication.","tags":["Users"],"responses":{"200":{"description":"Users retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"code":{"type":"number","const":200},"message":{"type":"string","const":"Users retrieved successfully"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"username":{"type":"string"},"display_name":{"type":"string"}},"required":["id","username","display_name"]}}},"required":["success","code","message","data"]}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"number","const":401},"message":{"type":"string","const":"Authentication required"}},"required":["success","code","message"]}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"q","schema":{"type":"string","minLength":2,"maxLength":64},"required":true},{"in":"query","name":"limit","schema":{"default":10,"type":"integer","minimum":1,"maximum":50}}]}}}}