{"openapi":"3.1.0","info":{"title":"papi","description":"RunWhen Platform API","version":"2.0.0"},"paths":{"/.well-known/oauth-authorization-server":{"get":{"tags":["oauth-server"],"summary":"Oauth As Metadata","description":"RFC 8414 — OAuth 2.0 Authorization Server Metadata.","operationId":"oauth_as_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/openid-configuration":{"get":{"tags":["oauth-server"],"summary":"Openid Configuration","description":"OIDC Discovery — alias for the same metadata document.","operationId":"openid_configuration__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/oauth/authorize":{"get":{"tags":["oauth-server"],"summary":"Oauth Authorize","description":"Authorization endpoint — renders login page or returns error.","operationId":"oauth_authorize_oauth_authorize_get","parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","title":"Redirect Uri"}},{"name":"response_type","in":"query","required":false,"schema":{"type":"string","default":"code","title":"Response Type"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"openid","title":"Scope"}},{"name":"code_challenge","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code Challenge"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string","default":"S256","title":"Code Challenge Method"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/oauth/authorize/login/email":{"post":{"tags":["oauth-server"],"summary":"Oauth Authorize Email Login","description":"Handle email/password login from the OAuth authorize page.","operationId":"oauth_authorize_email_login_oauth_authorize_login_email_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_oauth_authorize_email_login_oauth_authorize_login_email_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/oauth/authorize/enterprise":{"get":{"tags":["oauth-server"],"summary":"Oauth Authorize Enterprise","description":"Redirect to Auth0 with a connection hint for enterprise SSO.","operationId":"oauth_authorize_enterprise_oauth_authorize_enterprise_get","parameters":[{"name":"oauth_session","in":"query","required":true,"schema":{"type":"string","title":"Oauth Session"}},{"name":"identifier","in":"query","required":true,"schema":{"type":"string","title":"Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/oauth/authorize/login/{idp_name}":{"get":{"tags":["oauth-server"],"summary":"Oauth Authorize Oidc Login","description":"Begin a standalone upstream-OIDC login (dual-mode).\n\nResolves the IdP's authorization endpoint via discovery, stores PKCE +\nstate, and redirects the browser to the upstream IdP, which returns to\n``/oauth/authorize/callback/{idp_name}``. Two callers:\n\n* **OAuth 2.1 client** (MCP/Slack via ``/oauth/authorize``): passes\n ``oauth_session``; the callback issues an auth code back to the client.\n* **First-party UI** (``login.tsx``): passes ``next``; the callback sets a\n JWT cookie and redirects to ``next`` (mirrors ``/accounts/auth0/login/``).","operationId":"oauth_authorize_oidc_login_oauth_authorize_login__idp_name__get","parameters":[{"name":"idp_name","in":"path","required":true,"schema":{"type":"string","title":"Idp Name"}},{"name":"oauth_session","in":"query","required":false,"schema":{"type":"string","default":"","title":"Oauth Session"}},{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/oauth/authorize/callback/{idp_name}":{"get":{"tags":["oauth-server"],"summary":"Oauth Authorize Oidc Callback","description":"Handle the upstream OIDC redirect: exchange code, provision user, issue code.","operationId":"oauth_authorize_oidc_callback_oauth_authorize_callback__idp_name__get","parameters":[{"name":"idp_name","in":"path","required":true,"schema":{"type":"string","title":"Idp Name"}},{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/oauth/token":{"post":{"tags":["oauth-server"],"summary":"Oauth Token","description":"OAuth 2.1 token endpoint — authorization_code and refresh_token grants.\n\nSupports both ``client_secret_post`` (client_id/client_secret in body) and\n``client_secret_basic`` (credentials in Authorization header).","operationId":"oauth_token_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_oauth_token_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/.well-known/jwks.json":{"get":{"tags":["jwks"],"summary":"Jwks Endpoint","description":"Return the JSON Web Key Set containing the RS256 public key.","operationId":"jwks_endpoint__well_known_jwks_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/accounts/auth0/login/":{"get":{"tags":["auth0"],"summary":"Auth0 Login","description":"Initiate Auth0 OAuth2 login flow with PKCE.\n\nBuilds the Auth0 authorize URL, stores state in Redis, and redirects\nthe browser to Auth0 for authentication.\n\nArgs:\n request: The incoming request.\n next: URL to redirect to after login (e.g. /rd/).\n auth_params: Auth0 connection parameters (e.g. [connection]=runwhen).\n oauth_session: OAuth 2.1 AS session ID — when present, the callback\n issues an authorization code and redirects to the OAuth client\n instead of setting a UI cookie.\n\nReturns:\n Redirect to Auth0 authorize URL.","operationId":"auth0_login_accounts_auth0_login__get","parameters":[{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},{"name":"auth_params","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Params"}},{"name":"oauth_session","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oauth Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/accounts/auth0/login/callback/":{"get":{"tags":["auth0"],"summary":"Auth0 Callback","description":"Handle Auth0 OAuth2 callback.\n\nExchanges authorization code for tokens, fetches userinfo, creates or\nlinks the user, issues a JWT cookie, and redirects to the next URL.\n\nArgs:\n request: The incoming request.\n code: Authorization code from Auth0.\n state: State parameter for CSRF validation.\n error: Error code from Auth0 (if any).\n error_description: Error description from Auth0 (if any).\n\nReturns:\n Redirect to next URL with JWT cookie set.","operationId":"auth0_callback_accounts_auth0_login_callback__get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/accounts/logout/":{"get":{"tags":["auth0"],"summary":"Generic Logout","description":"Log out — clears JWT cookie and delegates to Auth0 federated logout.\n\nThis is the path the UI redirects to (pages/logout.tsx).\nDelegates to the Auth0 logout flow.","operationId":"generic_logout_accounts_logout__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/accounts/auth0/logout/":{"get":{"tags":["auth0"],"summary":"Auth0 Logout","description":"Log out via Auth0 federated logout.\n\nRedirects to Auth0's /v2/logout endpoint which clears the Auth0 session\nand the upstream SAML/OIDC provider session, then redirects back to\nthe user pages login page.\n\nReturns:\n Redirect to Auth0 logout URL or direct to login page.","operationId":"auth0_logout_accounts_auth0_logout__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/rd/{nxt_raw}":{"get":{"tags":["auth0"],"summary":"Login Redirect","description":"Redirect to a base64-encoded URL after login, with host whitelist validation.\n\nThis matches Django's core/login.py:rd() view exactly. The URL is base64-encoded\nto avoid issues with OAuth providers stripping query parameters.\n\nArgs:\n nxt_raw: Base64-encoded absolute URL to redirect to.\n\nReturns:\n Redirect to the decoded URL if host is allowed, or to an error page.","operationId":"login_redirect_rd__nxt_raw__get","parameters":[{"name":"nxt_raw","in":"path","required":true,"schema":{"type":"string","title":"Nxt Raw"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/accounts/google/login/":{"get":{"tags":["social-auth"],"summary":"Google Login","description":"Initiate Google OAuth2 login.","operationId":"google_login_accounts_google_login__get","parameters":[{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},{"name":"oauth_session","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oauth Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/accounts/google/login/callback/":{"get":{"tags":["social-auth"],"summary":"Google Callback","description":"Handle Google OAuth2 callback.","operationId":"google_callback_accounts_google_login_callback__get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/accounts/github/login/":{"get":{"tags":["social-auth"],"summary":"Github Login","description":"Initiate GitHub OAuth2 login.","operationId":"github_login_accounts_github_login__get","parameters":[{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},{"name":"oauth_session","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oauth Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/accounts/github/login/callback/":{"get":{"tags":["social-auth"],"summary":"Github Callback","description":"Handle GitHub OAuth2 callback.","operationId":"github_callback_accounts_github_login_callback__get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/accounts/gitlab/login/":{"get":{"tags":["social-auth"],"summary":"Gitlab Login","description":"Initiate GitLab OAuth2 login.","operationId":"gitlab_login_accounts_gitlab_login__get","parameters":[{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},{"name":"oauth_session","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oauth Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/accounts/gitlab/login/callback/":{"get":{"tags":["social-auth"],"summary":"Gitlab Callback","description":"Handle GitLab OAuth2 callback.","operationId":"gitlab_callback_accounts_gitlab_login_callback__get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/accounts/profile/{user_id}":{"get":{"tags":["profile"],"summary":"Get Profile","description":"Retrieve a user's public profile by user ID.\n\nIntentionally readable by any authenticated user — profiles contain only\npublic-facing fields (avatar, bio, LinkedIn). Write/delete operations\nenforce ownership.","operationId":"get_profile_accounts_profile__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["profile"],"summary":"Update Profile","description":"Update a profile. Creates the profile if it doesn't exist (PUT-as-create).\n\nUsers can only edit their own profile.","operationId":"update_profile_accounts_profile__user_id__put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["profile"],"summary":"Delete Profile","description":"Delete a profile. Only the profile owner or superuser can delete.","operationId":"delete_profile_accounts_profile__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/accounts/sync-user-account":{"post":{"tags":["profile"],"summary":"Sync User Account","description":"Reconcile workspace permissions for a user.\n\nWhen workspace admins invite a user by email before that user has an\naccount, the permission row stores a placeholder email. This endpoint\nlinks those placeholder rows to the actual user record.\n\nOnly the target user or staff may trigger this.","operationId":"sync_user_account_accounts_sync_user_account_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncUserAccountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sync User Account Accounts Sync User Account Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/":{"get":{"tags":["health"],"summary":"Root","description":"Root endpoint for nginx-ingress backend health checks.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Root Get"}}}}},"security":[{"BearerAuth":[]}]}},"/healthz":{"get":{"tags":["health"],"summary":"Health","description":"Check overall service health.\n\nUsed by K8s readiness and startup probes.\nReturns 503 during graceful shutdown to drain traffic.\n\nReturns:\n Health status with version information.","operationId":"health_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/health":{"get":{"tags":["health"],"summary":"Health","description":"Check overall service health.\n\nUsed by K8s readiness and startup probes.\nReturns 503 during graceful shutdown to drain traffic.\n\nReturns:\n Health status with version information.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/livez":{"get":{"tags":["health"],"summary":"Liveness","description":"Liveness probe endpoint.\n\nUsed by K8s liveness probe.\n\nReturns:\n Liveness status.","operationId":"liveness_livez_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Liveness Livez Get"}}}}},"security":[]}},"/internal/api/v1/health":{"get":{"tags":["explorer"],"summary":"Explorer Health","description":"Health check for the explorer API.","operationId":"explorer_health_internal_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Explorer Health Internal Api V1 Health Get"}}}}},"security":[{"BearerAuth":[]}]}},"/internal/api/v1/getSLIEnv":{"post":{"tags":["explorer"],"summary":"Get Sli Env","description":"Return execution environment for an SLI.\n\nCalled by runners before executing an SLI check.\nQuery param ``runnerUUID`` replaces the old ``locationUUID`` name.","operationId":"get_sli_env_internal_api_v1_getSLIEnv_post","parameters":[{"name":"sli","in":"query","required":true,"schema":{"type":"string","description":"SLX full name (workspace--slx-name)","title":"Sli"},"description":"SLX full name (workspace--slx-name)"},{"name":"runnerUUID","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Runner UUID","title":"Runneruuid"},"description":"Runner UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLIEnvResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"get":{"tags":["explorer"],"summary":"Get Sli Env","description":"Return execution environment for an SLI.\n\nCalled by runners before executing an SLI check.\nQuery param ``runnerUUID`` replaces the old ``locationUUID`` name.","operationId":"get_sli_env_internal_api_v1_getSLIEnv_get","parameters":[{"name":"sli","in":"query","required":true,"schema":{"type":"string","description":"SLX full name (workspace--slx-name)","title":"Sli"},"description":"SLX full name (workspace--slx-name)"},{"name":"runnerUUID","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Runner UUID","title":"Runneruuid"},"description":"Runner UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLIEnvResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/internal/api/v1/runners/register":{"post":{"tags":["explorer"],"summary":"Register Runner","description":"Register or update a runner in the runners table.\n\nPorted from Go pkg/explorer/explorer.go RegisterRunnerLocation.\nLook up by (display name + workspace). If found, return existing\n(preserves any pre-existing rows that were created with random UUIDs).\nIf not found, create a new row with the deterministic\n``f\"{workspace}--{runner}\"`` identity.","operationId":"register_runner_internal_api_v1_runners_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunnerRegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunnerRegisterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/internal/api/v1/runners/status":{"post":{"tags":["explorer"],"summary":"Runner Status Update","description":"Update runner heartbeat and status for an existing runner.\n\nPorted from Go pkg/explorer/explorer.go UpdateRunnerLocationStatus.\nLooks up the runner by UUID (``runnerUUID`` is the ``name`` column).\nUpdates ``last_heartbeat`` and persists the ``runnerStatus`` payload.\nReturns 404 if the runner is not found.","operationId":"runner_status_update_internal_api_v1_runners_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunnerStatusUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Runner Status Update Internal Api V1 Runners Status Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/internal/api/v1/runners/run-status":{"post":{"tags":["explorer"],"summary":"Runner Run Status","description":"Receive run-status updates from runners after SLI/Runbook execution.\n\nPorted from Go pkg/explorer/explorer.go LocationUpdate.\n\nBody is a RunnerLocation:\n { \"runnerUUID\": \"...\", \"status\": { \"name\": \"\", \"code\": \"...\", \"message\": \"...\" } }\n\nSteps (independent queries — partial failure is acceptable):\n1. Look up runner by runnerUUID; update last_heartbeat. If not found, log and return early.\n2. Look up SLI or Runbook by slx full name; update last_run_* columns.","operationId":"runner_run_status_internal_api_v1_runners_run_status_post","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'sli' or 'runbook'","title":"Type"},"description":"'sli' or 'runbook'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Runner Run Status Internal Api V1 Runners Run Status Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/internal/api/v1/sli":{"get":{"tags":["explorer"],"summary":"List Slis","description":"List SLIs for a workspace, optionally filtered by runner.\n\nReturns SLI names with workspace and runner info.\nCalled by runner-control for SLI cron scheduling.","operationId":"list_slis_internal_api_v1_sli_get","parameters":[{"name":"workspace","in":"query","required":true,"schema":{"type":"string","description":"Workspace name","title":"Workspace"},"description":"Workspace name"},{"name":"runnerUUID","in":"query","required":false,"schema":{"type":"string","description":"Runner UUID","default":"","title":"Runneruuid"},"description":"Runner UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":true}},"title":"Response List Slis Internal Api V1 Sli Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/internal/api/v1/codeCollection":{"get":{"tags":["explorer"],"summary":"List Code Collections","description":"List code collections used by SLIs and Runbooks assigned to a runner.\n\nMirrors Go ``handleGetCodeCollection``: derives collections dynamically\nfrom SLIs (cronCodeRunCount) and Runbooks (codeRunCount) that are\nassigned to the given runner in the given workspace. The\n``CodeCollection`` table is NOT queried directly because it may not\nreflect what the runner actually needs to run.\n\nIntentional divergence from the Go handler: when a CCV resolves, ``gitUrl``\nis emitted from the *resolved collection's* ``repo_url`` rather than the\nSLI/Runbook's stored ``code_bundle_repo_url`` (the Go handler emits the\nstored URL). In airgap (``CC_SOURCE=catalog``) the stored URL may be an\nunreachable public Git host while the synced collection carries the\nin-cluster catalog host — see ``_make_collection_entry`` and\n``_resolve_ccv``'s slug fallback. This also matches the sibling\n``/codeCollection/{id}`` endpoint, which already emits ``cc.repo_url``.\n\n``runnerUUID`` is optional: when absent, all SLIs/Runbooks in the\nworkspace are included (unfiltered by runner).","operationId":"list_code_collections_internal_api_v1_codeCollection_get","parameters":[{"name":"workspace","in":"query","required":true,"schema":{"type":"string","description":"Workspace name","title":"Workspace"},"description":"Workspace name"},{"name":"runnerUUID","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Runner UUID","title":"Runneruuid"},"description":"Runner UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":true}},"title":"Response List Code Collections Internal Api V1 Codecollection Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/internal/api/v1/codeCollection/{collection_id}":{"get":{"tags":["explorer"],"summary":"Get Code Collection","description":"Get a single code collection by ID with its built CCV image tags.","operationId":"get_code_collection_internal_api_v1_codeCollection__collection_id__get","parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"string","title":"Collection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Code Collection Internal Api V1 Codecollection Collection Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces":{"get":{"tags":["workspaces"],"summary":"List workspaces for the current user","description":"List all workspaces the current user has access to.\n\nReturns workspaces where the user is either the owner or has\nexplicit permissions.\n\nArgs:\n limit: Maximum number of results to return.\n offset: Number of results to skip.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Paginated list of workspaces.","operationId":"list_workspaces_api_v1_workspaces_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["workspaces"],"summary":"Create a new workspace","description":"Create a new workspace (synchronous, DB-direct).\n\nThis endpoint:\n1. Auto-suffixes the name if it collides with an existing workspace,\n tombstone, repository, or K8s CRD (e.g. ``myws`` -> ``myws-2``).\n2. Creates the workspace DB record and provisions runner infrastructure.\n3. Returns with status=\"ready\" on success.\n\nCreation is synchronous — no polling required after a 201 response.","operationId":"create_workspace_api_v1_workspaces_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceGitCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_short_name}":{"get":{"tags":["workspaces"],"summary":"Get a workspace by name","description":"Get a workspace by its short name.\n\nArgs:\n workspace_short_name: The workspace short name (e.g., 'pp-04').\n detail: If true, include additional details (SLXs, alerts, spec). Defaults to false.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The workspace details.\n\nRaises:\n HTTPException: 404 if workspace not found or user has no access.","operationId":"get_workspace_api_v1_workspaces__workspace_short_name__get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"detail","in":"query","required":false,"schema":{"type":"boolean","description":"If true, load SLXs and firing alerts. Default false: fast metadata-only response.","default":false,"title":"Detail"},"description":"If true, load SLXs and firing alerts. Default false: fast metadata-only response."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/provisioning-status/{workspace_name}":{"get":{"tags":["workspaces"],"summary":"Get workspace provisioning progress","description":"Get workspace provisioning progress without requiring a DB workspace record.\n\nNon-detail endpoint — bypasses workspace permission checks.\nOnly requires authentication. Returns boolean stage flags and sync status.\nUsed by the UI wizard to poll until all provisioning stages complete.\n\nCRD-less mode: workspace creation is synchronous — all stages are\ncomplete if the workspace exists in the database.","operationId":"provisioning_status_api_v1_workspaces_provisioning_status__workspace_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ProvisioningStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}":{"patch":{"tags":["workspaces"],"summary":"Update a workspace","description":"Update a workspace (partial update).\n\nAccepts workspace name (slug) as the path parameter. All body fields are\noptional; only non-None values are applied.\n\nSupports updating: alias, description, scrubber_config, enabled_locations,\nconfig_provided, permissions (full replacement), slx_groups, slx_relationships.\n\nRequires admin permission on the workspace.\n\nArgs:\n workspace_name: The workspace short name (slug, e.g. 'my-workspace').\n data: The workspace update data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The updated workspace (detail view with spec populated).\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 403 if user lacks admin permission.","operationId":"update_workspace_api_v1_workspaces__workspace_name__patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["workspaces"],"summary":"Delete a workspace","description":"Delete a workspace with full multi-system cleanup.\n\nPhase 1 (sync): Vault secrets, Slack, K8s CRDs, git repo, DB + tombstone.\nPhase 2 (async): Sobow, USearch, GCS files, email notification.\n\nReturns step-by-step status for each cleanup operation.\nRequires admin permission on the workspace.","operationId":"delete_workspace_api_v1_workspaces__workspace_name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceDeletionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/workspace-configuration-index":{"get":{"tags":["workspaces"],"summary":"Get workspace configuration index","description":"Get the workspace configuration index from sobow.\n\nThe configuration index contains cached workspace data including:\n- SLX metadata and task information\n- Entity index (Kubernetes resources, cloud resources, etc.)\n- Workspace relationships and hierarchies\n\nThis endpoint proxies to the sobow service which owns the canonical\nworkspace configuration index cached in Redis.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n sobow: Sobow client for fetching configuration.\n\nReturns:\n The workspace configuration index as a dictionary.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 503 if sobow service is unavailable.","operationId":"get_workspace_configuration_index_api_v1_workspaces__workspace_name__workspace_configuration_index_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Configuration Index Api V1 Workspaces Workspace Name Workspace Configuration Index Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/metadata":{"get":{"tags":["workspaces"],"summary":"Get workspace metadata from sobow","description":"Get workspace metadata from sobow service.\n\nReturns metadata about the workspace including index status,\ntask counts, and other operational information.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n sobow: Sobow client for fetching metadata.\n\nReturns:\n The workspace metadata as a dictionary, or None if not available.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 503 if sobow service is unavailable.","operationId":"get_workspace_metadata_api_v1_workspaces__workspace_name__metadata_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Response Get Workspace Metadata Api V1 Workspaces Workspace Name Metadata Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/entities":{"get":{"tags":["workspaces"],"summary":"Get workspace entities","description":"Get entities (Kubernetes resources, cloud resources, etc.) for a workspace.\n\nEntities are extracted from the workspace configuration and represent\nthe discoverable resources that can be referenced in tasks.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n sobow: Sobow client for fetching entities.\n\nReturns:\n Dictionary containing workspace entities organized by type.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 503 if sobow service is unavailable.","operationId":"get_workspace_entities_api_v1_workspaces__workspace_name__entities_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Entities Api V1 Workspaces Workspace Name Entities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/index-health":{"get":{"tags":["workspaces"],"summary":"Get workspace index health","description":"Get the health status of the workspace task index.\n\nReturns information about the index's current state, including\nlast update time, task counts, and any indexing errors.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n sobow: Sobow client for fetching health status.\n\nReturns:\n Dictionary containing index health information.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 503 if sobow service is unavailable.","operationId":"get_workspace_index_health_api_v1_workspaces__workspace_name__index_health_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Index Health Api V1 Workspaces Workspace Name Index Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/status":{"get":{"tags":["workspaces"],"summary":"Get workspace creation status","description":"Get the status of a workspace creation.\n\nThis endpoint is used to poll for workspace creation completion.\nIt checks:\n1. Whether the workspace exists in the database\n2. Whether the WorkSync has successfully reconciled\n\nArgs:\n workspace_name: The workspace name.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n WorkspaceStatusResponse with workspace and sync booleans.","operationId":"get_workspace_status_api_v1_workspaces__workspace_name__status_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/my-permissions":{"get":{"tags":["workspaces"],"summary":"Get current user's permissions on workspace","description":"Get the current user's permissions (roles) on a workspace.\n\nReturns a list of role strings the user has on this workspace.\nThis matches the Django implementation which returns a set of roles.","operationId":"get_my_permissions_api_v1_workspaces__workspace_name__my_permissions_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Get My Permissions Api V1 Workspaces Workspace Name My Permissions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/sync-status":{"get":{"tags":["workspaces"],"summary":"Get workspace sync status from WorkSync CRD","description":"Get the sync status for a workspace from the WorkSync Kubernetes CRD.\n\nReturns information about the workspace's GitOps sync status including\nconditions, last applied revision, and related Kubernetes events.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Dictionary containing WorkSync status and events.\n\nRaises:\n HTTPException: 404 if workspace not found or no WorkSync CRD exists.","operationId":"get_workspace_sync_status_api_v1_workspaces__workspace_name__sync_status_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Sync Status Api V1 Workspaces Workspace Name Sync Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/secrets-keys":{"get":{"tags":["workspaces"],"summary":"List workspace secret keys","description":"Get list of secret key names for a workspace.\n\nReturns only the key names, not the secret values.\nRequires read access to the workspace.","operationId":"get_workspace_secret_keys_api_v1_workspaces__workspace_name__secrets_keys_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretsKeysResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/secrets":{"post":{"tags":["workspaces"],"summary":"Create or update workspace secrets","description":"Create or update workspace secrets in Vault.\n\nRequires admin access to the workspace.","operationId":"create_workspace_secrets_api_v1_workspaces__workspace_name__secrets_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretsCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretsCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/secrets/{secret_key}":{"delete":{"tags":["workspaces"],"summary":"Delete a single workspace secret","description":"Permanently delete a single workspace secret by key.\n\nRequires admin access to the workspace. Mirrors Django's\n``WorkspaceViewSet.delete_workspace_secret``.","operationId":"delete_workspace_secret_api_v1_workspaces__workspace_name__secrets__secret_key__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"secret_key","in":"path","required":true,"schema":{"type":"string","title":"Secret Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/secrets/{secret_key}/usage":{"get":{"tags":["workspaces"],"summary":"List where a workspace secret is used","description":"Return the SLIs and Runbooks that reference this workspace secret.\n\nUsed by the UI to warn before deleting a secret that is still in use.\nRequires read access to the workspace. Mirrors Django's\n``WorkspaceViewSet.get_secret_usage``.","operationId":"get_workspace_secret_usage_api_v1_workspaces__workspace_name__secrets__secret_key__usage_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"secret_key","in":"path","required":true,"schema":{"type":"string","title":"Secret Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/reset-service-account":{"post":{"tags":["workspaces"],"summary":"Reset or create workspace service account","description":"Reset or create the service account for a workspace.\n\nIf a service account exists for this workspace, updates its password.\nIf no service account exists, creates a new one.\n\nAlso writes the credentials to Vault for use by SLI/Runbook containers.\n\nRequires admin access to the workspace.","operationId":"reset_workspace_service_account_api_v1_workspaces__workspace_name__reset_service_account_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetServiceAccountRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetServiceAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/sa-token":{"get":{"tags":["workspaces"],"summary":"Get workspace service account token","description":"Get the workspace service account token.\n\nTrades an existing valid token for a workspace service account token.\nThis is used by runners and SLI containers to authenticate with PAPI.\n\nValid tokenTypes:\n- LOCATION_WORKSPACE_SA_TOKEN: Token from location namespace","operationId":"get_workspace_sa_token_api_v1_workspaces__workspace_name__sa_token_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"Token to trade for SA token","title":"Token"},"description":"Token to trade for SA token"},{"name":"tokenType","in":"query","required":true,"schema":{"type":"string","description":"Type of token being traded","title":"Tokentype"},"description":"Type of token being traded"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SATokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/get-gitlab-sas":{"get":{"tags":["workspaces"],"summary":"Get GitLab service accounts for workspace","description":"Get GitLab service accounts for the workspace repository.\n\nReturns service accounts filtered by the user's access level:\n- Admin/readwrite users get both read and write service accounts\n- Read-only users get only read service accounts\n\nReturns empty list for non-GitLab (e.g. Gitea) environments.","operationId":"get_gitlab_service_accounts_api_v1_workspaces__workspace_name__get_gitlab_sas_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Gitlab Service Accounts Api V1 Workspaces Workspace Name Get Gitlab Sas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/task-search":{"post":{"tags":["workspaces"],"summary":"Search workspace tasks","description":"Search for tasks in a workspace.\n\nSupports scoping to specific SLXs and persona-based query interpretation.","operationId":"search_workspace_tasks_api_v1_workspaces__workspace_name__task_search_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskSearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Workspace Tasks Api V1 Workspaces Workspace Name Task Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/autocomplete":{"post":{"tags":["workspaces"],"summary":"Autocomplete for task search","description":"Get autocomplete suggestions for task search.","operationId":"autocomplete_workspace_search_api_v1_workspaces__workspace_name__autocomplete_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutocompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Autocomplete Workspace Search Api V1 Workspaces Workspace Name Autocomplete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runners":{"get":{"tags":["workspaces"],"summary":"Get runners","description":"Returns runners registered for this workspace.","operationId":"get_runners_api_v1_workspaces__workspace_name__runners_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuthorizedRunner"},"title":"Response Get Runners Api V1 Workspaces Workspace Name Runners Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/generate-workspace-builder-config":{"get":{"tags":["workspaces"],"summary":"[DEPRECATED] Generate workspace builder config","description":"Deprecated: use GET /{workspace_name}/upload-config instead. Returns 410 Gone.","operationId":"generate_workspace_builder_config_api_v1_workspaces__workspace_name__generate_workspace_builder_config_get","deprecated":true,"parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/search-scope":{"get":{"tags":["workspaces"],"summary":"Get search scope options","description":"Return search scope options for the workspace.\n\nReturns SLX groups, subgroups, and individual SLXs with firing alert status.\nUsed by the workspace chat page to build the scope selector.","operationId":"get_search_scope_api_v1_workspaces__workspace_name__search_scope_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchScopeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/upload-config":{"get":{"tags":["workspaces"],"summary":"Generate upload config for a location","description":"Returns an SA-scoped uploadConfig for the given workspace and location. Works for both private and public locations — no runner registration required.","operationId":"get_upload_config_api_v1_workspaces__workspace_name__upload_config_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"location","in":"query","required":true,"schema":{"type":"string","description":"Location name","title":"Location"},"description":"Location name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Upload Config Api V1 Workspaces Workspace Name Upload Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/internal/upload-config":{"get":{"tags":["workspaces","internal"],"summary":"Generate upload config (internal)","description":"Generate upload credentials for runner-control.\n\nReturns a short-lived SA token and the public PAPI URL so runner-control\ncan assemble a complete ``uploadInfo`` for workspace-builder.\n\n**Network isolation:** This endpoint MUST be blocked from external access\nvia an ingress deny rule on ``/*/internal/*`` (same pattern as ``/metrics``).\nRunner-control reaches PAPI through the cluster-internal Service URL, which\nbypasses ingress. The ``RW-Runner-Token`` header is required as a secondary\nguard but is not cryptographically validated by PAPI — runner-control already\nvalidated the token before making this call.\n\n**Why require a non-empty header at all?** Largely a lightweight handshake so\nthe caller is clearly runner-control (or anything that holds the runner token),\nnot arbitrary cluster traffic. It does not strengthen auth on the PAPI side.\n\n**Future consideration:** If this endpoint remains strictly internal-only and\nPAPI never gains cryptographic validation of the runner token, the header could\nbe removed entirely — it would not change the trust model on PAPI (isolation\nis ClusterIP + ingress deny). Doing so would require a coordinated change with\nrunner-control and regression testing; we keep the header until then to avoid\nchurn on a path that already works.","operationId":"get_internal_upload_config_api_v1_workspaces__workspace_name__internal_upload_config_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"RW-Runner-Token","in":"header","required":true,"schema":{"type":"string","title":"Rw-Runner-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runner-token":{"get":{"tags":["workspaces"],"summary":"Get runner registration token","description":"Get a runner registration token for a workspace.\n\nRequires admin permission on the workspace.\nCalls the internal runner service to generate a token.\n\nArgs:\n workspace_name: The workspace name.\n location: The location name for the runner.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The runner token response from the runner service.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 403 if user lacks admin permission.\n HTTPException: 422 if location not provided.\n HTTPException: 503 if runner service unavailable.","operationId":"get_runner_token_api_v1_workspaces__workspace_name__runner_token_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"location","in":"query","required":true,"schema":{"type":"string","description":"Location name for the runner","title":"Location"},"description":"Location name for the runner"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Runner Token Api V1 Workspaces Workspace Name Runner Token Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/anonymous-mode":{"get":{"tags":["workspaces"],"summary":"Get anonymous mode status","description":"Check whether anonymous mode is enabled for a workspace.\n\nAccess: Staff or workspace admin.","operationId":"get_anonymous_mode_status_api_v1_workspaces__workspace_name__anonymous_mode_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousModeStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["workspaces"],"summary":"Toggle anonymous mode","description":"Enable or disable anonymous mode for a workspace.\n\nAccess: Staff or workspace admin.","operationId":"toggle_anonymous_mode_api_v1_workspaces__workspace_name__anonymous_mode_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousModeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousModeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_short_name}/workspace-stats":{"get":{"tags":["workspaces"],"summary":"Get workspace statistics","description":"Get pre-aggregated workspace statistics for the chat page subtitle.\n\nReturns alias, assistantCount, tasksCount24h, resourceTypeCounts, issuesCount24h.","operationId":"workspace_stats_api_v1_workspaces__workspace_short_name__workspace_stats_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Workspace Stats Api V1 Workspaces Workspace Short Name Workspace Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_short_name}/top-issue-resources":{"get":{"tags":["workspaces"],"summary":"Get top resources by issue count","description":"Get top resources with most issues in a configurable time window.\n\nReturns resources grouped by SLX hierarchy with issue counts,\nfor ticker display on the workspace chat page.","operationId":"top_issue_resources_api_v1_workspaces__workspace_short_name__top_issue_resources_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"description":"Lookback window in hours","default":1,"title":"Hours"},"description":"Lookback window in hours"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Max resources to return","default":5,"title":"Limit"},"description":"Max resources to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Top Issue Resources Api V1 Workspaces Workspace Short Name Top Issue Resources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/agentfarm-params":{"get":{"tags":["workspaces"],"summary":"Get AgentFarm parameters for a workspace","description":"Get parameters for AgentFarm including LLM config, org, user perms, and repo info.\n\nAlso serves to authenticate the user/workspace combination for AgentFarm.","operationId":"agentfarm_params_api_v1_workspaces__workspace_name__agentfarm_params_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"llm_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"LLM category: DEFAULT, CHAT, BACKGROUND, EMBEDDING","title":"Llm Category"},"description":"LLM category: DEFAULT, CHAT, BACKGROUND, EMBEDDING"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agentfarm Params Api V1 Workspaces Workspace Name Agentfarm Params Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/activities":{"get":{"tags":["workspaces"],"summary":"Get workspace activity feed","description":"Proxy workspace activities from the activities service.\n\nDjango parity: WorkspaceViewSet.get_activities proxies to the activities\nservice via activityutils.fetch_workspace_activities().","operationId":"get_workspace_activities_api_v1_workspaces__workspace_name__activities_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Workspace Activities Api V1 Workspaces Workspace Name Activities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runners/{runner_id}":{"delete":{"tags":["workspaces","workspaces"],"summary":"Delete a runner","description":"Delete a runner from the database.\n\nValidates that the runner belongs to the specified workspace,\ndeletes the runner record, and revokes associated upload PATs.","operationId":"delete_runner_api_v1_workspaces__workspace_name__runners__runner_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"runner_id","in":"path","required":true,"schema":{"type":"string","title":"Runner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Runner Api V1 Workspaces Workspace Name Runners Runner Id Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/layout":{"get":{"tags":["workspaces"],"summary":"Get workspace layout","description":"Returns the workspace layout JSON (or alt_layout when ?alt_layout=true).","operationId":"get_workspace_layout_api_v1_workspaces__workspace_name__layout_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"alt_layout","in":"query","required":false,"schema":{"type":"boolean","description":"Return alt_layout instead of layout","default":false,"title":"Alt Layout"},"description":"Return alt_layout instead of layout"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Workspace Layout Api V1 Workspaces Workspace Name Layout Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["workspaces"],"summary":"Save workspace layout","description":"Saves an arbitrary JSON body as the workspace layout (or alt_layout when ?alt_layout=true).","operationId":"save_workspace_layout_api_v1_workspaces__workspace_name__layout_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"alt_layout","in":"query","required":false,"schema":{"type":"boolean","description":"Save to alt_layout instead of layout","default":false,"title":"Alt Layout"},"description":"Save to alt_layout instead of layout"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Save Workspace Layout Api V1 Workspaces Workspace Name Layout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/reprovision-workspace-infra":{"post":{"tags":["workspaces"],"summary":"Reprovision workspace runner infrastructure (staff only)","description":"Re-run workspace-level runner infrastructure provisioning.\n\nCreates or re-creates the Vault AppRole and cert-manager Certificates for\na workspace. Idempotent — safe to call on already-provisioned workspaces.\nReturns per-subsystem status regardless of partial failure (HTTP 200).\n\nAccess: Staff only.","operationId":"reprovision_workspace_infra_api_v1_workspaces__workspace_name__reprovision_workspace_infra_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReprovisionWorkspaceInfraResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/run-sessions":{"post":{"tags":["run-sessions"],"summary":"Create a new run session","description":"Create a new run session.\n\nA RunSession tracks a series of RunRequests for a troubleshooting session.\nIf no name is provided and generate_name is True, a unique name will be generated.\n\nArgs:\n data: The run session creation data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The created run session.\n\nRaises:\n HTTPException: 400 if workspace not found or name already exists.","operationId":"create_run_session_api_v1_run_sessions_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"get":{"tags":["run-sessions"],"summary":"List run sessions","description":"List run sessions for a workspace.\n\nArgs:\n workspace_id: The workspace ID to filter by.\n active_only: If True, return only active sessions.\n limit: Maximum number of results to return.\n offset: Number of results to skip.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Paginated list of run sessions.\n\nRaises:\n HTTPException: 400 if workspace not found.","operationId":"list_run_sessions_api_v1_run_sessions_get","parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"integer","description":"Workspace ID to filter sessions","title":"Workspace Id"},"description":"Workspace ID to filter sessions"},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"Filter to active sessions only","default":false,"title":"Active Only"},"description":"Filter to active sessions only"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/run-sessions/{session_id}":{"get":{"tags":["run-sessions"],"summary":"Get a run session by ID","description":"Get a run session by ID.\n\nArgs:\n session_id: The run session ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The run session details.\n\nRaises:\n HTTPException: 404 if session not found.","operationId":"get_run_session_api_v1_run_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["run-sessions"],"summary":"Update a run session","description":"Update a run session (partial update).\n\nArgs:\n session_id: The run session ID.\n data: The run session update data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The updated run session.\n\nRaises:\n HTTPException: 404 if session not found.","operationId":"update_run_session_api_v1_run_sessions__session_id__patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["run-sessions"],"summary":"Delete a run session","description":"Delete a run session.\n\nThis will also delete all associated RunRequests (cascade delete).\n\nArgs:\n session_id: The run session ID.\n session: Database session.\n current_user: The authenticated user.\n\nRaises:\n HTTPException: 404 if session not found.","operationId":"delete_run_session_api_v1_run_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/run-sessions/{session_id}/deactivate":{"post":{"tags":["run-sessions"],"summary":"Deactivate a run session","description":"Deactivate a run session.\n\nSets the session's active flag to False. Inactive sessions cannot accept\nnew RunRequests but can still be viewed and referenced.\n\nArgs:\n session_id: The run session ID.\n data: Optional deactivation request with reason.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The deactivated run session.\n\nRaises:\n HTTPException: 404 if session not found.\n HTTPException: 400 if session is already inactive.","operationId":"deactivate_run_session_api_v1_run_sessions__session_id__deactivate_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DeactivateRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/run-sessions/{session_id}/escalate":{"post":{"tags":["run-sessions"],"summary":"Escalate a run session","description":"Mark a run session as escalated.\n\nEscalation flags the session as requiring human attention. This is used\nfor issue triage and prioritization.\n\nArgs:\n session_id: The run session ID.\n data: Optional escalation request with escalated status.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The escalated run session.\n\nRaises:\n HTTPException: 404 if session not found.","operationId":"escalate_run_session_api_v1_run_sessions__session_id__escalate_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EscalateRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions":{"get":{"tags":["run-sessions"],"summary":"List run sessions for a workspace","description":"List run sessions for a workspace by name.\n\nArgs:\n workspace_name: The workspace short name.\n page: Page number (1-indexed).\n page_size: Number of items per page.\n active: Optional exact-match filter on ``RunSession.active``.\n modified__gte: Inclusive lower bound on ``modified_at``.\n modified__lte: Inclusive upper bound on ``modified_at``.\n created__gte: Inclusive lower bound on ``created_at``.\n created__lte: Inclusive upper bound on ``created_at``.\n runrequest__runbook__name: Filter by a single SLX full name\n (e.g. ``workspace--short-name``).\n runrequest__runbook__name__in: Filter by multiple SLX full names,\n comma-separated (e.g. ``ws--slx-a,ws--slx-b``). Ignored when\n ``runrequest__runbook__name`` is provided (single-name takes\n precedence).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Paginated list of run sessions.\n\nRaises:\n HTTPException: 400 if any unsupported query parameter is sent.\n HTTPException: 404 if workspace not found.","operationId":"list_workspace_run_sessions_api_v1_workspaces__workspace_name__runsessions_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page-size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page","default":100,"title":"Page-Size"},"description":"Items per page"},{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"If set, filter to sessions whose ``active`` column matches this value (``true`` for active, ``false`` for inactive). Omit to return both.","title":"Active"},"description":"If set, filter to sessions whose ``active`` column matches this value (``true`` for active, ``false`` for inactive). Omit to return both."},{"name":"modified__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to sessions with modified_at >= this ISO-8601 datetime. Must include a timezone offset (e.g. ``...+00:00`` or ``...Z``); naive datetimes are rejected to avoid ambiguity against the tz-aware column.","title":"Modified Gte"},"description":"Filter to sessions with modified_at >= this ISO-8601 datetime. Must include a timezone offset (e.g. ``...+00:00`` or ``...Z``); naive datetimes are rejected to avoid ambiguity against the tz-aware column."},{"name":"modified__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to sessions with modified_at <= this ISO-8601 datetime. Must include a timezone offset.","title":"Modified Lte"},"description":"Filter to sessions with modified_at <= this ISO-8601 datetime. Must include a timezone offset."},{"name":"created__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to sessions with created_at >= this ISO-8601 datetime. Must include a timezone offset.","title":"Created Gte"},"description":"Filter to sessions with created_at >= this ISO-8601 datetime. Must include a timezone offset."},{"name":"created__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to sessions with created_at <= this ISO-8601 datetime. Must include a timezone offset.","title":"Created Lte"},"description":"Filter to sessions with created_at <= this ISO-8601 datetime. Must include a timezone offset."},{"name":"runrequest__runbook__name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by SLX/runbook full name (e.g. workspace--short-name). Returns only sessions with at least one RunRequest for this SLX.","title":"Runrequest Runbook Name"},"description":"Filter by SLX/runbook full name (e.g. workspace--short-name). Returns only sessions with at least one RunRequest for this SLX."},{"name":"runrequest__runbook__name__in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by multiple SLX/runbook full names (comma-separated). Returns sessions with at least one RunRequest matching any name.","title":"Runrequest Runbook Name In"},"description":"Filter by multiple SLX/runbook full names (comma-separated). Returns sessions with at least one RunRequest matching any name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["run-sessions"],"summary":"Create a run session with run requests","description":"Create a new run session with run requests atomically.\n\nThis endpoint creates a RunSession and associated RunRequests in a single\natomic transaction. It supports deduplication to merge requests into\nexisting sessions based on the source type.\n\n**Deduplication behavior by source:**\n- `direct`: No deduplication - always creates a new session\n- `search`: No deduplication - always creates a new session\n- `slo_alert`: Deduplication enabled (10m window by default)\n- `sli_alert`: Deduplication enabled (10m window by default)\n- `webhook`: Deduplication enabled (10m window by default)\n\n**Status codes:**\n- 201: New session created\n- 200: Merged into existing session (via deduplication)\n- 422: Validation errors (all errors returned)\n\nArgs:\n workspace_name: The workspace short name.\n data: The run session creation request with run requests.\n response: FastAPI response object for setting status code.\n db_session: Database session.\n current_user: The authenticated user.\n\nReturns:\n RunSessionCreateResponse with the session and created flag.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 422 if run request validation fails.","operationId":"create_runsession_with_requests_api_v1_workspaces__workspace_name__runsessions_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionCreateWithRequests"}}}},"responses":{"200":{"description":"Merged into existing session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"201":{"description":"New session created"},"422":{"description":"Validation errors in run requests"}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/search":{"post":{"tags":["run-sessions"],"summary":"Search Workspace Run Sessions","description":"Search RunSessions with time-bounded filtering.","operationId":"search_workspace_run_sessions_api_v1_workspaces__workspace_name__runsessions_search_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionSearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/search/sources":{"get":{"tags":["run-sessions"],"summary":"Get Search Sources","description":"Get available source filter values for RunSession search.","operationId":"get_search_sources_api_v1_workspaces__workspace_name__runsessions_search_sources_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/{runsession_id}/alerts":{"get":{"tags":["run-sessions"],"summary":"Get Runsession Alerts","description":"Get alerts routed to a specific RunSession.","operationId":"get_runsession_alerts_api_v1_workspaces__workspace_name__runsessions__runsession_id__alerts_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionAlertsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/{runsession_id}":{"get":{"tags":["run-sessions"],"summary":"Get a run session by ID within a workspace","description":"Get a run session by ID within a workspace.\n\nArgs:\n workspace_name: The workspace short name.\n runsession_id: The run session ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The run session details.\n\nRaises:\n HTTPException: 404 if workspace or session not found.","operationId":"get_workspace_run_session_api_v1_workspaces__workspace_name__runsessions__runsession_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["run-sessions"],"summary":"Update a run session within a workspace","description":"Update a run session within a workspace (partial update).","operationId":"patch_workspace_run_session_api_v1_workspaces__workspace_name__runsessions__runsession_id__patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/{runsession_id}/summary":{"get":{"tags":["run-sessions"],"summary":"Get run session summary from Sobrain","description":"Proxy to Sobrain service for LLM-generated run session summary.","operationId":"get_workspace_run_session_summary_api_v1_workspaces__workspace_name__runsessions__runsession_id__summary_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Run Session Summary Api V1 Workspaces Workspace Name Runsessions Runsession Id Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/{runsession_id}/activities":{"get":{"tags":["run-sessions"],"summary":"Get run session activity timeline","description":"Proxy to Activities service for run session timeline.\n\nReturns paginated response matching Django's DRF PageNumberPagination\nformat: {count, next, previous, results}.","operationId":"get_workspace_run_session_activities_api_v1_workspaces__workspace_name__runsessions__runsession_id__activities_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Run Session Activities Api V1 Workspaces Workspace Name Runsessions Runsession Id Activities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/{runsession_id}/step":{"post":{"tags":["run-sessions"],"summary":"Process the next step in the RunSession workflow","description":"Process the next step in the RunSession workflow.\n\nThis endpoint coordinates several background tasks:\n1. Processes queued RunRequests that are ready to run (if any)\n2. Marks relevant issues as visited\n3. Triggers persona tasks if a persona is attached\n\nArgs:\n workspace_name: The workspace short name.\n runsession_id: The RunSession ID.\n db_session: Database session.\n current_user: The authenticated user.\n\nReturns:\n StepResponse with processing status.\n\nRaises:\n HTTPException: 404 if workspace or session not found.","operationId":"step_runsession_api_v1_workspaces__workspace_name__runsessions__runsession_id__step_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/issues":{"get":{"tags":["issues"],"summary":"List issues for a workspace","description":"List issues for a workspace with optional filters.\n\nSupports Django-compatible query parameters for filtering and pagination.","operationId":"list_workspace_issues_api_v1_workspaces__workspace_name__issues_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by severity (1-4 or SEV1-SEV4, repeatable)","title":"Severity"},"description":"Filter by severity (1-4 or SEV1-SEV4, repeatable)"},{"name":"severity__in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by severity (comma-sep, e.g. 1,2,3)","title":"Severity In"},"description":"Filter by severity (comma-sep, e.g. 1,2,3)"},{"name":"severity__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: severity >= value","title":"Severity Gte"},"description":"Filter: severity >= value"},{"name":"severity__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: severity <= value","title":"Severity Lte"},"description":"Filter: severity <= value"},{"name":"closed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by closed status - true for closed, false for open","title":"Closed"},"description":"Filter by closed status - true for closed, false for open"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in title, task_title, and slx_name","title":"Search"},"description":"Search in title, task_title, and slx_name"},{"name":"task_title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact match filter on issue.task_title. Use together with slx_name to narrow to all issues belonging to one task within an SLX without scanning the full SLX issue set on the client.","title":"Task Title"},"description":"Exact match filter on issue.task_title. Use together with slx_name to narrow to all issues belonging to one task within an SLX without scanning the full SLX issue set on the client."},{"name":"latest_occurrence_at__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: latest_occurrence_at >= ISO datetime","title":"Latest Occurrence At Gte"},"description":"Filter: latest_occurrence_at >= ISO datetime"},{"name":"modified__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: modified_at >= ISO datetime","title":"Modified Gte"},"description":"Filter: modified_at >= ISO datetime"},{"name":"modified__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: modified_at <= ISO datetime","title":"Modified Lte"},"description":"Filter: modified_at <= ISO datetime"},{"name":"created__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: created_at >= ISO datetime","title":"Created Gte"},"description":"Filter: created_at >= ISO datetime"},{"name":"created__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: created_at <= ISO datetime","title":"Created Lte"},"description":"Filter: created_at <= ISO datetime"},{"name":"open_since__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: open_since >= ISO datetime","title":"Open Since Gte"},"description":"Filter: open_since >= ISO datetime"},{"name":"open_since__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: open_since <= ISO datetime","title":"Open Since Lte"},"description":"Filter: open_since <= ISO datetime"},{"name":"open_occurrence_count__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: open_occurrence_count >= value","title":"Open Occurrence Count Gte"},"description":"Filter: open_occurrence_count >= value"},{"name":"open_occurrence_count__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: open_occurrence_count <= value","title":"Open Occurrence Count Lte"},"description":"Filter: open_occurrence_count <= value"},{"name":"total_occurrence_count__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: total_occurrence_count >= value","title":"Total Occurrence Count Gte"},"description":"Filter: total_occurrence_count >= value"},{"name":"total_occurrence_count__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: total_occurrence_count <= value","title":"Total Occurrence Count Lte"},"description":"Filter: total_occurrence_count <= value"},{"name":"details","in":"query","required":false,"schema":{"type":"boolean","description":"Include heavy fields from latest occurrence","default":false,"title":"Details"},"description":"Include heavy fields from latest occurrence"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/issues/{issue_id}":{"get":{"tags":["issues"],"summary":"Get an issue by ID","description":"Get an issue by ID within a workspace.\n\nSupports optional occurrence timestamp slicing via query parameters.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n include_occurrence_timestamps: Opt-in for occurrence timestamps.\n occurrence_tail: Return N most recent occurrences.\n occurrence_from: Slice from position (1=latest).\n occurrence_to: Slice to position (1=latest).\n occurrence_window_gte: Filter occurrences observed_at >= this datetime.\n occurrence_window_lte: Filter occurrences observed_at <= this datetime.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The issue details.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"get_workspace_issue_api_v1_workspaces__workspace_name__issues__issue_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}},{"name":"include_occurrence_timestamps","in":"query","required":false,"schema":{"type":"boolean","description":"Include occurrence timestamps","default":false,"title":"Include Occurrence Timestamps"},"description":"Include occurrence timestamps"},{"name":"occurrence_tail","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Return N most recent occurrences","title":"Occurrence Tail"},"description":"Return N most recent occurrences"},{"name":"occurrence_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Slice from (1=latest, inclusive)","title":"Occurrence From"},"description":"Slice from (1=latest, inclusive)"},{"name":"occurrence_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Slice to (1=latest, inclusive)","title":"Occurrence To"},"description":"Slice to (1=latest, inclusive)"},{"name":"occurrence_window_gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Window filter: observed_at >= ISO datetime","title":"Occurrence Window Gte"},"description":"Window filter: observed_at >= ISO datetime"},{"name":"occurrence_window_lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Window filter: observed_at <= ISO datetime","title":"Occurrence Window Lte"},"description":"Window filter: observed_at <= ISO datetime"},{"name":"occurrence_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated occurrence fields to include (e.g. observed_at)","title":"Occurrence Fields"},"description":"Comma-separated occurrence fields to include (e.g. observed_at)"},{"name":"occurrence_order","in":"query","required":false,"schema":{"type":"string","description":"Sort order for occurrences: asc or desc (default desc)","default":"desc","title":"Occurrence Order"},"description":"Sort order for occurrences: asc or desc (default desc)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["issues"],"summary":"Update an issue","description":"Update an issue (partial update).\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n issue_data: The issue update data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The updated issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"update_workspace_issue_api_v1_workspaces__workspace_name__issues__issue_id__patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["issues"],"summary":"Delete an issue","description":"Delete an issue.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n session: Database session.\n current_user: The authenticated user.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"delete_workspace_issue_api_v1_workspaces__workspace_name__issues__issue_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/issues/{issue_id}/ignore":{"patch":{"tags":["issues"],"summary":"Ignore an issue","description":"Ignore an issue.\n\nSets ignored_by_user, ignored_since, and ignored_until.\nAlso resets open_since and open_occurrence_count to close the issue.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n ignore_data: The ignore request data with required ignored_until.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The ignored issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"ignore_workspace_issue_api_v1_workspaces__workspace_name__issues__issue_id__ignore_patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueIgnoreRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/issues/{issue_id}/close":{"patch":{"tags":["issues"],"summary":"Close an issue","description":"Close an issue, optionally with a comment.\n\nSets the issue's closed_at timestamp and resets open_since\nand open_occurrence_count to 0.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n body: Optional request body with a comment.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The closed issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"close_workspace_issue_api_v1_workspaces__workspace_name__issues__issue_id__close_patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IssueCloseRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/issues/{issue_id}/generate-next-steps":{"post":{"tags":["issues"],"summary":"Generate next steps for an issue using AI","description":"Generate intelligent next steps for an issue using sobrain AI service.\n\nThis endpoint calls the sobrain service to generate suggested next steps\nbased on the issue details and optional comment context.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n request_data: Optional request data with comment contents.\n session: Database session.\n current_user: The authenticated user.\n sobrain: Sobrain client for AI features.\n\nReturns:\n Generated next steps for the issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.\n HTTPException: 503 if sobrain service is unavailable.","operationId":"generate_issue_next_steps_api_v1_workspaces__workspace_name__issues__issue_id__generate_next_steps_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GenerateNextStepsRequest"},{"type":"null"}],"title":"Request Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateNextStepsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/issues/{issue_id}/generate-summary":{"post":{"tags":["issues"],"summary":"Generate a summary for an issue using AI","description":"Generate a summary for an issue using sobrain AI service.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n session: Database session.\n current_user: The authenticated user.\n sobrain: Sobrain client for AI features.\n\nReturns:\n Generated summary for the issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.\n HTTPException: 503 if sobrain service is unavailable.","operationId":"generate_issue_summary_api_v1_workspaces__workspace_name__issues__issue_id__generate_summary_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/{runsession_id}/issues/{issue_id}/jit-summary":{"post":{"tags":["issues"],"summary":"Generate a just-in-time summary for an issue occurrence in a run session","description":"Generate a JIT summary for an issue within a specific run session context.\n\nFinds the latest occurrence of the issue, looks up the RunSessionIssueMap\nentry for the given run session, builds a payload, and calls Sobrain to\ngenerate a summary. Stores the summary in the occurrence's additional_context.","operationId":"jit_summary_api_v1_workspaces__workspace_name__runsessions__runsession_id__issues__issue_id__jit_summary_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JitSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/{runsession_id}/issueoccurrences":{"get":{"tags":["issue-occurrences"],"summary":"List issue occurrences for a run session","description":"List issue occurrences for a specific run session.\n\nGets occurrences through the RunSessionIssueMap table.\n\nArgs:\n workspace_name: The workspace name.\n runsession_id: The run session ID.\n session: Database session.\n current_user: The authenticated user.\n limit: Maximum number of results (default 100, max 250).\n offset: Number of results to skip.\n\nReturns:\n Paginated list of issue occurrences with flattened issue attributes.","operationId":"list_runsession_issue_occurrences_api_v1_workspaces__workspace_name__runsessions__runsession_id__issueoccurrences_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by occurrence ID","title":"Id"},"description":"Filter by occurrence ID"},{"name":"issue_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by issue ID","title":"Issue Id"},"description":"Filter by issue ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueOccurrenceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/issueoccurrences":{"get":{"tags":["issue-occurrences"],"summary":"List issue occurrences for a workspace","description":"List issue occurrences at workspace level with optional date filtering.\n\nUsed by agentfarm to list issue occurrences between two timestamps.\n\nArgs:\n workspace_name: The workspace name.\n session: Database session.\n current_user: The authenticated user.\n observed_at_gte: Filter occurrences observed at or after this time.\n observed_at_lte: Filter occurrences observed at or before this time.\n limit: Maximum number of results (default 100, max 250).\n offset: Number of results to skip.\n\nReturns:\n Paginated list of issue occurrences with workspace-level fields.","operationId":"list_workspace_issue_occurrences_api_v1_workspaces__workspace_name__issueoccurrences_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"observed_at__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter occurrences observed at or after this datetime (ISO 8601)","title":"Observed At Gte"},"description":"Filter occurrences observed at or after this datetime (ISO 8601)"},{"name":"observed_at__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter occurrences observed at or before this datetime (ISO 8601)","title":"Observed At Lte"},"description":"Filter occurrences observed at or before this datetime (ISO 8601)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceIssueOccurrenceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runsessions/{runsession_id}/issueoccurrences/{occurrence_id}":{"get":{"tags":["issue-occurrences"],"summary":"Get an issue occurrence by ID","description":"Get a specific issue occurrence by ID.\n\nArgs:\n workspace_name: The workspace name.\n runsession_id: The run session ID.\n occurrence_id: The issue occurrence ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The issue occurrence with flattened issue attributes.\n\nRaises:\n HTTPException: 404 if workspace, run session, or occurrence not found.","operationId":"get_runsession_issue_occurrence_api_v1_workspaces__workspace_name__runsessions__runsession_id__issueoccurrences__occurrence_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}},{"name":"occurrence_id","in":"path","required":true,"schema":{"type":"integer","title":"Occurrence Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueOccurrenceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs":{"get":{"tags":["slxs"],"summary":"List SLXs for a workspace","description":"List SLXs for a workspace with optional filters.\n\nArgs:\n workspace_name: The workspace name.\n request: The incoming request (used to build pagination URLs).\n session: Database session.\n current_user: The authenticated user.\n search: Optional search string.\n tags: Optional tags to filter by.\n resource_path_prefix: Optional resource path prefix filter.\n resource_type: Optional resource type filter.\n owners: Optional owner filter.\n limit: Maximum number of results (default 100, max 250).\n offset: Number of results to skip.\n\nReturns:\n Paginated list of SLXs.","operationId":"list_workspace_slxs_api_v1_workspaces__workspace_name__slxs_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in name, short_name, or alias","title":"Search"},"description":"Search in name, short_name, or alias"},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by tags (any match)","title":"Tags"},"description":"Filter by tags (any match)"},{"name":"resource_path_prefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by resource path prefix (e.g. 'kubernetes/cluster-01')","title":"Resource Path Prefix"},"description":"Filter by resource path prefix (e.g. 'kubernetes/cluster-01')"},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by resource type (e.g. 'Deployment')","title":"Resource Type"},"description":"Filter by resource type (e.g. 'Deployment')"},{"name":"owners","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by owners (any match)","title":"Owners"},"description":"Filter by owners (any match)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlxListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}":{"get":{"tags":["slxs"],"summary":"Get an SLX by short name","description":"Get an SLX by its short name within a workspace.\n\nWhen history/resolution are provided, enriches the response with live\nCortex metrics for SLI charts and SLO error budget charts.","operationId":"get_workspace_slx_api_v1_workspaces__workspace_name__slxs__slx_short_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"history","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d+[smhd]$","description":"PromQL time range for SLI metrics","default":"5m","title":"History"},"description":"PromQL time range for SLI metrics"},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d+[smhd]$","description":"PromQL step interval for SLI metrics","default":"30s","title":"Resolution"},"description":"PromQL step interval for SLI metrics"},{"name":"window","in":"query","required":false,"schema":{"type":"string","pattern":"^(month|\\d+[d])$","description":"EBR window: 'month' for calendar month or Nd for rolling N days","default":"month","title":"Window"},"description":"EBR window: 'month' for calendar month or Nd for rolling N days"},{"name":"detail","in":"query","required":false,"schema":{"type":"string","description":"Detail level (accepted for Django parity)","default":"False","title":"Detail"},"description":"Detail level (accepted for Django parity)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlxResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/metrics":{"get":{"tags":["slxs"],"summary":"Get lightweight metrics for SLX chart widgets","description":"Lightweight metrics endpoint for chart widgets.\n\nOnly fires the Cortex queries the requesting chart actually needs.\nSLO resolution is always derived from ``window`` — callers must not send it.\n\nValidation rules (400 Bad Request):\n- types=sli,slo + any of history/resolution/window present\n- types=slo + history present\n- types=sli + window present\n- SLI (history, resolution) not in the 8-pair allowlist\n- SLO window not matching ^(month|since[1-3]|since6)$","operationId":"get_workspace_slx_metrics_api_v1_workspaces__workspace_name__slxs__slx_short_name__metrics_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"types","in":"query","required":true,"schema":{"type":"string","description":"Cortex query types: sli, slo, or sli,slo","title":"Types"},"description":"Cortex query types: sli, slo, or sli,slo"},{"name":"history","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SLI history window (e.g. 5m, 1h)","title":"History"},"description":"SLI history window (e.g. 5m, 1h)"},{"name":"resolution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SLI step interval (e.g. 30s, 6m)","title":"Resolution"},"description":"SLI step interval (e.g. 30s, 6m)"},{"name":"window","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SLO calendar window (month, since1-since6)","title":"Window"},"description":"SLO calendar window (month, since1-since6)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlxMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/file-upload-url/{session_id}/{path}":{"get":{"tags":["slxs"],"summary":"Get a signed URL for uploading a file","description":"Get a signed URL for uploading a file to workspace storage.\n\nThis endpoint is used by the robot-runtime platform library when\nuploading files from task runs.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n session_id: The run session ID.\n path: The file path/name to upload.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n A signed URL that can be used to PUT the file content.\n\nRaises:\n HTTPException: 404 if workspace or SLX not found.\n HTTPException: 500 if signed URL generation fails.","operationId":"get_file_upload_url_api_v1_workspaces__workspace_name__slxs__slx_short_name__file_upload_url__session_id___path__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","description":"The session ID","title":"Session Id"},"description":"The session ID"},{"name":"path","in":"path","required":true,"schema":{"type":"string","description":"The file path/name to upload","title":"Path"},"description":"The file path/name to upload"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUploadUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/files/{session_id}":{"get":{"tags":["slxs"],"summary":"List files for an SLX session","description":"List files for an SLX session in workspace storage.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n session_id: The run session ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of filenames.","operationId":"list_slx_files_api_v1_workspaces__workspace_name__slxs__slx_short_name__files__session_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","description":"The session ID","title":"Session Id"},"description":"The session ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response List Slx Files Api V1 Workspaces Workspace Name Slxs Slx Short Name Files Session Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/files/{session_id}/{path}":{"get":{"tags":["slxs"],"summary":"Get a file for an SLX session","description":"Get a file for an SLX session from workspace storage.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n session_id: The run session ID.\n path: The file path/name to retrieve.\n size_limit_bytes: Maximum file size to read (default 240MB).\n raw: If True, return plain text response instead of JSON.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n File contents as JSON {\"contents\": str} or plain text.","operationId":"get_slx_file_api_v1_workspaces__workspace_name__slxs__slx_short_name__files__session_id___path__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","description":"The session ID","title":"Session Id"},"description":"The session ID"},{"name":"path","in":"path","required":true,"schema":{"type":"string","description":"The file path/name","title":"Path"},"description":"The file path/name"},{"name":"sizeLimitBytes","in":"query","required":false,"schema":{"type":"integer","description":"Max file size in bytes","default":240000000,"title":"Sizelimitbytes"},"description":"Max file size in bytes"},{"name":"raw","in":"query","required":false,"schema":{"type":"boolean","description":"Return raw text instead of JSON wrapper","default":false,"title":"Raw"},"description":"Return raw text instead of JSON wrapper"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/task-outputs":{"get":{"tags":["slxs"],"summary":"Get task outputs by task name across recent RunRequests","description":"Get task outputs for a task name across recent RunRequests.\n\nReturns outputs from the report.jsonl files of matching RunRequests.","operationId":"get_task_outputs_by_task_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs_task_outputs_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"task_name","in":"query","required":true,"schema":{"type":"string","description":"Task name to filter by","title":"Task Name"},"description":"Task name to filter by"},{"name":"created__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"RunRequests created after this time","title":"Created Gte"},"description":"RunRequests created after this time"},{"name":"created__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"RunRequests created before this time","title":"Created Lte"},"description":"RunRequests created before this time"},{"name":"outputs_limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max RunRequests to fetch","default":10,"title":"Outputs Limit"},"description":"Max RunRequests to fetch"},{"name":"exclude_issue_outputs","in":"query","required":false,"schema":{"type":"boolean","description":"Exclude issue-type outputs","default":true,"title":"Exclude Issue Outputs"},"description":"Exclude issue-type outputs"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Task Outputs By Task Api V1 Workspaces Workspace Name Slxs Slx Short Name Runbook Runs Task Outputs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/task-outputs":{"get":{"tags":["slxs"],"summary":"Get task outputs for a specific RunRequest","description":"Get task outputs for a specific RunRequest.\n\nReturns outputs from the report.jsonl file.","operationId":"get_task_outputs_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__task_outputs_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","description":"RunRequest ID","title":"Run Request Id"},"description":"RunRequest ID"},{"name":"task_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional task name filter","title":"Task Name"},"description":"Optional task name filter"},{"name":"exclude_issue_outputs","in":"query","required":false,"schema":{"type":"boolean","description":"Exclude issue-type outputs","default":true,"title":"Exclude Issue Outputs"},"description":"Exclude issue-type outputs"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Task Outputs Api V1 Workspaces Workspace Name Slxs Slx Short Name Runbook Runs Run Request Id Task Outputs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/sli":{"get":{"tags":["slis"],"summary":"Get the SLI for an SLX","description":"Get the SLI for an SLX.\n\nSLX and SLI have a 1:1 relationship. This endpoint returns the single\nSLI associated with the specified SLX, or 404 if no SLI exists.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n _detail: Django parity query param (ignored).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The SLI details.\n\nRaises:\n HTTPException: 404 if workspace, SLX, or SLI not found.","operationId":"get_slx_sli_api_v1_workspaces__workspace_name__slxs__slx_short_name__sli_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"detail","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Accepted for Django parity; ignored (always returns full detail)","title":"Detail"},"description":"Accepted for Django parity; ignored (always returns full detail)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__sli__SliResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/push-alert-rules":{"post":{"tags":["slis"],"summary":"Push alert rules for all SLIs with alertConfig","description":"Push Prometheus alert rules to the metric store for every SLI in the workspace that has an alertConfig.\n\nBypasses the SHA-based sync deduplication — safe to call even when workspace YAML has not changed.\nUseful for bootstrapping alert rules after a new cluster is stood up or after\nMETRIC_STORE_RULER_URL is first configured.\n\nReturns a summary with counts and any per-SLX errors.","operationId":"push_workspace_alert_rules_api_v1_workspaces__workspace_name__push_alert_rules_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Push Workspace Alert Rules Api V1 Workspaces Workspace Name Push Alert Rules Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/sli/runners":{"get":{"tags":["slis"],"summary":"List runners for an SLI","description":"Get runners and health status for an SLI.\n\nHealth is derived from the freshness of the runner's ``last_heartbeat`` column,\nwhich is updated on every ``POST /runners/status`` from the runner agent. A\nrunner is considered Healthy if its heartbeat is within\n``settings.runner_heartbeat_staleness_seconds`` (default 90s).\n\nNote: the legacy Django implementation (``HasCodeRunLocationsMixin.list_locations``)\nderived health from ``status.runnerLocations[*].status.code`` on the SLI CRD —\na string set by the runner via ``POST /runners/run-status``. In CRD-less the\nrunner no longer reports that code and the JSONB ``runner_status`` blob only\ncontains registration metadata, so we use heartbeat freshness instead.","operationId":"list_sli_runners_api_v1_workspaces__workspace_name__slxs__slx_short_name__sli_runners_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Sli Runners Api V1 Workspaces Workspace Name Slxs Slx Short Name Sli Runners Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/slo":{"get":{"tags":["slos"],"summary":"Get the SLO for an SLX","description":"Get the SLO for an SLX.\n\nSLX and SLO have a 1:1 relationship. This endpoint returns the single\nSLO associated with the specified SLX, or 404 if no SLO exists.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n _detail: Django parity query param (ignored).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The SLO details.\n\nRaises:\n HTTPException: 404 if workspace, SLX, or SLO not found.","operationId":"get_slx_slo_api_v1_workspaces__workspace_name__slxs__slx_short_name__slo_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"detail","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Accepted for Django parity; ignored (always returns full detail)","title":"Detail"},"description":"Accepted for Django parity; ignored (always returns full detail)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__slo__SloResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/slo/objective-recommendation":{"get":{"tags":["slos"],"summary":"Get SLO objective recommendation for an SLX","description":"Calculate a recommended SLO objective for an SLX.\n\nTwo paths:\n- **Has SLO:** Recommends based on the current month's error budget burn rate.\n- **No SLO:** Recommends based on 30 days of historical SLI healthiness data.\n\nMirrors Django's SloViewSet.slo_objective_recommendation().","operationId":"objective_recommendation_api_v1_workspaces__workspace_name__slxs__slx_short_name__slo_objective_recommendation_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"baseline","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PromQL timestring defining the baseline window for the burn-rate calculation (e.g. '2h', '1d'). Defaults to hours elapsed since the 1st of the current month. Only used when an SLO exists. Must not exceed hours since month start.","title":"Baseline"},"description":"PromQL timestring defining the baseline window for the burn-rate calculation (e.g. '2h', '1d'). Defaults to hours elapsed since the 1st of the current month. Only used when an SLO exists. Must not exceed hours since month start."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObjectiveRecommendationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook":{"get":{"tags":["runbooks"],"summary":"Get the Runbook for an SLX","description":"Get the Runbook for an SLX.\n\nSLX and Runbook have a 1:1 relationship. This endpoint returns the single\nRunbook associated with the specified SLX, or 404 if no Runbook exists.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n _detail: Django parity query param (ignored).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The Runbook details.\n\nRaises:\n HTTPException: 404 if workspace, SLX, or Runbook not found.","operationId":"get_slx_runbook_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"detail","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Accepted for Django parity; ignored (always returns full detail)","title":"Detail"},"description":"Accepted for Django parity; ignored (always returns full detail)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__runbook__RunbookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs":{"post":{"tags":["run-requests"],"summary":"Create a new RunRequest","description":"Create a new RunRequest for an SLX.\n\nIf request_time is None, the RunRequest is staged and waits for /start.\nIf request_time is provided (or default now), the RunRequest starts immediately.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n data: The RunRequest creation data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The created RunRequest.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 400 if runsession validation fails.","operationId":"create_run_request_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"get":{"tags":["run-requests"],"summary":"List RunRequests for an SLX","description":"List RunRequests for an SLX.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n limit: Maximum number of results.\n offset: Number of results to skip.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Paginated list of RunRequests.\n\nRaises:\n HTTPException: 404 if workspace not found.","operationId":"list_run_requests_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum results","default":100,"title":"Limit"},"description":"Maximum results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Skip results","default":0,"title":"Offset"},"description":"Skip results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}":{"get":{"tags":["run-requests"],"summary":"Get a RunRequest by ID","description":"Get a RunRequest by its ID.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The RunRequest details.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.","operationId":"get_run_request_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["run-requests"],"summary":"Record a run response","description":"Record results from a completed run.\n\nThis endpoint is called by the runner after task execution completes.\nIt sets response_time and updates the result fields. After recording,\nit enqueues the async issue processing task.\n\nParity with main branch: This matches the behavior of\npapi/views/runrequest.py:RunRequestViewSet.update()\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n data: The response data from the runner.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The updated RunRequest.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.","operationId":"record_run_response_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestRecordResponse"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["run-requests"],"summary":"Delete a RunRequest","description":"Delete a RunRequest.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.","operationId":"delete_run_request_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/start":{"post":{"tags":["run-requests"],"summary":"Start a staged RunRequest","description":"Start a staged RunRequest by setting its request_time and submitting to TaskSet API.\n\nStaged RunRequests have request_time=None and wait for this endpoint\nto be called before execution begins. This endpoint:\n1. Sets request_time to mark the run as started\n2. Submits the run to the TaskSet API for execution by the runner\n3. Returns the taskset_uuid for tracking\n\nArgs:\n workspace_name: The workspace name (short name from URL).\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Start confirmation with the request_time and taskset_uuid.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.\n HTTPException: 400 if RunRequest is not staged or already started.","operationId":"start_run_request_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__start_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartRunRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/report":{"get":{"tags":["run-requests"],"summary":"Get the report for a RunRequest","description":"Get the report for a completed RunRequest.\n\nReads report.jsonl from the GCS bucket and returns the parsed JSONL\nas a JSON array, matching Django's behavior.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n raw: If set, return raw JSONL array (Django parity).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n JSON array of report lines (JSONL parsed).\n\nRaises:\n HTTPException: 404 if workspace, RunRequest, or report not found.","operationId":"get_run_request_report_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__report_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}},{"name":"raw","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Return raw JSONL data","title":"Raw"},"description":"Return raw JSONL data"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/issues":{"get":{"tags":["run-requests"],"summary":"Get issues from a RunRequest","description":"Get issues associated with a RunRequest.\n\nIssues are created by parsing the output files after a run completes.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of issues from this RunRequest.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.","operationId":"get_run_request_issues_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__issues_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestIssuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/output":{"get":{"tags":["run-requests"],"summary":"Get parsed output from a RunRequest","description":"Get the parsed output from a completed RunRequest.\n\nThe output is parsed from the robot output XML file.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Parsed output data.\n\nRaises:\n HTTPException: 404 if workspace, RunRequest, or output not found.","operationId":"get_run_request_output_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__output_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/runner-status":{"get":{"tags":["run-requests"],"summary":"Get runner status for a RunRequest","description":"Get the runner status for a RunRequest.\n\nThis queries the runner-control service to get the current status\nof the task execution.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Runner status information.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.\n HTTPException: 400 if RunRequest has no taskset_uuid.","operationId":"get_run_request_runner_status_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__runner_status_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunnerStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/staged":{"get":{"tags":["run-requests"],"summary":"List staged RunRequests","description":"List staged (not yet started) RunRequests for an SLX.\n\nStaged RunRequests have request_time=None and are waiting for /start.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n limit: Maximum number of results.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of staged RunRequests.\n\nRaises:\n HTTPException: 404 if workspace not found.","operationId":"list_staged_run_requests_api_v1_workspaces__workspace_name__slxs__slx_short_name__runbook_runs_staged_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum results","default":100,"title":"Limit"},"description":"Maximum results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/run-requests/{run_request_id}/log":{"get":{"tags":["run-requests"],"summary":"Get the robot log for a RunRequest (SLX-agnostic)","description":"Get the robot log.html for a RunRequest without requiring slx_short_name.\n\nLooks up the RunRequest by ID to derive slx_short_name and runsession_id,\nthen reads log.html from workspace storage. Designed for citation-path\ncallers (e.g. TaskOutputDisplay) that only have a runrequest_id.\n\nArgs:\n workspace_name: The workspace name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Raw HTML content of log.html.\n\nRaises:\n HTTPException: 404 if workspace, RunRequest, or log file not found.","operationId":"get_run_request_log_api_v1_workspaces__workspace_name__run_requests__run_request_id__log_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/rwfs/task-vitals":{"get":{"tags":["rwfs"],"summary":"Get Task Vitals","description":"Return per-task run-history vitals for the workspace.\n\nOne entry per (slx_name, task_title) with any completed run_request\nhistory. Tasks that have never run are omitted — the rwfs UI renders\ngrey pips by default for tasks it doesn't see in this response.\n\nThe aggregator caps each partition at the last\n``RECENT_RUNS_WINDOW`` run_requests so cost stays O(N_tasks) even\nwhen individual tasks have thousands of historic runs.","operationId":"get_task_vitals_api_v1_workspaces__workspace_name__rwfs_task_vitals_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskVitalsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_short_name}/upload":{"post":{"tags":["workspaces"],"summary":"Upload workspace archive","description":"Upload a workspace archive for async processing.\n\nAccepts a base64-encoded tar archive containing workspace configuration.\nThe upload is processed asynchronously via TaskIQ.\n\nArgs:\n workspace_short_name: The workspace identifier.\n data: The upload request containing file_content and optional file_hash.\n current_user: The authenticated user.\n session: The database session.\n\nReturns:\n WorkspaceUploadResponse with task_id for status tracking.","operationId":"upload_workspace_api_v1_workspaces__workspace_short_name__upload_post","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/upload-status/{task_id}":{"get":{"tags":["workspaces"],"summary":"Check upload task status","description":"Check the status of an upload task.\n\nArgs:\n task_id: The task ID returned from the upload endpoint.\n current_user: The authenticated user.\n\nReturns:\n UploadStatusResponse with current task status.","operationId":"get_upload_status_api_v1_workspaces_upload_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/sync":{"post":{"tags":["sync"],"summary":"Upsert an SLX","description":"Upsert an SLX record using SHA-based deduplication.","operationId":"sync_slx_api_v1_workspaces__workspace_name__slxs_sync_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/{name}":{"delete":{"tags":["sync"],"summary":"Soft-delete an SLX","description":"Soft-delete an SLX by name.","operationId":"delete_slx_api_v1_workspaces__workspace_name__slxs__name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slxs/reconcile-tasks":{"post":{"tags":["sync"],"summary":"[dev only] Re-reconcile slx_tasks for a workspace","description":"Re-run the slx_tasks reconcile for every runbook in a workspace.\n\nDev-only validation hook: the production trigger is the runbook reconcile\nhook (sync endpoints / workspace-upload pipeline), but seeded/migrated\nworkspaces have runbooks without slx_tasks rows until something re-syncs.\nReconciles from the runbooks' current resolved_tasks/task_details — no\nrobot re-parse — so it works without git access. Returns 404 outside the\ndevelopment environment.","operationId":"reconcile_workspace_tasks_api_v1_workspaces__workspace_name__slxs_reconcile_tasks_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconcileTasksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slis/sync":{"post":{"tags":["sync"],"summary":"Upsert an SLI","description":"Upsert an SLI record. The slx_id must be present in the payload.","operationId":"sync_sli_api_v1_workspaces__workspace_name__slis_sync_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slis/{slx_name}":{"delete":{"tags":["sync"],"summary":"Soft-delete an SLI by its parent SLX name","description":"Soft-delete an SLI identified by its parent SLX name.","operationId":"delete_sli_api_v1_workspaces__workspace_name__slis__slx_name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slos/sync":{"post":{"tags":["sync"],"summary":"Upsert an SLO","description":"Upsert an SLO record. The slx_id must be present in the payload.","operationId":"sync_slo_api_v1_workspaces__workspace_name__slos_sync_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/slos/{slx_name}":{"delete":{"tags":["sync"],"summary":"Soft-delete an SLO by its parent SLX name","description":"Soft-delete an SLO identified by its parent SLX name.","operationId":"delete_slo_api_v1_workspaces__workspace_name__slos__slx_name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runbooks/sync":{"post":{"tags":["sync"],"summary":"Upsert a Runbook","description":"Upsert a Runbook record. The slx_id must be present in the payload.","operationId":"sync_runbook_api_v1_workspaces__workspace_name__runbooks_sync_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/runbooks/{slx_name}":{"delete":{"tags":["sync"],"summary":"Soft-delete a Runbook by its parent SLX name","description":"Soft-delete a Runbook identified by its parent SLX name.","operationId":"delete_runbook_api_v1_workspaces__workspace_name__runbooks__slx_name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/personas/sync":{"post":{"tags":["sync"],"summary":"Upsert a Persona","description":"Upsert a Persona record.","operationId":"sync_persona_api_v1_workspaces__workspace_name__personas_sync_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/personas/{name}":{"delete":{"tags":["sync"],"summary":"Soft-delete a Persona","description":"Soft-delete a Persona by name.","operationId":"delete_persona_api_v1_workspaces__workspace_name__personas__name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/workflows/sync":{"post":{"tags":["sync"],"summary":"Upsert a Workflow","description":"Upsert a Workflow record.","operationId":"sync_workflow_api_v1_workspaces__workspace_name__workflows_sync_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/workflows/{name}":{"delete":{"tags":["sync"],"summary":"Soft-delete a Workflow","description":"Soft-delete a Workflow by name.","operationId":"delete_workflow_api_v1_workspaces__workspace_name__workflows__name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/sync":{"post":{"tags":["sync"],"summary":"Upsert a Workspace","description":"Upsert a Workspace record.\n\nWorkspace deletion is handled by the dedicated workspace deletion flow\nand is not exposed here.","operationId":"sync_workspace_api_v1_workspaces__workspace_name__sync_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/slxs":{"get":{"tags":["slx-v4"],"summary":"List Slxs","operationId":"list_slxs_api_v4_workspaces__workspace_name__slxs_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlxListResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/slxs/{slx_short_name}":{"get":{"tags":["slx-v4"],"summary":"Get Slx","operationId":"get_slx_api_v4_workspaces__workspace_name__slxs__slx_short_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlxResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["slx-v4"],"summary":"Soft-delete an SLX (V4, short-name URL)","description":"Soft-delete an SLX by its short name (the v4-consistent URL form).\n\nMirrors the v4 GET pattern: clients pass the short name (e.g. ``my-slx``);\nthe handler forms the full DB name (``{workspace}--{short_name}``) before\ninvoking ``SlxSyncService.soft_delete``. This matches what the UI already\nsends — the legacy ``sync_router`` DELETE at ``/api/v1/.../slxs/{name}``\ntook the full name as the path param, and a UI sending a short name\nagainst it always landed on ``status=\"not_found\"`` (silent no-op).","operationId":"delete_slx_api_v4_workspaces__workspace_name__slxs__slx_short_name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/slxs/sync-typed":{"post":{"tags":["slx-v4"],"summary":"Upsert an SLX (V4 typed payload)","operationId":"sync_slx_typed_api_v4_workspaces__workspace_name__slxs_sync_typed_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlxSyncRequestV4"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/slxs/{slx_short_name}/sli":{"get":{"tags":["sli-v4"],"summary":"Get Sli","operationId":"get_sli_api_v4_workspaces__workspace_name__slxs__slx_short_name__sli_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SliResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["sli-v4"],"summary":"Soft-delete the SLI attached to an SLX (V4, short-name URL)","description":"Soft-delete the SLI that belongs to ``{slx_short_name}`` in this workspace.\n\nMirrors the v4 GET URL (``/slxs/{slx_short_name}/sli``). SLI rows are\nkeyed by ``slx_id`` (1-1 with the parent SLX), so the path identifies\nthe parent SLX rather than the SLI itself.","operationId":"delete_sli_api_v4_workspaces__workspace_name__slxs__slx_short_name__sli_delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/slis/sync-typed":{"post":{"tags":["sli-v4"],"summary":"Upsert an SLI (V4 typed payload)","operationId":"sync_sli_typed_api_v4_workspaces__workspace_name__slis_sync_typed_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SliSyncRequestV4"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/slxs/{slx_short_name}/slo":{"get":{"tags":["slo-v4"],"summary":"Get Slo","operationId":"get_slo_api_v4_workspaces__workspace_name__slxs__slx_short_name__slo_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SloResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["slo-v4"],"summary":"Soft-delete the SLO attached to an SLX (V4, short-name URL)","description":"Soft-delete the SLO that belongs to ``{slx_short_name}`` in this workspace.\n\nMirrors the v4 GET URL (``/slxs/{slx_short_name}/slo``). SLO rows are\nkeyed by ``slx_id`` (1-1 with the parent SLX).","operationId":"delete_slo_api_v4_workspaces__workspace_name__slxs__slx_short_name__slo_delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/slos/sync-typed":{"post":{"tags":["slo-v4"],"summary":"Upsert an SLO (V4 typed payload)","operationId":"sync_slo_typed_api_v4_workspaces__workspace_name__slos_sync_typed_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SloSyncRequestV4"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook":{"get":{"tags":["runbook-v4"],"summary":"Get Runbook","operationId":"get_runbook_api_v4_workspaces__workspace_name__slxs__slx_short_name__runbook_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunbookResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["runbook-v4"],"summary":"Soft-delete the Runbook attached to an SLX (V4, short-name URL)","description":"Soft-delete the Runbook that belongs to ``{slx_short_name}`` in this workspace.\n\nMirrors the v4 GET URL (``/slxs/{slx_short_name}/runbook``). Runbook rows\nare keyed by ``slx_id`` (1-1 with the parent SLX).","operationId":"delete_runbook_api_v4_workspaces__workspace_name__slxs__slx_short_name__runbook_delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/runbooks/sync-typed":{"post":{"tags":["runbook-v4"],"summary":"Upsert a Runbook (V4 typed payload)","operationId":"sync_runbook_typed_api_v4_workspaces__workspace_name__runbooks_sync_typed_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunbookSyncRequestV4"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/personas":{"get":{"tags":["persona-v4"],"summary":"List Personas","operationId":"list_personas_api_v4_workspaces__workspace_name__personas_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaListResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/personas/{persona_short_name}":{"get":{"tags":["persona-v4"],"summary":"Get Persona","operationId":"get_persona_api_v4_workspaces__workspace_name__personas__persona_short_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"persona_short_name","in":"path","required":true,"schema":{"type":"string","title":"Persona Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["persona-v4"],"summary":"Soft-delete a Persona (V4, short-name URL)","description":"Soft-delete a Persona by its short name (mirrors the v4 GET URL).","operationId":"delete_persona_api_v4_workspaces__workspace_name__personas__persona_short_name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"persona_short_name","in":"path","required":true,"schema":{"type":"string","title":"Persona Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/personas/sync-typed":{"post":{"tags":["persona-v4"],"summary":"Upsert a Persona (V4 typed payload)","operationId":"sync_persona_typed_api_v4_workspaces__workspace_name__personas_sync_typed_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaSyncRequestV4"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/workflows":{"get":{"tags":["workflow-v4"],"summary":"List Workflows","operationId":"list_workflows_api_v4_workspaces__workspace_name__workflows_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowListResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/workflows/{workflow_name}":{"get":{"tags":["workflow-v4"],"summary":"Get Workflow","operationId":"get_workflow_api_v4_workspaces__workspace_name__workflows__workflow_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"workflow_name","in":"path","required":true,"schema":{"type":"string","title":"Workflow Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["workflow-v4"],"summary":"Soft-delete a Workflow (V4, short-name URL)","description":"Soft-delete a Workflow by its short name (mirrors the v4 GET URL).","operationId":"delete_workflow_api_v4_workspaces__workspace_name__workflows__workflow_name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"workflow_name","in":"path","required":true,"schema":{"type":"string","title":"Workflow Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/workflows/sync-typed":{"post":{"tags":["workflow-v4"],"summary":"Upsert a Workflow (V4 typed payload)","operationId":"sync_workflow_typed_api_v4_workspaces__workspace_name__workflows_sync_typed_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowSyncRequestV4"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/configuration":{"get":{"tags":["workspace-v4"],"summary":"Get workspace configuration (lightweight)","description":"Return only the fields the Workspace Configuration page needs.\n\nCheap reads only: WorkspaceModel columns, the eagerly-loaded permissions\nrelationship, the user's effective role, and a ``COUNT(*)`` of SLXs.\nNo SLX list, no firing alerts, no layout, no gallery summaries.","operationId":"get_workspace_configuration_api_v4_workspaces__workspace_name__configuration_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceConfigurationResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/notes":{"get":{"tags":["notes-v4"],"summary":"List notes for a workspace","description":"List notes for a workspace.\n\n``view=summary``: lightweight metadata-only list (no content body) — the\n\"summary representation\" for listing UIs (e.g. the rwfs tree). ``status``\nand ``search`` filters still apply (``search`` is title-only here, since\ncontent is not loaded). It is a distinct representation from\n``include_enrichment`` and the two cannot be combined (400).\nWithout include_enrichment: plain list of notes (full, with content).\nWith include_enrichment=true: paginated wrapper with USearch metadata.","operationId":"list_notes_api_v4_workspaces__workspace_name__notes_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"view","in":"query","required":false,"schema":{"type":"string","pattern":"^(full|summary)$","description":"\"full\" (default): notes with content. \"summary\": lightweight metadata-only representation (no content body) for listing UIs.","default":"full","title":"View"},"description":"\"full\" (default): notes with content. \"summary\": lightweight metadata-only representation (no content body) for listing UIs."},{"name":"include_enrichment","in":"query","required":false,"schema":{"type":"boolean","description":"Include USearch indexing metadata","default":false,"title":"Include Enrichment"},"description":"Include USearch indexing metadata"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive substring filter. full view: title or content; summary view: title only (content is not loaded at this representation).","title":"Search"},"description":"Case-insensitive substring filter. full view: title or content; summary view: title only (content is not loaded at this representation)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max results","default":200,"title":"Limit"},"description":"Max results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Offset"},"description":"Pagination offset"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["notes-v4"],"summary":"Create a note","description":"Create a new note and fire-and-forget USearch indexing.","operationId":"create_note_api_v4_workspaces__workspace_name__notes_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreateV4"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["notes-import-v4"],"summary":"Remove KB notes from a source","description":"Delete a list of notes (by source_id) from one source. ``dry_run`` previews.","operationId":"delete_notes_api_v4_workspaces__workspace_name__notes_delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteDeleteRequestV4"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteDeleteResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/notes/{note_id}":{"get":{"tags":["notes-v4"],"summary":"Get a note","description":"Retrieve a single note by UUID.","operationId":"get_note_api_v4_workspaces__workspace_name__notes__note_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["notes-v4"],"summary":"Update a note","description":"Partial update of a note. Re-indexes in USearch.","operationId":"update_note_api_v4_workspaces__workspace_name__notes__note_id__patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteUpdateV4"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["notes-v4"],"summary":"Delete a note","description":"Delete a note and remove from USearch index.","operationId":"delete_note_api_v4_workspaces__workspace_name__notes__note_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/notes/sync":{"post":{"tags":["notes-import-v4"],"summary":"Publish (upsert) a KB note from a source","description":"Upsert a note identified by its source. ``dry_run`` validates without writing.","operationId":"sync_note_api_v4_workspaces__workspace_name__notes_sync_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteSyncRequestV4"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteSyncResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/resource-paths":{"get":{"tags":["notes-import-v4"],"summary":"List the workspace's valid resource paths","description":"Resource paths to author/validate `resource_paths` against.","operationId":"list_resource_paths_api_v4_workspaces__workspace_name__resource_paths_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourcePathsResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v4/workspaces/{workspace_name}/tags":{"get":{"tags":["notes-import-v4"],"summary":"List the workspace's tag keys and values","description":"The workspace's tag keys → values, to author ``match_tags`` selectors against.","operationId":"list_workspace_tags_api_v4_workspaces__workspace_name__tags_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"limit_values","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Max sample values returned per tag key","default":100,"title":"Limit Values"},"description":"Max sample values returned per tag key"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceTagsResponseV4"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/notes":{"get":{"tags":["notes (deprecated v3)"],"summary":"List notes for a workspace (deprecated v3)","description":"List notes for a workspace.\n\nWithout include_enrichment: plain list of notes.\nWith include_enrichment=true: paginated wrapper with USearch metadata.","operationId":"list_notes_api_v3_workspaces__workspace_name__notes_get","deprecated":true,"parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"include_enrichment","in":"query","required":false,"schema":{"type":"boolean","description":"Include USearch indexing metadata","default":false,"title":"Include Enrichment"},"description":"Include USearch indexing metadata"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search within content","title":"Search"},"description":"Search within content"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max results","default":200,"title":"Limit"},"description":"Max results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Offset"},"description":"Pagination offset"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["notes (deprecated v3)"],"summary":"Create a note (deprecated v3)","description":"Create a new manual note and enqueue the v4 resolve+index reconcile.","operationId":"create_note_api_v3_workspaces__workspace_name__notes_post","deprecated":true,"parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/notes/{note_id}":{"get":{"tags":["notes (deprecated v3)"],"summary":"Get a note (deprecated v3)","description":"Retrieve a single note by UUID.","operationId":"get_note_api_v3_workspaces__workspace_name__notes__note_id__get","deprecated":true,"parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["notes (deprecated v3)"],"summary":"Update a note (deprecated v3)","description":"Partial update of a note. Re-runs the resolve+index reconcile.","operationId":"update_note_api_v3_workspaces__workspace_name__notes__note_id__patch","deprecated":true,"parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["notes (deprecated v3)"],"summary":"Delete a note (deprecated v3)","description":"Delete a note and remove it from the USearch index.","operationId":"delete_note_api_v3_workspaces__workspace_name__notes__note_id__delete","deprecated":true,"parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/users/tokens":{"get":{"tags":["tokens"],"summary":"List Tokens","description":"List all personal access tokens for the current user.","operationId":"list_tokens_api_v1_users_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PATResponse"},"type":"array","title":"Response List Tokens Api V1 Users Tokens Get"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/users/tokens/create":{"post":{"tags":["tokens"],"summary":"Create Token","description":"Create a new personal access token. The full token is returned only once.","operationId":"create_token_api_v1_users_tokens_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/users/tokens/{token_id}/revoke":{"post":{"tags":["tokens"],"summary":"Revoke Token","description":"Revoke a personal access token.","operationId":"revoke_token_api_v1_users_tokens__token_id__revoke_post","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/users/tokens/{token_id}":{"delete":{"tags":["tokens"],"summary":"Delete Token","description":"Permanently delete a personal access token.","operationId":"delete_token_api_v1_users_tokens__token_id__delete","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/tokens":{"get":{"tags":["tokens"],"summary":"List Tokens","description":"List all personal access tokens for the current user.","operationId":"list_tokens_api_v3_users_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PATResponse"},"type":"array","title":"Response List Tokens Api V3 Users Tokens Get"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/tokens/create":{"post":{"tags":["tokens"],"summary":"Create Token","description":"Create a new personal access token. The full token is returned only once.","operationId":"create_token_api_v3_users_tokens_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/tokens/{token_id}/revoke":{"post":{"tags":["tokens"],"summary":"Revoke Token","description":"Revoke a personal access token.","operationId":"revoke_token_api_v3_users_tokens__token_id__revoke_post","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/tokens/{token_id}":{"delete":{"tags":["tokens"],"summary":"Delete Token","description":"Permanently delete a personal access token.","operationId":"delete_token_api_v3_users_tokens__token_id__delete","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/upload":{"post":{"tags":["workspaces"],"summary":"Upload workspace archive","description":"Upload a workspace archive for async processing.\n\nAccepts a base64-encoded tar archive containing workspace configuration.\nThe upload is processed asynchronously via TaskIQ.\n\nArgs:\n workspace_short_name: The workspace identifier.\n data: The upload request containing file_content and optional file_hash.\n current_user: The authenticated user.\n session: The database session.\n\nReturns:\n WorkspaceUploadResponse with task_id for status tracking.","operationId":"upload_workspace_api_v3_workspaces__workspace_short_name__upload_post","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/upload-status/{task_id}":{"get":{"tags":["workspaces"],"summary":"Check upload task status","description":"Check the status of an upload task.\n\nArgs:\n task_id: The task ID returned from the upload endpoint.\n current_user: The authenticated user.\n\nReturns:\n UploadStatusResponse with current task status.","operationId":"get_upload_status_api_v3_workspaces_upload_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs":{"get":{"tags":["slxs"],"summary":"List SLXs for a workspace","description":"List SLXs for a workspace with optional filters.\n\nArgs:\n workspace_name: The workspace name.\n request: The incoming request (used to build pagination URLs).\n session: Database session.\n current_user: The authenticated user.\n search: Optional search string.\n tags: Optional tags to filter by.\n resource_path_prefix: Optional resource path prefix filter.\n resource_type: Optional resource type filter.\n owners: Optional owner filter.\n limit: Maximum number of results (default 100, max 250).\n offset: Number of results to skip.\n\nReturns:\n Paginated list of SLXs.","operationId":"list_workspace_slxs_api_v3_workspaces__workspace_name__slxs_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in name, short_name, or alias","title":"Search"},"description":"Search in name, short_name, or alias"},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by tags (any match)","title":"Tags"},"description":"Filter by tags (any match)"},{"name":"resource_path_prefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by resource path prefix (e.g. 'kubernetes/cluster-01')","title":"Resource Path Prefix"},"description":"Filter by resource path prefix (e.g. 'kubernetes/cluster-01')"},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by resource type (e.g. 'Deployment')","title":"Resource Type"},"description":"Filter by resource type (e.g. 'Deployment')"},{"name":"owners","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by owners (any match)","title":"Owners"},"description":"Filter by owners (any match)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlxListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}":{"get":{"tags":["slxs"],"summary":"Get an SLX by short name","description":"Get an SLX by its short name within a workspace.\n\nWhen history/resolution are provided, enriches the response with live\nCortex metrics for SLI charts and SLO error budget charts.","operationId":"get_workspace_slx_api_v3_workspaces__workspace_name__slxs__slx_short_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"history","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d+[smhd]$","description":"PromQL time range for SLI metrics","default":"5m","title":"History"},"description":"PromQL time range for SLI metrics"},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d+[smhd]$","description":"PromQL step interval for SLI metrics","default":"30s","title":"Resolution"},"description":"PromQL step interval for SLI metrics"},{"name":"window","in":"query","required":false,"schema":{"type":"string","pattern":"^(month|\\d+[d])$","description":"EBR window: 'month' for calendar month or Nd for rolling N days","default":"month","title":"Window"},"description":"EBR window: 'month' for calendar month or Nd for rolling N days"},{"name":"detail","in":"query","required":false,"schema":{"type":"string","description":"Detail level (accepted for Django parity)","default":"False","title":"Detail"},"description":"Detail level (accepted for Django parity)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlxResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/metrics":{"get":{"tags":["slxs"],"summary":"Get lightweight metrics for SLX chart widgets","description":"Lightweight metrics endpoint for chart widgets.\n\nOnly fires the Cortex queries the requesting chart actually needs.\nSLO resolution is always derived from ``window`` — callers must not send it.\n\nValidation rules (400 Bad Request):\n- types=sli,slo + any of history/resolution/window present\n- types=slo + history present\n- types=sli + window present\n- SLI (history, resolution) not in the 8-pair allowlist\n- SLO window not matching ^(month|since[1-3]|since6)$","operationId":"get_workspace_slx_metrics_api_v3_workspaces__workspace_name__slxs__slx_short_name__metrics_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"types","in":"query","required":true,"schema":{"type":"string","description":"Cortex query types: sli, slo, or sli,slo","title":"Types"},"description":"Cortex query types: sli, slo, or sli,slo"},{"name":"history","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SLI history window (e.g. 5m, 1h)","title":"History"},"description":"SLI history window (e.g. 5m, 1h)"},{"name":"resolution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SLI step interval (e.g. 30s, 6m)","title":"Resolution"},"description":"SLI step interval (e.g. 30s, 6m)"},{"name":"window","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SLO calendar window (month, since1-since6)","title":"Window"},"description":"SLO calendar window (month, since1-since6)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlxMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/file-upload-url/{session_id}/{path}":{"get":{"tags":["slxs"],"summary":"Get a signed URL for uploading a file","description":"Get a signed URL for uploading a file to workspace storage.\n\nThis endpoint is used by the robot-runtime platform library when\nuploading files from task runs.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n session_id: The run session ID.\n path: The file path/name to upload.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n A signed URL that can be used to PUT the file content.\n\nRaises:\n HTTPException: 404 if workspace or SLX not found.\n HTTPException: 500 if signed URL generation fails.","operationId":"get_file_upload_url_api_v3_workspaces__workspace_name__slxs__slx_short_name__file_upload_url__session_id___path__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","description":"The session ID","title":"Session Id"},"description":"The session ID"},{"name":"path","in":"path","required":true,"schema":{"type":"string","description":"The file path/name to upload","title":"Path"},"description":"The file path/name to upload"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUploadUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/files/{session_id}":{"get":{"tags":["slxs"],"summary":"List files for an SLX session","description":"List files for an SLX session in workspace storage.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n session_id: The run session ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of filenames.","operationId":"list_slx_files_api_v3_workspaces__workspace_name__slxs__slx_short_name__files__session_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","description":"The session ID","title":"Session Id"},"description":"The session ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response List Slx Files Api V3 Workspaces Workspace Name Slxs Slx Short Name Files Session Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/files/{session_id}/{path}":{"get":{"tags":["slxs"],"summary":"Get a file for an SLX session","description":"Get a file for an SLX session from workspace storage.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n session_id: The run session ID.\n path: The file path/name to retrieve.\n size_limit_bytes: Maximum file size to read (default 240MB).\n raw: If True, return plain text response instead of JSON.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n File contents as JSON {\"contents\": str} or plain text.","operationId":"get_slx_file_api_v3_workspaces__workspace_name__slxs__slx_short_name__files__session_id___path__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","description":"The session ID","title":"Session Id"},"description":"The session ID"},{"name":"path","in":"path","required":true,"schema":{"type":"string","description":"The file path/name","title":"Path"},"description":"The file path/name"},{"name":"sizeLimitBytes","in":"query","required":false,"schema":{"type":"integer","description":"Max file size in bytes","default":240000000,"title":"Sizelimitbytes"},"description":"Max file size in bytes"},{"name":"raw","in":"query","required":false,"schema":{"type":"boolean","description":"Return raw text instead of JSON wrapper","default":false,"title":"Raw"},"description":"Return raw text instead of JSON wrapper"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/task-outputs":{"get":{"tags":["slxs"],"summary":"Get task outputs by task name across recent RunRequests","description":"Get task outputs for a task name across recent RunRequests.\n\nReturns outputs from the report.jsonl files of matching RunRequests.","operationId":"get_task_outputs_by_task_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs_task_outputs_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"task_name","in":"query","required":true,"schema":{"type":"string","description":"Task name to filter by","title":"Task Name"},"description":"Task name to filter by"},{"name":"created__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"RunRequests created after this time","title":"Created Gte"},"description":"RunRequests created after this time"},{"name":"created__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"RunRequests created before this time","title":"Created Lte"},"description":"RunRequests created before this time"},{"name":"outputs_limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max RunRequests to fetch","default":10,"title":"Outputs Limit"},"description":"Max RunRequests to fetch"},{"name":"exclude_issue_outputs","in":"query","required":false,"schema":{"type":"boolean","description":"Exclude issue-type outputs","default":true,"title":"Exclude Issue Outputs"},"description":"Exclude issue-type outputs"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Task Outputs By Task Api V3 Workspaces Workspace Name Slxs Slx Short Name Runbook Runs Task Outputs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/task-outputs":{"get":{"tags":["slxs"],"summary":"Get task outputs for a specific RunRequest","description":"Get task outputs for a specific RunRequest.\n\nReturns outputs from the report.jsonl file.","operationId":"get_task_outputs_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__task_outputs_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","description":"RunRequest ID","title":"Run Request Id"},"description":"RunRequest ID"},{"name":"task_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional task name filter","title":"Task Name"},"description":"Optional task name filter"},{"name":"exclude_issue_outputs","in":"query","required":false,"schema":{"type":"boolean","description":"Exclude issue-type outputs","default":true,"title":"Exclude Issue Outputs"},"description":"Exclude issue-type outputs"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Task Outputs Api V3 Workspaces Workspace Name Slxs Slx Short Name Runbook Runs Run Request Id Task Outputs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/token/":{"post":{"tags":["auth"],"summary":"Obtain Token","description":"Obtain JWT access and refresh tokens.\n\nAccepts either username or email with password for authentication.\nCompatible with Django REST Framework SimpleJWT token endpoint.\nSupports both application/json and application/x-www-form-urlencoded.\n\nArgs:\n request: The incoming HTTP request.\n\nReturns:\n TokenResponse with access and refresh JWT tokens.\n\nRaises:\n HTTPException: 401 if credentials are invalid.","operationId":"obtain_token_api_v3_token__post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}}},"security":[]}},"/api/v3/token/refresh/":{"post":{"tags":["auth"],"summary":"Refresh Token","description":"Refresh an access token using a refresh token.\n\nAccepts {\"refresh\": \"\"} in the request body, matching Django SimpleJWT.\n\nArgs:\n body: Request body containing the refresh token.\n\nReturns:\n TokenResponse with new access and refresh tokens.\n\nRaises:\n HTTPException: 401 if refresh token is invalid.","operationId":"refresh_token_api_v3_token_refresh__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v3/token/verify/":{"post":{"tags":["auth"],"summary":"Verify Token","description":"Verify a JWT token is valid and not expired.\n\nMirrors Django SimpleJWT TokenVerifyView. Returns {} on success.\n\nArgs:\n body: Request body containing the token to verify.\n\nReturns:\n Empty dict on success.\n\nRaises:\n HTTPException: 401 if token is invalid or expired.","operationId":"verify_token_api_v3_token_verify__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verify Token Api V3 Token Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v3/username-password-login":{"post":{"tags":["auth"],"summary":"Username Password Login","description":"Authenticate user with username/password and return access token.\n\nThis endpoint is provided for UI login compatibility with Django.\nIt returns an access token with a custom lifetime based on the `days` parameter.\n\nArgs:\n request: Token request containing username/email and password.\n days: Token lifetime in days (default 1, max 30).\n\nReturns:\n UsernamePasswordLoginResponse with access token and lifetime string.\n\nRaises:\n HTTPException: 400 if credentials are invalid.","operationId":"username_password_login_api_v3_username_password_login_post","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Token lifetime in days","default":1,"title":"Days"},"description":"Token lifetime in days"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsernamePasswordLoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v3/token/exchange/":{"post":{"tags":["auth"],"summary":"Exchange an external token for a PAPI JWT","description":"Exchange an Auth0 access token for a PAPI JWT.\n\nThis endpoint implements a simplified RFC 8693 token exchange. It\nvalidates the Auth0 token against Auth0's /userinfo endpoint, looks up\nthe corresponding PAPI user by email, and issues a PAPI JWT.\n\nIntended for use by the MCP server after completing an OAuth 2.1 flow\nwith Auth0 — the MCP server receives an Auth0 access token from the\ninteractive login and exchanges it here for a PAPI JWT that can be\nused for API calls.","operationId":"token_exchange_api_v3_token_exchange__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenExchangeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenExchangeResponse"}}}},"401":{"description":"External token is invalid or expired"},"404":{"description":"No PAPI user found for the token's email"},"501":{"description":"Token exchange not available (Auth0 not configured)"},"502":{"description":"Failed to validate token with identity provider"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v3/users/register":{"post":{"tags":["users"],"summary":"Register a new user account","description":"Create a new user account and send a verification email.\n\nArgs:\n data: Registration details (username, email, password).\n session: Database session.\n\nReturns:\n The created user's basic info with a confirmation message.\n\nRaises:\n HTTPException: 409 if username or email already exists.","operationId":"register_api_v3_users_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v3/users/verify-email":{"post":{"tags":["users"],"summary":"Verify email address via token","description":"Verify a user's email address using a signed token.\n\nArgs:\n data: The verification token.\n session: Database session.\n\nReturns:\n Confirmation message.\n\nRaises:\n HTTPException: 400 if token is invalid or expired.","operationId":"verify_email_api_v3_users_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v3/users/resend-verification":{"post":{"tags":["users"],"summary":"Resend verification email","description":"Resend verification email for an unverified account.\n\nAlways returns 200 with a generic message to prevent email enumeration.","operationId":"resend_verification_api_v3_users_resend_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/forgot-password":{"post":{"tags":["users"],"summary":"Request a password reset email","description":"Send a password reset email if the email exists.\n\nAlways returns 200 with a generic message to prevent email enumeration.\n\nArgs:\n data: The email address to send the reset link to.\n session: Database session.\n\nReturns:\n Generic confirmation message (regardless of whether the email exists).","operationId":"forgot_password_api_v3_users_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v3/users/reset-password":{"post":{"tags":["users"],"summary":"Reset password using a token","description":"Reset a user's password using a signed, one-time-use token.\n\nArgs:\n data: The reset token and new password.\n session: Database session.\n\nReturns:\n Confirmation message.\n\nRaises:\n HTTPException: 400 if token is invalid, expired, or already consumed.","operationId":"reset_password_api_v3_users_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v3/users/csrf-token":{"get":{"tags":["users"],"summary":"Get CSRF token","description":"Get a CSRF token for cross-domain requests.\n\nThis endpoint is provided for UI compatibility. With JWT-based\nauthentication, CSRF tokens are not strictly necessary since\nthe auth token is sent in the Authorization header (not cookies).\n\nHowever, the frontend may still expect this endpoint to exist.\n\nReturns:\n A CSRF token.","operationId":"get_csrf_token_api_v3_users_csrf_token_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsrfTokenResponse"}}}}},"security":[]}},"/api/v3/users/login":{"post":{"tags":["users"],"summary":"Login with username and password","description":"Authenticate user with username and password.\n\nArgs:\n data: Login credentials.\n session: Database session.\n\nReturns:\n Access and refresh tokens with user info.\n\nRaises:\n HTTPException: 401 if credentials invalid.","operationId":"login_api_v3_users_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/api/v3/users/logout":{"post":{"tags":["users"],"summary":"Logout (invalidate session)","description":"Logout the current user.\n\nClears the JWT cookie so browser-based sessions are terminated immediately.","operationId":"logout_api_v3_users_logout_post","responses":{"204":{"description":"Successful Response"}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/whoami":{"get":{"tags":["users"],"summary":"Get current user info","description":"Get information about the currently logged in user.\n\nArgs:\n current_user: The authenticated user.\n\nReturns:\n The current user's information.","operationId":"whoami_api_v3_users_whoami_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/search":{"get":{"tags":["users"],"summary":"Search users by name or email","description":"Search users by first name, last name, username, or email.\n\nReturns empty list if search term is less than 3 characters.\nExcludes service accounts from results.\n\nStaff-only for general search (matching Django IsAdminUser).\nNon-staff users may search within an anonymous workspace (returns only\nanonymized results).","operationId":"search_users_api_v3_users_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search term","title":"Q"},"description":"Search term"},{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace name for anonymous mode","title":"Workspace"},"description":"Workspace name for anonymous mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserSearchResponse"},"title":"Response Search Users Api V3 Users Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/search-email":{"get":{"tags":["users"],"summary":"Search users by exact email","description":"Search users by exact email address match.\n\nReturns matching users and list of emails not found.\nUsed for mapping git contributors to user accounts.\n\nNote: Accepts both `q` and `q[]` query parameter formats for compatibility\nwith different frontend frameworks.","operationId":"search_users_by_email_api_v3_users_search_email_get","parameters":[{"name":"q[]","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Email addresses to search","default":[],"title":"Q[]"},"description":"Email addresses to search"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSearchEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/get-token":{"get":{"tags":["users"],"summary":"Get access token for API usage","description":"Generate an access token for the current user.\n\nThe token can be used for API authentication with Bearer scheme.","operationId":"get_token_api_v3_users_get_token_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Token lifetime in days","default":1,"title":"Days"},"description":"Token lifetime in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/my-network":{"get":{"tags":["users"],"summary":"Get users in current user's network","description":"Get users who share workspaces with the current user.\n\nWorkspace name to scope results to (required).\nReturns users who have permissions on the specified workspace.\nUseful for autocomplete/mentions.\n\nArgs:\n workspace: Workspace name to scope results to (required).\n current_user: The authenticated user.\n session: Database session.\n\nReturns:\n List of users in the current user's network.","operationId":"get_my_network_api_v3_users_my_network_get","parameters":[{"name":"workspace","in":"query","required":true,"schema":{"type":"string","description":"Workspace name (required)","title":"Workspace"},"description":"Workspace name (required)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserNetworkResponse"},"title":"Response Get My Network Api V3 Users My Network Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/{user_id}":{"get":{"tags":["users"],"summary":"Get user by ID","description":"Get a user by their ID.\n\nArgs:\n user_id: The ID of the user to retrieve.\n session: Database session.\n current_user: The authenticated user (required for auth).\n\nReturns:\n The user information.\n\nRaises:\n HTTPException: 404 if user not found.","operationId":"get_user_api_v3_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["users"],"summary":"Update user details","description":"Update user details.\n\nUsers can only update their own profile. Admins can update any user.\n\nArgs:\n user_id: The ID of the user to update.\n update_data: The fields to update.\n current_user: The authenticated user.\n session: Database session.\n\nReturns:\n The updated user information.\n\nRaises:\n HTTPException: 403 if trying to update another user's profile.\n HTTPException: 404 if user not found.","operationId":"update_user_api_v3_users__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/{user_id}/activeworkspaces":{"get":{"tags":["users"],"summary":"Get user's active workspaces","description":"Get workspaces sorted by user's activity count.\n\nArgs:\n user_id: The user ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of workspaces with activity counts.","operationId":"get_user_active_workspaces_api_v3_users__user_id__activeworkspaces_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserActiveWorkspacesResponse"},"title":"Response Get User Active Workspaces Api V3 Users User Id Activeworkspaces Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/{user_id}/activities/count":{"get":{"tags":["users"],"summary":"Get count of user's activities","description":"Get the count of activities for a user (heatmap data).\n\nReturns a list of date/count pairs for generating activity heatmaps.\n\nArgs:\n user_id: The user ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of date/count pairs.","operationId":"get_user_activities_count_api_v3_users__user_id__activities_count_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserActivitiesCountResponse"},"title":"Response Get User Activities Count Api V3 Users User Id Activities Count Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/users/{user_id}/activities":{"get":{"tags":["users"],"summary":"Get user's activity stream","description":"Get activity stream for a user.\n\nArgs:\n user_id: The user ID.\n page: Page number.\n page_size: Items per page.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of activities.","operationId":"get_user_activities_api_v3_users__user_id__activities_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page-size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page-Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get User Activities Api V3 Users User Id Activities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces":{"get":{"tags":["workspaces"],"summary":"List workspaces for the current user","description":"List all workspaces the current user has access to.\n\nReturns workspaces where the user is either the owner or has\nexplicit permissions.\n\nArgs:\n limit: Maximum number of results to return.\n offset: Number of results to skip.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Paginated list of workspaces.","operationId":"list_workspaces_api_v3_workspaces_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["workspaces"],"summary":"Create a new workspace","description":"Create a new workspace (synchronous, DB-direct).\n\nThis endpoint:\n1. Auto-suffixes the name if it collides with an existing workspace,\n tombstone, repository, or K8s CRD (e.g. ``myws`` -> ``myws-2``).\n2. Creates the workspace DB record and provisions runner infrastructure.\n3. Returns with status=\"ready\" on success.\n\nCreation is synchronous — no polling required after a 201 response.","operationId":"create_workspace_api_v3_workspaces_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceGitCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}":{"get":{"tags":["workspaces"],"summary":"Get a workspace by name","description":"Get a workspace by its short name.\n\nArgs:\n workspace_short_name: The workspace short name (e.g., 'pp-04').\n detail: If true, include additional details (SLXs, alerts, spec). Defaults to false.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The workspace details.\n\nRaises:\n HTTPException: 404 if workspace not found or user has no access.","operationId":"get_workspace_api_v3_workspaces__workspace_short_name__get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"detail","in":"query","required":false,"schema":{"type":"boolean","description":"If true, load SLXs and firing alerts. Default false: fast metadata-only response.","default":false,"title":"Detail"},"description":"If true, load SLXs and firing alerts. Default false: fast metadata-only response."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/provisioning-status/{workspace_name}":{"get":{"tags":["workspaces"],"summary":"Get workspace provisioning progress","description":"Get workspace provisioning progress without requiring a DB workspace record.\n\nNon-detail endpoint — bypasses workspace permission checks.\nOnly requires authentication. Returns boolean stage flags and sync status.\nUsed by the UI wizard to poll until all provisioning stages complete.\n\nCRD-less mode: workspace creation is synchronous — all stages are\ncomplete if the workspace exists in the database.","operationId":"provisioning_status_api_v3_workspaces_provisioning_status__workspace_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ProvisioningStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}":{"patch":{"tags":["workspaces"],"summary":"Update a workspace","description":"Update a workspace (partial update).\n\nAccepts workspace name (slug) as the path parameter. All body fields are\noptional; only non-None values are applied.\n\nSupports updating: alias, description, scrubber_config, enabled_locations,\nconfig_provided, permissions (full replacement), slx_groups, slx_relationships.\n\nRequires admin permission on the workspace.\n\nArgs:\n workspace_name: The workspace short name (slug, e.g. 'my-workspace').\n data: The workspace update data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The updated workspace (detail view with spec populated).\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 403 if user lacks admin permission.","operationId":"update_workspace_api_v3_workspaces__workspace_name__patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["workspaces"],"summary":"Delete a workspace","description":"Delete a workspace with full multi-system cleanup.\n\nPhase 1 (sync): Vault secrets, Slack, K8s CRDs, git repo, DB + tombstone.\nPhase 2 (async): Sobow, USearch, GCS files, email notification.\n\nReturns step-by-step status for each cleanup operation.\nRequires admin permission on the workspace.","operationId":"delete_workspace_api_v3_workspaces__workspace_name__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceDeletionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/workspace-configuration-index":{"get":{"tags":["workspaces"],"summary":"Get workspace configuration index","description":"Get the workspace configuration index from sobow.\n\nThe configuration index contains cached workspace data including:\n- SLX metadata and task information\n- Entity index (Kubernetes resources, cloud resources, etc.)\n- Workspace relationships and hierarchies\n\nThis endpoint proxies to the sobow service which owns the canonical\nworkspace configuration index cached in Redis.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n sobow: Sobow client for fetching configuration.\n\nReturns:\n The workspace configuration index as a dictionary.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 503 if sobow service is unavailable.","operationId":"get_workspace_configuration_index_api_v3_workspaces__workspace_name__workspace_configuration_index_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Configuration Index Api V3 Workspaces Workspace Name Workspace Configuration Index Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/metadata":{"get":{"tags":["workspaces"],"summary":"Get workspace metadata from sobow","description":"Get workspace metadata from sobow service.\n\nReturns metadata about the workspace including index status,\ntask counts, and other operational information.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n sobow: Sobow client for fetching metadata.\n\nReturns:\n The workspace metadata as a dictionary, or None if not available.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 503 if sobow service is unavailable.","operationId":"get_workspace_metadata_api_v3_workspaces__workspace_name__metadata_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Response Get Workspace Metadata Api V3 Workspaces Workspace Name Metadata Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/entities":{"get":{"tags":["workspaces"],"summary":"Get workspace entities","description":"Get entities (Kubernetes resources, cloud resources, etc.) for a workspace.\n\nEntities are extracted from the workspace configuration and represent\nthe discoverable resources that can be referenced in tasks.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n sobow: Sobow client for fetching entities.\n\nReturns:\n Dictionary containing workspace entities organized by type.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 503 if sobow service is unavailable.","operationId":"get_workspace_entities_api_v3_workspaces__workspace_name__entities_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Entities Api V3 Workspaces Workspace Name Entities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/index-health":{"get":{"tags":["workspaces"],"summary":"Get workspace index health","description":"Get the health status of the workspace task index.\n\nReturns information about the index's current state, including\nlast update time, task counts, and any indexing errors.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n sobow: Sobow client for fetching health status.\n\nReturns:\n Dictionary containing index health information.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 503 if sobow service is unavailable.","operationId":"get_workspace_index_health_api_v3_workspaces__workspace_name__index_health_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Index Health Api V3 Workspaces Workspace Name Index Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/status":{"get":{"tags":["workspaces"],"summary":"Get workspace creation status","description":"Get the status of a workspace creation.\n\nThis endpoint is used to poll for workspace creation completion.\nIt checks:\n1. Whether the workspace exists in the database\n2. Whether the WorkSync has successfully reconciled\n\nArgs:\n workspace_name: The workspace name.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n WorkspaceStatusResponse with workspace and sync booleans.","operationId":"get_workspace_status_api_v3_workspaces__workspace_name__status_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/my-permissions":{"get":{"tags":["workspaces"],"summary":"Get current user's permissions on workspace","description":"Get the current user's permissions (roles) on a workspace.\n\nReturns a list of role strings the user has on this workspace.\nThis matches the Django implementation which returns a set of roles.","operationId":"get_my_permissions_api_v3_workspaces__workspace_name__my_permissions_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Get My Permissions Api V3 Workspaces Workspace Name My Permissions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/sync-status":{"get":{"tags":["workspaces"],"summary":"Get workspace sync status from WorkSync CRD","description":"Get the sync status for a workspace from the WorkSync Kubernetes CRD.\n\nReturns information about the workspace's GitOps sync status including\nconditions, last applied revision, and related Kubernetes events.\n\nArgs:\n workspace_name: The workspace name (not ID).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Dictionary containing WorkSync status and events.\n\nRaises:\n HTTPException: 404 if workspace not found or no WorkSync CRD exists.","operationId":"get_workspace_sync_status_api_v3_workspaces__workspace_name__sync_status_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Sync Status Api V3 Workspaces Workspace Name Sync Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/secrets-keys":{"get":{"tags":["workspaces"],"summary":"List workspace secret keys","description":"Get list of secret key names for a workspace.\n\nReturns only the key names, not the secret values.\nRequires read access to the workspace.","operationId":"get_workspace_secret_keys_api_v3_workspaces__workspace_name__secrets_keys_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretsKeysResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/secrets":{"post":{"tags":["workspaces"],"summary":"Create or update workspace secrets","description":"Create or update workspace secrets in Vault.\n\nRequires admin access to the workspace.","operationId":"create_workspace_secrets_api_v3_workspaces__workspace_name__secrets_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretsCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretsCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/secrets/{secret_key}":{"delete":{"tags":["workspaces"],"summary":"Delete a single workspace secret","description":"Permanently delete a single workspace secret by key.\n\nRequires admin access to the workspace. Mirrors Django's\n``WorkspaceViewSet.delete_workspace_secret``.","operationId":"delete_workspace_secret_api_v3_workspaces__workspace_name__secrets__secret_key__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"secret_key","in":"path","required":true,"schema":{"type":"string","title":"Secret Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/secrets/{secret_key}/usage":{"get":{"tags":["workspaces"],"summary":"List where a workspace secret is used","description":"Return the SLIs and Runbooks that reference this workspace secret.\n\nUsed by the UI to warn before deleting a secret that is still in use.\nRequires read access to the workspace. Mirrors Django's\n``WorkspaceViewSet.get_secret_usage``.","operationId":"get_workspace_secret_usage_api_v3_workspaces__workspace_name__secrets__secret_key__usage_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"secret_key","in":"path","required":true,"schema":{"type":"string","title":"Secret Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/reset-service-account":{"post":{"tags":["workspaces"],"summary":"Reset or create workspace service account","description":"Reset or create the service account for a workspace.\n\nIf a service account exists for this workspace, updates its password.\nIf no service account exists, creates a new one.\n\nAlso writes the credentials to Vault for use by SLI/Runbook containers.\n\nRequires admin access to the workspace.","operationId":"reset_workspace_service_account_api_v3_workspaces__workspace_name__reset_service_account_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetServiceAccountRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetServiceAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/sa-token":{"get":{"tags":["workspaces"],"summary":"Get workspace service account token","description":"Get the workspace service account token.\n\nTrades an existing valid token for a workspace service account token.\nThis is used by runners and SLI containers to authenticate with PAPI.\n\nValid tokenTypes:\n- LOCATION_WORKSPACE_SA_TOKEN: Token from location namespace","operationId":"get_workspace_sa_token_api_v3_workspaces__workspace_name__sa_token_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"Token to trade for SA token","title":"Token"},"description":"Token to trade for SA token"},{"name":"tokenType","in":"query","required":true,"schema":{"type":"string","description":"Type of token being traded","title":"Tokentype"},"description":"Type of token being traded"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SATokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/get-gitlab-sas":{"get":{"tags":["workspaces"],"summary":"Get GitLab service accounts for workspace","description":"Get GitLab service accounts for the workspace repository.\n\nReturns service accounts filtered by the user's access level:\n- Admin/readwrite users get both read and write service accounts\n- Read-only users get only read service accounts\n\nReturns empty list for non-GitLab (e.g. Gitea) environments.","operationId":"get_gitlab_service_accounts_api_v3_workspaces__workspace_name__get_gitlab_sas_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Gitlab Service Accounts Api V3 Workspaces Workspace Name Get Gitlab Sas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/task-search":{"post":{"tags":["workspaces"],"summary":"Search workspace tasks","description":"Search for tasks in a workspace.\n\nSupports scoping to specific SLXs and persona-based query interpretation.","operationId":"search_workspace_tasks_api_v3_workspaces__workspace_name__task_search_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskSearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Workspace Tasks Api V3 Workspaces Workspace Name Task Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/autocomplete":{"post":{"tags":["workspaces"],"summary":"Autocomplete for task search","description":"Get autocomplete suggestions for task search.","operationId":"autocomplete_workspace_search_api_v3_workspaces__workspace_name__autocomplete_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutocompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Autocomplete Workspace Search Api V3 Workspaces Workspace Name Autocomplete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runners":{"get":{"tags":["workspaces"],"summary":"Get runners","description":"Returns runners registered for this workspace.","operationId":"get_runners_api_v3_workspaces__workspace_name__runners_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuthorizedRunner"},"title":"Response Get Runners Api V3 Workspaces Workspace Name Runners Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/generate-workspace-builder-config":{"get":{"tags":["workspaces"],"summary":"[DEPRECATED] Generate workspace builder config","description":"Deprecated: use GET /{workspace_name}/upload-config instead. Returns 410 Gone.","operationId":"generate_workspace_builder_config_api_v3_workspaces__workspace_name__generate_workspace_builder_config_get","deprecated":true,"parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/search-scope":{"get":{"tags":["workspaces"],"summary":"Get search scope options","description":"Return search scope options for the workspace.\n\nReturns SLX groups, subgroups, and individual SLXs with firing alert status.\nUsed by the workspace chat page to build the scope selector.","operationId":"get_search_scope_api_v3_workspaces__workspace_name__search_scope_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchScopeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/upload-config":{"get":{"tags":["workspaces"],"summary":"Generate upload config for a location","description":"Returns an SA-scoped uploadConfig for the given workspace and location. Works for both private and public locations — no runner registration required.","operationId":"get_upload_config_api_v3_workspaces__workspace_name__upload_config_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"location","in":"query","required":true,"schema":{"type":"string","description":"Location name","title":"Location"},"description":"Location name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Upload Config Api V3 Workspaces Workspace Name Upload Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/internal/upload-config":{"get":{"tags":["workspaces","internal"],"summary":"Generate upload config (internal)","description":"Generate upload credentials for runner-control.\n\nReturns a short-lived SA token and the public PAPI URL so runner-control\ncan assemble a complete ``uploadInfo`` for workspace-builder.\n\n**Network isolation:** This endpoint MUST be blocked from external access\nvia an ingress deny rule on ``/*/internal/*`` (same pattern as ``/metrics``).\nRunner-control reaches PAPI through the cluster-internal Service URL, which\nbypasses ingress. The ``RW-Runner-Token`` header is required as a secondary\nguard but is not cryptographically validated by PAPI — runner-control already\nvalidated the token before making this call.\n\n**Why require a non-empty header at all?** Largely a lightweight handshake so\nthe caller is clearly runner-control (or anything that holds the runner token),\nnot arbitrary cluster traffic. It does not strengthen auth on the PAPI side.\n\n**Future consideration:** If this endpoint remains strictly internal-only and\nPAPI never gains cryptographic validation of the runner token, the header could\nbe removed entirely — it would not change the trust model on PAPI (isolation\nis ClusterIP + ingress deny). Doing so would require a coordinated change with\nrunner-control and regression testing; we keep the header until then to avoid\nchurn on a path that already works.","operationId":"get_internal_upload_config_api_v3_workspaces__workspace_name__internal_upload_config_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"RW-Runner-Token","in":"header","required":true,"schema":{"type":"string","title":"Rw-Runner-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runner-token":{"get":{"tags":["workspaces"],"summary":"Get runner registration token","description":"Get a runner registration token for a workspace.\n\nRequires admin permission on the workspace.\nCalls the internal runner service to generate a token.\n\nArgs:\n workspace_name: The workspace name.\n location: The location name for the runner.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The runner token response from the runner service.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 403 if user lacks admin permission.\n HTTPException: 422 if location not provided.\n HTTPException: 503 if runner service unavailable.","operationId":"get_runner_token_api_v3_workspaces__workspace_name__runner_token_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"location","in":"query","required":true,"schema":{"type":"string","description":"Location name for the runner","title":"Location"},"description":"Location name for the runner"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Runner Token Api V3 Workspaces Workspace Name Runner Token Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/anonymous-mode":{"get":{"tags":["workspaces"],"summary":"Get anonymous mode status","description":"Check whether anonymous mode is enabled for a workspace.\n\nAccess: Staff or workspace admin.","operationId":"get_anonymous_mode_status_api_v3_workspaces__workspace_name__anonymous_mode_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousModeStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["workspaces"],"summary":"Toggle anonymous mode","description":"Enable or disable anonymous mode for a workspace.\n\nAccess: Staff or workspace admin.","operationId":"toggle_anonymous_mode_api_v3_workspaces__workspace_name__anonymous_mode_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousModeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousModeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/workspace-stats":{"get":{"tags":["workspaces"],"summary":"Get workspace statistics","description":"Get pre-aggregated workspace statistics for the chat page subtitle.\n\nReturns alias, assistantCount, tasksCount24h, resourceTypeCounts, issuesCount24h.","operationId":"workspace_stats_api_v3_workspaces__workspace_short_name__workspace_stats_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Workspace Stats Api V3 Workspaces Workspace Short Name Workspace Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/top-issue-resources":{"get":{"tags":["workspaces"],"summary":"Get top resources by issue count","description":"Get top resources with most issues in a configurable time window.\n\nReturns resources grouped by SLX hierarchy with issue counts,\nfor ticker display on the workspace chat page.","operationId":"top_issue_resources_api_v3_workspaces__workspace_short_name__top_issue_resources_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"description":"Lookback window in hours","default":1,"title":"Hours"},"description":"Lookback window in hours"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Max resources to return","default":5,"title":"Limit"},"description":"Max resources to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Top Issue Resources Api V3 Workspaces Workspace Short Name Top Issue Resources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/agentfarm-params":{"get":{"tags":["workspaces"],"summary":"Get AgentFarm parameters for a workspace","description":"Get parameters for AgentFarm including LLM config, org, user perms, and repo info.\n\nAlso serves to authenticate the user/workspace combination for AgentFarm.","operationId":"agentfarm_params_api_v3_workspaces__workspace_name__agentfarm_params_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"llm_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"LLM category: DEFAULT, CHAT, BACKGROUND, EMBEDDING","title":"Llm Category"},"description":"LLM category: DEFAULT, CHAT, BACKGROUND, EMBEDDING"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agentfarm Params Api V3 Workspaces Workspace Name Agentfarm Params Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/activities":{"get":{"tags":["workspaces"],"summary":"Get workspace activity feed","description":"Proxy workspace activities from the activities service.\n\nDjango parity: WorkspaceViewSet.get_activities proxies to the activities\nservice via activityutils.fetch_workspace_activities().","operationId":"get_workspace_activities_api_v3_workspaces__workspace_name__activities_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Workspace Activities Api V3 Workspaces Workspace Name Activities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runners/{runner_id}":{"delete":{"tags":["workspaces","workspaces"],"summary":"Delete a runner","description":"Delete a runner from the database.\n\nValidates that the runner belongs to the specified workspace,\ndeletes the runner record, and revokes associated upload PATs.","operationId":"delete_runner_api_v3_workspaces__workspace_name__runners__runner_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"runner_id","in":"path","required":true,"schema":{"type":"string","title":"Runner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Runner Api V3 Workspaces Workspace Name Runners Runner Id Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/layout":{"get":{"tags":["workspaces"],"summary":"Get workspace layout","description":"Returns the workspace layout JSON (or alt_layout when ?alt_layout=true).","operationId":"get_workspace_layout_api_v3_workspaces__workspace_name__layout_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"alt_layout","in":"query","required":false,"schema":{"type":"boolean","description":"Return alt_layout instead of layout","default":false,"title":"Alt Layout"},"description":"Return alt_layout instead of layout"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Workspace Layout Api V3 Workspaces Workspace Name Layout Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["workspaces"],"summary":"Save workspace layout","description":"Saves an arbitrary JSON body as the workspace layout (or alt_layout when ?alt_layout=true).","operationId":"save_workspace_layout_api_v3_workspaces__workspace_name__layout_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"alt_layout","in":"query","required":false,"schema":{"type":"boolean","description":"Save to alt_layout instead of layout","default":false,"title":"Alt Layout"},"description":"Save to alt_layout instead of layout"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Save Workspace Layout Api V3 Workspaces Workspace Name Layout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/reprovision-workspace-infra":{"post":{"tags":["workspaces"],"summary":"Reprovision workspace runner infrastructure (staff only)","description":"Re-run workspace-level runner infrastructure provisioning.\n\nCreates or re-creates the Vault AppRole and cert-manager Certificates for\na workspace. Idempotent — safe to call on already-provisioned workspaces.\nReturns per-subsystem status regardless of partial failure (HTTP 200).\n\nAccess: Staff only.","operationId":"reprovision_workspace_infra_api_v3_workspaces__workspace_name__reprovision_workspace_infra_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReprovisionWorkspaceInfraResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/personas":{"get":{"tags":["personas"],"summary":"List personas for a workspace","description":"List all personas for a workspace.\n\nArgs:\n request: The HTTP request.\n workspace_short_name: The short name of the workspace.\n limit: Maximum number of results to return.\n offset: Number of results to skip.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Paginated list of personas.\n\nRaises:\n HTTPException: 404 if workspace not found.","operationId":"list_personas_api_v3_workspaces__workspace_short_name__personas_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/personas/{persona_short_name}":{"get":{"tags":["personas"],"summary":"Get a persona by short name","description":"Get a persona by its short name.\n\nArgs:\n workspace_short_name: The short name of the workspace.\n persona_short_name: The short name of the persona.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The persona details.\n\nRaises:\n HTTPException: 404 if workspace or persona not found.","operationId":"get_persona_api_v3_workspaces__workspace_short_name__personas__persona_short_name__get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"persona_short_name","in":"path","required":true,"schema":{"type":"string","title":"Persona Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/workflows":{"get":{"tags":["workflows"],"summary":"List workflows for a workspace","description":"List all workflows for a workspace.\n\nArgs:\n request: The HTTP request.\n workspace_short_name: The short name of the workspace.\n limit: Maximum number of results to return.\n offset: Number of results to skip.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Paginated list of workflows.\n\nRaises:\n HTTPException: 404 if workspace not found.","operationId":"list_workflows_api_v3_workspaces__workspace_short_name__workflows_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/workflows/{workflow_short_name}":{"get":{"tags":["workflows"],"summary":"Get a workflow by short name","description":"Get a workflow by its short name.\n\nArgs:\n workspace_short_name: The short name of the workspace.\n workflow_short_name: The short name of the workflow.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The workflow details.\n\nRaises:\n HTTPException: 404 if workspace or workflow not found.","operationId":"get_workflow_api_v3_workspaces__workspace_short_name__workflows__workflow_short_name__get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"workflow_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workflow Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/workflows/{workflow_short_name}/webhook-url":{"get":{"tags":["workflows"],"summary":"Get workflow webhook URL","description":"Get the webhook URL for a workflow.\n\nArgs:\n workspace_short_name: The workspace name.\n workflow_short_name: The workflow short name.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Webhook URL.","operationId":"get_workflow_webhook_url_api_v3_workspaces__workspace_short_name__workflows__workflow_short_name__webhook_url_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"workflow_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workflow Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/workflows/{workflow_short_name}/token":{"get":{"tags":["workflows"],"summary":"Get workflow webhook token (admin only)","description":"Get the webhook token for a workflow.\n\nThis endpoint can only be called once. After the token is retrieved,\nyou must rotate it to get a new one.\n\nArgs:\n workspace_short_name: The workspace name.\n workflow_short_name: The workflow short name.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Webhook URL and token.","operationId":"get_workflow_token_api_v3_workspaces__workspace_short_name__workflows__workflow_short_name__token_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"workflow_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workflow Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/workflows/{workflow_short_name}/rotate-token":{"patch":{"tags":["workflows"],"summary":"Rotate workflow webhook token (admin only)","description":"Rotate the webhook token for a workflow.\n\nThis triggers regeneration of the webhook token.\n\nArgs:\n workspace_short_name: The workspace name.\n workflow_short_name: The workflow short name.\n session: Database session.\n current_user: The authenticated user.","operationId":"rotate_workflow_token_api_v3_workspaces__workspace_short_name__workflows__workflow_short_name__rotate_token_patch","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"workflow_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workflow Short Name"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/workflows/{workflow_short_name}/run":{"post":{"tags":["workflows"],"summary":"Run a workflow","description":"Run a workflow by sending a webhook event.\n\nArgs:\n workspace_short_name: The workspace name.\n workflow_short_name: The workflow short name.\n request: The HTTP request containing run parameters.\n session: Database session.\n current_user: The authenticated user.","operationId":"run_workflow_api_v3_workspaces__workspace_short_name__workflows__workflow_short_name__run_post","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"workflow_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workflow Short Name"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/runsessions/{runsession_id}/comments":{"get":{"tags":["comments"],"summary":"List comments for a run session","description":"List all top-level comments for a run session with their replies.","operationId":"list_runsession_comments_api_v3_workspaces__workspace_short_name__runsessions__runsession_id__comments_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CommentResponse"},"title":"Response List Runsession Comments Api V3 Workspaces Workspace Short Name Runsessions Runsession Id Comments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/issues/{issue_id}/comments":{"get":{"tags":["comments"],"summary":"List comments for an issue","description":"List all top-level comments for an issue with their replies.\n\nArgs:\n workspace_short_name: The workspace short name.\n issue_id: The issue ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of top-level comments with nested replies.","operationId":"list_issue_comments_api_v3_workspaces__workspace_short_name__issues__issue_id__comments_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CommentResponse"},"title":"Response List Issue Comments Api V3 Workspaces Workspace Short Name Issues Issue Id Comments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["comments"],"summary":"Create a comment on an issue","description":"Create a new top-level comment on an issue.\n\nArgs:\n workspace_short_name: The workspace short name.\n issue_id: The issue ID.\n comment_data: The comment creation data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The created comment.","operationId":"create_issue_comment_api_v3_workspaces__workspace_short_name__issues__issue_id__comments_post","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/runsessions/{runsession_id}/issueoccurrences/{issue_id}/comments":{"get":{"tags":["comments"],"summary":"List comments for an issue occurrence (alias)","description":"List comments for an issue via the occurrence URL pattern.\n\nThe frontend constructs this URL when viewing issue comments within\na run session context. Delegates to the same issue comment lookup.","operationId":"list_issue_occurrence_comments_api_v3_workspaces__workspace_short_name__runsessions__runsession_id__issueoccurrences__issue_id__comments_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CommentResponse"},"title":"Response List Issue Occurrence Comments Api V3 Workspaces Workspace Short Name Runsessions Runsession Id Issueoccurrences Issue Id Comments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/issues/{issue_id}/comments/{comment_id}/replies":{"post":{"tags":["comments"],"summary":"Reply to a comment","description":"Create a reply to an existing comment.\n\nArgs:\n workspace_short_name: The workspace short name.\n issue_id: The issue ID.\n comment_id: The parent comment ID to reply to.\n reply_data: The reply creation data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The created reply comment.\n\nRaises:\n HTTPException: 404 if parent comment not found.","operationId":"create_issue_comment_reply_api_v3_workspaces__workspace_short_name__issues__issue_id__comments__comment_id__replies_post","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentReplyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/issues/{issue_id}/comments/{comment_id}":{"patch":{"tags":["comments"],"summary":"Update a comment","description":"Update an existing comment's content.\n\nArgs:\n workspace_short_name: The workspace short name.\n issue_id: The issue ID.\n comment_id: The comment ID to update.\n comment_data: The comment update data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The updated comment.\n\nRaises:\n HTTPException: 404 if comment not found.","operationId":"update_issue_comment_api_v3_workspaces__workspace_short_name__issues__issue_id__comments__comment_id__patch","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/codecollections":{"get":{"tags":["codecollections"],"summary":"List all code collections","description":"List all code collections, ordered by id descending.\n\nReturns a paginated response matching Django's DRF format:\n``{count, next, previous, results: [...]}``.\n\nMatches Django's CodeCollectionViewSet.list() which filters out\nnon-public collections. Since FastAPI normalized model doesn't store\nthe public flag, all collections are returned (corestate only syncs\npublic collections by default).","operationId":"list_code_collections_api_v3_codecollections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Code Collections Api V3 Codecollections Get"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/codecollections/{name}/tmp":{"get":{"tags":["codecollections"],"summary":"Get codecollection detail with codebundles","description":"Get detailed codecollection info including parsed codebundles.\n\nClones the codecollection git repo (shallow), walks the codebundles/\ndirectory, parses .robot files, and returns structured codebundle\nmetadata. Mirrors Django ``CodeCollectionViewSet.get_detail()``.\n\nThe full unfiltered response is cached in Redis under\n``cc:detail:{name}`` for ``_CC_DETAIL_CACHE_TTL`` seconds. ``rfns`` is\napplied AFTER the cache lookup so SLI and runbook callers share the\nsame cache entry. Cache is best-effort: any Redis error falls through\nto a fresh git clone.\n\nThe ``reconcile_single_code_collection`` taskiq job pre-warms this\ncache after each reconcile tick, so first-user latency is only paid\nfor collections added between cron ticks.","operationId":"get_codecollection_detail_api_v3_codecollections__name__tmp_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"rfns","in":"query","required":false,"schema":{"anyOf":[{"enum":["sli","runbook"],"type":"string"},{"type":"null"}],"description":"Restrict returned codeBundles to this kind.","title":"Rfns"},"description":"Restrict returned codeBundles to this kind."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Codecollection Detail Api V3 Codecollections Name Tmp Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/codecollections/{name}":{"get":{"tags":["codecollections"],"summary":"Get a code collection by name","description":"Get a single code collection by name.\n\nMatches Django's CodeCollectionViewSet.retrieve() with lookup_field='name'.","operationId":"get_code_collection_api_v3_codecollections__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeCollectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/parsecodebundle":{"get":{"tags":["codebundles"],"summary":"Parse Codebundle","description":"Parse a code bundle and return its tasks, config schema, and metadata.\n\nUsed by the corestate runbook controller to populate\n``status.codeBundle.tasks`` on Runbook CRDs.","operationId":"parse_codebundle_api_v3_parsecodebundle_get","parameters":[{"name":"repoUrl","in":"query","required":true,"schema":{"type":"string","title":"Repourl"}},{"name":"ref","in":"query","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"pathToRobot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pathtorobot"}},{"name":"pathToYaml","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pathtoyaml"}},{"name":"pathInRepo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pathinrepo"}},{"name":"obo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Obo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Parse Codebundle Api V3 Parsecodebundle Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions":{"get":{"tags":["run-sessions"],"summary":"List run sessions for a workspace","description":"List run sessions for a workspace by name.\n\nArgs:\n workspace_name: The workspace short name.\n page: Page number (1-indexed).\n page_size: Number of items per page.\n active: Optional exact-match filter on ``RunSession.active``.\n modified__gte: Inclusive lower bound on ``modified_at``.\n modified__lte: Inclusive upper bound on ``modified_at``.\n created__gte: Inclusive lower bound on ``created_at``.\n created__lte: Inclusive upper bound on ``created_at``.\n runrequest__runbook__name: Filter by a single SLX full name\n (e.g. ``workspace--short-name``).\n runrequest__runbook__name__in: Filter by multiple SLX full names,\n comma-separated (e.g. ``ws--slx-a,ws--slx-b``). Ignored when\n ``runrequest__runbook__name`` is provided (single-name takes\n precedence).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Paginated list of run sessions.\n\nRaises:\n HTTPException: 400 if any unsupported query parameter is sent.\n HTTPException: 404 if workspace not found.","operationId":"list_workspace_run_sessions_api_v3_workspaces__workspace_name__runsessions_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page-size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page","default":100,"title":"Page-Size"},"description":"Items per page"},{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"If set, filter to sessions whose ``active`` column matches this value (``true`` for active, ``false`` for inactive). Omit to return both.","title":"Active"},"description":"If set, filter to sessions whose ``active`` column matches this value (``true`` for active, ``false`` for inactive). Omit to return both."},{"name":"modified__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to sessions with modified_at >= this ISO-8601 datetime. Must include a timezone offset (e.g. ``...+00:00`` or ``...Z``); naive datetimes are rejected to avoid ambiguity against the tz-aware column.","title":"Modified Gte"},"description":"Filter to sessions with modified_at >= this ISO-8601 datetime. Must include a timezone offset (e.g. ``...+00:00`` or ``...Z``); naive datetimes are rejected to avoid ambiguity against the tz-aware column."},{"name":"modified__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to sessions with modified_at <= this ISO-8601 datetime. Must include a timezone offset.","title":"Modified Lte"},"description":"Filter to sessions with modified_at <= this ISO-8601 datetime. Must include a timezone offset."},{"name":"created__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to sessions with created_at >= this ISO-8601 datetime. Must include a timezone offset.","title":"Created Gte"},"description":"Filter to sessions with created_at >= this ISO-8601 datetime. Must include a timezone offset."},{"name":"created__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to sessions with created_at <= this ISO-8601 datetime. Must include a timezone offset.","title":"Created Lte"},"description":"Filter to sessions with created_at <= this ISO-8601 datetime. Must include a timezone offset."},{"name":"runrequest__runbook__name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by SLX/runbook full name (e.g. workspace--short-name). Returns only sessions with at least one RunRequest for this SLX.","title":"Runrequest Runbook Name"},"description":"Filter by SLX/runbook full name (e.g. workspace--short-name). Returns only sessions with at least one RunRequest for this SLX."},{"name":"runrequest__runbook__name__in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by multiple SLX/runbook full names (comma-separated). Returns sessions with at least one RunRequest matching any name.","title":"Runrequest Runbook Name In"},"description":"Filter by multiple SLX/runbook full names (comma-separated). Returns sessions with at least one RunRequest matching any name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["run-sessions"],"summary":"Create a run session with run requests","description":"Create a new run session with run requests atomically.\n\nThis endpoint creates a RunSession and associated RunRequests in a single\natomic transaction. It supports deduplication to merge requests into\nexisting sessions based on the source type.\n\n**Deduplication behavior by source:**\n- `direct`: No deduplication - always creates a new session\n- `search`: No deduplication - always creates a new session\n- `slo_alert`: Deduplication enabled (10m window by default)\n- `sli_alert`: Deduplication enabled (10m window by default)\n- `webhook`: Deduplication enabled (10m window by default)\n\n**Status codes:**\n- 201: New session created\n- 200: Merged into existing session (via deduplication)\n- 422: Validation errors (all errors returned)\n\nArgs:\n workspace_name: The workspace short name.\n data: The run session creation request with run requests.\n response: FastAPI response object for setting status code.\n db_session: Database session.\n current_user: The authenticated user.\n\nReturns:\n RunSessionCreateResponse with the session and created flag.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 422 if run request validation fails.","operationId":"create_runsession_with_requests_api_v3_workspaces__workspace_name__runsessions_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionCreateWithRequests"}}}},"responses":{"200":{"description":"Merged into existing session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"201":{"description":"New session created"},"422":{"description":"Validation errors in run requests"}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/search":{"post":{"tags":["run-sessions"],"summary":"Search Workspace Run Sessions","description":"Search RunSessions with time-bounded filtering.","operationId":"search_workspace_run_sessions_api_v3_workspaces__workspace_name__runsessions_search_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionSearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/search/sources":{"get":{"tags":["run-sessions"],"summary":"Get Search Sources","description":"Get available source filter values for RunSession search.","operationId":"get_search_sources_api_v3_workspaces__workspace_name__runsessions_search_sources_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/{runsession_id}/alerts":{"get":{"tags":["run-sessions"],"summary":"Get Runsession Alerts","description":"Get alerts routed to a specific RunSession.","operationId":"get_runsession_alerts_api_v3_workspaces__workspace_name__runsessions__runsession_id__alerts_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionAlertsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/{runsession_id}":{"get":{"tags":["run-sessions"],"summary":"Get a run session by ID within a workspace","description":"Get a run session by ID within a workspace.\n\nArgs:\n workspace_name: The workspace short name.\n runsession_id: The run session ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The run session details.\n\nRaises:\n HTTPException: 404 if workspace or session not found.","operationId":"get_workspace_run_session_api_v3_workspaces__workspace_name__runsessions__runsession_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["run-sessions"],"summary":"Update a run session within a workspace","description":"Update a run session within a workspace (partial update).","operationId":"patch_workspace_run_session_api_v3_workspaces__workspace_name__runsessions__runsession_id__patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/{runsession_id}/summary":{"get":{"tags":["run-sessions"],"summary":"Get run session summary from Sobrain","description":"Proxy to Sobrain service for LLM-generated run session summary.","operationId":"get_workspace_run_session_summary_api_v3_workspaces__workspace_name__runsessions__runsession_id__summary_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Run Session Summary Api V3 Workspaces Workspace Name Runsessions Runsession Id Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/{runsession_id}/activities":{"get":{"tags":["run-sessions"],"summary":"Get run session activity timeline","description":"Proxy to Activities service for run session timeline.\n\nReturns paginated response matching Django's DRF PageNumberPagination\nformat: {count, next, previous, results}.","operationId":"get_workspace_run_session_activities_api_v3_workspaces__workspace_name__runsessions__runsession_id__activities_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Run Session Activities Api V3 Workspaces Workspace Name Runsessions Runsession Id Activities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/{runsession_id}/step":{"post":{"tags":["run-sessions"],"summary":"Process the next step in the RunSession workflow","description":"Process the next step in the RunSession workflow.\n\nThis endpoint coordinates several background tasks:\n1. Processes queued RunRequests that are ready to run (if any)\n2. Marks relevant issues as visited\n3. Triggers persona tasks if a persona is attached\n\nArgs:\n workspace_name: The workspace short name.\n runsession_id: The RunSession ID.\n db_session: Database session.\n current_user: The authenticated user.\n\nReturns:\n StepResponse with processing status.\n\nRaises:\n HTTPException: 404 if workspace or session not found.","operationId":"step_runsession_api_v3_workspaces__workspace_name__runsessions__runsession_id__step_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","description":"RunSession ID","title":"Runsession Id"},"description":"RunSession ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/issues":{"get":{"tags":["issues"],"summary":"List issues for a workspace","description":"List issues for a workspace with optional filters.\n\nSupports Django-compatible query parameters for filtering and pagination.","operationId":"list_workspace_issues_api_v3_workspaces__workspace_name__issues_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by severity (1-4 or SEV1-SEV4, repeatable)","title":"Severity"},"description":"Filter by severity (1-4 or SEV1-SEV4, repeatable)"},{"name":"severity__in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by severity (comma-sep, e.g. 1,2,3)","title":"Severity In"},"description":"Filter by severity (comma-sep, e.g. 1,2,3)"},{"name":"severity__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: severity >= value","title":"Severity Gte"},"description":"Filter: severity >= value"},{"name":"severity__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: severity <= value","title":"Severity Lte"},"description":"Filter: severity <= value"},{"name":"closed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by closed status - true for closed, false for open","title":"Closed"},"description":"Filter by closed status - true for closed, false for open"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in title, task_title, and slx_name","title":"Search"},"description":"Search in title, task_title, and slx_name"},{"name":"task_title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact match filter on issue.task_title. Use together with slx_name to narrow to all issues belonging to one task within an SLX without scanning the full SLX issue set on the client.","title":"Task Title"},"description":"Exact match filter on issue.task_title. Use together with slx_name to narrow to all issues belonging to one task within an SLX without scanning the full SLX issue set on the client."},{"name":"latest_occurrence_at__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: latest_occurrence_at >= ISO datetime","title":"Latest Occurrence At Gte"},"description":"Filter: latest_occurrence_at >= ISO datetime"},{"name":"modified__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: modified_at >= ISO datetime","title":"Modified Gte"},"description":"Filter: modified_at >= ISO datetime"},{"name":"modified__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: modified_at <= ISO datetime","title":"Modified Lte"},"description":"Filter: modified_at <= ISO datetime"},{"name":"created__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: created_at >= ISO datetime","title":"Created Gte"},"description":"Filter: created_at >= ISO datetime"},{"name":"created__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: created_at <= ISO datetime","title":"Created Lte"},"description":"Filter: created_at <= ISO datetime"},{"name":"open_since__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: open_since >= ISO datetime","title":"Open Since Gte"},"description":"Filter: open_since >= ISO datetime"},{"name":"open_since__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: open_since <= ISO datetime","title":"Open Since Lte"},"description":"Filter: open_since <= ISO datetime"},{"name":"open_occurrence_count__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: open_occurrence_count >= value","title":"Open Occurrence Count Gte"},"description":"Filter: open_occurrence_count >= value"},{"name":"open_occurrence_count__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: open_occurrence_count <= value","title":"Open Occurrence Count Lte"},"description":"Filter: open_occurrence_count <= value"},{"name":"total_occurrence_count__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: total_occurrence_count >= value","title":"Total Occurrence Count Gte"},"description":"Filter: total_occurrence_count >= value"},{"name":"total_occurrence_count__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: total_occurrence_count <= value","title":"Total Occurrence Count Lte"},"description":"Filter: total_occurrence_count <= value"},{"name":"details","in":"query","required":false,"schema":{"type":"boolean","description":"Include heavy fields from latest occurrence","default":false,"title":"Details"},"description":"Include heavy fields from latest occurrence"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/issues/{issue_id}":{"get":{"tags":["issues"],"summary":"Get an issue by ID","description":"Get an issue by ID within a workspace.\n\nSupports optional occurrence timestamp slicing via query parameters.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n include_occurrence_timestamps: Opt-in for occurrence timestamps.\n occurrence_tail: Return N most recent occurrences.\n occurrence_from: Slice from position (1=latest).\n occurrence_to: Slice to position (1=latest).\n occurrence_window_gte: Filter occurrences observed_at >= this datetime.\n occurrence_window_lte: Filter occurrences observed_at <= this datetime.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The issue details.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"get_workspace_issue_api_v3_workspaces__workspace_name__issues__issue_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}},{"name":"include_occurrence_timestamps","in":"query","required":false,"schema":{"type":"boolean","description":"Include occurrence timestamps","default":false,"title":"Include Occurrence Timestamps"},"description":"Include occurrence timestamps"},{"name":"occurrence_tail","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Return N most recent occurrences","title":"Occurrence Tail"},"description":"Return N most recent occurrences"},{"name":"occurrence_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Slice from (1=latest, inclusive)","title":"Occurrence From"},"description":"Slice from (1=latest, inclusive)"},{"name":"occurrence_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Slice to (1=latest, inclusive)","title":"Occurrence To"},"description":"Slice to (1=latest, inclusive)"},{"name":"occurrence_window_gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Window filter: observed_at >= ISO datetime","title":"Occurrence Window Gte"},"description":"Window filter: observed_at >= ISO datetime"},{"name":"occurrence_window_lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Window filter: observed_at <= ISO datetime","title":"Occurrence Window Lte"},"description":"Window filter: observed_at <= ISO datetime"},{"name":"occurrence_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated occurrence fields to include (e.g. observed_at)","title":"Occurrence Fields"},"description":"Comma-separated occurrence fields to include (e.g. observed_at)"},{"name":"occurrence_order","in":"query","required":false,"schema":{"type":"string","description":"Sort order for occurrences: asc or desc (default desc)","default":"desc","title":"Occurrence Order"},"description":"Sort order for occurrences: asc or desc (default desc)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["issues"],"summary":"Update an issue","description":"Update an issue (partial update).\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n issue_data: The issue update data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The updated issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"update_workspace_issue_api_v3_workspaces__workspace_name__issues__issue_id__patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["issues"],"summary":"Delete an issue","description":"Delete an issue.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n session: Database session.\n current_user: The authenticated user.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"delete_workspace_issue_api_v3_workspaces__workspace_name__issues__issue_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/issues/{issue_id}/ignore":{"patch":{"tags":["issues"],"summary":"Ignore an issue","description":"Ignore an issue.\n\nSets ignored_by_user, ignored_since, and ignored_until.\nAlso resets open_since and open_occurrence_count to close the issue.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n ignore_data: The ignore request data with required ignored_until.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The ignored issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"ignore_workspace_issue_api_v3_workspaces__workspace_name__issues__issue_id__ignore_patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueIgnoreRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/issues/{issue_id}/close":{"patch":{"tags":["issues"],"summary":"Close an issue","description":"Close an issue, optionally with a comment.\n\nSets the issue's closed_at timestamp and resets open_since\nand open_occurrence_count to 0.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n body: Optional request body with a comment.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The closed issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.","operationId":"close_workspace_issue_api_v3_workspaces__workspace_name__issues__issue_id__close_patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IssueCloseRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/issues/{issue_id}/generate-next-steps":{"post":{"tags":["issues"],"summary":"Generate next steps for an issue using AI","description":"Generate intelligent next steps for an issue using sobrain AI service.\n\nThis endpoint calls the sobrain service to generate suggested next steps\nbased on the issue details and optional comment context.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n request_data: Optional request data with comment contents.\n session: Database session.\n current_user: The authenticated user.\n sobrain: Sobrain client for AI features.\n\nReturns:\n Generated next steps for the issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.\n HTTPException: 503 if sobrain service is unavailable.","operationId":"generate_issue_next_steps_api_v3_workspaces__workspace_name__issues__issue_id__generate_next_steps_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GenerateNextStepsRequest"},{"type":"null"}],"title":"Request Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateNextStepsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/issues/{issue_id}/generate-summary":{"post":{"tags":["issues"],"summary":"Generate a summary for an issue using AI","description":"Generate a summary for an issue using sobrain AI service.\n\nArgs:\n workspace_name: The workspace name.\n issue_id: The issue ID.\n session: Database session.\n current_user: The authenticated user.\n sobrain: Sobrain client for AI features.\n\nReturns:\n Generated summary for the issue.\n\nRaises:\n HTTPException: 404 if workspace or issue not found.\n HTTPException: 503 if sobrain service is unavailable.","operationId":"generate_issue_summary_api_v3_workspaces__workspace_name__issues__issue_id__generate_summary_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/{runsession_id}/issues/{issue_id}/jit-summary":{"post":{"tags":["issues"],"summary":"Generate a just-in-time summary for an issue occurrence in a run session","description":"Generate a JIT summary for an issue within a specific run session context.\n\nFinds the latest occurrence of the issue, looks up the RunSessionIssueMap\nentry for the given run session, builds a payload, and calls Sobrain to\ngenerate a summary. Stores the summary in the occurrence's additional_context.","operationId":"jit_summary_api_v3_workspaces__workspace_name__runsessions__runsession_id__issues__issue_id__jit_summary_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JitSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/{runsession_id}/issueoccurrences":{"get":{"tags":["issue-occurrences"],"summary":"List issue occurrences for a run session","description":"List issue occurrences for a specific run session.\n\nGets occurrences through the RunSessionIssueMap table.\n\nArgs:\n workspace_name: The workspace name.\n runsession_id: The run session ID.\n session: Database session.\n current_user: The authenticated user.\n limit: Maximum number of results (default 100, max 250).\n offset: Number of results to skip.\n\nReturns:\n Paginated list of issue occurrences with flattened issue attributes.","operationId":"list_runsession_issue_occurrences_api_v3_workspaces__workspace_name__runsessions__runsession_id__issueoccurrences_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by occurrence ID","title":"Id"},"description":"Filter by occurrence ID"},{"name":"issue_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by issue ID","title":"Issue Id"},"description":"Filter by issue ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueOccurrenceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/issueoccurrences":{"get":{"tags":["issue-occurrences"],"summary":"List issue occurrences for a workspace","description":"List issue occurrences at workspace level with optional date filtering.\n\nUsed by agentfarm to list issue occurrences between two timestamps.\n\nArgs:\n workspace_name: The workspace name.\n session: Database session.\n current_user: The authenticated user.\n observed_at_gte: Filter occurrences observed at or after this time.\n observed_at_lte: Filter occurrences observed at or before this time.\n limit: Maximum number of results (default 100, max 250).\n offset: Number of results to skip.\n\nReturns:\n Paginated list of issue occurrences with workspace-level fields.","operationId":"list_workspace_issue_occurrences_api_v3_workspaces__workspace_name__issueoccurrences_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"observed_at__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter occurrences observed at or after this datetime (ISO 8601)","title":"Observed At Gte"},"description":"Filter occurrences observed at or after this datetime (ISO 8601)"},{"name":"observed_at__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter occurrences observed at or before this datetime (ISO 8601)","title":"Observed At Lte"},"description":"Filter occurrences observed at or before this datetime (ISO 8601)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceIssueOccurrenceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/runsessions/{runsession_id}/issueoccurrences/{occurrence_id}":{"get":{"tags":["issue-occurrences"],"summary":"Get an issue occurrence by ID","description":"Get a specific issue occurrence by ID.\n\nArgs:\n workspace_name: The workspace name.\n runsession_id: The run session ID.\n occurrence_id: The issue occurrence ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The issue occurrence with flattened issue attributes.\n\nRaises:\n HTTPException: 404 if workspace, run session, or occurrence not found.","operationId":"get_runsession_issue_occurrence_api_v3_workspaces__workspace_name__runsessions__runsession_id__issueoccurrences__occurrence_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"runsession_id","in":"path","required":true,"schema":{"type":"integer","title":"Runsession Id"}},{"name":"occurrence_id","in":"path","required":true,"schema":{"type":"integer","title":"Occurrence Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueOccurrenceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/tutorials":{"get":{"tags":["tutorials"],"summary":"List tutorials (deprecated)","description":"Tutorials feature is deprecated. Returns empty list for backwards compatibility.","operationId":"list_workspace_tutorials_api_v3_workspaces__workspace_name__tutorials_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{},"title":"Response List Workspace Tutorials Api V3 Workspaces Workspace Name Tutorials Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/tutorials/{tutorial_name}":{"get":{"tags":["tutorials"],"summary":"Get tutorial (deprecated)","description":"Tutorials feature is deprecated. Returns 404.","operationId":"get_workspace_tutorial_api_v3_workspaces__workspace_name__tutorials__tutorial_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"tutorial_name","in":"path","required":true,"schema":{"type":"string","title":"Tutorial Name"}}],"responses":{"404":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workspace Tutorial Api V3 Workspaces Workspace Name Tutorials Tutorial Name Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/llmconfigs":{"get":{"tags":["llm-config"],"summary":"Get Llm Config","description":"Get LLM configuration.\n\nWhen ``workspace`` is provided, resolution is workspace → org → platform default.\nWhen ``workspace`` is omitted, returns the platform default for ``category`` directly.","operationId":"get_llm_config_api_v3_llmconfigs_get","parameters":[{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace short name; omit to fetch the platform default","title":"Workspace"},"description":"Workspace short name; omit to fetch the platform default"},{"name":"category","in":"query","required":false,"schema":{"type":"string","description":"LLM category","default":"DEFAULT","title":"Category"},"description":"LLM category"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__routers__llm_config__LLMConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/runners":{"get":{"tags":["runners"],"summary":"List all runners","description":"List all runners, ordered by id descending.","operationId":"list_runners_api_v3_runners_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunnerListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/runners/{runner_uuid}":{"get":{"tags":["runners"],"summary":"Get a runner by UUID","description":"Get a single runner by its UUID.","operationId":"get_runner_api_v3_runners__runner_uuid__get","parameters":[{"name":"runner_uuid","in":"path","required":true,"schema":{"type":"string","title":"Runner Uuid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunnerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/sli":{"get":{"tags":["slis"],"summary":"Get the SLI for an SLX","description":"Get the SLI for an SLX.\n\nSLX and SLI have a 1:1 relationship. This endpoint returns the single\nSLI associated with the specified SLX, or 404 if no SLI exists.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n _detail: Django parity query param (ignored).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The SLI details.\n\nRaises:\n HTTPException: 404 if workspace, SLX, or SLI not found.","operationId":"get_slx_sli_api_v3_workspaces__workspace_name__slxs__slx_short_name__sli_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"detail","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Accepted for Django parity; ignored (always returns full detail)","title":"Detail"},"description":"Accepted for Django parity; ignored (always returns full detail)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__sli__SliResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/push-alert-rules":{"post":{"tags":["slis"],"summary":"Push alert rules for all SLIs with alertConfig","description":"Push Prometheus alert rules to the metric store for every SLI in the workspace that has an alertConfig.\n\nBypasses the SHA-based sync deduplication — safe to call even when workspace YAML has not changed.\nUseful for bootstrapping alert rules after a new cluster is stood up or after\nMETRIC_STORE_RULER_URL is first configured.\n\nReturns a summary with counts and any per-SLX errors.","operationId":"push_workspace_alert_rules_api_v3_workspaces__workspace_name__push_alert_rules_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Push Workspace Alert Rules Api V3 Workspaces Workspace Name Push Alert Rules Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/sli/runners":{"get":{"tags":["slis"],"summary":"List runners for an SLI","description":"Get runners and health status for an SLI.\n\nHealth is derived from the freshness of the runner's ``last_heartbeat`` column,\nwhich is updated on every ``POST /runners/status`` from the runner agent. A\nrunner is considered Healthy if its heartbeat is within\n``settings.runner_heartbeat_staleness_seconds`` (default 90s).\n\nNote: the legacy Django implementation (``HasCodeRunLocationsMixin.list_locations``)\nderived health from ``status.runnerLocations[*].status.code`` on the SLI CRD —\na string set by the runner via ``POST /runners/run-status``. In CRD-less the\nrunner no longer reports that code and the JSONB ``runner_status`` blob only\ncontains registration metadata, so we use heartbeat freshness instead.","operationId":"list_sli_runners_api_v3_workspaces__workspace_name__slxs__slx_short_name__sli_runners_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Sli Runners Api V3 Workspaces Workspace Name Slxs Slx Short Name Sli Runners Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/slo":{"get":{"tags":["slos"],"summary":"Get the SLO for an SLX","description":"Get the SLO for an SLX.\n\nSLX and SLO have a 1:1 relationship. This endpoint returns the single\nSLO associated with the specified SLX, or 404 if no SLO exists.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n _detail: Django parity query param (ignored).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The SLO details.\n\nRaises:\n HTTPException: 404 if workspace, SLX, or SLO not found.","operationId":"get_slx_slo_api_v3_workspaces__workspace_name__slxs__slx_short_name__slo_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"detail","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Accepted for Django parity; ignored (always returns full detail)","title":"Detail"},"description":"Accepted for Django parity; ignored (always returns full detail)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__slo__SloResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/slo/objective-recommendation":{"get":{"tags":["slos"],"summary":"Get SLO objective recommendation for an SLX","description":"Calculate a recommended SLO objective for an SLX.\n\nTwo paths:\n- **Has SLO:** Recommends based on the current month's error budget burn rate.\n- **No SLO:** Recommends based on 30 days of historical SLI healthiness data.\n\nMirrors Django's SloViewSet.slo_objective_recommendation().","operationId":"objective_recommendation_api_v3_workspaces__workspace_name__slxs__slx_short_name__slo_objective_recommendation_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"baseline","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PromQL timestring defining the baseline window for the burn-rate calculation (e.g. '2h', '1d'). Defaults to hours elapsed since the 1st of the current month. Only used when an SLO exists. Must not exceed hours since month start.","title":"Baseline"},"description":"PromQL timestring defining the baseline window for the burn-rate calculation (e.g. '2h', '1d'). Defaults to hours elapsed since the 1st of the current month. Only used when an SLO exists. Must not exceed hours since month start."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObjectiveRecommendationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook":{"get":{"tags":["runbooks"],"summary":"Get the Runbook for an SLX","description":"Get the Runbook for an SLX.\n\nSLX and Runbook have a 1:1 relationship. This endpoint returns the single\nRunbook associated with the specified SLX, or 404 if no Runbook exists.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n _detail: Django parity query param (ignored).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The Runbook details.\n\nRaises:\n HTTPException: 404 if workspace, SLX, or Runbook not found.","operationId":"get_slx_runbook_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"detail","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Accepted for Django parity; ignored (always returns full detail)","title":"Detail"},"description":"Accepted for Django parity; ignored (always returns full detail)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__runbook__RunbookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs":{"post":{"tags":["run-requests"],"summary":"Create a new RunRequest","description":"Create a new RunRequest for an SLX.\n\nIf request_time is None, the RunRequest is staged and waits for /start.\nIf request_time is provided (or default now), the RunRequest starts immediately.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n data: The RunRequest creation data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The created RunRequest.\n\nRaises:\n HTTPException: 404 if workspace not found.\n HTTPException: 400 if runsession validation fails.","operationId":"create_run_request_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"get":{"tags":["run-requests"],"summary":"List RunRequests for an SLX","description":"List RunRequests for an SLX.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n limit: Maximum number of results.\n offset: Number of results to skip.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Paginated list of RunRequests.\n\nRaises:\n HTTPException: 404 if workspace not found.","operationId":"list_run_requests_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum results","default":100,"title":"Limit"},"description":"Maximum results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Skip results","default":0,"title":"Offset"},"description":"Skip results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}":{"get":{"tags":["run-requests"],"summary":"Get a RunRequest by ID","description":"Get a RunRequest by its ID.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The RunRequest details.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.","operationId":"get_run_request_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["run-requests"],"summary":"Record a run response","description":"Record results from a completed run.\n\nThis endpoint is called by the runner after task execution completes.\nIt sets response_time and updates the result fields. After recording,\nit enqueues the async issue processing task.\n\nParity with main branch: This matches the behavior of\npapi/views/runrequest.py:RunRequestViewSet.update()\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n data: The response data from the runner.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n The updated RunRequest.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.","operationId":"record_run_response_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestRecordResponse"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["run-requests"],"summary":"Delete a RunRequest","description":"Delete a RunRequest.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.","operationId":"delete_run_request_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/start":{"post":{"tags":["run-requests"],"summary":"Start a staged RunRequest","description":"Start a staged RunRequest by setting its request_time and submitting to TaskSet API.\n\nStaged RunRequests have request_time=None and wait for this endpoint\nto be called before execution begins. This endpoint:\n1. Sets request_time to mark the run as started\n2. Submits the run to the TaskSet API for execution by the runner\n3. Returns the taskset_uuid for tracking\n\nArgs:\n workspace_name: The workspace name (short name from URL).\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Start confirmation with the request_time and taskset_uuid.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.\n HTTPException: 400 if RunRequest is not staged or already started.","operationId":"start_run_request_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__start_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartRunRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/report":{"get":{"tags":["run-requests"],"summary":"Get the report for a RunRequest","description":"Get the report for a completed RunRequest.\n\nReads report.jsonl from the GCS bucket and returns the parsed JSONL\nas a JSON array, matching Django's behavior.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n raw: If set, return raw JSONL array (Django parity).\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n JSON array of report lines (JSONL parsed).\n\nRaises:\n HTTPException: 404 if workspace, RunRequest, or report not found.","operationId":"get_run_request_report_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__report_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}},{"name":"raw","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Return raw JSONL data","title":"Raw"},"description":"Return raw JSONL data"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/issues":{"get":{"tags":["run-requests"],"summary":"Get issues from a RunRequest","description":"Get issues associated with a RunRequest.\n\nIssues are created by parsing the output files after a run completes.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of issues from this RunRequest.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.","operationId":"get_run_request_issues_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__issues_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestIssuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/output":{"get":{"tags":["run-requests"],"summary":"Get parsed output from a RunRequest","description":"Get the parsed output from a completed RunRequest.\n\nThe output is parsed from the robot output XML file.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Parsed output data.\n\nRaises:\n HTTPException: 404 if workspace, RunRequest, or output not found.","operationId":"get_run_request_output_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__output_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/{run_request_id}/runner-status":{"get":{"tags":["run-requests"],"summary":"Get runner status for a RunRequest","description":"Get the runner status for a RunRequest.\n\nThis queries the runner-control service to get the current status\nof the task execution.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Runner status information.\n\nRaises:\n HTTPException: 404 if workspace or RunRequest not found.\n HTTPException: 400 if RunRequest has no taskset_uuid.","operationId":"get_run_request_runner_status_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs__run_request_id__runner_status_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunnerStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/slxs/{slx_short_name}/runbook/runs/staged":{"get":{"tags":["run-requests"],"summary":"List staged RunRequests","description":"List staged (not yet started) RunRequests for an SLX.\n\nStaged RunRequests have request_time=None and are waiting for /start.\n\nArgs:\n workspace_name: The workspace name.\n slx_short_name: The SLX short name.\n limit: Maximum number of results.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n List of staged RunRequests.\n\nRaises:\n HTTPException: 404 if workspace not found.","operationId":"list_staged_run_requests_api_v3_workspaces__workspace_name__slxs__slx_short_name__runbook_runs_staged_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"slx_short_name","in":"path","required":true,"schema":{"type":"string","title":"Slx Short Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Maximum results","default":100,"title":"Limit"},"description":"Maximum results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/run-requests/{run_request_id}/log":{"get":{"tags":["run-requests"],"summary":"Get the robot log for a RunRequest (SLX-agnostic)","description":"Get the robot log.html for a RunRequest without requiring slx_short_name.\n\nLooks up the RunRequest by ID to derive slx_short_name and runsession_id,\nthen reads log.html from workspace storage. Designed for citation-path\ncallers (e.g. TaskOutputDisplay) that only have a runrequest_id.\n\nArgs:\n workspace_name: The workspace name.\n run_request_id: The RunRequest ID.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Raw HTML content of log.html.\n\nRaises:\n HTTPException: 404 if workspace, RunRequest, or log file not found.","operationId":"get_run_request_log_api_v3_workspaces__workspace_name__run_requests__run_request_id__log_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"run_request_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/orgs":{"get":{"tags":["rwsupport"],"summary":"List Orgs","description":"List all organizations ordered by name.","operationId":"list_orgs_api_v3_rwsupport_orgs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OrgResponse"},"type":"array","title":"Response List Orgs Api V3 Rwsupport Orgs Get"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["rwsupport"],"summary":"Create Org","description":"Create a new organization.","operationId":"create_org_api_v3_rwsupport_orgs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/orgs/{org_id}":{"get":{"tags":["rwsupport"],"summary":"Get Org","description":"Get an organization by ID.","operationId":"get_org_api_v3_rwsupport_orgs__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["rwsupport"],"summary":"Update Org","description":"Update an organization.\n\nChanging tenant_type triggers cleanup of associated LLM configs.","operationId":"update_org_api_v3_rwsupport_orgs__org_id__patch","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["rwsupport"],"summary":"Update Org","description":"Update an organization.\n\nChanging tenant_type triggers cleanup of associated LLM configs.","operationId":"update_org_api_v3_rwsupport_orgs__org_id__put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["rwsupport"],"summary":"Delete Org","description":"Delete an organization.","operationId":"delete_org_api_v3_rwsupport_orgs__org_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/orgs/{org_id}/assign-workspaces":{"post":{"tags":["rwsupport"],"summary":"Assign Workspaces","description":"Assign workspaces to an organization.\n\nMay require confirmation if workspace-scoped LLM configs will be deleted.","operationId":"assign_workspaces_api_v3_rwsupport_orgs__org_id__assign_workspaces_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignWorkspacesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Assign Workspaces Api V3 Rwsupport Orgs Org Id Assign Workspaces Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/llm-providers":{"get":{"tags":["rwsupport"],"summary":"List Llm Providers","description":"List LLM providers with optional filtering.","operationId":"list_llm_providers_api_v3_rwsupport_llm_providers_get","parameters":[{"name":"llm_tenant_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Tenant Type"}},{"name":"provider_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Type"}},{"name":"owner_org","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Owner Org"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMProviderResponse"},"title":"Response List Llm Providers Api V3 Rwsupport Llm Providers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["rwsupport"],"summary":"Create Llm Provider","description":"Create an LLM provider with auto-generated vault path.","operationId":"create_llm_provider_api_v3_rwsupport_llm_providers_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMProviderCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMProviderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/llm-providers/{provider_id}":{"get":{"tags":["rwsupport"],"summary":"Get Llm Provider","description":"Get an LLM provider by ID.","operationId":"get_llm_provider_api_v3_rwsupport_llm_providers__provider_id__get","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"integer","title":"Provider Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMProviderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["rwsupport"],"summary":"Update Llm Provider","description":"Update an LLM provider. Name is immutable.","operationId":"update_llm_provider_api_v3_rwsupport_llm_providers__provider_id__patch","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"integer","title":"Provider Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMProviderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMProviderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["rwsupport"],"summary":"Update Llm Provider","description":"Update an LLM provider. Name is immutable.","operationId":"update_llm_provider_api_v3_rwsupport_llm_providers__provider_id__put","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"integer","title":"Provider Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMProviderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMProviderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["rwsupport"],"summary":"Delete Llm Provider","description":"Delete an LLM provider with protection and vault cleanup.","operationId":"delete_llm_provider_api_v3_rwsupport_llm_providers__provider_id__delete","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"integer","title":"Provider Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/llm-models":{"get":{"tags":["rwsupport"],"summary":"List Llm Models","description":"List LLM models with optional provider filter.","operationId":"list_llm_models_api_v3_rwsupport_llm_models_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMModelResponse"},"title":"Response List Llm Models Api V3 Rwsupport Llm Models Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["rwsupport"],"summary":"Create Llm Model","description":"Create an LLM model.","operationId":"create_llm_model_api_v3_rwsupport_llm_models_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMModelCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMModelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/llm-models/{model_id}":{"get":{"tags":["rwsupport"],"summary":"Get Llm Model","description":"Get an LLM model by ID.","operationId":"get_llm_model_api_v3_rwsupport_llm_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"integer","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMModelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["rwsupport"],"summary":"Update Llm Model","description":"Update an LLM model.","operationId":"update_llm_model_api_v3_rwsupport_llm_models__model_id__patch","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"integer","title":"Model Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMModelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMModelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["rwsupport"],"summary":"Update Llm Model","description":"Update an LLM model.","operationId":"update_llm_model_api_v3_rwsupport_llm_models__model_id__put","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"integer","title":"Model Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMModelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMModelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["rwsupport"],"summary":"Delete Llm Model","description":"Delete an LLM model with protection (can't delete if used in configs).","operationId":"delete_llm_model_api_v3_rwsupport_llm_models__model_id__delete","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"integer","title":"Model Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/llm-configs":{"get":{"tags":["rwsupport"],"summary":"List Llm Configs","description":"List LLM configs with optional filtering.","operationId":"list_llm_configs_api_v3_rwsupport_llm_configs_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workspace"}},{"name":"org","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org"}},{"name":"is_platform_default","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Is Platform Default"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMConfigResponse"},"title":"Response List Llm Configs Api V3 Rwsupport Llm Configs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["rwsupport"],"summary":"Create Llm Config","description":"Create an LLM config with scope enforcement.","operationId":"create_llm_config_api_v3_rwsupport_llm_configs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMConfigCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/llm-configs/{config_id}":{"get":{"tags":["rwsupport"],"summary":"Get Llm Config By Id","description":"Get an LLM config by ID.","operationId":"get_llm_config_by_id_api_v3_rwsupport_llm_configs__config_id__get","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["rwsupport"],"summary":"Update Llm Config","description":"Update an LLM config with scope enforcement.","operationId":"update_llm_config_api_v3_rwsupport_llm_configs__config_id__patch","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["rwsupport"],"summary":"Update Llm Config","description":"Update an LLM config with scope enforcement.","operationId":"update_llm_config_api_v3_rwsupport_llm_configs__config_id__put","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/papi__schemas__rwsupport__LLMConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["rwsupport"],"summary":"Delete Llm Config","description":"Delete an LLM config.","operationId":"delete_llm_config_api_v3_rwsupport_llm_configs__config_id__delete","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/llm-configs/bulk-delete":{"delete":{"tags":["rwsupport"],"summary":"Bulk Delete Llm Configs","description":"Bulk delete LLM configs for a workspace.","operationId":"bulk_delete_llm_configs_api_v3_rwsupport_llm_configs_bulk_delete_delete","parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"integer","description":"Workspace ID to delete configs for","title":"Workspace Id"},"description":"Workspace ID to delete configs for"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/prompt-hub/agents/{agent_name}/categories":{"get":{"tags":["rwsupport-prompt-hub"],"summary":"List Categories","operationId":"list_categories_api_v3_rwsupport_prompt_hub_agents__agent_name__categories_get","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Agent Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CategoryResponse"},"title":"Response List Categories Api V3 Rwsupport Prompt Hub Agents Agent Name Categories Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/prompt-hub/agents/{agent_name}/sections":{"get":{"tags":["rwsupport-prompt-hub"],"summary":"List Sections","operationId":"list_sections_api_v3_rwsupport_prompt_hub_agents__agent_name__sections_get","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Agent Name"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"enum":["ui","slack","teams","*"],"type":"string"},{"type":"null"}],"title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResolvedSectionResponse"},"title":"Response List Sections Api V3 Rwsupport Prompt Hub Agents Agent Name Sections Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/prompt-hub/agents/{agent_name}/sections/{section_id}/overrides":{"get":{"tags":["rwsupport-prompt-hub"],"summary":"List Section Overrides","operationId":"list_section_overrides_api_v3_rwsupport_prompt_hub_agents__agent_name__sections__section_id__overrides_get","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Agent Name"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Section Id"}},{"name":"source","in":"query","required":false,"schema":{"enum":["ui","slack","teams","*"],"type":"string","default":"*","title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OverrideRowResponse"},"title":"Response List Section Overrides Api V3 Rwsupport Prompt Hub Agents Agent Name Sections Section Id Overrides Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["rwsupport-prompt-hub"],"summary":"Create Section Override","operationId":"create_section_override_api_v3_rwsupport_prompt_hub_agents__agent_name__sections__section_id__overrides_post","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Agent Name"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Section Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOverrideRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverrideRowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["rwsupport-prompt-hub"],"summary":"Reset Section","description":"Soft-reset the platform-default cell so the runtime falls back to code default.\n\nMirrors the existing platform restore proxy — staff-gated, rate-limited,\naudit-logged. Returns 204 on success.","operationId":"reset_section_api_v3_rwsupport_prompt_hub_agents__agent_name__sections__section_id__overrides_delete","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Agent Name"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Section Id"}},{"name":"source","in":"query","required":true,"schema":{"enum":["ui","slack","teams","*"],"type":"string","title":"Source"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/prompt-hub/agents/{agent_name}/sections/{section_id}/overrides/{override_id}/restore":{"post":{"tags":["rwsupport-prompt-hub"],"summary":"Restore Override","operationId":"restore_override_api_v3_rwsupport_prompt_hub_agents__agent_name__sections__section_id__overrides__override_id__restore_post","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Agent Name"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Section Id"}},{"name":"override_id","in":"path","required":true,"schema":{"type":"integer","title":"Override Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverrideRowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/prompt-hub/agents/{agent_name}/preview":{"get":{"tags":["rwsupport-prompt-hub"],"summary":"Preview","operationId":"preview_api_v3_rwsupport_prompt_hub_agents__agent_name__preview_get","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","title":"Agent Name"}},{"name":"source","in":"query","required":false,"schema":{"enum":["ui","slack","teams","*"],"type":"string","default":"ui","title":"Source"}},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/workspaces/{workspace_name}/recognizers":{"get":{"tags":["rwsupport-scrubhub"],"summary":"List Recognizers","operationId":"list_recognizers_api_v3_rwsupport_scrubhub_workspaces__workspace_name__recognizers_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response List Recognizers Api V3 Rwsupport Scrubhub Workspaces Workspace Name Recognizers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["rwsupport-scrubhub"],"summary":"Create Recognizer","description":"Staff-only proxy. `workspace_name` is the URL primary scope — never\nin the body (matches the platform-wide `{workspace_name}` URL\nconvention; lets logging/anonymization middleware bind cleanly).","operationId":"create_recognizer_api_v3_rwsupport_scrubhub_workspaces__workspace_name__recognizers_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Create Recognizer Api V3 Rwsupport Scrubhub Workspaces Workspace Name Recognizers Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/workspaces/{workspace_name}/recognizers/bulk":{"post":{"tags":["rwsupport-scrubhub"],"summary":"Bulk Create Recognizers","description":"Staff-only thin proxy for bulk recognizer creation (multipart/form-data).\n\n`workspace_name` is in the URL path, NOT a form field. Reads the\nuploaded CSV bytes and forwards them via the SDK to the scrubber\nservice, which parses + validates server-side.","operationId":"bulk_create_recognizers_api_v3_rwsupport_scrubhub_workspaces__workspace_name__recognizers_bulk_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_bulk_create_recognizers_api_v3_rwsupport_scrubhub_workspaces__workspace_name__recognizers_bulk_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Bulk Create Recognizers Api V3 Rwsupport Scrubhub Workspaces Workspace Name Recognizers Bulk Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/workspaces/{workspace_name}/scrub-preview":{"post":{"tags":["rwsupport-scrubhub"],"summary":"Scrub Preview","description":"Staff-only proxy for the ScrubHub Scrub Tester dry-run.\n\nRuns the live detection pipeline for `workspace_name` and returns the\nscrubbed text, a descrub round-trip, and the per-detection detail —\nminting no pseudonyms and writing no audit row. `workspace_name` is the\nURL primary scope; the body carries only `{ \"text\": ... }`.","operationId":"scrub_preview_api_v3_rwsupport_scrubhub_workspaces__workspace_name__scrub_preview_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Scrub Preview Api V3 Rwsupport Scrubhub Workspaces Workspace Name Scrub Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/recognizers/{recognizer_id}":{"patch":{"tags":["rwsupport-scrubhub"],"summary":"Update Recognizer","operationId":"update_recognizer_api_v3_rwsupport_scrubhub_recognizers__recognizer_id__patch","parameters":[{"name":"recognizer_id","in":"path","required":true,"schema":{"type":"string","title":"Recognizer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Update Recognizer Api V3 Rwsupport Scrubhub Recognizers Recognizer Id Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["rwsupport-scrubhub"],"summary":"Delete Recognizer","operationId":"delete_recognizer_api_v3_rwsupport_scrubhub_recognizers__recognizer_id__delete","parameters":[{"name":"recognizer_id","in":"path","required":true,"schema":{"type":"string","title":"Recognizer Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/assignments":{"get":{"tags":["rwsupport-scrubhub"],"summary":"List Assignments","operationId":"list_assignments_api_v3_rwsupport_scrubhub_assignments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response List Assignments Api V3 Rwsupport Scrubhub Assignments Get"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/assignments/{workspace_name}":{"get":{"tags":["rwsupport-scrubhub"],"summary":"Get Assignment","operationId":"get_assignment_api_v3_rwsupport_scrubhub_assignments__workspace_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Assignment Api V3 Rwsupport Scrubhub Assignments Workspace Name Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["rwsupport-scrubhub"],"summary":"Update Assignment","operationId":"update_assignment_api_v3_rwsupport_scrubhub_assignments__workspace_name__put","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Update Assignment Api V3 Rwsupport Scrubhub Assignments Workspace Name Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/assignments/{workspace_name}/reset":{"post":{"tags":["rwsupport-scrubhub"],"summary":"Reset Assignment","operationId":"reset_assignment_api_v3_rwsupport_scrubhub_assignments__workspace_name__reset_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Reset Assignment Api V3 Rwsupport Scrubhub Assignments Workspace Name Reset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/audit/workspaces-summary":{"get":{"tags":["rwsupport-scrubhub"],"summary":"List Audit Workspaces Summary","description":"Section 2 of the mockup — workspace-summary list landing view.","operationId":"list_audit_workspaces_summary_api_v3_rwsupport_scrubhub_audit_workspaces_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response List Audit Workspaces Summary Api V3 Rwsupport Scrubhub Audit Workspaces Summary Get"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/audit/{workspace_id}/summary":{"get":{"tags":["rwsupport-scrubhub"],"summary":"Get Audit Summary","operationId":"get_audit_summary_api_v3_rwsupport_scrubhub_audit__workspace_id__summary_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Audit Summary Api V3 Rwsupport Scrubhub Audit Workspace Id Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/audit/{workspace_id}/sample-rate":{"get":{"tags":["rwsupport-scrubhub"],"summary":"Get Audit Sample Rate","operationId":"get_audit_sample_rate_api_v3_rwsupport_scrubhub_audit__workspace_id__sample_rate_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Audit Sample Rate Api V3 Rwsupport Scrubhub Audit Workspace Id Sample Rate Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["rwsupport-scrubhub"],"summary":"Set Audit Sample Rate","operationId":"set_audit_sample_rate_api_v3_rwsupport_scrubhub_audit__workspace_id__sample_rate_put","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Set Audit Sample Rate Api V3 Rwsupport Scrubhub Audit Workspace Id Sample Rate Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/scrubhub/audit/{workspace_id}":{"get":{"tags":["rwsupport-scrubhub"],"summary":"Query Audit","operationId":"query_audit_api_v3_rwsupport_scrubhub_audit__workspace_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Query Audit Api V3 Rwsupport Scrubhub Audit Workspace Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/workspace-deletion":{"get":{"tags":["rwsupport"],"summary":"List Tombstones","description":"List all workspace tombstones with audit status.\n\nResponse matches Django's WorkspaceDeletionAuditViewSet.list() contract:\ncamelCase keys, includes audit_result, uses 'created' (not 'created_at').","operationId":"list_tombstones_api_v3_rwsupport_workspace_deletion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Tombstones Api V3 Rwsupport Workspace Deletion Get"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/workspace-deletion/audit/{workspace_name}":{"post":{"tags":["rwsupport"],"summary":"Run Audit","description":"Run full deletion audit for a workspace and persist on tombstone.","operationId":"run_audit_api_v3_rwsupport_workspace_deletion_audit__workspace_name__post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/workspace-deletion/audit/{workspace_name}/status":{"get":{"tags":["rwsupport"],"summary":"Get Audit Status","description":"Get the last audit result for a workspace.","operationId":"get_audit_status_api_v3_rwsupport_workspace_deletion_audit__workspace_name__status_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/rwsupport/workspace-deletion/cleanup/{workspace_name}":{"post":{"tags":["rwsupport"],"summary":"Retry Cleanup","description":"Retry failed cleanup steps and re-run audit.\n\nReturns a CleanupResult shape matching the frontend contract:\n{ workspaceName, cleanupSteps, cleanupSuccess, auditResult }","operationId":"retry_cleanup_api_v3_rwsupport_workspace_deletion_cleanup__workspace_name__post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/{workspace_name}/slack":{"get":{"tags":["slack"],"summary":"Get Slack integrations for workspace","description":"Get Slack integrations for a workspace.\n\nProxies to the slackbot service to fetch workspace integrations.\n\nArgs:\n workspace_name: The workspace name from path.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Slack workspace integrations from slackbot service.","operationId":"get_slack_workspaces_api_v3__workspace_name__slack_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Slack Workspaces Api V3 Workspace Name Slack Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["slack"],"summary":"Create Slack integration for workspace","description":"Create a Slack integration for a workspace.\n\nProxies to the slackbot service to create the integration.\n\nArgs:\n workspace_name: The workspace name from path.\n data: Slack integration data.\n session: Database session.\n current_user: The authenticated user.\n\nReturns:\n Created integration from slackbot service.","operationId":"create_slack_workspace_api_v3__workspace_name__slack_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackWorkspaceCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Slack Workspace Api V3 Workspace Name Slack Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/{workspace_name}/slack/{integration_id}":{"delete":{"tags":["slack"],"summary":"Delete Slack integration","description":"Delete a Slack integration for a workspace.\n\nArgs:\n workspace_name: The workspace name from path.\n integration_id: The integration ID to delete.\n session: Database session.\n current_user: The authenticated user.","operationId":"delete_slack_workspace_api_v3__workspace_name__slack__integration_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"integration_id","in":"path","required":true,"schema":{"type":"integer","title":"Integration Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_short_name}/alerts":{"get":{"tags":["workspace-alerts"],"summary":"List alerts for a workspace","description":"List alerts for a workspace with pagination and filtering.\n\nCombines SLI and SLO alerts from the unified alerts table.\nMatches Django WorkspaceViewSet.get_alerts() response shape.","operationId":"list_workspace_alerts_api_v3_workspaces__workspace_short_name__alerts_get","parameters":[{"name":"workspace_short_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Short Name"}},{"name":"created__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Gte"}},{"name":"created__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Lte"}},{"name":"modified__gte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified Gte"}},{"name":"modified__lte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified Lte"}},{"name":"slxNames","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Slxnames"}},{"name":"slxNames[]","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Slxnames[]"}},{"name":"slxName","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slxname"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Workspace Alerts Api V3 Workspaces Workspace Short Name Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/rules":{"get":{"tags":["chat-config"],"summary":"Ws List Rules","description":"List rules for a workspace.\n\nOmitting ``scope_type`` returns workspace + persona + the caller's\nown user-scope rules in a single response. See\n``_list_workspace_chat_objects`` for the full filter contract.","operationId":"ws_list_rules_api_v3_workspaces__workspace_name__chat_config_rules_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"scope_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Type"}},{"name":"scope_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Id"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws List Rules Api V3 Workspaces Workspace Name Chat Config Rules Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["chat-config"],"summary":"Ws Create Rule","description":"Create a rule scoped to this workspace, its personas, or the\ncurrent user (within this workspace).\n\nWorkspace and persona scopes require workspace admin. User scope\nonly requires workspace membership (already enforced by the\nws_router dependency); a workspace member can author personal rules\nagainst their own email under any workspace they belong to.","operationId":"ws_create_rule_api_v3_workspaces__workspace_name__chat_config_rules_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Create Rule Api V3 Workspaces Workspace Name Chat Config Rules Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/rules/{rule_id}":{"get":{"tags":["chat-config"],"summary":"Ws Get Rule","description":"Get a rule by ID.","operationId":"ws_get_rule_api_v3_workspaces__workspace_name__chat_config_rules__rule_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Get Rule Api V3 Workspaces Workspace Name Chat Config Rules Rule Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["chat-config"],"summary":"Ws Update Rule","description":"Update a rule.","operationId":"ws_update_rule_api_v3_workspaces__workspace_name__chat_config_rules__rule_id__put","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Update Rule Api V3 Workspaces Workspace Name Chat Config Rules Rule Id Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["chat-config"],"summary":"Ws Delete Rule","description":"Delete a rule. Admin gate skipped for the rule's owner deleting\ntheir own user-scope rule.","operationId":"ws_delete_rule_api_v3_workspaces__workspace_name__chat_config_rules__rule_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/commands":{"get":{"tags":["chat-config"],"summary":"Ws List Commands","description":"List commands for a workspace.\n\nOmitting ``scope_type`` returns workspace + persona + the caller's\nown user-scope commands in a single response. See\n``_list_workspace_chat_objects`` for the full filter contract.","operationId":"ws_list_commands_api_v3_workspaces__workspace_name__chat_config_commands_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"scope_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Type"}},{"name":"scope_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Id"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws List Commands Api V3 Workspaces Workspace Name Chat Config Commands Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["chat-config"],"summary":"Ws Create Command","description":"Create a command scoped to this workspace, its personas, or the\ncurrent user (within this workspace). Admin gate skipped for\nuser scope (the workspace member can author their own personal\ncommands).","operationId":"ws_create_command_api_v3_workspaces__workspace_name__chat_config_commands_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Create Command Api V3 Workspaces Workspace Name Chat Config Commands Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/commands/{command_id}":{"get":{"tags":["chat-config"],"summary":"Ws Get Command","description":"Get a command by ID.","operationId":"ws_get_command_api_v3_workspaces__workspace_name__chat_config_commands__command_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"command_id","in":"path","required":true,"schema":{"type":"integer","title":"Command Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Get Command Api V3 Workspaces Workspace Name Chat Config Commands Command Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["chat-config"],"summary":"Ws Update Command","description":"Update a command. Admin gate skipped for user scope.","operationId":"ws_update_command_api_v3_workspaces__workspace_name__chat_config_commands__command_id__put","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"command_id","in":"path","required":true,"schema":{"type":"integer","title":"Command Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Update Command Api V3 Workspaces Workspace Name Chat Config Commands Command Id Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["chat-config"],"summary":"Ws Delete Command","description":"Delete a command. Admin gate skipped for owner-deletes-own-personal.","operationId":"ws_delete_command_api_v3_workspaces__workspace_name__chat_config_commands__command_id__delete","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"command_id","in":"path","required":true,"schema":{"type":"integer","title":"Command Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/commands/{command_id}/executions":{"get":{"tags":["chat-config"],"summary":"Ws List Command Executions","description":"Scheduled-chat execution history for one command (RW-779).\n\nProxies to agentfarm's `/commands/{id}/executions`. We verify the command\nbelongs to this workspace first so a workspace admin cannot read another\nworkspace's execution history by guessing command IDs.\n\nPermission level is workspace membership (already enforced by the\n``ws_router``-level ``require_workspace_member`` dependency) — same as\nevery other GET in this router (``ws_get_command``, ``ws_list_commands``,\n``ws_get_rule``). The previous ``_check_workspace_admin`` for non-user\nscopes was a copy-paste from the write paths and surfaced as a confusing\n403 on the studio page: a non-admin could read the command itself but\ngot bounced from its execution history. Read on the parent should\nimply read on the children.","operationId":"ws_list_command_executions_api_v3_workspaces__workspace_name__chat_config_commands__command_id__executions_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"command_id","in":"path","required":true,"schema":{"type":"integer","title":"Command Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Ws List Command Executions Api V3 Workspaces Workspace Name Chat Config Commands Command Id Executions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/dry-run":{"post":{"tags":["chat-config"],"summary":"Ws Dry Run Command","description":"Start an async dry-run for the current form state.\n\nMints a run-as token, calls agentfarm's ``start_dry_run`` which claims\na ``scheduled_chat_executions`` row and kicks off a detached worker.\nReturns ``{exec_id, status: \"pending\"}`` immediately — the UI polls\n``GET /chat-config/dry-run/{exec_id}`` until terminal.\n\nSplits what was previously a single sync call (which collided with the\nPAPI ingress 60s ``proxy_read_timeout`` and surfaced as CORS-shaped\n504s in the browser).","operationId":"ws_dry_run_command_api_v3_workspaces__workspace_name__chat_config_dry_run_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DryRunRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Dry Run Command Api V3 Workspaces Workspace Name Chat Config Dry Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/dry-run/{exec_id}":{"get":{"tags":["chat-config"],"summary":"Ws Get Dry Run Status","description":"Poll target for an async dry-run.\n\nLoads the agentfarm execution row by ``exec_id``. When the row is in a\nterminal succeeded status, also runs the dispatcher in ``dry_run=True``\nmode to render per-sink previews (email subject + body, slack mrkdwn).\nReturns the same shape the legacy sync endpoint produced, so the UI's\nDryRunPreviewDialog needs only minor changes.\n\n``sink_configs_json`` is a URL-encoded JSON list of sink configs from\nthe form state. Passed through on each poll because the admin may\nhave edited the form between submission and the row turning terminal\n— the dispatcher should render against whatever the form currently\nholds, not a stale snapshot. ``command_name`` is used purely for\nrendered subjects/headers.\n\nAuth: ``ws_router``-level ``require_workspace_member`` gates the\ncaller; we additionally mint a run-as token for ``current_user.email``\nbound to ``workspace_name`` and forward it to agentfarm so its GET\nendpoint can re-validate via PAPI (defense-in-depth, brings the\npoll endpoint in line with the bar set by /dry-run/start).\n\nNOTE: admin gating is intentionally NOT applied here. The POST start\nhandler enforces admin for non-user scopes; once a row exists, any\nworkspace member can poll its status. Tightening this further (e.g.\nonly the requester can read their dry-run) would require tracking\n``started_by_user_id`` on the executions row — a schema change worth\nits own ticket. Today's footprint is bounded by the dry-run rate\nlimit (admin-gated upstream) plus integer exec_id guessing.","operationId":"ws_get_dry_run_status_api_v3_workspaces__workspace_name__chat_config_dry_run__exec_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"exec_id","in":"path","required":true,"schema":{"type":"integer","title":"Exec Id"}},{"name":"sink_configs_json","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sink Configs Json"}},{"name":"command_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Command Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Get Dry Run Status Api V3 Workspaces Workspace Name Chat Config Dry Run Exec Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/commands/{command_id}/run-now":{"post":{"tags":["chat-config"],"summary":"Ws Run Command Now","description":"On-demand fire for a saved scheduled command.\n\nSame code path as the cron tier-3 task (``fire_scheduled_chat_session``):\nwe just enqueue it directly. The kiq task handles command lookup, run-as\ntoken mint, agentfarm /fire call, sink dispatch, and dispatch-result\nwrite-back. Each invocation:\n\n* Writes a real ``scheduled_chat_executions`` row (``dry_run=false``).\n* Bumps ``last_fired_at`` and increments ``runs_completed`` on success\n (counted toward the user's cap, just like a cron tick).\n* Respects the running-row partial unique — a second run-now while one\n is already in flight surfaces as 409 ``already_running`` from\n agentfarm and the kiq task no-ops.\n\nThe cron-due check is intentionally bypassed: the whole point is to fire\nimmediately. ``max_runs`` IS enforced here so users can't silently blow\npast their budget; this mirrors the SQL-side filter ``evaluate_due_commands``\napplies to cron candidates.","operationId":"ws_run_command_now_api_v3_workspaces__workspace_name__chat_config_commands__command_id__run_now_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"command_id","in":"path","required":true,"schema":{"type":"integer","title":"Command Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Run Command Now Api V3 Workspaces Workspace Name Chat Config Commands Command Id Run Now Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/commands/{command_id}/preview-artifact-deliveries":{"post":{"tags":["chat-config"],"summary":"Ws Preview Artifact Deliveries","description":"Render a stored artifact through the command's current sinks in\ndispatcher dry-run mode.\n\nUsed by the execution-history \"Inspect deliveries\" UI so admins can\nsee the actual email HTML / slack text payload a past run produced\n(or would produce, when the original delivery was skipped because\nMailgun/Slack wasn't configured locally).\n\nWhen the caller provides ``sink_configs`` in the body (the snapshot\npersisted in the execution row at fire time), the preview renders\nthrough those — so admins see what was actually targeted by the\nhistorical run. When the body omits ``sink_configs``, falls back to\nthe command's CURRENT sinks for back-compat with rows fired before\nthe snapshot column existed.\n\nThe ``export_url_path`` is the SAME signed-token chat-export URL the\nexecutions list returned for this row — agentfarm minted the token\nvia ``build_export_url_path`` so the link verifies on the\nchat-export view. We just absolute-join it with WEB_BASE_URL here.\nPass null to suppress the link in the preview.","operationId":"ws_preview_artifact_deliveries_api_v3_workspaces__workspace_name__chat_config_commands__command_id__preview_artifact_deliveries_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}},{"name":"command_id","in":"path","required":true,"schema":{"type":"integer","title":"Command Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewArtifactDeliveriesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Preview Artifact Deliveries Api V3 Workspaces Workspace Name Chat Config Commands Command Id Preview Artifact Deliveries Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/sink-suggestions/slack":{"get":{"tags":["chat-config"],"summary":"Ws Slack Sink Suggestions","description":"Channels (and DMs the bot has been included in) known for this\nworkspace's slack install.\n\nThin admin-gated proxy to slackbot's\n``GET /internal/workspaces/{workspace_name}/slack-channels``. Slackbot\nowns the read path so the directory shape and rules (which channels\nshow up, how DMs surface, sort order) live in one place. PAPI keeps\nthe workspace-admin role check + the existing ``{installed, channels}``\nresponse shape so the UI doesn't need to change.\n\n``installed`` is false when no slack workspace is linked — the UI\nsurfaces a \"Connect Slack\" prompt rather than an empty list. DM\nchannels (``is_im`` — IDs prefixed ``D``) ride in the same list as\nregular channels; the UI distinguishes by ID prefix.","operationId":"ws_slack_sink_suggestions_api_v3_workspaces__workspace_name__chat_config_sink_suggestions_slack_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Slack Sink Suggestions Api V3 Workspaces Workspace Name Chat Config Sink Suggestions Slack Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/chat-config/resolved":{"get":{"tags":["chat-config"],"summary":"Ws Resolved Config","description":"Get resolved chat config for a workspace (all scopes merged).","operationId":"ws_resolved_config_api_v3_workspaces__workspace_name__chat_config_resolved_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ws Resolved Config Api V3 Workspaces Workspace Name Chat Config Resolved Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/auth/providers":{"get":{"tags":["auth-providers"],"summary":"Get Auth Providers","description":"Return the categorised list of enabled login methods.\n\nThe Web UI login page fetches this on mount to render social buttons,\nenterprise SSO, and email/password sections dynamically.","operationId":"get_auth_providers_api_v3_auth_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/api/v3/configuration/what-knowledge":{"get":{"tags":["configuration"],"summary":"Get what-knowledge graph","description":"Return the what-knowledge graph used for task search.","operationId":"list_what_knowledge_api_v3_configuration_what_knowledge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List What Knowledge Api V3 Configuration What Knowledge Get"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/author/run":{"post":{"tags":["author"],"summary":"Create an author run","description":"Submit a new author run.\n\nGenerates a UUID, stores the command payload in Redis, and enqueues a\nTaskSet with the runner control plane.","operationId":"create_run_api_v1_workspaces__workspace_name__author_run_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunCreate"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/author/run/{run_id}":{"get":{"tags":["author"],"summary":"Get stored command for a run (public, for runner/explorer)","description":"Return the stored user command for a run.\n\nThis endpoint is public (no auth required) — the runner/explorer service\ncalls it to fetch the command to execute.","operationId":"get_run_api_v1_workspaces__workspace_name__author_run__run_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Run UUID","title":"Run Id"},"description":"Run UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Run Api V1 Workspaces Workspace Name Author Run Run Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/author/run/{run_id}/status":{"get":{"tags":["author"],"summary":"Get run status (owner only)","description":"Return the current status of an author run.\n\nOnly the user who created the run may query its status.","operationId":"get_run_status_api_v1_workspaces__workspace_name__author_run__run_id__status_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Run UUID","title":"Run Id"},"description":"Run UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["author"],"summary":"Update run status (runner callback)","description":"Runner callback to update the run status.\n\nDerives SUCCEEDED / FAILED from whether ``passed_titles`` is truthy\n(matches Django's ``RunRequestResponseSerializer`` logic).","operationId":"update_run_status_api_v1_workspaces__workspace_name__author_run__run_id__status_patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Run UUID","title":"Run Id"},"description":"Run UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/workspaces/{workspace_name}/author/run/{run_id}/output":{"get":{"tags":["author"],"summary":"Get signed URLs for run output artifacts (owner only)","description":"Return signed URLs for the primary output artifacts of an author run.\n\nOnly the user who created the run may retrieve its output. Three artifacts\nare returned: ``report.jsonl``, ``issues.jsonl``, and ``log.html``.","operationId":"get_run_output_api_v1_workspaces__workspace_name__author_run__run_id__output_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Run UUID","title":"Run Id"},"description":"Run UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunOutputResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/author/run":{"post":{"tags":["author"],"summary":"Create an author run","description":"Submit a new author run.\n\nGenerates a UUID, stores the command payload in Redis, and enqueues a\nTaskSet with the runner control plane.","operationId":"create_run_api_v3_workspaces__workspace_name__author_run_post","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunCreate"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/author/run/{run_id}":{"get":{"tags":["author"],"summary":"Get stored command for a run (public, for runner/explorer)","description":"Return the stored user command for a run.\n\nThis endpoint is public (no auth required) — the runner/explorer service\ncalls it to fetch the command to execute.","operationId":"get_run_api_v3_workspaces__workspace_name__author_run__run_id__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Run UUID","title":"Run Id"},"description":"Run UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Run Api V3 Workspaces Workspace Name Author Run Run Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/author/run/{run_id}/status":{"get":{"tags":["author"],"summary":"Get run status (owner only)","description":"Return the current status of an author run.\n\nOnly the user who created the run may query its status.","operationId":"get_run_status_api_v3_workspaces__workspace_name__author_run__run_id__status_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Run UUID","title":"Run Id"},"description":"Run UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["author"],"summary":"Update run status (runner callback)","description":"Runner callback to update the run status.\n\nDerives SUCCEEDED / FAILED from whether ``passed_titles`` is truthy\n(matches Django's ``RunRequestResponseSerializer`` logic).","operationId":"update_run_status_api_v3_workspaces__workspace_name__author_run__run_id__status_patch","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Run UUID","title":"Run Id"},"description":"Run UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v3/workspaces/{workspace_name}/author/run/{run_id}/output":{"get":{"tags":["author"],"summary":"Get signed URLs for run output artifacts (owner only)","description":"Return signed URLs for the primary output artifacts of an author run.\n\nOnly the user who created the run may retrieve its output. Three artifacts\nare returned: ``report.jsonl``, ``issues.jsonl``, and ``log.html``.","operationId":"get_run_output_api_v3_workspaces__workspace_name__author_run__run_id__output_get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","description":"Workspace short name","title":"Workspace Name"},"description":"Workspace short name"},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Run UUID","title":"Run Id"},"description":"Run UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorRunOutputResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/graphql":{"get":{"summary":"Handle Http Get","operationId":"handle_http_get_graphql_get","responses":{"200":{"description":"The GraphiQL integrated development environment.","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found if GraphiQL or query via GET are not enabled."}},"security":[{"BearerAuth":[]}]},"post":{"summary":"Handle Http Post","operationId":"handle_http_post_graphql_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/alert-query/{path}":{"delete":{"tags":["alert-query-proxy"],"summary":"Proxy To Alert Query","description":"Proxy request to the internal alert-query service.","operationId":"proxy_to_alert_query_api_v1_alert_query__path__delete","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["alert-query-proxy"],"summary":"Proxy To Alert Query","description":"Proxy request to the internal alert-query service.","operationId":"proxy_to_alert_query_api_v1_alert_query__path__delete","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["alert-query-proxy"],"summary":"Proxy To Alert Query","description":"Proxy request to the internal alert-query service.","operationId":"proxy_to_alert_query_api_v1_alert_query__path__delete","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"put":{"tags":["alert-query-proxy"],"summary":"Proxy To Alert Query","description":"Proxy request to the internal alert-query service.","operationId":"proxy_to_alert_query_api_v1_alert_query__path__delete","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"get":{"tags":["alert-query-proxy"],"summary":"Proxy To Alert Query","description":"Proxy request to the internal alert-query service.","operationId":"proxy_to_alert_query_api_v1_alert_query__path__delete","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}}},"components":{"schemas":{"AnonymousModeRequest":{"properties":{"action":{"type":"string","pattern":"^(on|off)$","title":"Action","description":"Action: 'on' to enable, 'off' to disable"}},"type":"object","required":["action"],"title":"AnonymousModeRequest","description":"Request body for toggling anonymous mode."},"AnonymousModeResponse":{"properties":{"workspace":{"type":"string","title":"Workspace"},"anonymousMode":{"type":"boolean","title":"Anonymousmode"},"message":{"type":"string","title":"Message"}},"type":"object","required":["workspace","anonymousMode","message"],"title":"AnonymousModeResponse","description":"Response for anonymous mode toggle."},"AnonymousModeStatusResponse":{"properties":{"workspace":{"type":"string","title":"Workspace"},"anonymousMode":{"type":"boolean","title":"Anonymousmode"}},"type":"object","required":["workspace","anonymousMode"],"title":"AnonymousModeStatusResponse","description":"Response for anonymous mode status check."},"AssignWorkspacesRequest":{"properties":{"workspaceIds":{"items":{"type":"integer"},"type":"array","title":"Workspaceids"},"confirmConfigDeletion":{"type":"boolean","title":"Confirmconfigdeletion","default":false}},"type":"object","required":["workspaceIds"],"title":"AssignWorkspacesRequest"},"AuthorRunCreate":{"properties":{"command":{"type":"string","title":"Command","description":"Script source (will be base64-encoded before storage)"},"runType":{"type":"string","title":"Runtype","description":"Run type — \"task\" or \"runbook\"","default":"task"},"interpreter":{"type":"string","title":"Interpreter","description":"Script interpreter","default":"bash"},"location":{"type":"string","title":"Location","description":"Runner location to execute on"},"envVars":{"additionalProperties":{"type":"string"},"type":"object","title":"Envvars","description":"Plain-text env vars"},"secretVars":{"additionalProperties":{"type":"string"},"type":"object","title":"Secretvars","description":"Secret env vars"}},"type":"object","required":["command","location"],"title":"AuthorRunCreate","description":"Payload for ``POST /author/run``."},"AuthorRunCreateResponse":{"properties":{"runId":{"type":"string","title":"Runid"},"status":{"type":"string","title":"Status","default":"RUNNING"}},"type":"object","required":["runId"],"title":"AuthorRunCreateResponse","description":"Response for ``POST /author/run``."},"AuthorRunOutputArtifact":{"properties":{"type":{"type":"string","title":"Type"},"filename":{"type":"string","title":"Filename"},"contentType":{"type":"string","title":"Contenttype"},"expiresAt":{"type":"string","title":"Expiresat"},"signedUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signedurl"}},"type":"object","required":["type","filename","contentType","expiresAt","signedUrl"],"title":"AuthorRunOutputArtifact","description":"Single artifact entry inside the output response."},"AuthorRunOutputResponse":{"properties":{"runId":{"type":"string","title":"Runid"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"artifacts":{"items":{"$ref":"#/components/schemas/AuthorRunOutputArtifact"},"type":"array","title":"Artifacts"}},"type":"object","required":["runId","status","artifacts"],"title":"AuthorRunOutputResponse","description":"Response for ``GET /author/run/{run_id}/output``."},"AuthorRunStatusResponse":{"properties":{"runId":{"type":"string","title":"Runid"},"status":{"type":"string","title":"Status"}},"type":"object","required":["runId","status"],"title":"AuthorRunStatusResponse","description":"Response for ``GET|PATCH /author/run/{run_id}/status``."},"AuthorRunStatusUpdate":{"properties":{"passedTitles":{"type":"string","title":"Passedtitles","description":"'||'-separated titles of passed tasks","default":""},"failedTitles":{"type":"string","title":"Failedtitles","description":"'||'-separated titles of failed tasks","default":""},"skippedTitles":{"type":"string","title":"Skippedtitles","description":"'||'-separated titles of skipped tasks","default":""},"errors":{"title":"Errors","description":"Error details (dict or list)"}},"type":"object","title":"AuthorRunStatusUpdate","description":"Payload for ``PATCH /author/run/{run_id}/status`` (runner callback).\n\nThe runner posts back the RunRequest response shape; we derive SUCCEEDED /\nFAILED from whether ``passed_titles`` is truthy.\n\nDjango stores these as '||'-separated CharField strings, so the runner\nsends strings (e.g. ``\"Task A||Task B\"``), not arrays. Extra fields\n(``robot_log_file``, ``runsession_id``, etc.) are silently ignored."},"AuthorizedRunner":{"properties":{"name":{"type":"string","title":"Name","description":"Runner display name"},"value":{"type":"string","title":"Value","description":"Runner resource name (UUID)"},"health":{"type":"string","title":"Health","description":"Runner health: online, stale, or unknown","default":"unknown"},"lastHeartbeat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastheartbeat","description":"ISO timestamp of last heartbeat"},"secondsSinceHeartbeat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Secondssinceheartbeat","description":"Seconds since last heartbeat"}},"type":"object","required":["name","value"],"title":"AuthorizedRunner","description":"Authorized runner for a workspace."},"AutocompleteRequest":{"properties":{"query":{"type":"string","title":"Query","description":"Partial query for autocomplete"}},"type":"object","required":["query"],"title":"AutocompleteRequest","description":"Request for search autocomplete."},"Body_bulk_create_recognizers_api_v3_rwsupport_scrubhub_workspaces__workspace_name__recognizers_bulk_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"CSV upload"},"kind":{"type":"string","title":"Kind"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"entity_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Label"}},"type":"object","required":["file","kind"],"title":"Body_bulk_create_recognizers_api_v3_rwsupport_scrubhub_workspaces__workspace_name__recognizers_bulk_post"},"Body_oauth_authorize_email_login_oauth_authorize_login_email_post":{"properties":{"oauth_session":{"type":"string","title":"Oauth Session"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["oauth_session","username","password"],"title":"Body_oauth_authorize_email_login_oauth_authorize_login_email_post"},"Body_oauth_token_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"code":{"type":"string","title":"Code","default":""},"redirect_uri":{"type":"string","title":"Redirect Uri","default":""},"client_id":{"type":"string","title":"Client Id","default":""},"client_secret":{"type":"string","title":"Client Secret","default":""},"code_verifier":{"type":"string","title":"Code Verifier","default":""},"refresh_token":{"type":"string","title":"Refresh Token","default":""}},"type":"object","required":["grant_type"],"title":"Body_oauth_token_oauth_token_post"},"CategoryResponse":{"properties":{"categoryId":{"type":"string","title":"Categoryid"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"displayOrder":{"type":"integer","title":"Displayorder"}},"type":"object","required":["categoryId","title","description","displayOrder"],"title":"CategoryResponse"},"CodeBundleReference":{"properties":{"id":{"type":"string","title":"Id","default":""},"name":{"type":"string","title":"Name","default":""},"gitURL":{"type":"string","title":"Giturl","default":""},"branch":{"type":"string","title":"Branch","default":""},"path":{"type":"string","title":"Path","default":""},"image":{"type":"string","title":"Image","default":""},"imageTag":{"type":"string","title":"Imagetag","default":""}},"type":"object","title":"CodeBundleReference","description":"Code bundle reference matching runner-control JSONCodeBundleReference."},"CodeCollectionResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"repo_web_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repo Web Url"},"spec":{"additionalProperties":true,"type":"object","title":"Spec"},"status":{"additionalProperties":true,"type":"object","title":"Status"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created"},"modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified"},"repo":{"type":"null","title":"Repo"}},"type":"object","required":["id","name"],"title":"CodeCollectionResponse","description":"CodeCollection response matching Django's CodeCollectionSerializer.\n\nDjango serializes: id, name, repo_web_url, spec, status, created, modified, repo."},"CommandCreate":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name"},"command_content":{"type":"string","minLength":1,"title":"Command Content"},"scope_type":{"type":"string","title":"Scope Type"},"scope_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active","default":true},"cron_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Schedule"},"sink_configs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Sink Configs"},"run_as_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run As User"},"assistant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Name"},"max_runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Runs"},"schedule_paused":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Schedule Paused"},"auto_approve_readonly":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Approve Readonly"}},"type":"object","required":["name","command_content","scope_type"],"title":"CommandCreate","description":"Create a chat command.\n\n``command_content`` is the prompt that gets shipped to agentfarm and\nruns the agent — empty / whitespace-only would mean the agent runs\nagainst no instructions, so reject at the schema layer instead of\nbouncing the user off agentfarm's 422."},"CommandUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"command_content":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Command Content"},"scope_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Type"},"scope_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"cron_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Schedule"},"sink_configs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Sink Configs"},"run_as_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run As User"},"assistant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Name"},"max_runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Runs"},"reset_runs_completed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reset Runs Completed"},"schedule_paused":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Schedule Paused"},"auto_approve_readonly":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Approve Readonly"}},"type":"object","title":"CommandUpdate","description":"Update a chat command.\n\nPartial-update semantics: omitting a field leaves it unchanged. An\nexplicit empty / whitespace-only ``command_content`` is the save-\nthen-blank mistake — reject so the prompt can't accidentally be\noverwritten with nothing on save."},"CommentAction":{"type":"string","enum":["resolve","reopen"],"title":"CommentAction","description":"Actions that can be taken on a comment thread."},"CommentAuthorResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique user identifier"},"username":{"type":"string","title":"Username","description":"Username"},"primaryEmail":{"type":"string","title":"Primaryemail","description":"User's primary email address"},"fullName":{"type":"string","title":"Fullname","description":"User's full display name"},"avatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatarurl","description":"URL to user's avatar image"},"isStaff":{"type":"boolean","title":"Isstaff","description":"Whether user is a staff member"},"isServiceAccount":{"type":"boolean","title":"Isserviceaccount","description":"Whether user is a service account"}},"type":"object","required":["id","username","primaryEmail","fullName","isStaff","isServiceAccount"],"title":"CommentAuthorResponse","description":"Author information for comment responses.\n\nUses camelCase aliases for frontend compatibility."},"CommentCreate":{"properties":{"content":{"type":"string","title":"Content","description":"Comment text content (markdown supported)"},"escalated":{"type":"boolean","title":"Escalated","description":"Whether to escalate the associated entity","default":false}},"type":"object","required":["content"],"title":"CommentCreate","description":"Schema for creating a top-level comment."},"CommentReplyCreate":{"properties":{"content":{"type":"string","title":"Content","description":"Reply text content (markdown supported)"},"action":{"anyOf":[{"$ref":"#/components/schemas/CommentAction"},{"type":"null"}],"description":"Optional action to take (resolve/reopen thread)"},"escalated":{"type":"boolean","title":"Escalated","description":"Whether to escalate the associated entity","default":false}},"type":"object","required":["content"],"title":"CommentReplyCreate","description":"Schema for creating a reply to an existing comment."},"CommentResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique comment identifier"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Comment text content (markdown)"},"htmlContent":{"type":"string","title":"Htmlcontent","description":"Rendered HTML content","default":""},"deleted":{"type":"boolean","title":"Deleted","description":"Whether comment has been soft-deleted","default":false},"resolved":{"type":"boolean","title":"Resolved","description":"Whether comment thread is resolved","default":false},"action":{"anyOf":[{"$ref":"#/components/schemas/CommentAction"},{"type":"null"}],"description":"Action taken by this comment (resolve/reopen)"},"author":{"$ref":"#/components/schemas/CommentAuthorResponse","description":"Comment author information"},"replies":{"items":{"$ref":"#/components/schemas/CommentResponse"},"type":"array","title":"Replies","description":"Child replies to this comment"},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last modification timestamp"}},"type":"object","required":["id","author","created","modified"],"title":"CommentResponse","description":"Comment response schema for API responses.\n\nUses camelCase aliases for frontend compatibility.\nSupports nested replies for threaded comments."},"CommentUpdate":{"properties":{"content":{"type":"string","title":"Content","description":"Updated comment text content"}},"type":"object","required":["content"],"title":"CommentUpdate","description":"Schema for updating an existing comment."},"CreateOverrideRequest":{"properties":{"source":{"type":"string","enum":["ui","slack","teams"],"title":"Source"},"prompt":{"type":"string","maxLength":16384,"minLength":1,"title":"Prompt"}},"type":"object","required":["source","prompt"],"title":"CreateOverrideRequest","description":"Request body for creating a platform-default override."},"CsrfTokenResponse":{"properties":{"csrfToken":{"type":"string","title":"Csrftoken"}},"type":"object","required":["csrfToken"],"title":"CsrfTokenResponse","description":"CSRF token response."},"DeactivateRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Optional reason for deactivation"}},"type":"object","title":"DeactivateRequest","description":"Schema for deactivating a run session."},"DedupeConfig":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Whether deduplication is enabled","default":true},"strategy":{"type":"string","const":"slx","title":"Strategy","description":"Deduplication strategy (only 'slx' supported currently)","default":"slx"},"window":{"type":"string","title":"Window","description":"Lookback window for finding matching sessions (e.g., '10m', '1h', '3d')","default":"10m"}},"type":"object","title":"DedupeConfig","description":"Configuration for RunSession deduplication."},"DeleteResponse":{"properties":{"status":{"type":"string","title":"Status"},"name":{"type":"string","title":"Name"},"resource_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Id"}},"type":"object","required":["status","name"],"title":"DeleteResponse","description":"Response for a soft-delete operation."},"DeletionStep":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"status":{"type":"string","title":"Status"},"detail":{"type":"string","title":"Detail","default":""}},"type":"object","required":["key","label","status"],"title":"DeletionStep","description":"Status of a single deletion step."},"DryRunRequest":{"properties":{"command_content":{"type":"string","minLength":1,"title":"Command Content"},"sink_configs":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Sink Configs"},"assistant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Name"},"run_as_user":{"type":"string","minLength":1,"title":"Run As User"},"scope_type":{"type":"string","title":"Scope Type","default":"workspace"},"scope_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Id"},"name":{"type":"string","title":"Name","default":""}},"type":"object","required":["command_content","run_as_user"],"title":"DryRunRequest","description":"Form-state dry-run for the schedule-config dialog.\n\n``run_as_user`` is required (RW-931 follow-up) — the dry-run session\nruns AS this user so chat-export and audit show the actual identity.\nEmpty / missing ``run_as_user`` yields a 422 here (no silent fallback\nto the requesting admin). ``StringConstraints(strip_whitespace=True)``\nis what makes ``\" \"`` count as empty: ``Field(min_length=1)`` checks\nthe raw string and would otherwise let three-space input through."},"EscalateRequest":{"properties":{"escalated":{"type":"boolean","title":"Escalated","description":"Escalation status (typically True)","default":true}},"type":"object","title":"EscalateRequest","description":"Schema for escalating a run session."},"FileUploadUrlResponse":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"FileUploadUrlResponse","description":"Response containing a signed URL for file upload."},"FinalizeActionEnum":{"type":"string","enum":["mergeToMain"],"title":"FinalizeActionEnum","description":"Finalize action after workspace upload."},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest","description":"Forgot password request."},"GalleryPersona":{"properties":{"name":{"type":"string","title":"Name","description":"Persona short name"},"fullName":{"type":"string","title":"Fullname","description":"Persona full display name"},"avatarUrl":{"type":"string","title":"Avatarurl","description":"Avatar image URL","default":""}},"type":"object","required":["name","fullName"],"title":"GalleryPersona","description":"Schema for persona info in workspace gallery."},"GalleryUser":{"properties":{"role":{"type":"string","title":"Role","description":"User role in workspace"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"User email"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group","description":"User group"}},"type":"object","required":["role"],"title":"GalleryUser","description":"Schema for user info in workspace gallery."},"GenerateNextStepsRequest":{"properties":{"comment_contents":{"items":{"type":"string"},"type":"array","title":"Comment Contents","description":"Optional list of comment contents to provide additional context"}},"type":"object","title":"GenerateNextStepsRequest","description":"Request schema for generating next steps via sobrain."},"GenerateNextStepsResponse":{"properties":{"next_steps":{"items":{"type":"string"},"type":"array","title":"Next Steps","description":"Generated next steps for the issue"},"raw_next_steps":{"items":{"type":"string"},"type":"array","title":"Raw Next Steps","description":"Raw next steps from LLM before validation"},"issue_id":{"type":"integer","title":"Issue Id","description":"The issue ID"}},"type":"object","required":["next_steps","issue_id"],"title":"GenerateNextStepsResponse","description":"Response schema for generated next steps."},"GenerateSummaryResponse":{"properties":{"summary":{"type":"string","title":"Summary","description":"Generated summary for the issue"},"issue_id":{"type":"integer","title":"Issue Id","description":"The issue ID"}},"type":"object","required":["summary","issue_id"],"title":"GenerateSummaryResponse","description":"Response schema for generated issue summary."},"GroupResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"GroupResponse","description":"Minimal group info returned inside UserResponse."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IssueCloseRequest":{"properties":{"comment":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Comment","description":"Optional comment when closing"}},"type":"object","title":"IssueCloseRequest","description":"Optional request body for closing an issue with a comment."},"IssueIgnoreRequest":{"properties":{"ignored_until":{"type":"string","format":"date-time","title":"Ignored Until","description":"Ignore until this datetime (required, ISO 8601 format)"}},"type":"object","required":["ignored_until"],"title":"IssueIgnoreRequest","description":"Schema for ignore issue request."},"IssueListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/IssueResponse"},"type":"array","title":"Results"},"count":{"type":"integer","title":"Count"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Next page URL"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous","description":"Previous page URL"}},"type":"object","required":["results","count","limit","offset"],"title":"IssueListResponse","description":"Schema for paginated issue list response."},"IssueOccurrenceListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/IssueOccurrenceResponse"},"type":"array","title":"Results"},"count":{"type":"integer","title":"Count"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Next page URL"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous","description":"Previous page URL"}},"type":"object","required":["results","count","limit","offset"],"title":"IssueOccurrenceListResponse","description":"Schema for paginated issue occurrence list response."},"IssueOccurrenceResponse":{"properties":{"observedAt":{"type":"string","format":"date-time","title":"Observedat","description":"When this occurrence was observed"},"details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Details","description":"Detailed description of the occurrence"},"nextSteps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextsteps","description":"Suggested next steps"},"expected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected","description":"Expected behavior/value"},"actual":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual","description":"Actual behavior/value observed"},"reproduceHint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reproducehint","description":"Hint for reproducing the issue"},"additionalContext":{"additionalProperties":true,"type":"object","title":"Additionalcontext","description":"Additional context data"},"occurrenceId":{"type":"integer","title":"Occurrenceid","description":"The occurrence ID"},"issueId":{"type":"integer","title":"Issueid","description":"The parent issue ID"},"taskTitle":{"type":"string","title":"Tasktitle","description":"Task title from the parent issue"},"title":{"type":"string","title":"Title","description":"Title from the parent issue","default":""},"severity":{"type":"integer","title":"Severity","description":"Severity from the parent issue (1=critical, 4=warning)","default":0},"closed":{"type":"boolean","title":"Closed","description":"Whether the parent issue is closed (open_since is None)"},"created":{"type":"string","format":"date-time","title":"Created"},"modified":{"type":"string","format":"date-time","title":"Modified"}},"type":"object","required":["observedAt","occurrenceId","issueId","taskTitle","closed","created","modified"],"title":"IssueOccurrenceResponse","description":"Schema for issue occurrence response with flattened issue attributes.\n\nUsed for RunSession-scoped issue occurrence listings."},"IssueReference":{"properties":{"id":{"type":"integer","title":"Id","description":"Issue ID"},"title":{"type":"string","title":"Title","description":"Issue title"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity","description":"Issue severity"},"slx_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slx Name","description":"SLX name"}},"type":"object","required":["id","title"],"title":"IssueReference","description":"Reference to an issue from a RunRequest."},"IssueResponse":{"properties":{"taskTitle":{"type":"string","title":"Tasktitle","description":"The task title for the issue"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Human-readable issue title"},"categorizationKey":{"type":"string","title":"Categorizationkey","description":"Key for categorizing/deduplicating issues"},"severity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Severity","description":"Issue severity level (1=critical, 4=warning)"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"LLM-generated summary of the issue"},"observations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Observations","description":"LLM-generated observations (list of strings)"},"nextSteps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextsteps","description":"LLM-generated next steps (plain text)"},"additionalContext":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Additionalcontext","description":"Additional context for the issue"},"id":{"type":"integer","title":"Id"},"workspaceId":{"type":"integer","title":"Workspaceid"},"slxName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slxname"},"openSince":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Opensince"},"latestOccurrenceAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latestoccurrenceat"},"openOccurrenceCount":{"type":"integer","title":"Openoccurrencecount","default":0},"closedOccurrenceCount":{"type":"integer","title":"Closedoccurrencecount","default":0},"totalOccurrenceCount":{"type":"integer","title":"Totaloccurrencecount","default":0},"ignoredByUserId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ignoredbyuserid"},"ignoredSince":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ignoredsince"},"ignoredUntil":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ignoreduntil"},"closedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closedat"},"closedByType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Closedbytype"},"closedById":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Closedbyid"},"latestOccurrenceDetails":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latestoccurrencedetails"},"latestOccurrenceNextSteps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latestoccurrencenextsteps"},"latestOccurrenceExpected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latestoccurrenceexpected"},"latestOccurrenceActual":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latestoccurrenceactual"},"latestOccurrenceReproduceHint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latestoccurrencereproducehint"},"latestOccurrenceId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latestoccurrenceid"},"latestOccurrenceObservedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latestoccurrenceobservedat"},"latestOccurrenceRunRequestId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latestoccurrencerunrequestid"},"latestOccurrenceRunSessionId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latestoccurrencerunsessionid"},"details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Details"},"expected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected"},"actual":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual"},"reproduceHint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reproducehint"},"created":{"type":"string","format":"date-time","title":"Created"},"modified":{"type":"string","format":"date-time","title":"Modified"},"occurrenceTimestamps":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Occurrencetimestamps"},"occurrenceTimestampsMeta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Occurrencetimestampsmeta"}},"type":"object","required":["taskTitle","categorizationKey","id","workspaceId","created","modified"],"title":"IssueResponse","description":"Schema for issue response with all fields.\n\nUses alias_generator=to_camel so the JSON output uses camelCase keys\nmatching the Django DRF convention the frontend expects."},"IssueUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"severity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Severity"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"observations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Observations"},"next_steps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Steps"},"additional_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Additional Context"}},"type":"object","title":"IssueUpdate","description":"Schema for updating an issue (partial update)."},"JitSummaryResponse":{"properties":{"summary":{"type":"string","title":"Summary","description":"Generated summary for the issue"}},"type":"object","required":["summary"],"title":"JitSummaryResponse","description":"Response schema for JIT summary."},"LLMConfigCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"category":{"type":"string","title":"Category"},"llmModel":{"type":"integer","title":"Llmmodel"},"workspace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workspace"},"org":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org"},"isPlatformDefault":{"type":"boolean","title":"Isplatformdefault","default":false}},"type":"object","required":["name","category","llmModel"],"title":"LLMConfigCreate"},"LLMConfigUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"llmModel":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Llmmodel"},"workspace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workspace"},"org":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org"},"isPlatformDefault":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isplatformdefault"}},"type":"object","title":"LLMConfigUpdate"},"LLMModelCreate":{"properties":{"provider":{"type":"integer","title":"Provider"},"modelName":{"type":"string","maxLength":100,"title":"Modelname"},"maxTokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxtokens"},"dimension":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dimension"},"endpointPath":{"type":"string","title":"Endpointpath","default":"/chat/completions"}},"type":"object","required":["provider","modelName"],"title":"LLMModelCreate"},"LLMModelUpdate":{"properties":{"provider":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Provider"},"modelName":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Modelname"},"maxTokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxtokens"},"dimension":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dimension"},"endpointPath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpointpath"}},"type":"object","title":"LLMModelUpdate"},"LLMProviderCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"},"providerType":{"type":"string","title":"Providertype"},"baseUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseurl"},"apiKey":{"type":"string","title":"Apikey"},"llmTenantType":{"type":"string","title":"Llmtenanttype","default":"SHARED"},"ownerOrg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ownerorg"}},"type":"object","required":["name","providerType","apiKey"],"title":"LLMProviderCreate"},"LLMProviderUpdate":{"properties":{"providerType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Providertype"},"baseUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseurl"},"apiKey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apikey"},"llmTenantType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llmtenanttype"},"ownerOrg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ownerorg"}},"type":"object","title":"LLMProviderUpdate"},"LoginRequest":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"LoginRequest","description":"Username/password login request."},"LoginResponse":{"properties":{"access":{"type":"string","title":"Access"},"refresh":{"type":"string","title":"Refresh"},"user":{"$ref":"#/components/schemas/UserResponse"}},"type":"object","required":["access","refresh","user"],"title":"LoginResponse","description":"Login response with tokens."},"MergeModeEnum":{"type":"string","enum":["keepexisting","keepuploaded"],"title":"MergeModeEnum","description":"Merge mode for workspace upload."},"MessageResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"MessageResponse","description":"Generic message response."},"MetricTypeV4":{"type":"string","enum":["gauge","counter","histogram"],"title":"MetricTypeV4"},"NoteCreate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Title","description":"Short note title"},"content":{"type":"string","maxLength":20000,"minLength":1,"title":"Content","description":"Note content"},"resourcePaths":{"items":{"type":"string"},"type":"array","title":"Resourcepaths","description":"Canonical resource paths"},"abstractEntities":{"items":{"type":"string"},"type":"array","title":"Abstractentities","description":"Normalized entity tokens"},"status":{"$ref":"#/components/schemas/NoteStatus","description":"Note lifecycle status","default":"active"}},"type":"object","required":["content"],"title":"NoteCreate","description":"Schema for creating a note."},"NoteCreateV4":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Title","description":"Short note title"},"content":{"type":"string","maxLength":20000,"minLength":1,"title":"Content","description":"Note content"},"resourcePaths":{"items":{"type":"string"},"type":"array","title":"Resourcepaths","description":"Canonical resource paths"},"resourceSelectors":{"items":{"$ref":"#/components/schemas/ResourceSelectorV4"},"type":"array","title":"Resourceselectors","description":"Tag selectors resolved to resources by the platform"},"abstractEntities":{"items":{"type":"string"},"type":"array","title":"Abstractentities","description":"Normalized entity tokens"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Author-facing labels"},"status":{"$ref":"#/components/schemas/NoteStatusV4","description":"Note lifecycle status","default":"active"}},"additionalProperties":false,"type":"object","required":["content"],"title":"NoteCreateV4","description":"Schema for creating a note."},"NoteDeleteRequestV4":{"properties":{"sourceKind":{"type":"string","title":"Sourcekind","default":"git"},"source":{"type":"string","title":"Source"},"sourceIds":{"items":{"type":"string"},"type":"array","title":"Sourceids"},"dryRun":{"type":"boolean","title":"Dryrun","default":false}},"additionalProperties":false,"type":"object","required":["source","sourceIds"],"title":"NoteDeleteRequestV4"},"NoteDeleteResponseV4":{"properties":{"applied":{"type":"boolean","title":"Applied"},"results":{"items":{"$ref":"#/components/schemas/NoteDeleteResultV4"},"type":"array","title":"Results","default":[]}},"type":"object","required":["applied"],"title":"NoteDeleteResponseV4"},"NoteDeleteResultV4":{"properties":{"sourceId":{"type":"string","title":"Sourceid"},"status":{"type":"string","title":"Status"}},"type":"object","required":["sourceId","status"],"title":"NoteDeleteResultV4"},"NoteDiagnosticV4":{"properties":{"level":{"type":"string","title":"Level"},"code":{"type":"string","title":"Code"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field"},"message":{"type":"string","title":"Message"}},"type":"object","required":["level","code","message"],"title":"NoteDiagnosticV4"},"NoteResourceLinkV4":{"properties":{"resourcePath":{"type":"string","title":"Resourcepath","description":"Concrete resource path the note attaches to"},"matchReason":{"type":"string","title":"Matchreason","description":"\"explicit_path\" | \"selector\""},"matchedSelector":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matchedselector","description":"Index into resourceSelectors (null for explicit paths)"}},"type":"object","required":["resourcePath","matchReason"],"title":"NoteResourceLinkV4","description":"A materialized note→resource attachment (Tier-3), resolver-owned."},"NoteResponse":{"properties":{"noteId":{"type":"string","format":"uuid","title":"Noteid","description":"Unique note identifier"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Short note title"},"content":{"type":"string","title":"Content","description":"Note content"},"resourcePaths":{"items":{"type":"string"},"type":"array","title":"Resourcepaths","description":"Canonical resource paths"},"abstractEntities":{"items":{"type":"string"},"type":"array","title":"Abstractentities","description":"Normalized entity tokens"},"status":{"type":"string","title":"Status","description":"Note lifecycle status"},"verified":{"type":"boolean","title":"Verified","description":"Whether note is human-verified"},"authorEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authoremail","description":"Author email address"},"createdAt":{"type":"string","format":"date-time","title":"Createdat","description":"Creation timestamp"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat","description":"Last update timestamp"}},"type":"object","required":["noteId","content","resourcePaths","abstractEntities","status","verified","createdAt","updatedAt"],"title":"NoteResponse","description":"Note response schema for API responses."},"NoteResponseV4":{"properties":{"noteId":{"type":"string","format":"uuid","title":"Noteid","description":"Unique note identifier"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Short note title"},"content":{"type":"string","title":"Content","description":"Note content"},"resourcePaths":{"items":{"type":"string"},"type":"array","title":"Resourcepaths","description":"Authored explicit resource paths"},"resourceSelectors":{"items":{"$ref":"#/components/schemas/ResourceSelectorV4"},"type":"array","title":"Resourceselectors","description":"Authored tag selectors (Tier-2 rule)"},"resourceLinks":{"items":{"$ref":"#/components/schemas/NoteResourceLinkV4"},"type":"array","title":"Resourcelinks","description":"Resolved concrete attachments (Tier-3), reconciler-owned"},"lastResolvedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastresolvedat","description":"When the reconciler last resolved this note"},"resolutionState":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolutionstate","description":"ok | pending | error"},"indexingState":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Indexingstate","description":"usearch-reported index state, mirrored into core DB (completed | failed | queued | …)"},"abstractEntities":{"items":{"type":"string"},"type":"array","title":"Abstractentities","description":"Normalized entity tokens"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Author-facing labels"},"status":{"type":"string","title":"Status","description":"Note lifecycle status"},"verified":{"type":"boolean","title":"Verified","description":"Whether note is human-verified"},"authorEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authoremail","description":"Author email address"},"createdAt":{"type":"string","format":"date-time","title":"Createdat","description":"Creation timestamp"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat","description":"Last update timestamp"},"sourceKind":{"type":"string","title":"Sourcekind","description":"Origin: \"manual\" or external (e.g. \"git\")","default":"manual"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Origin/collection (e.g. repo) for synced notes"},"sourceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourceid","description":"Identifier within the source (e.g. file path)"},"sourceRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourceref","description":"Version pointer at last sync (e.g. commit)"},"readOnly":{"type":"boolean","title":"Readonly","description":"True for externally-synced notes (edit at source)","default":false}},"type":"object","required":["noteId","content","resourcePaths","abstractEntities","status","verified","createdAt","updatedAt"],"title":"NoteResponseV4","description":"Note response schema for API responses."},"NoteStatus":{"type":"string","enum":["active","deprecated"],"title":"NoteStatus","description":"Note lifecycle status."},"NoteStatusV4":{"type":"string","enum":["active","deprecated"],"title":"NoteStatusV4","description":"Note lifecycle status."},"NoteSyncRequestV4":{"properties":{"sourceKind":{"type":"string","title":"Sourcekind","description":"Origin type, e.g. \"git\". Not \"manual\".","default":"git"},"source":{"type":"string","title":"Source","description":"Origin/collection (e.g. repo URL)."},"sourceId":{"type":"string","title":"Sourceid","description":"Stable id within the source (e.g. file path)."},"sourceRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourceref","description":"Version pointer (e.g. commit)."},"sourceMetadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Sourcemetadata","description":"Source-specific extras."},"content":{"type":"string","title":"Content","description":"Markdown note with YAML frontmatter."},"dryRun":{"type":"boolean","title":"Dryrun","description":"Validate only; write nothing.","default":false}},"additionalProperties":false,"type":"object","required":["source","sourceId","content"],"title":"NoteSyncRequestV4"},"NoteSyncResponseV4":{"properties":{"status":{"type":"string","title":"Status"},"applied":{"type":"boolean","title":"Applied"},"ok":{"type":"boolean","title":"Ok"},"noteId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Noteid"},"diagnostics":{"items":{"$ref":"#/components/schemas/NoteDiagnosticV4"},"type":"array","title":"Diagnostics","default":[]}},"type":"object","required":["status","applied","ok"],"title":"NoteSyncResponseV4"},"NoteUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string","maxLength":20000,"minLength":1},{"type":"null"}],"title":"Content"},"resourcePaths":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resourcepaths"},"abstractEntities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Abstractentities"},"status":{"anyOf":[{"$ref":"#/components/schemas/NoteStatus"},{"type":"null"}]},"verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verified"}},"type":"object","title":"NoteUpdate","description":"Schema for partial update of a note."},"NoteUpdateV4":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string","maxLength":20000,"minLength":1},{"type":"null"}],"title":"Content"},"resourcePaths":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resourcepaths"},"resourceSelectors":{"anyOf":[{"items":{"$ref":"#/components/schemas/ResourceSelectorV4"},"type":"array"},{"type":"null"}],"title":"Resourceselectors"},"abstractEntities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Abstractentities"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"status":{"anyOf":[{"$ref":"#/components/schemas/NoteStatusV4"},{"type":"null"}]},"verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verified"}},"additionalProperties":false,"type":"object","title":"NoteUpdateV4","description":"Schema for partial update of a note."},"ObjectiveRecommendationResponse":{"properties":{"currentErrorBudget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Currenterrorbudget","description":"Most recent error budget reading. None when no SLO exists."},"monthProgress":{"type":"number","title":"Monthprogress","description":"Fraction of the current calendar month elapsed (0.0–1.0)."},"projectedEndOfMonth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projectedendofmonth","description":"Projected error budget at end of month assuming linear burn rate. None when no SLO exists. May be negative when burn rate exceeds 100%."},"currentObjective":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Currentobjective","description":"Current SLO objective percentage (e.g. 99.9). None when no SLO exists."},"recommendedObjective":{"type":"number","title":"Recommendedobjective","description":"Recommended SLO objective percentage, clamped to [0.5, 99.99]."},"baselinePeriod":{"type":"string","title":"Baselineperiod","description":"PromQL timestring used as the calculation baseline (e.g. '168h', '30d'). '30d' for SLI-based recommendations."},"hasSlo":{"type":"boolean","title":"Hasslo","description":"True when an SLO exists for this SLX."},"recommendationSource":{"type":"string","title":"Recommendationsource","description":"How the recommendation was derived: 'error_budget' (SLO burn rate), 'sli_data' (historical SLI healthiness), or 'default' (insufficient data)."}},"type":"object","required":["monthProgress","recommendedObjective","baselinePeriod","hasSlo","recommendationSource"],"title":"ObjectiveRecommendationResponse","description":"SLO objective recommendation response.\n\nMatches Django's SloViewSet.slo_objective_recommendation() response shape exactly.\nUsed by agentfarm's papi_client.fetch_slo_recommendation().\n\nDjango's DRF uses djangorestframework-camel-case to auto-convert snake_case → camelCase.\nWe replicate that with alias_generator so agentfarm's SLORecommendation(extra=\"forbid\")\nreceives the expected camelCase keys."},"OrgCreate":{"properties":{"name":{"type":"string","maxLength":150,"title":"Name"},"tenantType":{"type":"string","title":"Tenanttype","default":"SHARED"}},"type":"object","required":["name"],"title":"OrgCreate"},"OrgResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"tenantType":{"type":"string","title":"Tenanttype"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created"},"workspaceCount":{"type":"integer","title":"Workspacecount","default":0}},"type":"object","required":["id","name","tenantType"],"title":"OrgResponse"},"OrgUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Name"},"tenantType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenanttype"}},"type":"object","title":"OrgUpdate"},"OutputProcessingStatusEnum":{"type":"string","enum":["new","processing","successful","failed","retry"],"title":"OutputProcessingStatusEnum","description":"Processing status for RunRequest output."},"OutputResponse":{"properties":{"output":{"additionalProperties":true,"type":"object","title":"Output","description":"Parsed XML output as JSON"},"size_bytes":{"type":"integer","title":"Size Bytes","description":"Original file size in bytes"}},"type":"object","required":["output","size_bytes"],"title":"OutputResponse","description":"Response for output endpoint."},"OverrideRowResponse":{"properties":{"id":{"type":"integer","title":"Id"},"agentName":{"type":"string","title":"Agentname"},"sectionId":{"type":"string","title":"Sectionid"},"workspaceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspaceid"},"isPlatformDefault":{"type":"boolean","title":"Isplatformdefault"},"source":{"type":"string","enum":["ui","slack","teams","*"],"title":"Source"},"version":{"type":"integer","title":"Version"},"isLatest":{"type":"boolean","title":"Islatest"},"prompt":{"type":"string","title":"Prompt"},"lastModifiedBy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastmodifiedby"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"modifiedAt":{"type":"string","format":"date-time","title":"Modifiedat"}},"type":"object","required":["id","agentName","sectionId","isPlatformDefault","source","version","isLatest","prompt","createdAt","modifiedAt"],"title":"OverrideRowResponse"},"OwnerResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Owner user ID"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Owner's email"},"fullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fullname","description":"Owner's full name"}},"type":"object","required":["id"],"title":"OwnerResponse","description":"Schema for owner info in workspace response."},"PATCreateRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"days":{"type":"integer","maximum":180.0,"minimum":1.0,"title":"Days","default":30}},"type":"object","required":["name"],"title":"PATCreateRequest"},"PATCreateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"tokenSuffix":{"type":"string","title":"Tokensuffix"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"expiresAt":{"type":"string","format":"date-time","title":"Expiresat"},"isRevoked":{"type":"boolean","title":"Isrevoked"},"isExpired":{"type":"boolean","title":"Isexpired"},"isActive":{"type":"boolean","title":"Isactive"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastusedat"},"token":{"type":"string","title":"Token"}},"type":"object","required":["id","name","tokenSuffix","createdAt","expiresAt","isRevoked","isExpired","isActive","lastUsedAt","token"],"title":"PATCreateResponse","description":"Returned only at creation time -- includes the full token value."},"PATResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"tokenSuffix":{"type":"string","title":"Tokensuffix"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"expiresAt":{"type":"string","format":"date-time","title":"Expiresat"},"isRevoked":{"type":"boolean","title":"Isrevoked"},"isExpired":{"type":"boolean","title":"Isexpired"},"isActive":{"type":"boolean","title":"Isactive"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastusedat"}},"type":"object","required":["id","name","tokenSuffix","createdAt","expiresAt","isRevoked","isExpired","isActive","lastUsedAt"],"title":"PATResponse"},"PersonaListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/PersonaResponse"},"type":"array","title":"Results","description":"List of persona items"},"count":{"type":"integer","title":"Count"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["results","count"],"title":"PersonaListResponse","description":"Paginated list response for Persona endpoints.\n\nSubclasses PersonaListResponseV4 but overrides results to use legacy PersonaResponse items."},"PersonaListResponseV4":{"properties":{"results":{"items":{"$ref":"#/components/schemas/PersonaResponseV4"},"type":"array","title":"Results"},"count":{"type":"integer","title":"Count"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["results","count"],"title":"PersonaListResponseV4","description":"Paginated list of Personas."},"PersonaPayloadV4":{"properties":{"name":{"type":"string","title":"Name"},"fullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fullname"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"avatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatarurl"},"workspaceId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workspaceid"},"filterConfidenceThreshold":{"type":"number","title":"Filterconfidencethreshold","default":0.5},"filterIssueSelectionStrategy":{"type":"string","title":"Filterissueselectionstrategy","default":"MOST_SEVERE"},"filterCodebundleTaskTags":{"items":{"type":"string"},"type":"array","title":"Filtercodebundletasktags"},"filterStopWords":{"items":{"type":"string"},"type":"array","title":"Filterstopwords"},"filterScope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filterscope"},"searchFilters":{"additionalProperties":true,"type":"object","title":"Searchfilters"},"runConfidenceThreshold":{"type":"number","title":"Runconfidencethreshold","default":0.95},"runConfig":{"additionalProperties":true,"type":"object","title":"Runconfig"}},"type":"object","required":["name"],"title":"PersonaPayloadV4","description":"Writable subset of Persona (the body of a sync upsert).\n\nLenient base on purpose. ``user-pages/utils/resources/useAssistants.ts``\ncurrently posts nested ``filter`` / ``run`` / ``search`` objects (the\npre-flat wire shape) plus a ``...templateSpec`` spread of the workspace's\ndefault persona manifest. Flipping this class to ``V4RequestModel`` (per\nRW-944's \"extra unknown fields rejected\") would 422 every existing UI\npersona write. Tracked as a follow-up: rework the UI to use the flat\nfields produced by ``user-pages/utils/yamlMappers/persona.ts`` and then\npromote this class to ``V4RequestModel``."},"PersonaResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name","description":"Full persona name: workspace--persona-short-name"},"shortName":{"type":"string","title":"Shortname","description":"Short name (workspace prefix stripped)","default":""},"fullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fullname","description":"Human-readable display name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"avatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatarurl","description":"Avatar image URL"},"workspace":{"type":"integer","title":"Workspace","description":"Parent workspace ID"},"filterConfidenceThreshold":{"type":"number","title":"Filterconfidencethreshold","description":"Confidence threshold for filtering results","default":0.5},"filterIssueSelectionStrategy":{"type":"string","title":"Filterissueselectionstrategy","description":"Strategy for selecting issues","default":"MOST_SEVERE"},"filterCodebundleTaskTags":{"items":{"type":"string"},"type":"array","title":"Filtercodebundletasktags","description":"Task tags to filter code bundles"},"filterStopWords":{"items":{"type":"string"},"type":"array","title":"Filterstopwords","description":"Words to remove from search queries"},"filterScope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filterscope","description":"Scope filter for results"},"searchFilters":{"additionalProperties":true,"type":"object","title":"Searchfilters","description":"Search filter operators for vector search"},"runConfidenceThreshold":{"type":"number","title":"Runconfidencethreshold","description":"Confidence threshold for automatic runs","default":0.95},"runConfig":{"additionalProperties":true,"type":"object","title":"Runconfig","description":"Run configuration (allow/disallow/budget settings)"},"created":{"title":"Created","description":"Creation timestamp"},"modified":{"title":"Modified","description":"Last modification timestamp"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"Return spec dict matching Django's CoreModelSerializer structure.","readOnly":true},"status":{"additionalProperties":true,"type":"object","title":"Status","description":"Return empty status dict matching Django's CoreModelSerializer structure.","readOnly":true}},"type":"object","required":["id","name","workspace","created","modified","spec","status"],"title":"PersonaResponse","description":"Persona response schema for API responses (legacy V1/V3 wire shape).\n\nSubclasses PersonaResponseV4 (flat V4 fields) and layers on:\n - Legacy wire keys: ``workspace`` (was ``workspaceId``),\n ``created`` (was ``createdAt``), ``modified`` (was ``modifiedAt``)\n - camelCase aliases for filter/run fields\n - Computed ``spec`` and ``status`` for Django-era consumers\n\nSunset path: when external consumers fully migrate to /api/v4, delete this subclass."},"PersonaResponseV4":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name","description":"Full persona name: workspace--persona-short-name"},"shortName":{"type":"string","title":"Shortname"},"fullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fullname"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"avatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatarurl"},"workspaceId":{"type":"integer","title":"Workspaceid"},"filterConfidenceThreshold":{"type":"number","title":"Filterconfidencethreshold","default":0.5},"filterIssueSelectionStrategy":{"type":"string","title":"Filterissueselectionstrategy","default":"MOST_SEVERE"},"filterCodebundleTaskTags":{"items":{"type":"string"},"type":"array","title":"Filtercodebundletasktags"},"filterStopWords":{"items":{"type":"string"},"type":"array","title":"Filterstopwords"},"filterScope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filterscope"},"searchFilters":{"additionalProperties":true,"type":"object","title":"Searchfilters"},"runConfidenceThreshold":{"type":"number","title":"Runconfidencethreshold","default":0.95},"runConfig":{"additionalProperties":true,"type":"object","title":"Runconfig"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"modifiedAt":{"type":"string","format":"date-time","title":"Modifiedat"}},"type":"object","required":["id","name","shortName","workspaceId","createdAt","modifiedAt"],"title":"PersonaResponseV4","description":"Flat-shape Persona detail response."},"PersonaSyncRequestV4":{"properties":{"payload":{"$ref":"#/components/schemas/PersonaPayloadV4"},"lastSyncedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastsyncedat"}},"additionalProperties":false,"type":"object","required":["payload"],"title":"PersonaSyncRequestV4","description":"Body of POST /api/v4/workspaces/{ws}/personas/sync-typed.\n\n``modified_by`` is not accepted: the server derives it from the JWT via\n``get_effective_modifier``. Unknown keys (including ``modified_by``)\nraise 422 because ``V4RequestModel`` sets ``extra=\"forbid\"``."},"PreviewArtifactDeliveriesRequest":{"properties":{"artifact_markdown":{"type":"string","title":"Artifact Markdown","default":""},"export_url_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Export Url Path","description":"Relative chat-export URL the executions list returned for this row (e.g. '/workspace/foo/chat-export/?view=pro'). PAPI joins it with WEB_BASE_URL for the absolute 'View full session' link in the preview. Pass null to suppress the link entirely."},"sink_configs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Sink Configs","description":"Optional snapshot of the sinks targeted by THIS run, taken at fire time. When provided, the preview renders through these instead of the command's current sinks — so admins see what was actually delivered (or attempted) for the historical run, not what would be delivered now. When omitted, falls back to the command's current sink_configs."}},"type":"object","title":"PreviewArtifactDeliveriesRequest","description":"Render a saved execution's artifact through its command's sinks\nin dispatcher dry-run mode — no email is sent, no slack message\nposted. Returns per-sink rendered payloads so admins can inspect\nexactly what was (or would-be) delivered for a past run."},"PreviewResponse":{"properties":{"agentName":{"type":"string","title":"Agentname"},"workspaceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspaceid"},"source":{"type":"string","enum":["ui","slack","teams","*"],"title":"Source"},"sections":{"items":{"$ref":"#/components/schemas/PreviewSectionResponse"},"type":"array","title":"Sections","default":[]},"assembled":{"type":"string","title":"Assembled"}},"type":"object","required":["agentName","source","assembled"],"title":"PreviewResponse"},"PreviewSectionResponse":{"properties":{"sectionId":{"type":"string","title":"Sectionid"},"title":{"type":"string","title":"Title"},"text":{"type":"string","title":"Text"},"origin":{"type":"string","enum":["workspace_source","workspace_any","platform_source","platform_any","code_default"],"title":"Origin"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"}},"type":"object","required":["sectionId","title","text","origin"],"title":"PreviewSectionResponse"},"ProcessingStatusResponse":{"properties":{"status":{"$ref":"#/components/schemas/OutputProcessingStatusEnum","description":"Processing status"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"When processing completed"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"},"retry_count":{"type":"integer","title":"Retry Count","description":"Number of retry attempts","default":0}},"type":"object","required":["status"],"title":"ProcessingStatusResponse","description":"Schema for RunRequest output processing status."},"ProfileResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user":{"type":"integer","title":"User"},"publicEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publicemail"},"publicFullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publicfullname"},"publicLinkedinUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publiclinkedinurl"},"publicAvatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publicavatarurl"},"publicBio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publicbio"},"optOutPublicGroup":{"type":"boolean","title":"Optoutpublicgroup","default":false}},"type":"object","required":["id","user"],"title":"ProfileResponse","description":"Profile response matching Django's ProfileSerializer (all fields, camelCase)."},"ProfileUpdateRequest":{"properties":{"publicEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publicemail"},"publicFullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publicfullname"},"publicLinkedinUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publiclinkedinurl"},"publicAvatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publicavatarurl"},"publicBio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publicbio"},"optOutPublicGroup":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Optoutpublicgroup"}},"type":"object","title":"ProfileUpdateRequest","description":"Profile update request — all fields optional for partial updates."},"ReconcileTasksResponse":{"properties":{"workspace":{"type":"string","title":"Workspace"},"slx_count":{"type":"integer","title":"Slx Count"},"task_upserted":{"type":"integer","title":"Task Upserted"},"task_soft_deleted":{"type":"integer","title":"Task Soft Deleted"}},"type":"object","required":["workspace","slx_count","task_upserted","task_soft_deleted"],"title":"ReconcileTasksResponse","description":"Response for the dev-only slx_tasks reconcile trigger."},"RegisterRequest":{"properties":{"username":{"anyOf":[{"type":"string","maxLength":150,"minLength":3},{"type":"null"}],"title":"Username"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"confirm_password":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Confirm Password"},"first_name":{"type":"string","maxLength":100,"title":"First Name","default":""},"last_name":{"type":"string","maxLength":100,"title":"Last Name","default":""}},"type":"object","required":["email","password"],"title":"RegisterRequest","description":"User registration request."},"RegisterResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","title":"Username"},"email":{"type":"string","title":"Email"},"message":{"type":"string","title":"Message"}},"type":"object","required":["id","username","email","message"],"title":"RegisterResponse","description":"User registration response."},"ReprovisionWorkspaceInfraResponse":{"properties":{"workspace":{"type":"string","title":"Workspace"},"vault_approle":{"type":"string","title":"Vault Approle"},"runner_certs":{"type":"string","title":"Runner Certs"}},"type":"object","required":["workspace","vault_approle","runner_certs"],"title":"ReprovisionWorkspaceInfraResponse","description":"Response from reprovisioning workspace runner infrastructure."},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"password":{"anyOf":[{"type":"string","maxLength":128,"minLength":8},{"type":"null"}],"title":"Password"},"new_password":{"anyOf":[{"type":"string","maxLength":128,"minLength":8},{"type":"null"}],"title":"New Password"},"confirm_password":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Confirm Password"}},"type":"object","required":["token"],"title":"ResetPasswordRequest","description":"Password reset request.\n\nAccepts both 'password' (frontend sends this) and 'new_password' for\nbackward compatibility."},"ResetServiceAccountRequest":{"properties":{"password":{"type":"string","minLength":8,"title":"Password","description":"New password for the service account"}},"type":"object","required":["password"],"title":"ResetServiceAccountRequest","description":"Request to reset a workspace service account password."},"ResetServiceAccountResponse":{"properties":{"username":{"type":"string","title":"Username"},"message":{"type":"string","title":"Message","default":"Service account password reset successfully"}},"type":"object","required":["username"],"title":"ResetServiceAccountResponse","description":"Response from resetting a service account."},"ResolvedSectionResponse":{"properties":{"sectionId":{"type":"string","title":"Sectionid"},"categoryId":{"type":"string","title":"Categoryid"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"safetyCritical":{"type":"boolean","title":"Safetycritical"},"recommendedPerSource":{"type":"boolean","title":"Recommendedpersource"},"placeholdersRequired":{"items":{"type":"string"},"type":"array","title":"Placeholdersrequired","default":[]},"placeholdersAllowed":{"items":{"type":"string"},"type":"array","title":"Placeholdersallowed","default":[]},"defaultText":{"type":"string","title":"Defaulttext"},"resolvedText":{"type":"string","title":"Resolvedtext"},"resolvedOrigin":{"type":"string","enum":["workspace_source","workspace_any","platform_source","platform_any","code_default"],"title":"Resolvedorigin"},"resolvedVersion":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resolvedversion"},"resolvedModifiedBy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolvedmodifiedby"},"resolvedModifiedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolvedmodifiedat"}},"type":"object","required":["sectionId","categoryId","title","description","safetyCritical","recommendedPerSource","defaultText","resolvedText","resolvedOrigin"],"title":"ResolvedSectionResponse"},"ResourcePathsResponseV4":{"properties":{"resourcePaths":{"items":{"type":"string"},"type":"array","title":"Resourcepaths"}},"type":"object","required":["resourcePaths"],"title":"ResourcePathsResponseV4"},"ResourceScrubberConfigEnum":{"type":"string","enum":["SCRUB_ALL_RESOURCE_LABELS","SCRUB_ALL_EXCEPT_RESOURCE_NAME","SCRUB_NONE"],"title":"ResourceScrubberConfigEnum","description":"Configuration for resource scrubbing before LLM calls."},"ResourceSelectorV4":{"properties":{"matchTags":{"additionalProperties":{"type":"string"},"type":"object","title":"Matchtags","description":"Tag key/value equalities, ANDed together"}},"additionalProperties":false,"type":"object","title":"ResourceSelectorV4","description":"A tag match rule (Tier-2). ``matchTags`` is an AND of equality.\n\n(``matchExpressions`` — set-based operators — is a planned follow-on; only\n``matchTags`` is supported today.)"},"RuleCreate":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name"},"rule_content":{"type":"string","title":"Rule Content"},"scope_type":{"type":"string","title":"Scope Type"},"scope_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Id"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","rule_content","scope_type"],"title":"RuleCreate","description":"Create a chat rule."},"RuleUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"rule_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule Content"},"scope_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Type"},"scope_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Id"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"RuleUpdate","description":"Update a chat rule."},"RunRequestCreate":{"properties":{"runsession_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Runsession Id","description":"Parent RunSession ID (optional)"},"task_titles":{"type":"string","title":"Task Titles","description":"Task titles to run ('||' separated, '*' for all)","default":"*"},"request_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Request Time","description":"When to run. None = staged (wait for /start), omit = now"},"depends_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Depends On","description":"Comma-separated list of RunRequest IDs to wait for"},"memo":{"additionalProperties":true,"type":"object","title":"Memo","description":"Arbitrary JSON for user storage"},"persona_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Persona Id","description":"Persona ID if run by AI automation"},"from_run_request_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"From Run Request Id","description":"ID of RunRequest that spawned this one"},"from_issue_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"From Issue Id","description":"Issue occurrence ID that triggered this run request"},"from_search_query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Search Query","description":"Search query that triggered this run"},"from_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"From Score","description":"Confidence score from search or persona action"},"from_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"From Context","description":"Additional context about the origin"}},"type":"object","title":"RunRequestCreate","description":"Schema for creating a new RunRequest."},"RunRequestInResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Run request ID"},"slxShortName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slxshortname","description":"SLX short name"},"slxName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slxname","description":"Full SLX name"},"slxAlias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slxalias","description":"SLX display alias (may be null)"},"resourcePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resourcepath","description":"Kubernetes resource path from ResourceTree"},"tasksetUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tasksetuuid","description":"Task set UUID"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Run request status"},"issues":{"items":{"$ref":"#/components/schemas/RunRequestIssue"},"type":"array","title":"Issues","description":"Issues raised by this run request"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created","description":"Creation timestamp"},"modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified","description":"Last update timestamp"},"requester":{"type":"string","title":"Requester","description":"Requester user email","default":""},"personaShortName":{"type":"string","title":"Personashortname","description":"Persona short name","default":""},"taskTitles":{"type":"string","title":"Tasktitles","description":"Task titles (|| separated)","default":""},"resolvedTaskTitles":{"type":"string","title":"Resolvedtasktitles","description":"Resolved task titles (|| separated)","default":""},"dependsOn":{"type":"string","title":"Dependson","description":"Dependency chain (comma-separated IDs)","default":""},"robotLogFile":{"type":"string","title":"Robotlogfile","description":"Robot log file URL","default":""},"robotStdoutFile":{"type":"string","title":"Robotstdoutfile","description":"Robot stdout file URL","default":""},"reportFile":{"type":"string","title":"Reportfile","description":"Report file URL","default":""},"issuesFile":{"type":"string","title":"Issuesfile","description":"Issues file URL","default":""},"memo":{"items":{},"type":"array","title":"Memo","description":"Memo messages/summaries"},"requestTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Requesttime","description":"Request dispatch time"},"responseTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Responsetime","description":"Response received time"},"passedTitles":{"type":"string","title":"Passedtitles","description":"Passed task titles (|| separated)","default":""},"failedTitles":{"type":"string","title":"Failedtitles","description":"Failed task titles (|| separated)","default":""},"skippedTitles":{"type":"string","title":"Skippedtitles","description":"Skipped task titles (|| separated)","default":""},"errors":{"anyOf":[{"items":{},"type":"array"},{"type":"string"},{"additionalProperties":true,"type":"object"}],"title":"Errors","description":"Error details"},"fromSearchQuery":{"type":"string","title":"Fromsearchquery","description":"Search query that led to this run","default":""},"fromScore":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fromscore","description":"Confidence score from search"},"fromContext":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Fromcontext","description":"Additional context data"},"runsession":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Runsession","description":"RunSession FK ID"},"runbook":{"type":"integer","title":"Runbook","description":"Runbook FK ID","default":0},"persona":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Persona","description":"Full persona/assistant object"},"fromRunRequest":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromrunrequest","description":"Parent run request ID"},"fromIssue":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromissue","description":"Source issue occurrence ID"},"fromAlert":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromalert","description":"Source SLO alert ID"},"fromSliAlert":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromslialert","description":"Source SLI alert ID"}},"type":"object","required":["id"],"title":"RunRequestInResponse","description":"Schema for run request within a run session response."},"RunRequestInSession":{"properties":{"slxName":{"type":"string","title":"Slxname","description":"Full SLX name to execute (workspace--slx-short-name)"},"taskTitles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tasktitles","description":"Specific task titles to run (None = all tasks)"},"memo":{"additionalProperties":true,"type":"object","title":"Memo","description":"Arbitrary JSON for user storage"},"fromSearchQuery":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fromsearchquery","description":"Search query that led to this run request"},"fromIssue":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromissue","description":"Issue occurrence ID that triggered this run request"},"fromRunRequest":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromrunrequest","description":"ID of RunRequest that spawned this one"},"fromSliAlert":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromslialert","description":"Source SLI alert ID"},"fromSloAlert":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromsloalert","description":"Source SLO alert ID"},"force":{"type":"boolean","title":"Force","description":"Skip task-title deduplication (re-run even if already executed)","default":false},"runtimeVarOverrides":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Runtimevaroverrides","description":"Values for runtime variables declared on this SLX's runbook"}},"type":"object","required":["slxName"],"title":"RunRequestInSession","description":"Single RunRequest within a RunSession creation."},"RunRequestIssue":{"properties":{"occurrenceId":{"type":"integer","title":"Occurrenceid","description":"Issue occurrence ID"},"issueId":{"type":"integer","title":"Issueid","description":"Parent issue ID"},"taskTitle":{"type":"string","title":"Tasktitle","description":"Task title from the issue"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Issue title"},"severity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Severity","description":"Issue severity (1-4)"},"closed":{"type":"boolean","title":"Closed","description":"Whether the issue is closed","default":false},"observedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Observedat","description":"When the issue was observed"},"details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Details","description":"Issue occurrence details"},"nextSteps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextsteps","description":"Recommended next steps"},"expected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected","description":"Expected result"},"actual":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual","description":"Actual result"},"reproduceHint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reproducehint","description":"Hint for reproducing the issue"},"additionalContext":{"additionalProperties":true,"type":"object","title":"Additionalcontext","description":"Additional context data"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created","description":"Occurrence creation timestamp"},"modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified","description":"Occurrence modification timestamp"}},"type":"object","required":["occurrenceId","issueId","taskTitle"],"title":"RunRequestIssue","description":"Schema for issue occurrence within a run request."},"RunRequestIssuesResponse":{"properties":{"issues":{"items":{"$ref":"#/components/schemas/IssueReference"},"type":"array","title":"Issues","description":"Issues from this RunRequest"},"total":{"type":"integer","title":"Total","description":"Total issue count"}},"type":"object","required":["issues","total"],"title":"RunRequestIssuesResponse","description":"Response for issues endpoint."},"RunRequestListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RunRequestResponse"},"type":"array","title":"Results","description":"List of RunRequests"},"count":{"type":"integer","title":"Count","description":"Total count matching filters"},"limit":{"type":"integer","title":"Limit","description":"Maximum items per page"},"offset":{"type":"integer","title":"Offset","description":"Number of items skipped"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Next page URL"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous","description":"Previous page URL"}},"type":"object","required":["results","count","limit","offset"],"title":"RunRequestListResponse","description":"Paginated list response for RunRequest endpoints."},"RunRequestRecordResponse":{"properties":{"passed_titles":{"type":"string","title":"Passed Titles","description":"Pipe-separated list of passed task titles","default":""},"failed_titles":{"type":"string","title":"Failed Titles","description":"Pipe-separated list of failed task titles","default":""},"skipped_titles":{"type":"string","title":"Skipped Titles","description":"Pipe-separated list of skipped task titles","default":""},"errors":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"}],"title":"Errors","description":"Task errors (dict or pipe-separated string)"},"robot_log_file":{"type":"string","title":"Robot Log File","description":"URL to robot log file","default":""},"robot_stdout_file":{"type":"string","title":"Robot Stdout File","description":"URL to robot stdout file","default":""},"report_file":{"type":"string","title":"Report File","description":"URL to report file","default":""},"issues_file":{"type":"string","title":"Issues File","description":"URL to issues file","default":""},"robot_output":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Robot Output","description":"Raw robot output XML (legacy format)"}},"type":"object","title":"RunRequestRecordResponse","description":"Schema for recording a run response (runner callback)."},"RunRequestResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique identifier"},"tasksetUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tasksetuuid","description":"UUID from runner-control for status tracking"},"runsessionId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Runsessionid","description":"Parent RunSession ID"},"slxShortName":{"type":"string","title":"Slxshortname","description":"SLX short name being executed"},"requesterId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Requesterid","description":"User who requested this run"},"personaId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Personaid","description":"Persona ID if AI-initiated"},"taskTitles":{"type":"string","title":"Tasktitles","description":"Task titles to run"},"dependsOn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dependson","description":"Comma-separated RunRequest IDs to wait for"},"requestTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Requesttime","description":"When the run was requested (None = staged)"},"responseTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Responsetime","description":"When the run completed (None = still running)"},"passedTitles":{"type":"string","title":"Passedtitles","description":"Passed task titles","default":""},"failedTitles":{"type":"string","title":"Failedtitles","description":"Failed task titles","default":""},"skippedTitles":{"type":"string","title":"Skippedtitles","description":"Skipped task titles","default":""},"errors":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"}],"title":"Errors","description":"Task errors"},"robotLogFile":{"type":"string","title":"Robotlogfile","description":"URL to robot log","default":""},"robotStdoutFile":{"type":"string","title":"Robotstdoutfile","description":"URL to stdout","default":""},"reportFile":{"type":"string","title":"Reportfile","description":"URL to report","default":""},"issuesFile":{"type":"string","title":"Issuesfile","description":"URL to issues","default":""},"memo":{"anyOf":[{"items":{},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Memo","description":"Arbitrary JSON"},"fromRunRequestId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromrunrequestid"},"fromIssueId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fromissueid"},"fromSearchQuery":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fromsearchquery"},"fromScore":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fromscore"},"fromContext":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Fromcontext"},"processingStatus":{"anyOf":[{"$ref":"#/components/schemas/ProcessingStatusResponse"},{"type":"null"}],"description":"Output processing status"},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last update timestamp"},"slxName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slxname","description":"Full SLX name"},"isStaged":{"type":"boolean","title":"Isstaged","description":"True if request_time is None (waiting for /start)","default":false},"isPending":{"type":"boolean","title":"Ispending","description":"True if running (request_time set, response_time None)","default":false},"isCompleted":{"type":"boolean","title":"Iscompleted","description":"True if completed (response_time set)","default":false}},"type":"object","required":["id","slxShortName","taskTitles","created","modified"],"title":"RunRequestResponse","description":"Full RunRequest response schema for API responses."},"RunSessionAlertResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"severity":{"type":"string","title":"Severity"},"status":{"type":"string","title":"Status"},"providerType":{"type":"string","title":"Providertype"},"sourceStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourcestatus"},"receivedAt":{"type":"string","format":"date-time","title":"Receivedat"},"event":{"additionalProperties":true,"type":"object","title":"Event"}},"type":"object","required":["id","name","severity","status","providerType","receivedAt","event"],"title":"RunSessionAlertResponse","description":"Single alert in RS alert detail view."},"RunSessionAlertsListResponse":{"properties":{"alerts":{"items":{"$ref":"#/components/schemas/RunSessionAlertResponse"},"type":"array","title":"Alerts"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["alerts","count"],"title":"RunSessionAlertsListResponse","description":"Response for GET /runsessions/{rs_id}/alerts."},"RunSessionCount":{"properties":{"date":{"type":"string","title":"Date","description":"ISO date string"},"count":{"type":"integer","title":"Count","description":"Number of run sessions"}},"type":"object","required":["date","count"],"title":"RunSessionCount","description":"Schema for run session count by date."},"RunSessionCreate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Unique slug identifier for the session"},"notes":{"type":"string","title":"Notes","description":"User-provided session notes","default":"your session notes here"},"source":{"type":"string","title":"Source","description":"Origin of the session (e.g., 'directSlx', 'sloAlert', 'webhook')","default":""},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID this session belongs to"},"persona_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Persona Id","description":"Optional AI persona ID for automated runs"},"ttl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ttl","description":"Time-to-live for session (e.g., '20m', '1h', '3d')"},"generate_name":{"type":"boolean","title":"Generate Name","description":"Auto-generate a unique name if name not provided","default":true}},"type":"object","required":["workspace_id"],"title":"RunSessionCreate","description":"Schema for creating a run session."},"RunSessionCreateWithRequests":{"properties":{"source":{"type":"string","enum":["direct","slo_alert","sli_alert","webhook","search","alert_group"],"title":"Source","description":"Origin of the session - determines default deduplication behavior","default":"direct"},"generateName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generatename","description":"Session name (auto-generated if omitted)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Session name (alternative to generateName)"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"User-provided session notes"},"personaName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Personaname","description":"Persona full name (workspace--persona-short-name)"},"persona_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Persona Id","description":"Persona ID (alternative to personaName)"},"alertId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Alertid","description":"Alert ID - required for slo_alert and sli_alert sources"},"webhookId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Webhookid","description":"Webhook ID - required for webhook source"},"searchQuery":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Searchquery","description":"Search query - required for search source"},"aliasKey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aliaskey","description":"Custom alias key (e.g. 'PagerDuty-Incident-ID')"},"aliasValue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aliasvalue","description":"Custom alias value (e.g. 'P12345')"},"skipNextStepsAnalysis":{"type":"boolean","title":"Skipnextstepsanalysis","description":"When true, persona will not create follow-up RunRequests from issue next steps","default":false},"dedupe":{"anyOf":[{"$ref":"#/components/schemas/DedupeConfig"},{"type":"null"}],"description":"Override default deduplication config for this source"},"runRequests":{"items":{"$ref":"#/components/schemas/RunRequestInSession"},"type":"array","minItems":1,"title":"Runrequests","description":"RunRequests to create within this session"}},"type":"object","required":["runRequests"],"title":"RunSessionCreateWithRequests","description":"Schema for creating a RunSession with RunRequests atomically.\n\nThis is the new preferred API for RunSession creation that:\n- Supports atomic RunRequest creation\n- Supports deduplication configuration\n- Accepts camelCase field names from frontend"},"RunSessionListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RunSessionResponse"},"type":"array","title":"Results","description":"List of RunSessions"},"count":{"type":"integer","title":"Count","description":"Total count matching filters"},"limit":{"type":"integer","title":"Limit","description":"Maximum items per page"},"offset":{"type":"integer","title":"Offset","description":"Number of items skipped"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Next page URL"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous","description":"Previous page URL"}},"type":"object","required":["results","count","limit","offset"],"title":"RunSessionListResponse","description":"Schema for paginated run session list response."},"RunSessionResponse":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Unique slug identifier for the session"},"notes":{"type":"string","title":"Notes","description":"User-provided session notes","default":"your session notes here"},"source":{"type":"string","title":"Source","description":"Origin of the session (e.g., 'directSlx', 'sloAlert', 'webhook')","default":""},"id":{"type":"integer","title":"Id","description":"Unique identifier"},"workspaceId":{"type":"integer","title":"Workspaceid","description":"Parent workspace ID"},"personaId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Personaid","description":"AI persona ID if assigned"},"persona":{"anyOf":[{"$ref":"#/components/schemas/PersonaResponse"},{"type":"null"}],"description":"Full persona object if assigned"},"personaRunStatus":{"additionalProperties":true,"type":"object","title":"Personarunstatus","description":"Persona budget and state tracking"},"active":{"type":"boolean","title":"Active","description":"Whether session accepts new RunRequests"},"escalated":{"type":"boolean","title":"Escalated","description":"Whether session has been escalated"},"activeUntil":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Activeuntil","description":"Active window end — session accepts RunRequests until this time"},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last update timestamp"},"personaShortName":{"type":"string","title":"Personashortname","description":"Short name of the assigned persona","default":""},"workspaceName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspacename","description":"Workspace name for display"},"requestCount":{"type":"integer","title":"Requestcount","description":"Number of RunRequests in this session","default":0},"hasFailures":{"type":"boolean","title":"Hasfailures","description":"Whether any RunRequest has failures","default":false},"workspace":{"type":"integer","title":"Workspace","description":"Workspace ID (Django FK parity)","default":0},"runRequests":{"items":{"$ref":"#/components/schemas/RunRequestInResponse"},"type":"array","title":"Runrequests","description":"Run requests in this session with their issues"},"eol":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Eol","readOnly":true}},"type":"object","required":["id","workspaceId","active","escalated","created","modified","eol"],"title":"RunSessionResponse","description":"Schema for run session response with all fields.\n\nUses alias_generator=to_camel so JSON output uses camelCase keys\nmatching the Django DRF convention the frontend expects."},"RunSessionSearchItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"source":{"type":"string","title":"Source","default":""},"active":{"type":"boolean","title":"Active","default":true},"activeUntil":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Activeuntil"},"created":{"type":"string","format":"date-time","title":"Created"},"modified":{"type":"string","format":"date-time","title":"Modified"},"workspaceId":{"type":"integer","title":"Workspaceid"},"workspaceName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspacename"},"escalated":{"type":"boolean","title":"Escalated","default":false},"notes":{"type":"string","title":"Notes","default":""},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"resourcePaths":{"items":{"type":"string"},"type":"array","title":"Resourcepaths"},"alertCount":{"type":"integer","title":"Alertcount","default":0},"alertSources":{"items":{"type":"string"},"type":"array","title":"Alertsources"},"newIssues":{"type":"integer","title":"Newissues","default":0},"occurrenceCount":{"type":"integer","title":"Occurrencecount","default":0},"closedIssues":{"type":"integer","title":"Closedissues","default":0},"eol":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Eol","readOnly":true}},"type":"object","required":["id","created","modified","workspaceId","eol"],"title":"RunSessionSearchItem","description":"Slim RunSession for list view — no nested run_requests."},"RunSessionSearchRequest":{"properties":{"timeStart":{"type":"string","format":"date-time","title":"Timestart"},"timeEnd":{"type":"string","format":"date-time","title":"Timeend"},"resourcePaths":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resourcepaths"},"sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sources"},"sortOrder":{"type":"string","enum":["asc","desc"],"title":"Sortorder","default":"desc"},"page":{"type":"integer","minimum":1.0,"title":"Page","default":1},"pageSize":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Pagesize","default":20}},"type":"object","required":["timeStart","timeEnd"],"title":"RunSessionSearchRequest","description":"Request body for POST /workspaces/{ws}/runsessions/search."},"RunSessionSearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RunSessionSearchItem"},"type":"array","title":"Results"},"count":{"type":"integer","title":"Count"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["results","count"],"title":"RunSessionSearchResponse","description":"Paginated search response."},"RunSessionUpdate":{"properties":{"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"Updated session notes"},"escalated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Escalated","description":"Set escalation status"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active","description":"Set active status"},"persona_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Persona Id","description":"Assign or change persona by ID"},"personaName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Personaname","description":"Assign or change persona by full name (workspace--persona-short-name)"},"persona_run_status":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Persona Run Status","description":"Update persona run status/budget"}},"type":"object","title":"RunSessionUpdate","description":"Schema for updating a run session (partial update)."},"RunbookInWorkspace":{"properties":{"id":{"type":"integer","title":"Id","description":"Runbook ID"},"name":{"type":"string","title":"Name","description":"Runbook name (same as SLX full name)"},"slx":{"type":"integer","title":"Slx","description":"Parent SLX ID"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"Runbook spec (codeBundle, location, etc.)"},"tasks":{"items":{"$ref":"#/components/schemas/RunbookTaskInWorkspace"},"type":"array","title":"Tasks","description":"Runbook tasks"},"repo":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repo","description":"Repository FK ID"}},"type":"object","required":["id","name","slx"],"title":"RunbookInWorkspace","description":"Runbook schema for workspace response with tasks."},"RunbookPayloadV4":{"properties":{"slxId":{"type":"integer","title":"Slxid"},"name":{"type":"string","title":"Name","default":""},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"runnerUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runneruuid"},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref"},"codeBundlePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepath"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided"},"secretsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Secretsprovided"},"runtimeVarsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Runtimevarsprovided"},"requirements":{"additionalProperties":true,"type":"object","title":"Requirements"},"lookbackWindow":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lookbackwindow"}},"additionalProperties":false,"type":"object","required":["slxId"],"title":"RunbookPayloadV4","description":"Writable subset of Runbook (the body of a sync upsert)."},"RunbookResponseV4":{"properties":{"id":{"type":"integer","title":"Id"},"slxId":{"type":"integer","title":"Slxid"},"name":{"type":"string","title":"Name","default":""},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"runnerUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runneruuid"},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref"},"codeBundlePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepath"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided"},"secretsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Secretsprovided"},"runtimeVarsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Runtimevarsprovided"},"requirements":{"additionalProperties":true,"type":"object","title":"Requirements"},"lookbackWindow":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lookbackwindow"},"resolvedTasks":{"items":{"type":"string"},"type":"array","title":"Resolvedtasks"},"taskDetails":{"additionalProperties":true,"type":"object","title":"Taskdetails"},"lastRunCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastruncode"},"lastRunMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastrunmessage"},"lastRunAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastrunat"},"tasks":{"items":{"$ref":"#/components/schemas/RunbookTaskV4"},"type":"array","title":"Tasks"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"modifiedAt":{"type":"string","format":"date-time","title":"Modifiedat"}},"type":"object","required":["id","slxId","createdAt","modifiedAt"],"title":"RunbookResponseV4","description":"Flat-shape Runbook detail response."},"RunbookSyncRequestV4":{"properties":{"payload":{"$ref":"#/components/schemas/RunbookPayloadV4"},"lastSyncedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastsyncedat"}},"additionalProperties":false,"type":"object","required":["payload"],"title":"RunbookSyncRequestV4","description":"Body of POST /api/v4/workspaces/{ws}/runbooks/sync-typed.\n\n``modified_by`` is not accepted: the server derives it from the JWT via\n``get_effective_modifier``. Unknown keys (including ``modified_by``)\nraise 422 because ``V4RequestModel`` sets ``extra=\"forbid\"``."},"RunbookTaskInWorkspace":{"properties":{"name":{"type":"string","title":"Name","description":"Resolved task display name"},"value":{"type":"string","title":"Value","description":"Original task identifier"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Task tags"},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"Stable platform-owned task id (slx_tasks.id); null until reconciled"}},"type":"object","required":["name","value"],"title":"RunbookTaskInWorkspace","description":"Individual task in a runbook for workspace response."},"RunbookTaskResponse":{"properties":{"name":{"type":"string","title":"Name","description":"Resolved task display name"},"value":{"type":"string","title":"Value","description":"Original task identifier"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Task tags"},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"Stable platform-owned task id (slx_tasks.id); null until reconciled"}},"type":"object","required":["name","value"],"title":"RunbookTaskResponse","description":"Individual task in a runbook."},"RunbookTaskV4":{"properties":{"name":{"type":"string","title":"Name","description":"Resolved task display name"},"value":{"type":"string","title":"Value","description":"Original task identifier"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Task tags"}},"type":"object","required":["name","value"],"title":"RunbookTaskV4","description":"Individual task in a runbook (V4 wire shape)."},"RunnerListResponse":{"properties":{"count":{"type":"integer","title":"Count","description":"Total count of runners"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"URL to next page"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous","description":"URL to previous page"},"results":{"items":{"$ref":"#/components/schemas/RunnerResponse"},"type":"array","title":"Results","description":"List of runners"}},"type":"object","required":["count","results"],"title":"RunnerListResponse","description":"DRF-style paginated response for Runner list endpoint."},"RunnerRegisterRequest":{"properties":{"organization":{"type":"string","title":"Organization","default":""},"workspace":{"type":"string","title":"Workspace","default":""},"runner":{"type":"string","title":"Runner","default":""}},"type":"object","title":"RunnerRegisterRequest","description":"Request body for runner registration endpoint."},"RunnerRegisterResponse":{"properties":{"runner":{"type":"string","title":"Runner","default":""},"runnerUUID":{"type":"string","title":"Runneruuid","default":""}},"type":"object","title":"RunnerRegisterResponse","description":"Response for runner registration endpoint."},"RunnerResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique identifier"},"runner_uuid":{"type":"string","title":"Runner Uuid","description":"Stable UUID identifier for this runner"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Human-readable runner name"},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name","description":"Associated workspace name"},"last_heartbeat":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Heartbeat","description":"Last heartbeat timestamp"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"modified_at":{"type":"string","format":"date-time","title":"Modified At","description":"Last modification timestamp"}},"type":"object","required":["id","runner_uuid","created_at","modified_at"],"title":"RunnerResponse","description":"Runner response schema for API responses."},"RunnerStatusResponse":{"properties":{"taskset_uuid":{"type":"string","title":"Taskset Uuid","description":"TaskSet UUID"},"status":{"type":"string","title":"Status","description":"Runner status"},"details":{"additionalProperties":true,"type":"object","title":"Details","description":"Additional details"}},"type":"object","required":["taskset_uuid","status"],"title":"RunnerStatusResponse","description":"Response for runner status query."},"RunnerStatusUpdateRequest":{"properties":{"organization":{"type":"string","title":"Organization","default":""},"workspace":{"type":"string","title":"Workspace","default":""},"runner":{"type":"string","title":"Runner","default":""},"runnerUUID":{"type":"string","title":"Runneruuid","default":""},"runnerStatus":{"additionalProperties":true,"type":"object","title":"Runnerstatus","default":{}}},"type":"object","title":"RunnerStatusUpdateRequest","description":"Request body for runner status update endpoint."},"SATokenResponse":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"SATokenResponse","description":"Response containing a service account token."},"SLIEnvResponse":{"properties":{"runner":{"type":"string","title":"Runner","default":""},"runnerUUID":{"type":"string","title":"Runneruuid","default":""},"version":{"type":"string","title":"Version","default":""},"platform":{"additionalProperties":{"type":"string"},"type":"object","title":"Platform"},"configProvided":{"additionalProperties":{"type":"string"},"type":"object","title":"Configprovided"},"secretsProvided":{"additionalProperties":{"type":"string"},"type":"object","title":"Secretsprovided"},"locationServicesProvided":{"additionalProperties":{"type":"string"},"type":"object","title":"Locationservicesprovided"},"codeBundleReference":{"$ref":"#/components/schemas/CodeBundleReference"}},"type":"object","title":"SLIEnvResponse","description":"SLI environment response matching Go SLIEnv struct."},"SearchScopeGroup":{"properties":{"name":{"type":"string","title":"Name"},"firingAlerts":{"type":"boolean","title":"Firingalerts","default":false},"slxs":{"items":{"type":"string"},"type":"array","title":"Slxs"}},"type":"object","required":["name"],"title":"SearchScopeGroup","description":"SLX group in search scope."},"SearchScopeResponse":{"properties":{"slxGroups":{"items":{"$ref":"#/components/schemas/SearchScopeGroup"},"type":"array","title":"Slxgroups"},"slxSubGroups":{"items":{"$ref":"#/components/schemas/SearchScopeGroup"},"type":"array","title":"Slxsubgroups"},"slxs":{"items":{"$ref":"#/components/schemas/SearchScopeSlx"},"type":"array","title":"Slxs"}},"type":"object","title":"SearchScopeResponse","description":"Search scope response."},"SearchScopeSlx":{"properties":{"name":{"type":"string","title":"Name"},"shortName":{"type":"string","title":"Shortname"},"alias":{"type":"string","title":"Alias"},"firingAlerts":{"type":"boolean","title":"Firingalerts","default":false},"sloId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sloid"},"sliId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sliid"},"runbookId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Runbookid"},"hierarchy":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Hierarchy"},"tags":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Tags"},"imageURL":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imageurl"}},"type":"object","required":["name","shortName","alias"],"title":"SearchScopeSlx","description":"SLX item in search scope."},"SecretDeleteResponse":{"properties":{"key":{"type":"string","title":"Key"},"deleted":{"type":"boolean","title":"Deleted"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["key","deleted"],"title":"SecretDeleteResponse","description":"Response after deleting a single workspace secret."},"SecretUsageItem":{"properties":{"slx":{"type":"string","title":"Slx","description":"SLX short name"},"kind":{"type":"string","title":"Kind","description":"'Sli' or 'Runbook'"},"name":{"type":"string","title":"Name","description":"The secretsProvided entry name"}},"type":"object","required":["slx","kind","name"],"title":"SecretUsageItem","description":"A single SLI/Runbook that references a workspace secret."},"SecretUsageResponse":{"properties":{"key":{"type":"string","title":"Key"},"usages":{"items":{"$ref":"#/components/schemas/SecretUsageItem"},"type":"array","title":"Usages"}},"type":"object","required":["key"],"title":"SecretUsageResponse","description":"Response listing where a workspace secret is referenced."},"SecretsCreateRequest":{"properties":{"secrets":{"additionalProperties":{"type":"string"},"type":"object","title":"Secrets","description":"Key-value pairs of secrets to create/update"}},"type":"object","required":["secrets"],"title":"SecretsCreateRequest","description":"Request to create/update workspace secrets."},"SecretsCreateResponse":{"properties":{"keys":{"items":{"type":"string"},"type":"array","title":"Keys"},"rsps":{"items":{"type":"string"},"type":"array","title":"Rsps"},"codes":{"items":{"type":"integer"},"type":"array","title":"Codes"}},"type":"object","title":"SecretsCreateResponse","description":"Response after creating/updating secrets."},"SecretsKeysResponse":{"properties":{"secrets":{"items":{"type":"string"},"type":"array","title":"Secrets"}},"type":"object","title":"SecretsKeysResponse","description":"Response containing list of secret key names."},"SlackWorkspaceCreate":{"properties":{"slack_payload":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"}],"title":"Slack Payload","description":"Slack OAuth payload (encrypted string or dict)"},"workspace":{"type":"string","title":"Workspace","description":"Workspace name"}},"type":"object","required":["slack_payload","workspace"],"title":"SlackWorkspaceCreate","description":"Request to create a Slack workspace integration."},"SliAlertInWorkspace":{"properties":{"id":{"type":"integer","title":"Id","description":"Alert ID"},"slx_name":{"type":"string","title":"Slx Name","description":"SLX short name"},"sli_id":{"type":"integer","title":"Sli Id","description":"SLI ID (same as slx_id)"},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Alert start time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"Alert end time"},"severity":{"type":"string","title":"Severity","description":"Alert severity","default":""},"kind":{"type":"string","title":"Kind","description":"Alert kind","default":""}},"type":"object","required":["id","slx_name","sli_id","start_time"],"title":"SliAlertInWorkspace","description":"SLI firing alert for workspace response."},"SliBasicInWorkspace":{"properties":{"id":{"type":"integer","title":"Id","description":"SLI ID (same as slx_id)"},"name":{"type":"string","title":"Name","description":"SLI name (same as SLX full name)"},"slx":{"type":"integer","title":"Slx","description":"Parent SLX ID"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"SLI spec (reconstructed)"},"repo":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repo","description":"Repository FK ID"}},"type":"object","required":["id","name","slx"],"title":"SliBasicInWorkspace","description":"Basic SLI info for workspace SLX response (matches Django SliSerializer)."},"SliPayloadV4":{"properties":{"slxId":{"type":"integer","title":"Slxid"},"displayUnitsLong":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayunitslong"},"displayUnitsShort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayunitsshort"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"runnerUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runneruuid"},"intervalStrategy":{"type":"string","title":"Intervalstrategy","default":"intermezzo"},"intervalSeconds":{"type":"integer","title":"Intervalseconds","default":300},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref"},"codeBundlePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepath"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided"},"secretsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Secretsprovided"},"alertConfig":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Alertconfig"}},"additionalProperties":false,"type":"object","required":["slxId"],"title":"SliPayloadV4","description":"Writable subset of SLI (the body of a sync upsert)."},"SliResponseV4":{"properties":{"slxId":{"type":"integer","title":"Slxid"},"displayUnitsLong":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayunitslong"},"displayUnitsShort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayunitsshort"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"runnerUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runneruuid"},"intervalStrategy":{"type":"string","title":"Intervalstrategy","default":"intermezzo"},"intervalSeconds":{"type":"integer","title":"Intervalseconds","default":300},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref"},"codeBundlePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepath"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided"},"secretsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Secretsprovided"},"alertConfig":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Alertconfig"},"lastRunCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastruncode"},"lastRunMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastrunmessage"},"lastRunAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastrunat"},"firingAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Firingalerts"},"lastSevenDaysAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Lastsevendaysalerts"},"alertCount":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Alertcount"},"recent":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recent"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"modifiedAt":{"type":"string","format":"date-time","title":"Modifiedat"}},"type":"object","required":["slxId","createdAt","modifiedAt"],"title":"SliResponseV4","description":"Flat-shape SLI detail response."},"SliSyncRequestV4":{"properties":{"payload":{"$ref":"#/components/schemas/SliPayloadV4"},"lastSyncedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastsyncedat"}},"additionalProperties":false,"type":"object","required":["payload"],"title":"SliSyncRequestV4","description":"Body of POST /api/v4/workspaces/{ws}/slis/sync-typed.\n\n``modified_by`` is not accepted: the server derives it from the JWT via\n``get_effective_modifier``. Unknown keys (including ``modified_by``)\nraise 422 because ``V4RequestModel`` sets ``extra=\"forbid\"``."},"SloAlertInWorkspace":{"properties":{"id":{"type":"integer","title":"Id","description":"Alert ID"},"slx_name":{"type":"string","title":"Slx Name","description":"SLX short name"},"slo_id":{"type":"integer","title":"Slo Id","description":"SLO ID (same as slx_id)"},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Alert start time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"Alert end time"},"severity":{"type":"string","title":"Severity","description":"Alert severity","default":""},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window","description":"SLO window"},"kind":{"type":"string","title":"Kind","description":"Alert kind","default":""},"hook_action":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Hook Action","description":"Hook action data"}},"type":"object","required":["id","slx_name","slo_id","start_time"],"title":"SloAlertInWorkspace","description":"SLO firing alert for workspace response."},"SloBasicInWorkspace":{"properties":{"id":{"type":"integer","title":"Id","description":"SLO ID (same as slx_id)"},"name":{"type":"string","title":"Name","description":"SLO name (same as SLX full name)"},"slx":{"type":"integer","title":"Slx","description":"Parent SLX ID"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"SLO spec (reconstructed)"},"status":{"additionalProperties":true,"type":"object","title":"Status","description":"SLO status (generation info)"},"created":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created","description":"Creation timestamp (ISO format)"},"modified":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modified","description":"Last modified timestamp (ISO format)"},"repo":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repo","description":"Repository FK ID"}},"type":"object","required":["id","name","slx"],"title":"SloBasicInWorkspace","description":"Basic SLO info for workspace SLX response (matches Django SloSerializer)."},"SloPayloadV4":{"properties":{"slxId":{"type":"integer","title":"Slxid"},"sloSpecType":{"type":"string","title":"Slospectype","default":"simple-mwmb"},"objective":{"type":"number","title":"Objective","default":99.9},"threshold":{"type":"integer","title":"Threshold","default":9},"operand":{"type":"string","title":"Operand","default":"eq"},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref"},"codeBundlePathToYaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepathtoyaml"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid"}},"additionalProperties":false,"type":"object","required":["slxId"],"title":"SloPayloadV4","description":"Writable subset of SLO (the body of a sync upsert)."},"SloResponseV4":{"properties":{"slxId":{"type":"integer","title":"Slxid"},"sloSpecType":{"type":"string","title":"Slospectype","default":"simple-mwmb"},"objective":{"type":"number","title":"Objective","default":99.9},"threshold":{"type":"integer","title":"Threshold","default":9},"operand":{"type":"string","title":"Operand","default":"eq"},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref"},"codeBundlePathToYaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepathtoyaml"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid"},"generation":{"type":"integer","title":"Generation","default":0},"generationChecksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generationchecksum"},"ruleGroups":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Rulegroups"},"firingAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Firingalerts"},"lastSevenDaysAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Lastsevendaysalerts"},"alertCount":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Alertcount"},"monthErrorBudgetRemaining":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Montherrorbudgetremaining"},"thirtyDayErrorBudgetRemaining":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Thirtydayerrorbudgetremaining"},"recent":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recent"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"modifiedAt":{"type":"string","format":"date-time","title":"Modifiedat"}},"type":"object","required":["slxId","createdAt","modifiedAt"],"title":"SloResponseV4","description":"Flat-shape SLO detail response."},"SloSyncRequestV4":{"properties":{"payload":{"$ref":"#/components/schemas/SloPayloadV4"},"lastSyncedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastsyncedat"}},"additionalProperties":false,"type":"object","required":["payload"],"title":"SloSyncRequestV4","description":"Body of POST /api/v4/workspaces/{ws}/slos/sync-typed.\n\n``modified_by`` is not accepted: the server derives it from the JWT via\n``get_effective_modifier``. Unknown keys (including ``modified_by``)\nraise 422 because ``V4RequestModel`` sets ``extra=\"forbid\"``."},"SlxInWorkspace":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique identifier"},"name":{"type":"string","title":"Name","description":"Full SLX name"},"shortName":{"type":"string","title":"Shortname","description":"Short SLX name"},"alias":{"type":"string","title":"Alias","description":"Human-readable alias","default":""},"tags":{"items":{"$ref":"#/components/schemas/SlxTag"},"type":"array","title":"Tags","description":"Tags with name-value pairs"},"hasSli":{"type":"boolean","title":"Hassli","description":"Whether SLX has an SLI","default":false},"hasSlo":{"type":"boolean","title":"Hasslo","description":"Whether SLX has an SLO","default":false},"hasRunbook":{"type":"boolean","title":"Hasrunbook","description":"Whether SLX has a Runbook","default":false},"hasHook":{"type":"boolean","title":"Hashook","description":"Whether SLX has a Hook","default":false},"created":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created","description":"Creation timestamp (ISO format)"},"repo":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repo","description":"Repository FK ID"},"sli":{"anyOf":[{"$ref":"#/components/schemas/SliBasicInWorkspace"},{"type":"null"}],"description":"SLI details if SLX has one"},"slo":{"anyOf":[{"$ref":"#/components/schemas/SloBasicInWorkspace"},{"type":"null"}],"description":"SLO details if SLX has one"},"spec":{"$ref":"#/components/schemas/SlxSpecInWorkspace","description":"SLX specification for UI"},"runbook":{"anyOf":[{"$ref":"#/components/schemas/RunbookInWorkspace"},{"type":"null"}],"description":"Runbook with tasks if SLX has one"}},"type":"object","required":["id","name","shortName"],"title":"SlxInWorkspace","description":"SLX summary for workspace response (camelCase for UI compatibility)."},"SlxListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SlxResponse"},"type":"array","title":"Results","description":"List of SLX items"},"count":{"type":"integer","title":"Count","description":"Total count of items matching filters"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"URL to next page"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous","description":"URL to previous page"}},"type":"object","required":["results","count"],"title":"SlxListResponse","description":"Paginated list response for SLX endpoints.\n\nUses 'results' key for Django REST Framework compatibility."},"SlxListResponseV4":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SlxResponseV4"},"type":"array","title":"Results"},"count":{"type":"integer","title":"Count"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["results","count"],"title":"SlxListResponseV4","description":"Paginated list of SLXs."},"SlxMetricsResponse":{"properties":{"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias"},"created":{"type":"string","format":"date-time","title":"Created"},"resourcePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resourcepath"},"sloObjective":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sloobjective"},"sli":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Sli"},"slo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Slo","description":"SLO time-series payload. ``slo.recent`` carries percent units (0..100, negative on breach); see class docstring."}},"type":"object","required":["created"],"title":"SlxMetricsResponse","description":"Lightweight response for chart widgets: scalar metadata + selected Cortex time series.\n\n``slo_objective`` is returned as a ratio (e.g. 0.999), already divided by\n100 from the DB's percentage value (99.9). Frontend must NOT divide by 100.\n\n``slo.recent.data.result[*].values[*][1]`` is delivered in **percent units**\n(e.g. ``\"99.9\"``, ``\"-5.0\"``) — the router multiplies the Cortex ratio by 100 (x100)\nbefore serialising. Consumers MUST NOT divide by 100. ``sli.recent`` retains\nCortex's native units (ratio in [0, 1] for compliance series).\n\n``sli`` and ``slo`` are null when the corresponding type was not requested."},"SlxPayloadV4":{"properties":{"name":{"type":"string","title":"Name"},"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias"},"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"asMeasuredBy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asmeasuredby"},"metricType":{"$ref":"#/components/schemas/MetricTypeV4","default":"gauge"},"owners":{"items":{"type":"string"},"type":"array","title":"Owners"},"tags":{"items":{"$ref":"#/components/schemas/SlxTagV4"},"type":"array","title":"Tags"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided"},"additionalContext":{"additionalProperties":true,"type":"object","title":"Additionalcontext"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"imageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imageurl"}},"additionalProperties":false,"type":"object","required":["name"],"title":"SlxPayloadV4","description":"Writable subset of SLX (the body of a sync upsert)."},"SlxResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name","description":"Full SLX name: workspace--slx-short-name"},"shortName":{"type":"string","title":"Shortname"},"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias"},"workspace":{"type":"integer","title":"Workspace","description":"Parent workspace ID"},"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"asMeasuredBy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asmeasuredby"},"metricType":{"$ref":"#/components/schemas/MetricTypeV4","default":"gauge"},"owners":{"items":{"type":"string"},"type":"array","title":"Owners"},"tags":{"items":{"$ref":"#/components/schemas/SlxTagV4"},"type":"array","title":"Tags"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided"},"additionalContext":{"additionalProperties":true,"type":"object","title":"Additionalcontext"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"imageURL":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imageurl"},"runbook":{"anyOf":[{"$ref":"#/components/schemas/papi__schemas__slx__RunbookResponse"},{"type":"null"}],"description":"Runbook with tasks"},"sli":{"anyOf":[{"$ref":"#/components/schemas/papi__schemas__slx__SliResponse"},{"type":"null"}],"description":"Service Level Indicator"},"slo":{"anyOf":[{"$ref":"#/components/schemas/papi__schemas__slx__SloResponse"},{"type":"null"}],"description":"Service Level Objective"},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last update timestamp"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","readOnly":true},"status":{"additionalProperties":true,"type":"object","title":"Status","readOnly":true}},"type":"object","required":["id","name","shortName","workspace","created","modified","spec","status"],"title":"SlxResponse","description":"Legacy V1/V3 shape: V4 fields + computed ``spec`` and ``status`` for Django-era consumers.\n\nSubclassing keeps flat fields in lock-step with V4. Computed fields rebuild the\nCRD-shape sub-objects from flat ones at serialization time. Sunset path: when\nexternal consumers fully migrate to /api/v4, delete this subclass.\n\nLegacy wire keys preserved by overriding three aliased fields:\n - ``workspace_id`` → alias ``workspace`` (was ``workspaceId`` in V4)\n - ``created_at`` → alias ``created`` (was ``createdAt`` in V4)\n - ``modified_at`` → alias ``modified`` (was ``modifiedAt`` in V4)\n - ``image_url`` → accepts both ``imageURL`` (legacy) and ``imageUrl`` (V4)"},"SlxResponseV4":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name","description":"Full SLX name: workspace--slx-short-name"},"shortName":{"type":"string","title":"Shortname"},"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias"},"workspaceId":{"type":"integer","title":"Workspaceid"},"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"asMeasuredBy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asmeasuredby"},"metricType":{"$ref":"#/components/schemas/MetricTypeV4","default":"gauge"},"owners":{"items":{"type":"string"},"type":"array","title":"Owners"},"tags":{"items":{"$ref":"#/components/schemas/SlxTagV4"},"type":"array","title":"Tags"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided"},"additionalContext":{"additionalProperties":true,"type":"object","title":"Additionalcontext"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"imageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imageurl"},"runbook":{"anyOf":[{"$ref":"#/components/schemas/RunbookResponseV4"},{"type":"null"}]},"sli":{"anyOf":[{"$ref":"#/components/schemas/SliResponseV4"},{"type":"null"}]},"slo":{"anyOf":[{"$ref":"#/components/schemas/SloResponseV4"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"modifiedAt":{"type":"string","format":"date-time","title":"Modifiedat"}},"type":"object","required":["id","name","shortName","workspaceId","createdAt","modifiedAt"],"title":"SlxResponseV4","description":"Flat-shape SLX detail response."},"SlxSpecInWorkspace":{"properties":{"alias":{"type":"string","title":"Alias","description":"Human-readable alias","default":""},"statement":{"type":"string","title":"Statement","description":"SLX purpose statement","default":""},"asMeasuredBy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asmeasuredby","description":"How the SLX is measured"},"imageURL":{"type":"string","title":"Imageurl","description":"Image/icon URL","default":""},"owners":{"items":{"type":"string"},"type":"array","title":"Owners","description":"Owner email addresses"},"configProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Configprovided","description":"Configuration as list of {name, value} objects"},"tags":{"items":{"$ref":"#/components/schemas/SlxTag"},"type":"array","title":"Tags","description":"Tags"},"additionalContext":{"additionalProperties":true,"type":"object","title":"Additionalcontext","description":"Additional context data (cluster, hierarchy, etc.)"}},"type":"object","title":"SlxSpecInWorkspace","description":"SLX spec for workspace response (matches frontend SlxSpec interface)."},"SlxSyncRequestV4":{"properties":{"payload":{"$ref":"#/components/schemas/SlxPayloadV4"},"lastSyncedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastsyncedat"}},"additionalProperties":false,"type":"object","required":["payload"],"title":"SlxSyncRequestV4","description":"Body of POST /api/v4/workspaces/{ws}/slxs/sync-typed.\n\n``modified_by`` is not accepted: the server derives it from the JWT via\n``get_effective_modifier``. Unknown keys (including ``modified_by``)\nraise 422 because ``V4RequestModel`` sets ``extra=\"forbid\"``."},"SlxTag":{"properties":{"name":{"type":"string","title":"Name","description":"Tag name/key"},"value":{"type":"string","title":"Value","description":"Tag value"}},"type":"object","required":["name","value"],"title":"SlxTag","description":"Tag with name-value structure for SLX."},"SlxTagV4":{"properties":{"name":{"type":"string","title":"Name"},"value":{"type":"string","title":"Value"}},"type":"object","required":["name","value"],"title":"SlxTagV4"},"SourceOption":{"properties":{"value":{"type":"string","title":"Value"},"label":{"type":"string","title":"Label"},"type":{"type":"string","enum":["runsession","alert_provider"],"title":"Type"}},"type":"object","required":["value","label","type"],"title":"SourceOption","description":"A single source filter option."},"SourcesResponse":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/SourceOption"},"type":"array","title":"Sources"}},"type":"object","required":["sources"],"title":"SourcesResponse","description":"Response for available search sources."},"StartRunRequestResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"RunRequest ID"},"taskset_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taskset Uuid","description":"UUID from runner-control"},"request_time":{"type":"string","format":"date-time","title":"Request Time","description":"When the run started"},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["id","request_time","message"],"title":"StartRunRequestResponse","description":"Response for starting a staged RunRequest."},"StepResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Processing status (processing, error)"},"runRequests":{"type":"integer","title":"Runrequests","description":"Number of RunRequests started"},"hasPersona":{"type":"boolean","title":"Haspersona","description":"Whether the session has a persona attached"}},"type":"object","required":["status","runRequests","hasPersona"],"title":"StepResponse","description":"Response for RunSession step endpoint."},"SubjectTokenType":{"type":"string","enum":["urn:ietf:params:oauth:token-type:access_token","auth0"],"title":"SubjectTokenType"},"SyncRequest":{"properties":{"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At","description":"Timestamp from upload task."},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Full model payload."}},"additionalProperties":false,"type":"object","required":["payload"],"title":"SyncRequest","description":"Request body for a sync (upsert) operation.\n\n``modified_by`` is *not* accepted from the request body — the server\nderives the writer identity from the JWT via\n:func:`shared.auth.dependencies.get_effective_modifier`. ``extra=\"forbid\"``\nensures any caller still sending ``modified_by`` (or any other unknown\nkey) sees HTTP 422 rather than a silent drop. See RW-998 / the\n``modified_by`` field removal for rationale."},"SyncResponse":{"properties":{"status":{"type":"string","title":"Status"},"name":{"type":"string","title":"Name"},"resource_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Id"}},"type":"object","required":["status","name"],"title":"SyncResponse","description":"Response for a sync (upsert) operation."},"SyncUserAccountRequest":{"properties":{"username":{"type":"string","title":"Username"}},"type":"object","required":["username"],"title":"SyncUserAccountRequest","description":"Request body matching Django's sync-user-account endpoint."},"TagKeyValuesV4":{"properties":{"key":{"type":"string","title":"Key"},"values":{"items":{"type":"string"},"type":"array","title":"Values"},"valueCount":{"type":"integer","title":"Valuecount"}},"type":"object","required":["key","values","valueCount"],"title":"TagKeyValuesV4"},"TaskSearchRequest":{"properties":{"query":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"title":"Query","description":"Search query or queries"},"scope":{"items":{"type":"string"},"type":"array","title":"Scope","description":"SLX short names to scope search"},"start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start","description":"Starting SLX short name"},"persona":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Persona","description":"Persona name to interpret query"}},"type":"object","required":["query"],"title":"TaskSearchRequest","description":"Request for workspace task search."},"TaskVitalsItem":{"properties":{"slxName":{"type":"string","title":"Slxname","description":"Full SLX name (`--`)."},"taskTitle":{"type":"string","title":"Tasktitle","description":"Task title as it appears in run_request.task_titles."},"recentStatuses":{"items":{"type":"string","enum":["ok","fail","warn"]},"type":"array","title":"Recentstatuses","description":"Most-recent statuses for this task, newest-first. Length 1..3; drops anything older than the third newest run_request."},"openIssueCount":{"type":"integer","title":"Openissuecount","description":"Count of currently-open issues (`closed_at IS NULL`) for this (slx, task), across all severities. Title-template normalised so PAPI's unresolved form (``${VAR}``) matches the resolved form stored on ``issues.task_title``."},"lastRunAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastrunat","description":"Timestamp of the most-recent completed run_request."}},"type":"object","required":["slxName","taskTitle","recentStatuses","openIssueCount","lastRunAt"],"title":"TaskVitalsItem","description":"Per-(slx, task) run-history rollup."},"TaskVitalsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TaskVitalsItem"},"type":"array","title":"Items","description":"One entry per (slx, task) with any run history."}},"type":"object","title":"TaskVitalsResponse","description":"Workspace-scoped task-vitals payload."},"TokenExchangeRequest":{"properties":{"grant_type":{"type":"string","title":"Grant Type","description":"Must be the token-exchange grant type.","default":"urn:ietf:params:oauth:grant-type:token-exchange"},"subject_token":{"type":"string","title":"Subject Token","description":"The external token to exchange (e.g. Auth0 access token)."},"subject_token_type":{"$ref":"#/components/schemas/SubjectTokenType","description":"Token type: \"auth0\" or the full RFC 8693 URN.","default":"auth0"},"scope":{"type":"string","title":"Scope","description":"Requested scopes (informational only).","default":"openid profile email"}},"type":"object","required":["subject_token"],"title":"TokenExchangeRequest","description":"RFC 8693 Token Exchange request (simplified)."},"TokenExchangeResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"Bearer"},"expires_in":{"type":"integer","title":"Expires In","description":"Token lifetime in seconds."},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"issued_token_type":{"type":"string","title":"Issued Token Type","default":"urn:ietf:params:oauth:token-type:access_token"}},"type":"object","required":["access_token","expires_in"],"title":"TokenExchangeResponse","description":"RFC 8693 Token Exchange response."},"TokenRefreshRequest":{"properties":{"refresh":{"type":"string","title":"Refresh"}},"type":"object","required":["refresh"],"title":"TokenRefreshRequest","description":"Refresh token request matching Django SimpleJWT format."},"TokenRequest":{"properties":{"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"TokenRequest","description":"Token request body - accepts username or email with password."},"TokenResponse":{"properties":{"access":{"type":"string","title":"Access"},"refresh":{"type":"string","title":"Refresh"}},"type":"object","required":["access","refresh"],"title":"TokenResponse","description":"Token response matching Django SimpleJWT format."},"TokenVerifyRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"TokenVerifyRequest","description":"Token verify request matching Django SimpleJWT format."},"UploadConfigResponse":{"properties":{"token":{"type":"string","title":"Token"},"papi_url":{"type":"string","title":"Papi Url"}},"type":"object","required":["token","papi_url"],"title":"UploadConfigResponse","description":"Response containing upload credentials and PAPI URL for workspace-builder."},"UploadStatusResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Task ID"},"status":{"type":"string","enum":["PENDING","STARTED","SUCCESS","FAILURE","UNKNOWN"],"title":"Status","description":"Task status"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result","description":"Task result if completed"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","required":["task_id","status"],"title":"UploadStatusResponse","description":"Schema for upload status check response."},"UserActiveWorkspacesResponse":{"properties":{"workspaceName":{"type":"string","title":"Workspacename"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["workspaceName","count"],"title":"UserActiveWorkspacesResponse","description":"Response for user's active workspaces with activity count."},"UserActivitiesCountResponse":{"properties":{"date":{"type":"string","title":"Date"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["date","count"],"title":"UserActivitiesCountResponse","description":"Response for user activities count (heatmap data)."},"UserNetworkResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","title":"Username"},"primaryEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primaryemail"},"fullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fullname"},"avatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatarurl"}},"type":"object","required":["id","username"],"title":"UserNetworkResponse","description":"Response schema for users in the current user's network."},"UserResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","title":"Username"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"primaryEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primaryemail","description":"Alias for email, for UI compatibility"},"firstName":{"type":"string","title":"Firstname","default":""},"lastName":{"type":"string","title":"Lastname","default":""},"fullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fullname"},"avatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatarurl"},"liveAvatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Liveavatarurl"},"groups":{"items":{"$ref":"#/components/schemas/GroupResponse"},"type":"array","title":"Groups"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"escalationMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escalationmessage"},"optOutPublicGroup":{"type":"boolean","title":"Optoutpublicgroup","default":false},"isActive":{"type":"boolean","title":"Isactive","default":true},"isStaff":{"type":"boolean","title":"Isstaff","default":false},"isSuperuser":{"type":"boolean","title":"Issuperuser","default":false},"isServiceAccount":{"type":"boolean","title":"Isserviceaccount","default":false}},"type":"object","required":["id","username"],"title":"UserResponse","description":"User response schema matching Django's UserSerializer."},"UserSearchEmailResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/UserSearchResponse"},"type":"array","title":"Users"},"notFound":{"items":{"type":"string"},"type":"array","title":"Notfound"}},"type":"object","required":["users"],"title":"UserSearchEmailResponse","description":"Response for email search including not found emails."},"UserSearchResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","title":"Username"},"primaryEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primaryemail"},"firstName":{"type":"string","title":"Firstname","default":""},"lastName":{"type":"string","title":"Lastname","default":""},"fullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fullname"},"avatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatarurl"},"isActive":{"type":"boolean","title":"Isactive","default":true},"isServiceAccount":{"type":"boolean","title":"Isserviceaccount","default":false}},"type":"object","required":["id","username"],"title":"UserSearchResponse","description":"Response for user search results."},"UserTokenResponse":{"properties":{"access":{"type":"string","title":"Access"},"lifetime":{"type":"string","title":"Lifetime"}},"type":"object","required":["access","lifetime"],"title":"UserTokenResponse","description":"Response for token generation."},"UserUpdateRequest":{"properties":{"primaryEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primaryemail"},"firstName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"},"lastName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"},"avatarUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatarurl"},"escalationMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escalationmessage"},"optOutPublicGroup":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Optoutpublicgroup"}},"type":"object","title":"UserUpdateRequest","description":"Request schema for updating user details.\n\nAccepts both camelCase (from UI) and snake_case field names."},"UsernamePasswordLoginResponse":{"properties":{"access":{"type":"string","title":"Access"},"lifetime":{"type":"string","title":"Lifetime"}},"type":"object","required":["access","lifetime"],"title":"UsernamePasswordLoginResponse","description":"Response for username-password-login endpoint matching Django format."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest","description":"Email verification request."},"WebhookTokenResponse":{"properties":{"webhook_url":{"type":"string","title":"Webhook Url"},"webhook_token":{"type":"string","title":"Webhook Token"}},"type":"object","required":["webhook_url","webhook_token"],"title":"WebhookTokenResponse","description":"Response for webhook token."},"WebhookUrlResponse":{"properties":{"webhook_url":{"type":"string","title":"Webhook Url"}},"type":"object","required":["webhook_url"],"title":"WebhookUrlResponse","description":"Response for webhook URL."},"WorkflowListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/WorkflowResponse"},"type":"array","title":"Results","description":"List of workflow items"},"count":{"type":"integer","title":"Count"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["results","count"],"title":"WorkflowListResponse","description":"Paginated list response for Workflow endpoints.\n\nSubclasses WorkflowListResponseV4 but overrides results to use legacy WorkflowResponse items."},"WorkflowListResponseV4":{"properties":{"results":{"items":{"$ref":"#/components/schemas/WorkflowResponseV4"},"type":"array","title":"Results"},"count":{"type":"integer","title":"Count"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["results","count"],"title":"WorkflowListResponseV4","description":"Paginated list of Workflows."},"WorkflowPayloadV4":{"properties":{"name":{"type":"string","title":"Name"},"definition":{"additionalProperties":true,"type":"object","title":"Definition"}},"additionalProperties":false,"type":"object","required":["name"],"title":"WorkflowPayloadV4","description":"Writable subset of Workflow (the body of a sync upsert)."},"WorkflowResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name","description":"Full workflow name: workspace--workflow-short-name"},"shortName":{"type":"string","title":"Shortname","description":"Short name (workspace prefix stripped)","default":""},"workspace":{"type":"integer","title":"Workspace","description":"Parent workspace ID"},"definition":{"additionalProperties":true,"type":"object","title":"Definition"},"created":{"title":"Created","description":"Creation timestamp"},"modified":{"title":"Modified","description":"Last modification timestamp"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"Alias for definition — UI reads workflow.spec.fromActivities.","readOnly":true},"status":{"additionalProperties":true,"type":"object","title":"Status","description":"Empty status for Django compatibility.","readOnly":true}},"type":"object","required":["id","name","workspace","created","modified","spec","status"],"title":"WorkflowResponse","description":"Workflow response schema for API responses (legacy V1/V3 wire shape).\n\nSubclasses WorkflowResponseV4 (flat V4 fields) and layers on:\n - Legacy wire keys: ``workspace`` (was ``workspaceId``),\n ``created`` (was ``createdAt``), ``modified`` (was ``modifiedAt``)\n - Computed ``spec`` and ``status`` for Django-era consumers\n\nspec is the workflow definition (UI reads workflow.spec.fromActivities).\nSunset path: when external consumers fully migrate to /api/v4, delete this subclass."},"WorkflowResponseV4":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name","description":"Full workflow name: workspace--workflow-short-name"},"shortName":{"type":"string","title":"Shortname"},"workspaceId":{"type":"integer","title":"Workspaceid"},"definition":{"additionalProperties":true,"type":"object","title":"Definition"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"modifiedAt":{"type":"string","format":"date-time","title":"Modifiedat"}},"type":"object","required":["id","name","shortName","workspaceId","createdAt","modifiedAt"],"title":"WorkflowResponseV4","description":"Flat-shape Workflow detail response."},"WorkflowSyncRequestV4":{"properties":{"payload":{"$ref":"#/components/schemas/WorkflowPayloadV4"},"lastSyncedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastsyncedat"}},"additionalProperties":false,"type":"object","required":["payload"],"title":"WorkflowSyncRequestV4","description":"Body of POST /api/v4/workspaces/{ws}/workflows/sync-typed.\n\n``modified_by`` is not accepted: the server derives it from the JWT via\n``get_effective_modifier``. Unknown keys (including ``modified_by``)\nraise 422 because ``V4RequestModel`` sets ``extra=\"forbid\"``."},"WorkspaceConfigurationResponseV4":{"properties":{"name":{"type":"string","title":"Name","description":"Workspace short name (slug)"},"alias":{"type":"string","title":"Alias","description":"Human-readable display name","default":""},"description":{"type":"string","title":"Description","description":"Workspace description","default":""},"scrubberConfig":{"$ref":"#/components/schemas/ResourceScrubberConfigEnum","description":"Resource scrubbing configuration","default":"SCRUB_NONE"},"anonymousMode":{"type":"boolean","title":"Anonymousmode","description":"Whether anonymous mode is enabled","default":false},"permissions":{"items":{"$ref":"#/components/schemas/WorkspacePermissionV4"},"type":"array","title":"Permissions","description":"Workspace permission entries (user or group keyed)"},"owner":{"anyOf":[{"$ref":"#/components/schemas/WorkspaceOwnerV4"},{"type":"null"}],"description":"Workspace owner"},"userRole":{"anyOf":[{"$ref":"#/components/schemas/WorkspaceRoleEnum"},{"type":"null"}],"description":"Effective role of the requesting user in this workspace"},"slxCount":{"type":"integer","title":"Slxcount","description":"Number of SLXs in this workspace","default":0},"lastSyncedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastsyncedat","description":"Timestamp of last successful workspace config sync"}},"type":"object","required":["name"],"title":"WorkspaceConfigurationResponseV4","description":"Flat response for the Workspace Configuration page.\n\nCovers exactly what the Settings, Users, and Secrets tabs read — no\nSLX list, no alerts, no layout, no gallery fields. See the migration\nplan for the field-by-field rationale."},"WorkspaceCreateResponse":{"properties":{"name":{"type":"string","title":"Name","description":"Workspace short name"},"repo_url":{"type":"string","title":"Repo Url","description":"URL of the created Git repository"},"status":{"type":"string","enum":["provisioning","ready"],"title":"Status","description":"Workspace creation status"},"renamed_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Renamed From","description":"Original requested name if it was auto-suffixed due to collision"}},"type":"object","required":["name","repo_url","status"],"title":"WorkspaceCreateResponse","description":"Response for workspace creation.\n\nSynchronous creation returns status=\"ready\". Async GitOps-based creation\n(if re-enabled) returns status=\"provisioning\" and requires polling\nGET /{workspace_name}/status for completion."},"WorkspaceDeletionResponse":{"properties":{"workspace":{"type":"string","title":"Workspace"},"status":{"type":"string","title":"Status"},"steps":{"items":{"$ref":"#/components/schemas/DeletionStep"},"type":"array","title":"Steps"},"async_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Async Task Id"}},"type":"object","required":["workspace","status","steps"],"title":"WorkspaceDeletionResponse","description":"Response from workspace deletion endpoint."},"WorkspaceGitCreate":{"properties":{"name":{"type":"string","maxLength":63,"minLength":2,"pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Workspace short name. Must be DNS-label compatible: lowercase alphanumerics and hyphens only, must start and end with an alphanumeric character."},"spec":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Spec","description":"Optional workspace spec overrides"}},"type":"object","required":["name"],"title":"WorkspaceGitCreate","description":"Schema for Git-first workspace creation."},"WorkspaceIssueOccurrenceListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/WorkspaceIssueOccurrenceResponse"},"type":"array","title":"Results"},"count":{"type":"integer","title":"Count"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Next page URL"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous","description":"Previous page URL"}},"type":"object","required":["results","count","limit","offset"],"title":"WorkspaceIssueOccurrenceListResponse","description":"Schema for paginated workspace issue occurrence list response."},"WorkspaceIssueOccurrenceResponse":{"properties":{"observedAt":{"type":"string","format":"date-time","title":"Observedat","description":"When this occurrence was observed"},"details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Details","description":"Detailed description of the occurrence"},"nextSteps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextsteps","description":"Suggested next steps"},"expected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected","description":"Expected behavior/value"},"actual":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual","description":"Actual behavior/value observed"},"reproduceHint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reproducehint","description":"Hint for reproducing the issue"},"additionalContext":{"additionalProperties":true,"type":"object","title":"Additionalcontext","description":"Additional context data"},"occurrenceId":{"type":"integer","title":"Occurrenceid","description":"The occurrence ID"},"issueId":{"type":"integer","title":"Issueid","description":"The parent issue ID"},"taskTitle":{"type":"string","title":"Tasktitle","description":"Task title from the parent issue"},"title":{"type":"string","title":"Title","description":"Title from the parent issue","default":""},"severity":{"type":"integer","title":"Severity","description":"Severity from the parent issue (1=critical, 4=warning)","default":0},"closed":{"type":"boolean","title":"Closed","description":"Whether the parent issue is closed (open_since is None)"},"created":{"type":"string","format":"date-time","title":"Created"},"modified":{"type":"string","format":"date-time","title":"Modified"},"slxName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slxname","description":"SLX name from the parent issue"},"runsessionIds":{"items":{"type":"integer"},"type":"array","title":"Runsessionids","description":"List of associated run session IDs"}},"type":"object","required":["observedAt","occurrenceId","issueId","taskTitle","closed","created","modified"],"title":"WorkspaceIssueOccurrenceResponse","description":"Schema for workspace-level issue occurrence response.\n\nExtends IssueOccurrenceResponse with additional workspace-level fields."},"WorkspaceListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/WorkspaceResponse"},"type":"array","title":"Results","description":"List of workspaces"},"count":{"type":"integer","title":"Count","description":"Total count matching filters"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Next page URL"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous","description":"Previous page URL"}},"type":"object","required":["results","count"],"title":"WorkspaceListResponse","description":"Schema for paginated workspace list response."},"WorkspaceOwnerV4":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"fullName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fullname"}},"type":"object","required":["id"],"title":"WorkspaceOwnerV4","description":"Workspace owner summary."},"WorkspacePermissionUpdate":{"properties":{"role":{"type":"string","title":"Role","description":"Permission role (admin, readwrite, readandrun, readonly, …)"},"user":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"User","description":"User email address"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group","description":"Group name"}},"type":"object","required":["role"],"title":"WorkspacePermissionUpdate","description":"A single permission entry for workspace update requests.\n\nMirrors WorkspaceSpecPermission but is used for incoming PATCH payloads.\nEither ``user`` (email) or ``group`` (name) must be set."},"WorkspacePermissionV4":{"properties":{"role":{"type":"string","title":"Role","description":"Permission role (admin, readwrite, readandrun, readonly, …)"},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User","description":"User email if a user permission. For an invited user who hasn't registered yet this is the placeholder email (see ``invited``)."},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group","description":"Group name if a group permission"},"invited":{"type":"boolean","title":"Invited","description":"True when this is an invited user added by email who has no account yet (placeholder row); the UI badges these as 'Invited'. (RW-1341)","default":false}},"type":"object","required":["role"],"title":"WorkspacePermissionV4","description":"A single workspace permission entry. Either ``user`` or ``group`` is set."},"WorkspaceResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique identifier"},"name":{"type":"string","title":"Name","description":"Unique workspace identifier (slug)"},"alias":{"type":"string","title":"Alias","description":"Human-readable display name","default":""},"description":{"type":"string","title":"Description","description":"Workspace description","default":""},"repo":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repo","description":"Repository ID"},"org":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org","description":"Organization name"},"repoHash":{"type":"string","title":"Repohash","description":"Repository modification hash","default":""},"openIssuesCount":{"type":"integer","title":"Openissuescount","description":"Number of open issues","default":0},"numberOfTools":{"type":"integer","title":"Numberoftools","description":"Number of tools/SLXs","default":0},"personas":{"items":{"$ref":"#/components/schemas/GalleryPersona"},"type":"array","title":"Personas","description":"List of personas in workspace"},"users":{"items":{"$ref":"#/components/schemas/GalleryUser"},"type":"array","title":"Users","description":"List of users with access"},"runSessionsCounts":{"items":{"$ref":"#/components/schemas/RunSessionCount"},"type":"array","title":"Runsessionscounts","description":"Run session counts by date"},"tasksCount1h":{"type":"integer","title":"Taskscount1H","description":"Task count in last 1 hour","default":0},"ownerId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ownerid","description":"Owner user ID"},"organizationId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organizationid","description":"Organization ID if workspace belongs to an org"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid","description":"Associated git repository ID"},"scrubberConfig":{"anyOf":[{"$ref":"#/components/schemas/ResourceScrubberConfigEnum"},{"type":"null"}],"description":"Resource scrubbing configuration"},"enabledLocations":{"items":{"type":"string"},"type":"array","title":"Enabledlocations","description":"List of enabled location identifiers"},"configProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Configprovided","description":"Configuration as list of {name, value} objects"},"createdAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdat","description":"Creation timestamp"},"updatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updatedat","description":"Last update timestamp"},"anonymousMode":{"type":"boolean","title":"Anonymousmode","description":"Whether anonymous mode is enabled","default":false},"ownerEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owneremail","description":"Owner's email for display"},"owner":{"anyOf":[{"$ref":"#/components/schemas/OwnerResponse"},{"type":"null"}],"description":"Owner user object with fullName"},"userRole":{"anyOf":[{"$ref":"#/components/schemas/WorkspaceRoleEnum"},{"type":"null"}],"description":"Current user's role in this workspace"},"pending_invitations":{"items":{"type":"string"},"type":"array","title":"Pending Invitations","description":"Emails that were submitted but not matched to existing users; pending resolution."},"spec":{"anyOf":[{"$ref":"#/components/schemas/WorkspaceSpec"},{"type":"null"}],"description":"Workspace spec (reconstructed for UI compatibility)"},"slxGroups":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Slxgroups","description":"SLX group definitions (top-level for UI compatibility)"},"slxSubGroups":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Slxsubgroups","description":"SLX subgroup definitions (top-level for UI compatibility)"},"layout":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Layout","description":"Map layout data with v2.groups, v2.subGroups, v2.slxs"},"slxs":{"items":{"$ref":"#/components/schemas/SlxInWorkspace"},"type":"array","title":"Slxs","description":"List of SLXs in this workspace"},"sli_firing_alerts":{"items":{"$ref":"#/components/schemas/SliAlertInWorkspace"},"type":"array","title":"Sli Firing Alerts","description":"Currently firing SLI alerts"},"slo_firing_alerts":{"items":{"$ref":"#/components/schemas/SloAlertInWorkspace"},"type":"array","title":"Slo Firing Alerts","description":"Currently firing SLO alerts"}},"type":"object","required":["id","name"],"title":"WorkspaceResponse","description":"Schema for workspace response with all fields (camelCase for UI)."},"WorkspaceRoleEnum":{"type":"string","enum":["admin","readwrite","readandrun","readonly","readandrunwithassistant"],"title":"WorkspaceRoleEnum","description":"Workspace permission roles."},"WorkspaceSpec":{"properties":{"slxGroups":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Slxgroups","description":"SLX group definitions"},"slxSubGroups":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Slxsubgroups","description":"SLX subgroup definitions"},"slxRelationships":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Slxrelationships","description":"Relationships between SLXs"},"permissions":{"items":{"$ref":"#/components/schemas/WorkspaceSpecPermission"},"type":"array","title":"Permissions","description":"User/group permissions"},"configProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Configprovided","description":"Configuration as list of {name, value} objects"},"secretsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Secretsprovided","description":"Secret references"},"commitToMain":{"type":"boolean","title":"Committomain","description":"Whether to commit directly to main branch","default":true},"resourceScrubberConfig":{"$ref":"#/components/schemas/ResourceScrubberConfigEnum","description":"Resource scrubbing configuration","default":"SCRUB_NONE"}},"type":"object","title":"WorkspaceSpec","description":"Workspace spec (reconstructed from individual columns for UI compatibility).\n\nThe Django model stores all these in a `body.spec` JSON field. The FastAPI\nmodel stores them in individual columns for better querying. This schema\nreconstructs the spec for API responses to maintain UI compatibility."},"WorkspaceSpecPermission":{"additionalProperties":true,"type":"object"},"WorkspaceStatusResponse":{"properties":{"workspace":{"type":"boolean","title":"Workspace","description":"Whether workspace exists in database"},"sync":{"type":"boolean","title":"Sync","description":"Whether workspace sync has succeeded"}},"type":"object","required":["workspace","sync"],"title":"WorkspaceStatusResponse","description":"Response for workspace creation status check."},"WorkspaceTagsResponseV4":{"properties":{"tags":{"items":{"$ref":"#/components/schemas/TagKeyValuesV4"},"type":"array","title":"Tags"}},"type":"object","required":["tags"],"title":"WorkspaceTagsResponseV4"},"WorkspaceUpdate":{"properties":{"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias","description":"Updated human-readable display name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Updated workspace description"},"scrubber_config":{"anyOf":[{"$ref":"#/components/schemas/ResourceScrubberConfigEnum"},{"type":"null"}],"description":"Updated resource scrubbing configuration"},"enabled_locations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Enabled Locations","description":"Updated list of enabled locations"},"config_provided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Config Provided","description":"Updated configuration as list of {name, value} objects"},"permissions":{"anyOf":[{"items":{"$ref":"#/components/schemas/WorkspacePermissionUpdate"},"type":"array"},{"type":"null"}],"title":"Permissions","description":"Full replacement of workspace permissions. Each entry must have 'role' and either 'user' (email) or 'group' (name). Owner admin permission is preserved automatically."},"slx_groups":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Slx Groups","description":"Updated SLX group definitions (replaces existing groups)"},"slx_relationships":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Slx Relationships","description":"Updated SLX relationship definitions (replaces existing relationships)"}},"type":"object","title":"WorkspaceUpdate","description":"Schema for updating a workspace (partial update).\n\nAll fields are optional; only non-None values are applied."},"WorkspaceUploadRequest":{"properties":{"output":{"type":"string","maxLength":104857600,"title":"Output","description":"Base64-encoded gzip-compressed tar archive"},"mergeMode":{"$ref":"#/components/schemas/MergeModeEnum","description":"Deprecated — ignored under the new ownership/overridden_fields model. Accepted for backward compatibility with existing callers.","default":"keepexisting"},"pruneStaleSlxs":{"type":"boolean","title":"Prunestaleslxs","description":"Remove SLXs no longer present in uploaded data","default":false},"pruneStaleResources":{"type":"boolean","title":"Prunestaleresources","description":"Remove resources no longer present in uploaded data","default":false},"message":{"type":"string","title":"Message","description":"Human-readable message describing the upload","default":"Updated workspace from map builder."},"finalizeAction":{"$ref":"#/components/schemas/FinalizeActionEnum","description":"Action after upload completes","default":"mergeToMain"},"build_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Date","description":"Builder run timestamp (informational); not processed, stored for audit logs"}},"type":"object","required":["output"],"title":"WorkspaceUploadRequest","description":"Schema for workspace upload request (matches runner format)."},"WorkspaceUploadResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Task ID for tracking upload progress (empty when deduplicated)","default":""},"status":{"type":"string","enum":["queued","duplicate_skipped"],"title":"Status","description":"Upload status","default":"queued"},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["message"],"title":"WorkspaceUploadResponse","description":"Schema for workspace upload response."},"_ProvisioningStages":{"properties":{"git_repo":{"type":"boolean","title":"Git Repo","default":false},"repository_crd":{"type":"boolean","title":"Repository Crd","default":false},"worksync":{"type":"boolean","title":"Worksync","default":false},"workspace_crd":{"type":"boolean","title":"Workspace Crd","default":false},"workspace_db":{"type":"boolean","title":"Workspace Db","default":false},"reconciliation":{"type":"boolean","title":"Reconciliation","default":false}},"type":"object","title":"_ProvisioningStages"},"_ProvisioningStatusResponse":{"properties":{"workspace":{"type":"boolean","title":"Workspace","default":false},"sync":{"type":"boolean","title":"Sync","default":false},"stages":{"$ref":"#/components/schemas/_ProvisioningStages"},"sync_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sync Message"}},"type":"object","title":"_ProvisioningStatusResponse"},"papi__routers__llm_config__LLMConfigResponse":{"properties":{"llmModel":{"$ref":"#/components/schemas/papi__routers__llm_config__LLMModelResponse"}},"type":"object","required":["llmModel"],"title":"LLMConfigResponse","description":"LLM Config response schema."},"papi__routers__llm_config__LLMModelResponse":{"properties":{"id":{"type":"integer","title":"Id"},"modelName":{"type":"string","title":"Modelname"},"maxTokens":{"type":"integer","title":"Maxtokens","default":0},"dimension":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dimension"},"endpointPath":{"type":"string","title":"Endpointpath","default":"/chat/completions"},"endpointUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpointurl"},"provider":{"$ref":"#/components/schemas/papi__routers__llm_config__LLMProviderResponse"}},"type":"object","required":["id","modelName","provider"],"title":"LLMModelResponse","description":"LLM Model response schema."},"papi__routers__llm_config__LLMProviderResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"providerType":{"type":"string","title":"Providertype"},"baseUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseurl"},"apiUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apiurl"},"credentialsVaultPath":{"type":"string","title":"Credentialsvaultpath","default":""},"llmTenantType":{"type":"string","title":"Llmtenanttype","default":"SHARED"}},"type":"object","required":["id","name","providerType"],"title":"LLMProviderResponse","description":"LLM Provider response schema."},"papi__schemas__runbook__RunbookResponse":{"properties":{"id":{"type":"integer","title":"Id"},"slxId":{"type":"integer","title":"Slxid"},"name":{"type":"string","title":"Name","default":""},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"runnerUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runneruuid"},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref"},"codeBundlePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepath"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided"},"secretsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Secretsprovided"},"runtimeVarsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Runtimevarsprovided"},"requirements":{"additionalProperties":true,"type":"object","title":"Requirements"},"lookbackWindow":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lookbackwindow"},"resolvedTasks":{"items":{"type":"string"},"type":"array","title":"Resolvedtasks"},"taskDetails":{"additionalProperties":true,"type":"object","title":"Taskdetails"},"lastRunCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastruncode"},"lastRunMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastrunmessage"},"lastRunAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastrunat"},"tasks":{"items":{"$ref":"#/components/schemas/RunbookTaskV4"},"type":"array","title":"Tasks"},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last update timestamp"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"Spec dict matching Django CoreModelSerializer shape.","readOnly":true},"status":{"additionalProperties":true,"type":"object","title":"Status","description":"Status dict matching Django CoreModelSerializer shape.","readOnly":true}},"type":"object","required":["id","slxId","created","modified","spec","status"],"title":"RunbookResponse","description":"Legacy V1/V3 shape: V4 fields + computed ``spec`` and ``status`` for Django-era consumers.\n\nSubclassing keeps flat fields in lock-step with V4. Computed fields rebuild the\nCRD-shape sub-objects from flat ones at serialization time. Sunset path: when\nexternal consumers fully migrate to /api/v4, delete this subclass.\n\nLegacy wire keys preserved by overriding aliased timestamp fields:\n - ``created_at`` → alias ``created`` (was ``createdAt`` in V4)\n - ``modified_at`` → alias ``modified`` (was ``modifiedAt`` in V4)"},"papi__schemas__rwsupport__LLMConfigResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"llmModel":{"type":"integer","title":"Llmmodel"},"modelName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modelname"},"providerName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Providername"},"workspace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workspace"},"workspaceName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspacename"},"org":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org"},"orgName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orgname"},"isPlatformDefault":{"type":"boolean","title":"Isplatformdefault","default":false},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created"},"modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified"},"lastModifiedBy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastmodifiedby"}},"type":"object","required":["id","name","category","llmModel"],"title":"LLMConfigResponse"},"papi__schemas__rwsupport__LLMModelResponse":{"properties":{"id":{"type":"integer","title":"Id"},"provider":{"type":"integer","title":"Provider"},"providerType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Providertype"},"providerName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Providername"},"modelName":{"type":"string","title":"Modelname"},"maxTokens":{"type":"integer","title":"Maxtokens","default":0},"dimension":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dimension"},"endpointPath":{"type":"string","title":"Endpointpath","default":"/chat/completions"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created"},"modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified"}},"type":"object","required":["id","provider","modelName"],"title":"LLMModelResponse"},"papi__schemas__rwsupport__LLMProviderResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"providerType":{"type":"string","title":"Providertype"},"baseUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseurl"},"apiUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apiurl"},"credentialsVaultPath":{"type":"string","title":"Credentialsvaultpath","default":""},"llmTenantType":{"type":"string","title":"Llmtenanttype","default":"SHARED"},"ownerOrg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ownerorg"},"ownerOrgName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownerorgname"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created"},"modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified"}},"type":"object","required":["id","name","providerType"],"title":"LLMProviderResponse"},"papi__schemas__sli__SliResponse":{"properties":{"slxId":{"type":"integer","title":"Slxid"},"displayUnitsLong":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayunitslong"},"displayUnitsShort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayunitsshort"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"runnerUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runneruuid"},"intervalStrategy":{"type":"string","title":"Intervalstrategy","default":"intermezzo"},"intervalSeconds":{"type":"integer","title":"Intervalseconds","default":300},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref"},"codeBundlePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepath"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided"},"secretsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Secretsprovided"},"alertConfig":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Alertconfig"},"lastRunCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastruncode"},"lastRunMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastrunmessage"},"lastRunAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastrunat"},"firingAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Firingalerts"},"lastSevenDaysAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Lastsevendaysalerts"},"alertCount":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Alertcount"},"recent":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recent"},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last update timestamp"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"Spec dict matching Django CoreModelSerializer shape.","readOnly":true},"status":{"additionalProperties":true,"type":"object","title":"Status","description":"Status dict matching Django CoreModelSerializer shape.","readOnly":true}},"type":"object","required":["slxId","created","modified","spec","status"],"title":"SliResponse","description":"Legacy V1/V3 shape: V4 fields + computed ``spec`` and ``status`` for Django-era consumers.\n\nSubclassing keeps flat fields in lock-step with V4. Computed fields rebuild the\nCRD-shape sub-objects from flat ones at serialization time. Sunset path: when\nexternal consumers fully migrate to /api/v4, delete this subclass.\n\nLegacy wire keys preserved by overriding aliased timestamp fields:\n - ``created_at`` → alias ``created`` (was ``createdAt`` in V4)\n - ``modified_at`` → alias ``modified`` (was ``modifiedAt`` in V4)"},"papi__schemas__slo__SloResponse":{"properties":{"slxId":{"type":"integer","title":"Slxid"},"sloSpecType":{"type":"string","title":"Slospectype","default":"simple-mwmb"},"objective":{"type":"number","title":"Objective","default":99.9},"threshold":{"type":"integer","title":"Threshold","default":9},"operand":{"type":"string","title":"Operand","default":"eq"},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref"},"codeBundlePathToYaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepathtoyaml"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid"},"generation":{"type":"integer","title":"Generation","default":0},"generationChecksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generationchecksum"},"ruleGroups":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Rulegroups"},"firingAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Firingalerts"},"lastSevenDaysAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Lastsevendaysalerts"},"alertCount":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Alertcount"},"monthErrorBudgetRemaining":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Montherrorbudgetremaining"},"thirtyDayErrorBudgetRemaining":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Thirtydayerrorbudgetremaining"},"recent":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recent"},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last update timestamp"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"Spec dict matching Django CoreModelSerializer shape.","readOnly":true},"status":{"additionalProperties":true,"type":"object","title":"Status","description":"Status dict matching Django CoreModelSerializer shape.","readOnly":true}},"type":"object","required":["slxId","created","modified","spec","status"],"title":"SloResponse","description":"Legacy V1/V3 shape: V4 fields + computed ``spec`` and ``status`` for Django-era consumers.\n\nSubclassing keeps flat fields in lock-step with V4. Computed fields rebuild the\nCRD-shape sub-objects from flat ones at serialization time. Sunset path: when\nexternal consumers fully migrate to /api/v4, delete this subclass.\n\nLegacy wire keys preserved by overriding aliased timestamp fields:\n - ``created_at`` → alias ``created`` (was ``createdAt`` in V4)\n - ``modified_at`` → alias ``modified`` (was ``modifiedAt`` in V4)"},"papi__schemas__slx__RunbookResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Runbook ID"},"slxId":{"type":"integer","title":"Slxid","description":"Parent SLX ID"},"name":{"type":"string","title":"Name","description":"Runbook name (same as SLX full name)","default":""},"runnerUUID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runneruuid","description":"Runner UUID"},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl","description":"Code bundle repository URL"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref","description":"Code bundle git ref"},"codeBundlePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepath","description":"Path to runbook in repository"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid","description":"Repository ID"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided","description":"Configuration as list of {name, value} objects or dict"},"secretsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Secretsprovided","description":"Secrets configuration"},"tasks":{"items":{"$ref":"#/components/schemas/RunbookTaskResponse"},"type":"array","title":"Tasks","description":"Runbook tasks"},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last update timestamp"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"Spec dict matching Django CoreModelSerializer shape.","readOnly":true},"status":{"additionalProperties":true,"type":"object","title":"Status","description":"Status dict matching Django CoreModelSerializer shape.","readOnly":true}},"type":"object","required":["id","slxId","created","modified","spec","status"],"title":"RunbookResponse","description":"Runbook response schema with tasks."},"papi__schemas__slx__SliResponse":{"properties":{"slxId":{"type":"integer","title":"Slxid","description":"Parent SLX ID (also serves as SLI ID)"},"displayUnitsLong":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayunitslong","description":"Long form display units"},"displayUnitsShort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayunitsshort","description":"Short form display units"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"SLI description"},"runnerUUID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runneruuid","description":"Runner UUID"},"intervalStrategy":{"type":"string","title":"Intervalstrategy","description":"Interval strategy","default":"intermezzo"},"intervalSeconds":{"type":"integer","title":"Intervalseconds","description":"Interval in seconds","default":300},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl","description":"Code bundle repository URL"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref","description":"Code bundle git ref"},"codeBundlePath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepath","description":"Path to SLI in repository"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid","description":"Repository ID"},"configProvided":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Configprovided","description":"Configuration as list of {name, value} objects or dict"},"secretsProvided":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Secretsprovided","description":"Secrets configuration"},"alertConfig":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Alertconfig","description":"Alert configuration"},"firingAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Firingalerts","description":"Currently firing SLI alerts"},"lastSevenDaysAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Lastsevendaysalerts","description":"SLI alerts from the last 7 days"},"alertCount":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Alertcount","description":"SLI alert counts grouped by date"},"recent":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recent","description":"Recent SLI metric data from Cortex (Prometheus-style response)"},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last update timestamp"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"Spec dict matching Django CoreModelSerializer shape.","readOnly":true},"status":{"additionalProperties":true,"type":"object","title":"Status","description":"Status dict matching Django CoreModelSerializer shape.","readOnly":true}},"type":"object","required":["slxId","created","modified","spec","status"],"title":"SliResponse","description":"SLI (Service Level Indicator) response schema."},"papi__schemas__slx__SloResponse":{"properties":{"slxId":{"type":"integer","title":"Slxid","description":"Parent SLX ID (also serves as SLO ID)"},"sloSpecType":{"type":"string","title":"Slospectype","description":"SLO specification type","default":"simple-mwmb"},"objective":{"type":"number","title":"Objective","description":"SLO objective percentage","default":99.9},"threshold":{"type":"integer","title":"Threshold","description":"SLO threshold","default":9},"operand":{"type":"string","title":"Operand","description":"Comparison operand","default":"eq"},"codeBundleRepoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlerepourl","description":"Code bundle repository URL"},"codeBundleRef":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundleref","description":"Code bundle git ref"},"codeBundlePathToYaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codebundlepathtoyaml","description":"Path to SLO YAML"},"repositoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repositoryid","description":"Repository ID"},"generation":{"type":"integer","title":"Generation","description":"Generation number","default":0},"generationChecksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generationchecksum","description":"Generation checksum"},"ruleGroups":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Rulegroups","description":"Rule groups from CRD status (list of Prometheus rule-group dicts)"},"firingAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Firingalerts","description":"Currently firing SLO alerts"},"lastSevenDaysAlerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Lastsevendaysalerts","description":"SLO alerts from the last 7 days"},"alertCount":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Alertcount","description":"SLO alert counts grouped by date"},"monthErrorBudgetRemaining":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Montherrorbudgetremaining","description":"Calendar month error budget remaining (Prometheus-style response). Values are ratio units (0..1, negative on breach), passed through unchanged from Cortex."},"thirtyDayErrorBudgetRemaining":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Thirtydayerrorbudgetremaining","description":"Rolling 30-day error budget remaining (Prometheus-style response). Values are ratio units (0..1, negative on breach), passed through unchanged from Cortex."},"recent":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recent","description":"Recent SLO error budget remaining for an arbitrary history/resolution window (Prometheus-style response). Values are percent units (0..100, negative on breach) — the router multiplies the Cortex ratio by 100 (x100) before serialising. Consumers MUST NOT divide by 100; the existing `month_error_budget_remaining` and `thirty_day_error_budget_remaining` fields on the same response remain in ratio units."},"created":{"type":"string","format":"date-time","title":"Created","description":"Creation timestamp"},"modified":{"type":"string","format":"date-time","title":"Modified","description":"Last update timestamp"},"spec":{"additionalProperties":true,"type":"object","title":"Spec","description":"Spec dict matching Django CoreModelSerializer shape.","readOnly":true},"status":{"additionalProperties":true,"type":"object","title":"Status","description":"Status dict matching Django CoreModelSerializer shape.","readOnly":true}},"type":"object","required":["slxId","created","modified","spec","status"],"title":"SloResponse","description":"SLO (Service Level Objective) response schema."}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT access token from /api/v3/token/ or Auth0 login"}}}}