-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathopenapi.json
More file actions
1 lines (1 loc) · 187 KB
/
openapi.json
File metadata and controls
1 lines (1 loc) · 187 KB
1
{"openapi":"3.1.0","info":{"title":"ushadow API","description":"AI Orchestration Platform","version":"0.1.0"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/auth/cookie/login":{"post":{"tags":["auth","auth"],"summary":"Auth:Cookie.Login","operationId":"auth_cookie_login_api_auth_cookie_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_auth_cookie_login_api_auth_cookie_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"LOGIN_BAD_CREDENTIALS":{"summary":"Bad credentials or the user is inactive.","value":{"detail":"LOGIN_BAD_CREDENTIALS"}},"LOGIN_USER_NOT_VERIFIED":{"summary":"The user is not verified.","value":{"detail":"LOGIN_USER_NOT_VERIFIED"}}}}}},"204":{"description":"No Content"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/cookie/logout":{"post":{"tags":["auth","auth"],"summary":"Auth:Cookie.Logout","operationId":"auth_cookie_logout_api_auth_cookie_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing token or inactive user."},"204":{"description":"No Content"}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/jwt/login":{"post":{"tags":["auth","auth"],"summary":"Auth:Bearer.Login","operationId":"auth_bearer_login_api_auth_jwt_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_auth_bearer_login_api_auth_jwt_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BearerResponse"},"example":{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOTIyMWZmYzktNjQwZi00MzcyLTg2ZDMtY2U2NDJjYmE1NjAzIiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTcxNTA0MTkzfQ.M10bjOe45I5Ncu_uXvOmVV8QxnL-nZfcH96U90JaocI","token_type":"bearer"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"LOGIN_BAD_CREDENTIALS":{"summary":"Bad credentials or the user is inactive.","value":{"detail":"LOGIN_BAD_CREDENTIALS"}},"LOGIN_USER_NOT_VERIFIED":{"summary":"The user is not verified.","value":{"detail":"LOGIN_USER_NOT_VERIFIED"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/jwt/logout":{"post":{"tags":["auth","auth"],"summary":"Auth:Bearer.Logout","operationId":"auth_bearer_logout_api_auth_jwt_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing token or inactive user."}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/register":{"post":{"tags":["auth","auth"],"summary":"Register:Register","operationId":"register_register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"REGISTER_USER_ALREADY_EXISTS":{"summary":"A user with this email already exists.","value":{"detail":"REGISTER_USER_ALREADY_EXISTS"}},"REGISTER_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"REGISTER_INVALID_PASSWORD","reason":"Password should beat least 3 characters"}}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/forgot-password":{"post":{"tags":["auth","auth"],"summary":"Reset:Forgot Password","operationId":"reset_forgot_password_api_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reset_forgot_password_api_auth_forgot_password_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/reset-password":{"post":{"tags":["auth","auth"],"summary":"Reset:Reset Password","operationId":"reset_reset_password_api_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reset_reset_password_api_auth_reset_password_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"RESET_PASSWORD_BAD_TOKEN":{"summary":"Bad or expired token.","value":{"detail":"RESET_PASSWORD_BAD_TOKEN"}},"RESET_PASSWORD_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"RESET_PASSWORD_INVALID_PASSWORD","reason":"Password should be at least 3 characters"}}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/request-verify-token":{"post":{"tags":["auth","auth"],"summary":"Verify:Request-Token","operationId":"verify_request_token_api_auth_request_verify_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_request_token_api_auth_request_verify_token_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify":{"post":{"tags":["auth","auth"],"summary":"Verify:Verify","operationId":"verify_verify_api_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_verify_api_auth_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"VERIFY_USER_BAD_TOKEN":{"summary":"Bad token, not existing user ornot the e-mail currently set for the user.","value":{"detail":"VERIFY_USER_BAD_TOKEN"}},"VERIFY_USER_ALREADY_VERIFIED":{"summary":"The user is already verified.","value":{"detail":"VERIFY_USER_ALREADY_VERIFIED"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/users/me":{"get":{"tags":["auth","users"],"summary":"Users:Current User","operationId":"users_current_user_api_auth_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"patch":{"tags":["auth","users"],"summary":"Users:Patch Current User","operationId":"users_patch_current_user_api_auth_users_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"UPDATE_USER_EMAIL_ALREADY_EXISTS":{"summary":"A user with this email already exists.","value":{"detail":"UPDATE_USER_EMAIL_ALREADY_EXISTS"}},"UPDATE_USER_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"UPDATE_USER_INVALID_PASSWORD","reason":"Password should beat least 3 characters"}}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/users/{id}":{"get":{"tags":["auth","users"],"summary":"Users:User","operationId":"users_user_api_auth_users__id__get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."},"403":{"description":"Not a superuser."},"404":{"description":"The user does not exist."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["auth","users"],"summary":"Users:Patch User","operationId":"users_patch_user_api_auth_users__id__patch","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."},"403":{"description":"Not a superuser."},"404":{"description":"The user does not exist."},"400":{"content":{"application/json":{"examples":{"UPDATE_USER_EMAIL_ALREADY_EXISTS":{"summary":"A user with this email already exists.","value":{"detail":"UPDATE_USER_EMAIL_ALREADY_EXISTS"}},"UPDATE_USER_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"UPDATE_USER_INVALID_PASSWORD","reason":"Password should beat least 3 characters"}}}},"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Bad Request"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["auth","users"],"summary":"Users:Delete User","operationId":"users_delete_user_api_auth_users__id__delete","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing token or inactive user."},"403":{"description":"Not a superuser."},"404":{"description":"The user does not exist."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Authenticate user with email/password and return JWT token.\n\nThis endpoint accepts JSON (frontend-friendly) instead of form data.\nSets both a cookie and returns the token in the response.","operationId":"login_api_auth_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}}}}},"/api/auth/setup/status":{"get":{"tags":["auth"],"summary":"Get Setup Status","description":"Check if initial setup is required.\n\nReturns true if no users exist in the system.","operationId":"get_setup_status_api_auth_setup_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupStatusResponse"}}}}}}},"/api/auth/setup":{"post":{"tags":["auth"],"summary":"Create Initial Admin","description":"Create the first admin user and auto-login.\n\nOnly works if no users exist yet. This endpoint bypasses normal\nregistration to create a superuser account, then returns a token\nfor immediate login.","operationId":"create_initial_admin_api_auth_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupRequest"}}},"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"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Get Current User Info","description":"Get current authenticated user information.","operationId":"get_current_user_info_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/service-token":{"post":{"tags":["auth"],"summary":"Get Service Token","description":"Generate a JWT token for cross-service authentication.\n\nThis token can be used to authenticate with other services\n(like chronicle) that share the same AUTH_SECRET_KEY.\n\nThe token includes issuer (\"ushadow\") and audience claims\nso receiving services can validate the token's intended use.","operationId":"get_service_token_api_auth_service_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Logout current user by clearing the auth cookie.\n\nNote: For bearer tokens, logout is handled client-side by\ndiscarding the token. This endpoint clears the HTTP-only cookie.","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/wizard/api-keys":{"get":{"tags":["wizard"],"summary":"Get Wizard Api Keys","description":"Get current API keys configuration from OmegaConf.\n\nReturns masked values to show which keys are configured.","operationId":"get_wizard_api_keys_api_wizard_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeysStep"}}}}}},"put":{"tags":["wizard"],"summary":"Update Wizard Api Keys","description":"Update API keys configuration via OmegaConf.\n\nOnly updates keys that are provided (non-None values).\nSaves to secrets.yaml for persistence.","operationId":"update_wizard_api_keys_api_wizard_api_keys_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeysStep"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeysUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wizard/complete":{"post":{"tags":["wizard"],"summary":"Complete Wizard","description":"Mark wizard as complete.\n\nThe wizard is automatically marked as complete when API keys are configured.","operationId":"complete_wizard_api_wizard_complete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/wizard/huggingface/status":{"get":{"tags":["wizard"],"summary":"Get Huggingface Status","description":"Check HuggingFace connection status.\n\nValidates the stored HF token by calling the HuggingFace API.\nReturns connection status and username if connected.","operationId":"get_huggingface_status_api_wizard_huggingface_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HuggingFaceStatusResponse"}}}}}}},"/api/wizard/huggingface/models":{"get":{"tags":["wizard"],"summary":"Check Huggingface Models","description":"Check if user has access to required PyAnnote models.\n\nUses the stored HF token to check model access.\nReturns access status for each required model.\n\nFor gated models (like PyAnnote), we verify actual access by attempting\nto resolve a file, not just checking model metadata.","operationId":"check_huggingface_models_api_wizard_huggingface_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HuggingFaceModelsResponse"}}}}}}},"/api/wizard/quickstart":{"get":{"tags":["wizard"],"summary":"Get Quickstart Config","description":"Get setup requirements for default services.\n\nThis endpoint powers the quickstart wizard by:\n1. Getting default services from settings\n2. Using CapabilityResolver to determine what capabilities they need\n3. Returning aggregated provider/key requirements (deduplicated by capability)\n\nReturns capabilities with their providers and any missing keys.\nAlso returns service info with display names for UI rendering.","operationId":"get_quickstart_config_api_wizard_quickstart_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickstartResponse"}}}}}},"post":{"tags":["wizard"],"summary":"Save Quickstart Config","description":"Save key values from quickstart wizard.\n\nAccepts a dict of settings_path -> value (e.g., api_keys.openai_api_key -> sk-xxx).\nSaves directly to the settings store.","operationId":"save_quickstart_config_api_wizard_quickstart_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Key Values"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Save Quickstart Config Api Wizard Quickstart Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wizard/setup-state":{"get":{"tags":["wizard"],"summary":"Get Setup State","description":"Get persisted wizard state.\n\nReturns wizard progress from config.overrides.yaml → wizard section.","operationId":"get_setup_state_api_wizard_setup_state_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Setup State Api Wizard Setup State Get"}}}}}},"put":{"tags":["wizard"],"summary":"Save Setup State","description":"Save wizard state to config.overrides.yaml → wizard section.","operationId":"save_setup_state_api_wizard_setup_state_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"State"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Save Setup State Api Wizard Setup State Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chronicle/status":{"get":{"tags":["chronicle"],"summary":"Get Chronicle Status","description":"Get Chronicle backend status.","operationId":"get_chronicle_status_api_chronicle_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/chronicle/conversations":{"get":{"tags":["chronicle"],"summary":"Get Conversations","description":"Proxy request to Chronicle conversations endpoint.","operationId":"get_conversations_api_chronicle_conversations_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chronicle/memories":{"get":{"tags":["chronicle"],"summary":"Get Memories","description":"Proxy request to Chronicle memories endpoint.","operationId":"get_memories_api_chronicle_memories_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chronicle/memories/search":{"get":{"tags":["chronicle"],"summary":"Search Memories","description":"Proxy request to Chronicle memory search.","operationId":"search_memories_api_chronicle_memories_search_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings":{"get":{"tags":["settings"],"summary":"Get Settings Info","description":"Get current infrastructure settings.","operationId":"get_settings_info_api_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsResponse"}}}}}}},"/api/settings/config":{"get":{"tags":["settings"],"summary":"Get Config","description":"Get merged configuration with secrets masked.","operationId":"get_config_api_settings_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["settings"],"summary":"Update Config","description":"Update configuration values.","operationId":"update_config_api_settings_config_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Updates"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/service-configs":{"get":{"tags":["settings"],"summary":"Get All Service Configs","description":"Get all service-specific configurations.","operationId":"get_all_service_configs_api_settings_service_configs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/settings/service-configs/{service_id}":{"get":{"tags":["settings"],"summary":"Get Service Config","description":"Get configuration for a specific service.","operationId":"get_service_config_api_settings_service_configs__service_id__get","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["settings"],"summary":"Update Service Config","description":"Update configuration for a specific service.","operationId":"update_service_config_api_settings_service_configs__service_id__put","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Updates"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["settings"],"summary":"Delete Service Config","description":"Delete configuration for a specific service.","operationId":"delete_service_config_api_settings_service_configs__service_id__delete","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/reset":{"post":{"tags":["settings"],"summary":"Reset Config","description":"Reset all configuration including API keys.\n\nDeletes both config_settings.yaml and secrets.yaml,\nreturning to factory defaults.","operationId":"reset_config_api_settings_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/settings/refresh":{"post":{"tags":["settings"],"summary":"Refresh Config","description":"Refresh all cached configuration.\n\nReloads:\n- OmegaConf settings cache\n- Compose service registry (compose files)\n- Provider registry (capabilities and providers)\n\nUse after editing YAML config files to pick up changes without restart.","operationId":"refresh_config_api_settings_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Refresh Config Api Settings Refresh Post"}}}}}}},"/api/docker/status":{"get":{"tags":["docker"],"summary":"Get Docker Status","description":"Check if Docker daemon is available.\n\nNote: Service-related operations have moved to /api/services.\nUse:\n- GET /api/services/status - all services status\n- GET /api/services/{name}/docker - container details\n- POST /api/services/{name}/start - start service","operationId":"get_docker_status_api_docker_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/feature-flags/status":{"get":{"tags":["feature-flags","feature-flags"],"summary":"Get Feature Flags Status","description":"Get feature flag service status and list all flags.\n\nThis is a public endpoint (no auth required) so it can be called on app startup.","operationId":"get_feature_flags_status_api_feature_flags_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/feature-flags/check/{flag_name}":{"get":{"tags":["feature-flags","feature-flags"],"summary":"Check Feature Flag","description":"Check if a specific feature flag is enabled for the current user.\n\nArgs:\n flag_name: Name of the feature flag to check","operationId":"check_feature_flag_api_feature_flags_check__flag_name__get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"flag_name","in":"path","required":true,"schema":{"type":"string","title":"Flag Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feature-flags/toggle/{flag_name}":{"post":{"tags":["feature-flags","feature-flags"],"summary":"Toggle Feature Flag","description":"Toggle a feature flag's enabled state.\n\nArgs:\n flag_name: Name of the feature flag to toggle","operationId":"toggle_feature_flag_api_feature_flags_toggle__flag_name__post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"flag_name","in":"path","required":true,"schema":{"type":"string","title":"Flag Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/join/{token}":{"get":{"tags":["unodes"],"summary":"Get Join Script","description":"Get the join script for a token (bash).\nThis is called by: curl -sL \"http://leader/api/unodes/join/TOKEN\" | sh","operationId":"get_join_script_api_unodes_join__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/join/{token}/ps1":{"get":{"tags":["unodes"],"summary":"Get Join Script Powershell","description":"Get the join script for a token (PowerShell).\nThis is called by: iex (iwr \"http://leader/api/unodes/join/TOKEN/ps1\").Content","operationId":"get_join_script_powershell_api_unodes_join__token__ps1_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/bootstrap/{token}":{"get":{"tags":["unodes"],"summary":"Get Bootstrap Script","description":"Get the bootstrap script for a token (bash).\nWorks on machines without Tailscale - installs everything from scratch.\nUsage: curl -sL \"http://PUBLIC_IP:8000/api/unodes/bootstrap/TOKEN\" | sh","operationId":"get_bootstrap_script_api_unodes_bootstrap__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/bootstrap/{token}/ps1":{"get":{"tags":["unodes"],"summary":"Get Bootstrap Script Powershell","description":"Get the bootstrap script for a token (PowerShell).\nWorks on machines without Tailscale - installs everything from scratch.\nUsage: iex (iwr \"http://PUBLIC_IP:8000/api/unodes/bootstrap/TOKEN/ps1\").Content","operationId":"get_bootstrap_script_powershell_api_unodes_bootstrap__token__ps1_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/register":{"post":{"tags":["unodes"],"summary":"Register Unode","description":"Register a new u-node with the cluster.\nCalled by the join script.","operationId":"register_unode_api_unodes_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNodeRegistrationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNodeRegistrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/heartbeat":{"post":{"tags":["unodes"],"summary":"Unode Heartbeat","description":"Receive a heartbeat from a u-node.\nCalled periodically by ushadow-manager.","operationId":"unode_heartbeat_api_unodes_heartbeat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNodeHeartbeat"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNodeActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes":{"get":{"tags":["unodes"],"summary":"List Unodes","description":"List all u-nodes in the cluster.","operationId":"list_unodes_api_unodes_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/UNodeStatus"},{"type":"null"}],"title":"Status"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/UNodeRole"},{"type":"null"}],"title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNodeListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/discover/peers":{"get":{"tags":["unodes"],"summary":"Discover Peers","description":"Discover all Tailscale peers on the network.\n\nReturns:\n- registered: Nodes registered to this leader\n- available: Nodes with u-node manager but not registered here\n- unknown: Other Tailscale peers without u-node manager","operationId":"discover_peers_api_unodes_discover_peers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discover Peers Api Unodes Discover Peers Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/unodes/claim":{"post":{"tags":["unodes"],"summary":"Claim Node","description":"Claim an available u-node by registering it to this leader.\n\nThis endpoint allows claiming nodes that are:\n- Discovered on Tailscale network\n- Running u-node manager\n- Either unregistered or released from another leader","operationId":"claim_node_api_unodes_claim_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Request"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNodeRegistrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/unodes/versions":{"get":{"tags":["unodes"],"summary":"Get Manager Versions","description":"Get available ushadow-manager versions from the container registry.\n\nFetches tags from ghcr.io/ushadow-io/ushadow-manager and returns\nthem sorted with semantic versioning (latest first).","operationId":"get_manager_versions_api_unodes_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagerVersionsResponse"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/unodes/leader/info":{"get":{"tags":["unodes"],"summary":"Get Leader Info","description":"Get full leader information for mobile app connection.\n\nThis is an unauthenticated endpoint that returns leader details\nfor mobile apps that have just connected via QR code.\nThe mobile app uses this to display cluster status and capabilities.","operationId":"get_leader_info_api_unodes_leader_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderInfoResponse"}}}}}}},"/api/unodes/{hostname}":{"get":{"tags":["unodes"],"summary":"Get Unode","description":"Get details of a specific u-node.","operationId":"get_unode_api_unodes__hostname__get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hostname","in":"path","required":true,"schema":{"type":"string","title":"Hostname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNode"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["unodes"],"summary":"Remove Unode","description":"Remove a u-node from the cluster.","operationId":"remove_unode_api_unodes__hostname__delete","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hostname","in":"path","required":true,"schema":{"type":"string","title":"Hostname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNodeActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/tokens":{"post":{"tags":["unodes"],"summary":"Create Join Token","description":"Create a join token for new u-nodes.\nReturns the token and a one-liner join command.","operationId":"create_join_token_api_unodes_tokens_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinTokenCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/unodes/{hostname}/release":{"post":{"tags":["unodes"],"summary":"Release Unode","description":"Release a u-node so it can be claimed by another leader.\n\nThis removes the node from this leader's cluster but keeps the worker's\nmanager container running. The node will appear in the \"Discovered\" tab\nfor other leaders to claim.","operationId":"release_unode_api_unodes__hostname__release_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hostname","in":"path","required":true,"schema":{"type":"string","title":"Hostname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNodeActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/{hostname}/status":{"post":{"tags":["unodes"],"summary":"Update Unode Status","description":"Manually update a u-node's status.","operationId":"update_unode_status_api_unodes__hostname__status_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hostname","in":"path","required":true,"schema":{"type":"string","title":"Hostname"}},{"name":"status","in":"query","required":true,"schema":{"$ref":"#/components/schemas/UNodeStatus"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UNodeActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/{hostname}/upgrade":{"post":{"tags":["unodes"],"summary":"Upgrade Unode","description":"Upgrade a u-node's manager to a new version.\n\nThis triggers the remote node to:\n1. Pull the new manager image\n2. Stop and remove its current container\n3. Start a new container with the new image\n\nThe node will be briefly offline during the upgrade (~10 seconds).","operationId":"upgrade_unode_api_unodes__hostname__upgrade_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hostname","in":"path","required":true,"schema":{"type":"string","title":"Hostname"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequest","default":{"version":"latest","registry":"ghcr.io/ushadow-io"}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unodes/upgrade-all":{"post":{"tags":["unodes"],"summary":"Upgrade All Unodes","description":"Upgrade all online worker u-nodes to a new manager version.\n\nThis performs a rolling upgrade across all workers.","operationId":"upgrade_all_unodes_api_unodes_upgrade_all_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequest","default":{"version":"latest","registry":"ghcr.io/ushadow-io"}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upgrade All Unodes Api Unodes Upgrade All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/kubernetes":{"get":{"tags":["kubernetes"],"summary":"List Clusters","description":"List all registered Kubernetes clusters.","operationId":"list_clusters_api_kubernetes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/KubernetesCluster"},"type":"array","title":"Response List Clusters Api Kubernetes Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["kubernetes"],"summary":"Add Cluster","description":"Add a new Kubernetes cluster.\n\nUpload a kubeconfig file (base64-encoded) to register a cluster.\nUshadow will validate connectivity before adding it.","operationId":"add_cluster_api_kubernetes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KubernetesClusterCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KubernetesCluster"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/kubernetes/{cluster_id}":{"get":{"tags":["kubernetes"],"summary":"Get Cluster","description":"Get details of a specific Kubernetes cluster.","operationId":"get_cluster_api_kubernetes__cluster_id__get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KubernetesCluster"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["kubernetes"],"summary":"Remove Cluster","description":"Remove a Kubernetes cluster from Ushadow.","operationId":"remove_cluster_api_kubernetes__cluster_id__delete","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/":{"get":{"tags":["services"],"summary":"List Services","description":"List all installed services.\n\nReturns services that are in default_services or user-added,\nwith their current docker status.","operationId":"list_services_api_services__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Services Api Services Get"}}}}}}},"/api/services/catalog":{"get":{"tags":["services"],"summary":"List Catalog","description":"List all available services (catalog).\n\nReturns all discovered services regardless of installation status.\nEach service includes an 'installed' flag.","operationId":"list_catalog_api_services_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Catalog Api Services Catalog Get"}}}}}}},"/api/services/by-capability/{capability}":{"get":{"tags":["services"],"summary":"Get Services By Capability","description":"Get all services that require a specific capability.\n\nArgs:\n capability: Capability name (e.g., 'llm', 'transcription')","operationId":"get_services_by_capability_api_services_by_capability__capability__get","parameters":[{"name":"capability","in":"path","required":true,"schema":{"type":"string","title":"Capability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Services By Capability Api Services By Capability Capability Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/docker-status":{"get":{"tags":["services"],"summary":"Get Docker Status","description":"Check if Docker daemon is available.","operationId":"get_docker_status_api_services_docker_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Docker Status Api Services Docker Status Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/services/status":{"get":{"tags":["services"],"summary":"Get All Statuses","description":"Get lightweight status for all services.\n\nReturns only name, status, and health - optimized for polling.","operationId":"get_all_statuses_api_services_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Response Get All Statuses Api Services Status Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/services/{name}":{"get":{"tags":["services"],"summary":"Get Service","description":"Get details for a specific service.\n\nArgs:\n name: Service name (e.g., 'chronicle')\n include_env: Include environment variable definitions","operationId":"get_service_api_services__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"include_env","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Env"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Service Api Services Name Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/status":{"get":{"tags":["services"],"summary":"Get Service Status","description":"Get status for a single service.","operationId":"get_service_status_api_services__name__status_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Service Status Api Services Name Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/docker":{"get":{"tags":["services"],"summary":"Get Docker Details","description":"Get Docker container details for a service.\n\nReturns container_id, status, image, ports, health, endpoints, etc.","operationId":"get_docker_details_api_services__name__docker_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Docker Details Api Services Name Docker Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/preflight":{"get":{"tags":["services"],"summary":"Preflight Check","description":"Pre-start checks for a service.\n\nChecks for port conflicts before attempting to start a service.\nIf conflicts are found, returns suggested alternative ports.","operationId":"preflight_check_api_services__name__preflight_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/port-override":{"post":{"tags":["services"],"summary":"Set Port Override","description":"Set a port override for a service.\n\nThis saves the port to service_preferences and sets the environment variable\nso that subsequent service starts will use the new port.","operationId":"set_port_override_api_services__name__port_override_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortOverrideRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/connection-info":{"get":{"tags":["services"],"summary":"Get Service Connection Info","description":"Get connection info for a service with both proxy and direct URLs.\n\nReturns TWO connection patterns for flexible service integration:\n\n1. proxy_url (Recommended for REST APIs):\n - Goes through ushadow backend proxy (/api/services/{name}/proxy/*)\n - Unified authentication (single JWT)\n - No CORS issues\n - Centralized logging/monitoring\n\n2. direct_url (For WebSocket/Streaming):\n - Direct connection to service (http://localhost:{port})\n - Low latency for real-time data\n - Use for: WebSocket, SSE, audio streaming (ws_pcm)\n\nExample:\n const info = await api.get('/api/services/chronicle-backend/connection-info')\n\n // For REST APIs (conversations, queue, config)\n axios.get(`${info.proxy_url}/api/conversations`) // -> /api/services/chronicle-backend/proxy/api/conversations\n\n // For WebSocket streaming (ws_pcm)\n new WebSocket(`ws://localhost:${info.port}/ws_pcm`) // -> ws://localhost:8082/ws_pcm","operationId":"get_service_connection_info_api_services__name__connection_info_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Service Connection Info Api Services Name Connection Info Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/proxy/{path}":{"delete":{"tags":["services"],"summary":"Proxy Service Request","description":"Generic proxy endpoint for service REST APIs.\n\nRoutes frontend requests through ushadow backend to any managed service.\nThis provides:\n- Unified authentication (JWT forwarded to service)\n- No CORS issues\n- Centralized logging/monitoring\n- Service discovery (no hardcoded ports)\n\nUsage:\n Frontend: axios.get('/api/services/chronicle-backend/proxy/api/conversations')\n Backend: Forwards to http://chronicle-backend:8000/api/conversations\n\nFor WebSocket/streaming, use direct_url from connection-info instead.","operationId":"proxy_service_request_api_services__name__proxy__path__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"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"}}}}}},"patch":{"tags":["services"],"summary":"Proxy Service Request","description":"Generic proxy endpoint for service REST APIs.\n\nRoutes frontend requests through ushadow backend to any managed service.\nThis provides:\n- Unified authentication (JWT forwarded to service)\n- No CORS issues\n- Centralized logging/monitoring\n- Service discovery (no hardcoded ports)\n\nUsage:\n Frontend: axios.get('/api/services/chronicle-backend/proxy/api/conversations')\n Backend: Forwards to http://chronicle-backend:8000/api/conversations\n\nFor WebSocket/streaming, use direct_url from connection-info instead.","operationId":"proxy_service_request_api_services__name__proxy__path__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"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"}}}}}},"post":{"tags":["services"],"summary":"Proxy Service Request","description":"Generic proxy endpoint for service REST APIs.\n\nRoutes frontend requests through ushadow backend to any managed service.\nThis provides:\n- Unified authentication (JWT forwarded to service)\n- No CORS issues\n- Centralized logging/monitoring\n- Service discovery (no hardcoded ports)\n\nUsage:\n Frontend: axios.get('/api/services/chronicle-backend/proxy/api/conversations')\n Backend: Forwards to http://chronicle-backend:8000/api/conversations\n\nFor WebSocket/streaming, use direct_url from connection-info instead.","operationId":"proxy_service_request_api_services__name__proxy__path__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"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"}}}}}},"get":{"tags":["services"],"summary":"Proxy Service Request","description":"Generic proxy endpoint for service REST APIs.\n\nRoutes frontend requests through ushadow backend to any managed service.\nThis provides:\n- Unified authentication (JWT forwarded to service)\n- No CORS issues\n- Centralized logging/monitoring\n- Service discovery (no hardcoded ports)\n\nUsage:\n Frontend: axios.get('/api/services/chronicle-backend/proxy/api/conversations')\n Backend: Forwards to http://chronicle-backend:8000/api/conversations\n\nFor WebSocket/streaming, use direct_url from connection-info instead.","operationId":"proxy_service_request_api_services__name__proxy__path__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"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"}}}}}},"options":{"tags":["services"],"summary":"Proxy Service Request","description":"Generic proxy endpoint for service REST APIs.\n\nRoutes frontend requests through ushadow backend to any managed service.\nThis provides:\n- Unified authentication (JWT forwarded to service)\n- No CORS issues\n- Centralized logging/monitoring\n- Service discovery (no hardcoded ports)\n\nUsage:\n Frontend: axios.get('/api/services/chronicle-backend/proxy/api/conversations')\n Backend: Forwards to http://chronicle-backend:8000/api/conversations\n\nFor WebSocket/streaming, use direct_url from connection-info instead.","operationId":"proxy_service_request_api_services__name__proxy__path__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"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"}}}}}},"put":{"tags":["services"],"summary":"Proxy Service Request","description":"Generic proxy endpoint for service REST APIs.\n\nRoutes frontend requests through ushadow backend to any managed service.\nThis provides:\n- Unified authentication (JWT forwarded to service)\n- No CORS issues\n- Centralized logging/monitoring\n- Service discovery (no hardcoded ports)\n\nUsage:\n Frontend: axios.get('/api/services/chronicle-backend/proxy/api/conversations')\n Backend: Forwards to http://chronicle-backend:8000/api/conversations\n\nFor WebSocket/streaming, use direct_url from connection-info instead.","operationId":"proxy_service_request_api_services__name__proxy__path__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"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"}}}}}}},"/api/services/debug/docker-ports":{"get":{"tags":["services"],"summary":"Debug Docker Ports","description":"Debug endpoint to show all Docker container port bindings.","operationId":"debug_docker_ports_api_services_debug_docker_ports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Debug Docker Ports Api Services Debug Docker Ports Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/services/{name}/start":{"post":{"tags":["services"],"summary":"Start Service","description":"Start a service container.","operationId":"start_service_api_services__name__start_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/stop":{"post":{"tags":["services"],"summary":"Stop Service","description":"Stop a service container.","operationId":"stop_service_api_services__name__stop_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/restart":{"post":{"tags":["services"],"summary":"Restart Service","description":"Restart a service container.","operationId":"restart_service_api_services__name__restart_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/logs":{"get":{"tags":["services"],"summary":"Get Service Logs","description":"Get logs from a service container.\n\nArgs:\n name: Service name\n tail: Number of lines to retrieve (default 100)","operationId":"get_service_logs_api_services__name__logs_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"tail","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Tail"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/enabled":{"get":{"tags":["services"],"summary":"Get Enabled State","description":"Get enabled state for a service.","operationId":"get_enabled_state_api_services__name__enabled_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Enabled State Api Services Name Enabled Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["services"],"summary":"Set Enabled State","description":"Enable or disable a service.","operationId":"set_enabled_state_api_services__name__enabled_put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnabledRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Enabled State Api Services Name Enabled Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/config":{"get":{"tags":["services"],"summary":"Get Service Config","description":"Get full service configuration.\n\nReturns enabled state, env config, and preferences.","operationId":"get_service_config_api_services__name__config_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Service Config Api Services Name Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/env":{"get":{"tags":["services"],"summary":"Get Env Config","description":"Get environment variable configuration for a service.\n\nReturns the env schema with current configuration and suggested settings.","operationId":"get_env_config_api_services__name__env_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Env Config Api Services Name Env Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["services"],"summary":"Update Env Config","description":"Save environment variable configuration for a service.\n\nSource types:\n- \"setting\": Use value from an existing settings path\n- \"new_setting\": Create a new setting and map to it\n- \"literal\": Use a directly entered value\n- \"default\": Use the compose file's default","operationId":"update_env_config_api_services__name__env_put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvConfigUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Env Config Api Services Name Env Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/resolve":{"get":{"tags":["services"],"summary":"Resolve Env Vars","description":"Resolve environment variables for runtime injection.\n\nReturns the actual values that would be passed to docker compose.\nSensitive values are masked in the response.","operationId":"resolve_env_vars_api_services__name__resolve_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resolve Env Vars Api Services Name Resolve Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/env-export":{"get":{"tags":["services"],"summary":"Export Env Vars","description":"Export environment variables for local development.\n\nReturns unmasked values suitable for running services locally.\nUse env_content for .env file format or env_vars for dict.\n\nExample usage:\n curl -H \"Authorization: Bearer $TOKEN\" \\\n http://localhost:8050/api/services/chronicle-backend/env-export \\\n | jq -r '.env_content' > .env.chronicle","operationId":"export_env_vars_api_services__name__env_export_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Export Env Vars Api Services Name Env Export Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/install":{"post":{"tags":["services"],"summary":"Install Service","description":"Install a service (add to installed services list).\n\nThis marks the service as user-added, overriding default_services.","operationId":"install_service_api_services__name__install_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Install Service Api Services Name Install Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/{name}/uninstall":{"post":{"tags":["services"],"summary":"Uninstall Service","description":"Uninstall a service (remove from installed services list).\n\nThis marks the service as removed, overriding default_services.","operationId":"uninstall_service_api_services__name__uninstall_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Uninstall Service Api Services Name Uninstall Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/services/register":{"post":{"tags":["services"],"summary":"Register Dynamic Service","description":"Register a dynamic service (e.g., Pieces app, custom integration).\n\nThis allows runtime registration of new services.","operationId":"register_dynamic_service_api_services_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterServiceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/providers":{"get":{"tags":["providers"],"summary":"List Providers","description":"List all providers (summary).","operationId":"list_providers_api_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Response List Providers Api Providers Get"}}}}}}},"/api/providers/capability/{capability}":{"get":{"tags":["providers"],"summary":"Get Providers By Capability","description":"Get providers for a capability with config status.","operationId":"get_providers_by_capability_api_providers_capability__capability__get","parameters":[{"name":"capability","in":"path","required":true,"schema":{"type":"string","title":"Capability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Providers By Capability Api Providers Capability Capability Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/providers/capabilities":{"get":{"tags":["providers"],"summary":"List Capabilities","description":"List capabilities with providers and config status.","operationId":"list_capabilities_api_providers_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Capabilities Api Providers Capabilities Get"}}}}}}},"/api/providers/{provider_id}":{"get":{"tags":["providers"],"summary":"Get Provider","description":"Get full provider details.","operationId":"get_provider_api_providers__provider_id__get","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"string","title":"Provider Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Provider Api Providers Provider Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/providers/{provider_id}/missing":{"get":{"tags":["providers"],"summary":"Get Provider Missing","description":"Get missing required fields for a provider.","operationId":"get_provider_missing_api_providers__provider_id__missing_get","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"string","title":"Provider Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Provider Missing Api Providers Provider Id Missing Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/providers/find":{"post":{"tags":["providers"],"summary":"Find Providers","description":"Find providers matching criteria.","operationId":"find_providers_api_providers_find_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Find Providers Api Providers Find Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/providers/selected":{"get":{"tags":["providers"],"summary":"Get Selected","description":"Get current provider selections.","operationId":"get_selected_api_providers_selected_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Selected Api Providers Selected Get"}}}}}},"put":{"tags":["providers"],"summary":"Update Selected","description":"Update provider selections.","operationId":"update_selected_api_providers_selected_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectionUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update Selected Api Providers Selected Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/providers/apply-defaults/{mode}":{"post":{"tags":["providers"],"summary":"Apply Defaults","description":"Apply default providers for a mode.","operationId":"apply_defaults_api_providers_apply_defaults__mode__post","parameters":[{"name":"mode","in":"path","required":true,"schema":{"type":"string","title":"Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Apply Defaults Api Providers Apply Defaults Mode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/templates":{"get":{"tags":["instances","instances"],"summary":"List Templates","description":"List available templates (compose services + providers).\n\nTemplates are discovered from compose/*.yaml and providers/*.yaml.","operationId":"list_templates_api_instances_templates_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Template"},"title":"Response List Templates Api Instances Templates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/templates/{template_id}":{"get":{"tags":["instances","instances"],"summary":"Get Template","description":"Get a template by ID.","operationId":"get_template_api_instances_templates__template_id__get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances":{"get":{"tags":["instances","instances"],"summary":"List Instances","description":"List all instances.","operationId":"list_instances_api_instances_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/InstanceSummary"},"type":"array","title":"Response List Instances Api Instances Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["instances","instances"],"summary":"Create Instance","description":"Create a new instance from a template.\n\nConfig values that match template defaults are filtered out,\nso only actual overrides are stored.","operationId":"create_instance_api_instances_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instance"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/instances/{instance_id}":{"get":{"tags":["instances","instances"],"summary":"Get Instance","description":"Get an instance by ID.\n\nThe config.values will only contain override values - values that differ\nfrom the template defaults. This uses two methods:\n1. OmegaConf.is_interpolation to identify inherited values (interpolations)\n2. Comparison with template defaults for direct values","operationId":"get_instance_api_instances__instance_id__get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instance"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["instances","instances"],"summary":"Update Instance","description":"Update an instance.\n\nConfig values that match template defaults are filtered out,\nso only actual overrides are stored.","operationId":"update_instance_api_instances__instance_id__put","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instance"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["instances","instances"],"summary":"Delete Instance","description":"Delete an instance.","operationId":"delete_instance_api_instances__instance_id__delete","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Instance Api Instances Instance Id Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/{instance_id}/deploy":{"post":{"tags":["instances","instances"],"summary":"Deploy Instance","description":"Deploy/start an instance.\n\nFor compose services, this starts the docker container.\nFor cloud providers, this marks the instance as active.","operationId":"deploy_instance_api_instances__instance_id__deploy_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deploy Instance Api Instances Instance Id Deploy Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/{instance_id}/undeploy":{"post":{"tags":["instances","instances"],"summary":"Undeploy Instance","description":"Stop/undeploy an instance.\n\nFor compose services, this stops the docker container.\nFor cloud providers, this marks the instance as inactive.","operationId":"undeploy_instance_api_instances__instance_id__undeploy_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Undeploy Instance Api Instances Instance Id Undeploy Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/wiring/all":{"get":{"tags":["instances","instances"],"summary":"List Wiring","description":"List all wiring connections.","operationId":"list_wiring_api_instances_wiring_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Wiring"},"type":"array","title":"Response List Wiring Api Instances Wiring All Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/instances/wiring/defaults":{"get":{"tags":["instances","instances"],"summary":"Get Defaults","description":"Get default capability -> instance mappings.","operationId":"get_defaults_api_instances_wiring_defaults_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Get Defaults Api Instances Wiring Defaults Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/instances/wiring/defaults/{capability}":{"put":{"tags":["instances","instances"],"summary":"Set Default","description":"Set default instance for a capability.","operationId":"set_default_api_instances_wiring_defaults__capability__put","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"capability","in":"path","required":true,"schema":{"type":"string","title":"Capability"}},{"name":"instance_id","in":"query","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Default Api Instances Wiring Defaults Capability Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/wiring":{"post":{"tags":["instances","instances"],"summary":"Create Wiring","description":"Create a wiring connection.","operationId":"create_wiring_api_instances_wiring_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WiringCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Wiring"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/instances/wiring/{wiring_id}":{"delete":{"tags":["instances","instances"],"summary":"Delete Wiring","description":"Delete a wiring connection.","operationId":"delete_wiring_api_instances_wiring__wiring_id__delete","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"wiring_id","in":"path","required":true,"schema":{"type":"string","title":"Wiring Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Wiring Api Instances Wiring Wiring Id Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/{instance_id}/wiring":{"get":{"tags":["instances","instances"],"summary":"Get Instance Wiring","description":"Get wiring connections for an instance.","operationId":"get_instance_wiring_api_instances__instance_id__wiring_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Wiring"},"title":"Response Get Instance Wiring Api Instances Instance Id Wiring Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/{instance_id}/test-connection":{"post":{"tags":["instances","instances"],"summary":"Test Integration Connection","description":"Test connection to an integration.\n\nOnly works for integration instances (instances with integration_type set).","operationId":"test_integration_connection_api_instances__instance_id__test_connection_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Integration Connection Api Instances Instance Id Test Connection Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/{instance_id}/sync":{"post":{"tags":["instances","instances"],"summary":"Trigger Integration Sync","description":"Manually trigger sync for an integration.\n\nOnly works for integration instances (instances with integration_type set).","operationId":"trigger_integration_sync_api_instances__instance_id__sync_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Integration Sync Api Instances Instance Id Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/{instance_id}/sync-status":{"get":{"tags":["instances","instances"],"summary":"Get Integration Sync Status","description":"Get current sync status for an integration.\n\nOnly works for integration instances (instances with integration_type set).","operationId":"get_integration_sync_status_api_instances__instance_id__sync_status_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Integration Sync Status Api Instances Instance Id Sync Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/{instance_id}/sync/enable":{"post":{"tags":["instances","instances"],"summary":"Enable Integration Auto Sync","description":"Enable automatic syncing for an integration.\n\nOnly works for integration instances (instances with integration_type set).\nRequires sync_interval to be configured on the instance.","operationId":"enable_integration_auto_sync_api_instances__instance_id__sync_enable_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Enable Integration Auto Sync Api Instances Instance Id Sync Enable Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instances/{instance_id}/sync/disable":{"post":{"tags":["instances","instances"],"summary":"Disable Integration Auto Sync","description":"Disable automatic syncing for an integration.\n\nOnly works for integration instances (instances with integration_type set).","operationId":"disable_integration_auto_sync_api_instances__instance_id__sync_disable_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Disable Integration Auto Sync Api Instances Instance Id Sync Disable Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chat/status":{"get":{"tags":["chat"],"summary":"Get Chat Status","description":"Get chat configuration status.\n\nReturns whether LLM is configured and which provider/model is active.","operationId":"get_chat_status_api_chat_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatStatus"}}}}}}},"/api/chat":{"post":{"tags":["chat"],"summary":"Chat","description":"Chat endpoint with streaming response.\n\nAccepts messages and returns a streaming response compatible with\nassistant-ui's data stream protocol.","operationId":"chat_api_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chat/simple":{"post":{"tags":["chat"],"summary":"Chat Simple","description":"Non-streaming chat endpoint.\n\nReturns the complete response as JSON. Useful for testing or\nwhen streaming isn't needed.","operationId":"chat_simple_api_chat_simple_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Chat Simple Api Chat Simple Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/services":{"get":{"tags":["deployments","deployments"],"summary":"List Service Definitions","description":"List all service definitions.","operationId":"list_service_definitions_api_deployments_services_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ServiceDefinition"},"type":"array","title":"Response List Service Definitions Api Deployments Services Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["deployments","deployments"],"summary":"Create Service Definition","description":"Create a new service definition.","operationId":"create_service_definition_api_deployments_services_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDefinitionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDefinition"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/deployments/services/{service_id}":{"get":{"tags":["deployments","deployments"],"summary":"Get Service Definition","description":"Get a service definition by ID.","operationId":"get_service_definition_api_deployments_services__service_id__get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDefinition"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["deployments","deployments"],"summary":"Update Service Definition","description":"Update a service definition.","operationId":"update_service_definition_api_deployments_services__service_id__put","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDefinitionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDefinition"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["deployments","deployments"],"summary":"Delete Service Definition","description":"Delete a service definition.","operationId":"delete_service_definition_api_deployments_services__service_id__delete","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/deploy":{"post":{"tags":["deployments","deployments"],"summary":"Deploy Service","description":"Deploy a service to a u-node.","operationId":"deploy_service_api_deployments_deploy_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deployment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/deployments":{"get":{"tags":["deployments","deployments"],"summary":"List Deployments","description":"List all deployments with optional filters.","operationId":"list_deployments_api_deployments_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"service_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Id"}},{"name":"unode_hostname","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unode Hostname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Deployment"},"title":"Response List Deployments Api Deployments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/{deployment_id}":{"get":{"tags":["deployments","deployments"],"summary":"Get Deployment","description":"Get a deployment by ID.","operationId":"get_deployment_api_deployments__deployment_id__get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deployment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["deployments","deployments"],"summary":"Remove Deployment","description":"Remove a deployment (stop and delete).","operationId":"remove_deployment_api_deployments__deployment_id__delete","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/{deployment_id}/stop":{"post":{"tags":["deployments","deployments"],"summary":"Stop Deployment","description":"Stop a deployment.","operationId":"stop_deployment_api_deployments__deployment_id__stop_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deployment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/{deployment_id}/restart":{"post":{"tags":["deployments","deployments"],"summary":"Restart Deployment","description":"Restart a deployment.","operationId":"restart_deployment_api_deployments__deployment_id__restart_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deployment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/{deployment_id}/logs":{"get":{"tags":["deployments","deployments"],"summary":"Get Deployment Logs","description":"Get logs for a deployment.","operationId":"get_deployment_logs_api_deployments__deployment_id__logs_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}},{"name":"tail","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Tail"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tailscale/environment":{"get":{"tags":["tailscale","tailscale"],"summary":"Get Environment Info","description":"Get current environment information for Tailscale setup","operationId":"get_environment_info_api_tailscale_environment_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentInfo"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/platform":{"get":{"tags":["tailscale","tailscale"],"summary":"Detect Platform","description":"Detect the current platform and system information","operationId":"detect_platform_api_tailscale_platform_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformInfo"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/installation-guide":{"get":{"tags":["tailscale","tailscale"],"summary":"Get Installation Guide","description":"Get platform-specific Tailscale installation instructions","operationId":"get_installation_guide_api_tailscale_installation_guide_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"os_type","in":"query","required":true,"schema":{"type":"string","title":"Os Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallationGuide"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tailscale/config":{"get":{"tags":["tailscale","tailscale"],"summary":"Get Config","description":"Get current Tailscale configuration","operationId":"get_config_api_tailscale_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TailscaleConfig"},{"type":"null"}],"title":"Response Get Config Api Tailscale Config Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["tailscale","tailscale"],"summary":"Save Config","description":"Save Tailscale configuration","operationId":"save_config_api_tailscale_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TailscaleConfig"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TailscaleConfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/generate-config":{"post":{"tags":["tailscale","tailscale"],"summary":"Generate Tailscale Config","description":"Generate Tailscale serve configuration or Caddyfile based on deployment mode","operationId":"generate_tailscale_config_api_tailscale_generate_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TailscaleConfig"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Generate Tailscale Config Api Tailscale Generate Config Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/access-urls":{"get":{"tags":["tailscale","tailscale"],"summary":"Get Access Urls","description":"Get access URLs for all configured services","operationId":"get_access_urls_api_tailscale_access_urls_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessUrls"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/test-connection":{"post":{"tags":["tailscale","tailscale"],"summary":"Test Connection","description":"Test connection to a specific URL","operationId":"test_connection_api_tailscale_test_connection_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Connection Api Tailscale Test Connection Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tailscale/container/status":{"get":{"tags":["tailscale","tailscale"],"summary":"Get Container Status","description":"Get Tailscale container status","operationId":"get_container_status_api_tailscale_container_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerStatus"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/mobile/connect-qr":{"get":{"tags":["tailscale","tailscale"],"summary":"Get Mobile Connection Qr","description":"Generate QR code for mobile app to connect to this leader.\n\nThe QR code contains minimal connection details (hostname, Tailscale IP, port)\nplus an auth token for automatic authentication with ushadow and chronicle.\nAfter scanning, the mobile app fetches full details from /api/unodes/leader/info","operationId":"get_mobile_connection_qr_api_tailscale_mobile_connect_qr_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileConnectionQR"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/container/clear-auth":{"post":{"tags":["tailscale","tailscale"],"summary":"Clear Tailscale Auth","description":"Clear local Tailscale authentication state.\n\nThis does a complete local cleanup:\n1. Logs out from Tailscale locally\n2. Stops and removes the container\n3. Deletes the state volume (clears all cached auth)\n\nNote: The machine will still appear in your Tailscale admin panel\nuntil you manually delete it at https://login.tailscale.com/admin/machines","operationId":"clear_tailscale_auth_api_tailscale_container_clear_auth_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Clear Tailscale Auth Api Tailscale Container Clear Auth Post"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/container/reset":{"post":{"tags":["tailscale","tailscale"],"summary":"Reset Tailscale","description":"Complete Tailscale reset - returns everything to defaults.\n\nThis performs a comprehensive cleanup:\n1. Clears all Tailscale Serve routes\n2. Removes certificates\n3. Logs out from Tailscale\n4. Stops and removes the container\n5. Deletes the state volume\n6. Removes Tailscale configuration files\n\nNote: The machine will still appear in your Tailscale admin panel\nuntil you manually delete it at https://login.tailscale.com/admin/machines","operationId":"reset_tailscale_api_tailscale_container_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reset Tailscale Api Tailscale Container Reset Post"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/container/start":{"post":{"tags":["tailscale","tailscale"],"summary":"Start Tailscale Container","description":"Start or create Tailscale container using Docker SDK.\n\nCreates a per-environment Tailscale container using COMPOSE_PROJECT_NAME.\nThe container will be named {env}-tailscale and use {env} as its hostname.","operationId":"start_tailscale_container_api_tailscale_container_start_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Start Tailscale Container Api Tailscale Container Start Post"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/container/start-with-caddy":{"post":{"tags":["tailscale","tailscale"],"summary":"Start Tailscale With Caddy","description":"Start both Tailscale and Caddy containers, then configure routing.\n\nThis sets up the full reverse proxy architecture:\n- Tailscale handles secure HTTPS access via MagicDNS\n- Caddy handles path-based routing to services\n\nRoute configuration:\n- /chronicle/* -> Chronicle backend (strips prefix)\n- /api/* -> Ushadow backend\n- /auth/* -> Ushadow backend\n- /ws_pcm -> Ushadow WebSocket\n- /* -> Ushadow frontend","operationId":"start_tailscale_with_caddy_api_tailscale_container_start_with_caddy_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Tailscale With Caddy Api Tailscale Container Start With Caddy Post"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/container/start-caddy":{"post":{"tags":["tailscale","tailscale"],"summary":"Start Caddy Container","description":"Start or create Caddy reverse proxy container.\n\nCreates the Caddy container for path-based routing to services.\nMust be called before configuring Tailscale Serve routes.","operationId":"start_caddy_container_api_tailscale_container_start_caddy_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Start Caddy Container Api Tailscale Container Start Caddy Post"}}}}}}},"/api/tailscale/caddy/status":{"get":{"tags":["tailscale","tailscale"],"summary":"Get Caddy Status","description":"Get Caddy container status.","operationId":"get_caddy_status_api_tailscale_caddy_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Caddy Status Api Tailscale Caddy Status Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/container/auth-url":{"get":{"tags":["tailscale","tailscale"],"summary":"Get Auth Url","description":"Get Tailscale authentication URL with QR code.\n\nArgs:\n regenerate: If True, logout first to force a new auth URL","operationId":"get_auth_url_api_tailscale_container_auth_url_get","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"regenerate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Regenerate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tailscale/container/tailnet-settings":{"get":{"tags":["tailscale","tailscale"],"summary":"Get Tailnet Settings","description":"Check Tailscale tailnet settings like MagicDNS and HTTPS.\n\nReturns information about which features are enabled and links to enable them.","operationId":"get_tailnet_settings_api_tailscale_container_tailnet_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Tailnet Settings Api Tailscale Container Tailnet Settings Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/container/enable-https":{"post":{"tags":["tailscale","tailscale"],"summary":"Enable Https Provisioning","description":"Enable HTTPS provisioning in Tailscale.\n\nThis must be run before provisioning certificates.\nEnables HTTPS by setting a minimal HTTPS route.\n\nSee: https://tailscale.com/kb/1153/enabling-https","operationId":"enable_https_provisioning_api_tailscale_container_enable_https_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Enable Https Provisioning Api Tailscale Container Enable Https Post"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/container/provision-cert":{"post":{"tags":["tailscale","tailscale"],"summary":"Provision Cert In Container","description":"Provision certificate via Tailscale container","operationId":"provision_cert_in_container_api_tailscale_container_provision_cert_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hostname","in":"query","required":true,"schema":{"type":"string","title":"Hostname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertificateStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tailscale/configure-serve":{"post":{"tags":["tailscale","tailscale"],"summary":"Configure Tailscale Serve","description":"Configure Tailscale serve for routing.\n\nSets up base routes: /api/* and /auth/* to backend, /* to frontend,\nand WebSocket routes /ws_pcm and /ws_omi direct to Chronicle.\nAlso saves the Tailscale configuration to disk.","operationId":"configure_tailscale_serve_api_tailscale_configure_serve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TailscaleConfig"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Configure Tailscale Serve Api Tailscale Configure Serve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/complete":{"post":{"tags":["tailscale","tailscale"],"summary":"Complete Setup","description":"Mark Tailscale setup as complete","operationId":"complete_setup_api_tailscale_complete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Complete Setup Api Tailscale Complete Post"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tailscale/update-cors":{"post":{"tags":["tailscale","tailscale"],"summary":"Update Cors Origins","description":"Add Tailscale hostname to CORS allowed origins.\n\nThis endpoint appends the Tailscale HTTPS origin to the security.cors_origins\nsetting so the frontend can make requests from the Tailscale URL.\n\nNote: The CORS middleware reads origins at startup. A server restart may be\nneeded for the new origin to take effect.","operationId":"update_cors_origins_api_tailscale_update_cors_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCorsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Update Cors Origins Api Tailscale Update Cors Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github-import/scan":{"post":{"tags":["github-import"],"summary":"Scan Github Repo","description":"Scan a GitHub repository for docker-compose files.\n\nAccepts a GitHub URL (repository, directory, or specific file) and returns\na list of detected docker-compose files.","operationId":"scan_github_repo_api_github_import_scan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitHubImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitHubScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github-import/parse":{"post":{"tags":["github-import"],"summary":"Parse Compose File","description":"Parse a docker-compose file and extract service/environment information.\n\nReturns structured information about services, including environment variables\nthat need to be configured.","operationId":"parse_compose_file_api_github_import_parse_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"github_url","in":"query","required":true,"schema":{"type":"string","title":"Github Url"}},{"name":"compose_path","in":"query","required":true,"schema":{"type":"string","title":"Compose Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeParseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/github-import/register":{"post":{"tags":["github-import"],"summary":"Register Imported Service","description":"Register an imported service from GitHub.\n\nDownloads the compose file, saves it locally, and registers the service\nwith the configured shadow header and environment variables.","operationId":"register_imported_service_api_github_import_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportServiceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportServiceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github-import/imported":{"get":{"tags":["github-import"],"summary":"List Imported Services","description":"List all imported services from GitHub.","operationId":"list_imported_services_api_github_import_imported_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Imported Services Api Github Import Imported Get"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github-import/imported/{service_id}":{"delete":{"tags":["github-import"],"summary":"Delete Imported Service","description":"Delete an imported service.","operationId":"delete_imported_service_api_github_import_imported__service_id__delete","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Imported Service Api Github Import Imported Service Id Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/github-import/imported/{service_id}/config":{"put":{"tags":["github-import"],"summary":"Update Imported Service Config","description":"Update configuration for an imported service.","operationId":"update_imported_service_config_api_github_import_imported__service_id__config_put","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportedServiceConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Imported Service Config Api Github Import Imported Service Id Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/github-import/dockerhub/scan":{"post":{"tags":["github-import"],"summary":"Scan Dockerhub Image","description":"Scan a Docker Hub image for information.\n\nAccepts a Docker Hub URL or image reference and returns\nimage details and available tags.","operationId":"scan_dockerhub_image_api_github_import_dockerhub_scan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerHubImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerHubScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github-import/dockerhub/register":{"post":{"tags":["github-import"],"summary":"Register Dockerhub Service","description":"Register a service from Docker Hub by generating a compose file.\n\nCreates a docker-compose file for the specified Docker Hub image\nwith the provided configuration.","operationId":"register_dockerhub_service_api_github_import_dockerhub_register_post","security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"service_name","in":"query","required":true,"schema":{"type":"string","title":"Service Name"}},{"name":"dockerhub_url","in":"query","required":true,"schema":{"type":"string","title":"Dockerhub Url"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}},{"name":"display_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},{"name":"description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},{"name":"shadow_header_enabled","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Shadow Header Enabled"}},{"name":"shadow_header_name","in":"query","required":false,"schema":{"type":"string","default":"X-Shadow-Service","title":"Shadow Header Name"}},{"name":"shadow_header_value","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shadow Header Value"}},{"name":"route_path","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route Path"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_register_dockerhub_service_api_github_import_dockerhub_register_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportServiceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/github-import/unified/scan":{"post":{"tags":["github-import"],"summary":"Unified Scan","description":"Scan any supported source (GitHub or Docker Hub).\n\nAutomatically detects the source type and returns appropriate information.","operationId":"unified_scan_api_github_import_unified_scan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/mcp/sse":{"get":{"summary":"Handle Sse","description":"Handle SSE connections for MCP.\n\nThe access token should be provided in the Authorization header:\n Authorization: Bearer <token>\n\nFor development, any token is accepted.","operationId":"handle_sse_mcp_sse_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/messages/":{"post":{"summary":"Handle Post Message","description":"Handle POST messages for SSE","operationId":"handle_post_message_mcp_messages__post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Root","description":"Root endpoint.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/version":{"get":{"summary":"Get Version","description":"Get application version information.","operationId":"get_version_api_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AccessUrls":{"properties":{"frontend":{"type":"string","title":"Frontend"},"backend":{"type":"string","title":"Backend"},"environments":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Environments"}},"type":"object","required":["frontend","backend"],"title":"AccessUrls","description":"Generated access URLs after setup"},"ActionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"ActionResponse","description":"Standard action response."},"ApiKeysStep":{"properties":{"openai_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openai Api Key"},"deepgram_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deepgram Api Key"},"mistral_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mistral Api Key"},"anthropic_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anthropic Api Key"},"hf_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hf Token"}},"type":"object","title":"ApiKeysStep","description":"API Keys configuration step."},"ApiKeysUpdateResponse":{"properties":{"api_keys":{"$ref":"#/components/schemas/ApiKeysStep","description":"Updated API keys (masked)"},"success":{"type":"boolean","title":"Success","description":"Whether update was successful","default":true}},"type":"object","required":["api_keys"],"title":"ApiKeysUpdateResponse","description":"Response for API keys update operation."},"AuthUrlResponse":{"properties":{"auth_url":{"type":"string","title":"Auth Url"},"web_url":{"type":"string","title":"Web Url"},"qr_code_data":{"type":"string","title":"Qr Code Data"}},"type":"object","required":["auth_url","web_url","qr_code_data"],"title":"AuthUrlResponse","description":"Authentication URL for Tailscale"},"BearerResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type"}},"type":"object","required":["access_token","token_type"],"title":"BearerResponse"},"Body_auth_bearer_login_api_auth_jwt_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_auth_bearer_login_api_auth_jwt_login_post"},"Body_auth_cookie_login_api_auth_cookie_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_auth_cookie_login_api_auth_cookie_login_post"},"Body_register_dockerhub_service_api_github_import_dockerhub_register_post":{"properties":{"ports":{"anyOf":[{"items":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Ports"},"volumes":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Volumes"},"env_vars":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Env Vars"},"capabilities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Capabilities"}},"type":"object","title":"Body_register_dockerhub_service_api_github_import_dockerhub_register_post"},"Body_reset_forgot_password_api_auth_forgot_password_post":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"Body_reset_forgot_password_api_auth_forgot_password_post"},"Body_reset_reset_password_api_auth_reset_password_post":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"Body_reset_reset_password_api_auth_reset_password_post"},"Body_verify_request_token_api_auth_request_verify_token_post":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"Body_verify_request_token_api_auth_request_verify_token_post"},"Body_verify_verify_api_auth_verify_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_verify_verify_api_auth_verify_post"},"CapabilityRequirement":{"properties":{"id":{"type":"string","title":"Id"},"selected_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Provider"},"provider_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Name"},"provider_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Mode"},"configured":{"type":"boolean","title":"Configured","default":false},"missing_keys":{"items":{"$ref":"#/components/schemas/MissingKey"},"type":"array","title":"Missing Keys","default":[]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["id"],"title":"CapabilityRequirement","description":"A capability requirement with provider info."},"CertificateStatus":{"properties":{"provisioned":{"type":"boolean","title":"Provisioned"},"cert_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cert Path"},"key_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Path"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["provisioned"],"title":"CertificateStatus","description":"Certificate provisioning status"},"ChatMessage":{"properties":{"role":{"type":"string","title":"Role"},"content":{"type":"string","title":"Content"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},"type":"object","required":["role","content"],"title":"ChatMessage","description":"A single chat message."},"ChatRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","title":"Messages"},"system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System"},"use_memory":{"type":"boolean","title":"Use Memory","default":true},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"},"max_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens"}},"type":"object","required":["messages"],"title":"ChatRequest","description":"Request body for chat endpoint."},"ChatStatus":{"properties":{"configured":{"type":"boolean","title":"Configured"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"memory_available":{"type":"boolean","title":"Memory Available","default":false},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["configured"],"title":"ChatStatus","description":"Status of chat configuration."},"ComposeEnvVarInfo":{"properties":{"name":{"type":"string","title":"Name"},"has_default":{"type":"boolean","title":"Has Default","default":false},"default_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Value"},"is_required":{"type":"boolean","title":"Is Required","default":true},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name"],"title":"ComposeEnvVarInfo","description":"Environment variable extracted from compose file."},"ComposeParseResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"compose_path":{"type":"string","title":"Compose Path"},"services":{"items":{"$ref":"#/components/schemas/ComposeServiceInfo"},"type":"array","title":"Services"},"networks":{"items":{"type":"string"},"type":"array","title":"Networks"},"volumes":{"items":{"type":"string"},"type":"array","title":"Volumes"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success","compose_path"],"title":"ComposeParseResponse","description":"Response from parsing a docker-compose file."},"ComposeServiceInfo":{"properties":{"name":{"type":"string","title":"Name"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"ports":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Ports"},"environment":{"items":{"$ref":"#/components/schemas/ComposeEnvVarInfo"},"type":"array","title":"Environment"},"depends_on":{"items":{"type":"string"},"type":"array","title":"Depends On"},"volumes":{"items":{"type":"string"},"type":"array","title":"Volumes"},"networks":{"items":{"type":"string"},"type":"array","title":"Networks"},"command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Command"},"healthcheck":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Healthcheck"}},"type":"object","required":["name"],"title":"ComposeServiceInfo","description":"Service information extracted from compose file."},"ContainerStatus":{"properties":{"exists":{"type":"boolean","title":"Exists"},"running":{"type":"boolean","title":"Running"},"authenticated":{"type":"boolean","title":"Authenticated","default":false},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"}},"type":"object","required":["exists","running"],"title":"ContainerStatus","description":"Tailscale container status"},"DeployRequest":{"properties":{"service_id":{"type":"string","title":"Service Id"},"unode_hostname":{"type":"string","title":"Unode Hostname"}},"type":"object","required":["service_id","unode_hostname"],"title":"DeployRequest","description":"Request to deploy a service to a node."},"Deployment":{"properties":{"id":{"type":"string","title":"Id","description":"Unique deployment ID"},"service_id":{"type":"string","title":"Service Id","description":"Reference to ServiceDefinition"},"unode_hostname":{"type":"string","title":"Unode Hostname","description":"Target u-node hostname"},"status":{"$ref":"#/components/schemas/DeploymentStatus","description":"Current deployment status","default":"pending"},"container_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Container Id","description":"Docker container ID (when deployed)"},"container_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Container Name","description":"Container name on the node"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"deployed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deployed At"},"stopped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Stopped At"},"last_health_check":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Health Check"},"healthy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Healthy"},"health_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"retry_count":{"type":"integer","title":"Retry Count","default":0},"deployed_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Deployed Config"},"access_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Url","description":"URL to access the deployed service"},"exposed_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exposed Port","description":"Primary exposed port for the service"}},"type":"object","required":["id","service_id","unode_hostname"],"title":"Deployment","description":"A service deployed to a specific node.\n\nRepresents an instance of a ServiceDefinition running on a u-node."},"DeploymentMode":{"properties":{"mode":{"type":"string","enum":["single","multi"],"title":"Mode"},"environment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment","description":"For single mode: dev, test, or prod"}},"type":"object","required":["mode"],"title":"DeploymentMode","description":"Deployment mode configuration"},"DeploymentStatus":{"type":"string","enum":["pending","deploying","running","stopped","failed","removing"],"title":"DeploymentStatus","description":"Status of a deployment."},"DetectedComposeFile":{"properties":{"path":{"type":"string","title":"Path"},"name":{"type":"string","title":"Name"},"download_url":{"type":"string","title":"Download Url"},"size":{"type":"integer","title":"Size","default":0}},"type":"object","required":["path","name","download_url"],"title":"DetectedComposeFile","description":"A docker-compose file detected in the repository."},"DockerHubImageInfo":{"properties":{"namespace":{"type":"string","title":"Namespace"},"repository":{"type":"string","title":"Repository"},"tag":{"type":"string","title":"Tag","default":"latest"}},"type":"object","required":["namespace","repository"],"title":"DockerHubImageInfo","description":"Parsed Docker Hub URL information."},"DockerHubImportRequest":{"properties":{"dockerhub_url":{"type":"string","title":"Dockerhub Url","description":"Docker Hub URL or image reference"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag","description":"Image tag (defaults to latest)"}},"type":"object","required":["dockerhub_url"],"title":"DockerHubImportRequest","description":"Request to import from Docker Hub."},"DockerHubScanResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"image_info":{"anyOf":[{"$ref":"#/components/schemas/DockerHubImageInfo"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"stars":{"type":"integer","title":"Stars","default":0},"pulls":{"type":"integer","title":"Pulls","default":0},"available_tags":{"items":{"type":"string"},"type":"array","title":"Available Tags"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"DockerHubScanResponse","description":"Response from scanning a Docker Hub image."},"EnabledRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"EnabledRequest","description":"Request to enable/disable a service."},"EnvConfigUpdateRequest":{"properties":{"env_vars":{"items":{"$ref":"#/components/schemas/EnvVarConfigRequest"},"type":"array","title":"Env Vars"}},"type":"object","required":["env_vars"],"title":"EnvConfigUpdateRequest","description":"Request to update all env var configs for a service."},"EnvVarConfigItem":{"properties":{"name":{"type":"string","title":"Name"},"source":{"type":"string","title":"Source","default":"literal"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"setting_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Setting Path"},"is_secret":{"type":"boolean","title":"Is Secret","default":false}},"type":"object","required":["name"],"title":"EnvVarConfigItem","description":"Configuration for a single environment variable."},"EnvVarConfigRequest":{"properties":{"name":{"type":"string","title":"Name"},"source":{"type":"string","title":"Source"},"setting_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Setting Path"},"new_setting_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Setting Path"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"}},"type":"object","required":["name","source"],"title":"EnvVarConfigRequest","description":"Request to configure an environment variable."},"EnvironmentInfo":{"properties":{"name":{"type":"string","title":"Name"},"tailscale_hostname":{"type":"string","title":"Tailscale Hostname"},"tailscale_container_name":{"type":"string","title":"Tailscale Container Name"},"tailscale_volume_name":{"type":"string","title":"Tailscale Volume Name"}},"type":"object","required":["name","tailscale_hostname","tailscale_container_name","tailscale_volume_name"],"title":"EnvironmentInfo","description":"Current environment information"},"ErrorModel":{"properties":{"detail":{"anyOf":[{"type":"string"},{"additionalProperties":{"type":"string"},"type":"object"}],"title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorModel"},"GitHubImportRequest":{"properties":{"github_url":{"type":"string","title":"Github Url","description":"GitHub repository or file URL"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch","description":"Branch to use (defaults to main/master)"},"compose_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compose Path","description":"Path to docker-compose file if not auto-detected"}},"type":"object","required":["github_url"],"title":"GitHubImportRequest","description":"Request to import from a GitHub URL."},"GitHubScanResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"github_info":{"anyOf":[{"$ref":"#/components/schemas/GitHubUrlInfo"},{"type":"null"}]},"compose_files":{"items":{"$ref":"#/components/schemas/DetectedComposeFile"},"type":"array","title":"Compose Files"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"GitHubScanResponse","description":"Response from scanning a GitHub repository."},"GitHubUrlInfo":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"branch":{"type":"string","title":"Branch","default":"main"},"path":{"type":"string","title":"Path","default":""}},"type":"object","required":["owner","repo"],"title":"GitHubUrlInfo","description":"Parsed GitHub URL information."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"service":{"type":"string","title":"Service"},"version":{"type":"string","title":"Version"}},"type":"object","required":["status","service","version"],"title":"HealthResponse","description":"Health check response."},"HuggingFaceModelsResponse":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ModelAccessStatus"},"type":"array","title":"Models"},"all_accessible":{"type":"boolean","title":"All Accessible","description":"Whether all required models are accessible"}},"type":"object","required":["models","all_accessible"],"title":"HuggingFaceModelsResponse","description":"Response for HuggingFace model access check."},"HuggingFaceStatusResponse":{"properties":{"connected":{"type":"boolean","title":"Connected","description":"Whether HF token is valid and connected"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"HuggingFace username if connected"},"has_token":{"type":"boolean","title":"Has Token","description":"Whether an HF token is configured"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if connection failed"}},"type":"object","required":["connected","has_token"],"title":"HuggingFaceStatusResponse","description":"Response for HuggingFace connection status."},"ImportServiceRequest":{"properties":{"github_url":{"type":"string","title":"Github Url"},"compose_path":{"type":"string","title":"Compose Path"},"service_name":{"type":"string","title":"Service Name"},"config":{"$ref":"#/components/schemas/ImportedServiceConfig"}},"type":"object","required":["github_url","compose_path","service_name","config"],"title":"ImportServiceRequest","description":"Request to import and register a service from GitHub."},"ImportServiceResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"service_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Id"},"service_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Name"},"message":{"type":"string","title":"Message"},"compose_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compose File Path"}},"type":"object","required":["success","message"],"title":"ImportServiceResponse","description":"Response from importing a service."},"ImportedServiceConfig":{"properties":{"service_name":{"type":"string","title":"Service Name"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source_type":{"type":"string","enum":["github","dockerhub"],"title":"Source Type","default":"github"},"source_url":{"type":"string","title":"Source Url"},"compose_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compose Path"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image"},"ports":{"items":{"$ref":"#/components/schemas/PortConfig"},"type":"array","title":"Ports"},"volumes":{"items":{"$ref":"#/components/schemas/VolumeConfig"},"type":"array","title":"Volumes"},"shadow_header":{"$ref":"#/components/schemas/ShadowHeaderConfig"},"env_vars":{"items":{"$ref":"#/components/schemas/EnvVarConfigItem"},"type":"array","title":"Env Vars"},"enabled":{"type":"boolean","title":"Enabled","default":true},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities","description":"Capabilities this service provides"}},"type":"object","required":["service_name","source_url"],"title":"ImportedServiceConfig","description":"Full configuration for an imported service."},"InstallationGuide":{"properties":{"platform":{"type":"string","title":"Platform"},"instructions":{"type":"string","title":"Instructions"},"download_url":{"type":"string","title":"Download Url"},"verification_command":{"type":"string","title":"Verification Command"}},"type":"object","required":["platform","instructions","download_url","verification_command"],"title":"InstallationGuide","description":"Platform-specific installation instructions"},"Instance":{"properties":{"id":{"type":"string","title":"Id","description":"Unique instance identifier (e.g., 'openmemory-prod')"},"template_id":{"type":"string","title":"Template Id","description":"Reference to the template"},"name":{"type":"string","title":"Name","description":"Display name for this instance"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Instance description"},"config":{"$ref":"#/components/schemas/InstanceConfig","description":"Config values"},"deployment_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Target","description":"Deployment target: None=local docker, hostname=u-node, 'cloud'=no deployment"},"status":{"$ref":"#/components/schemas/InstanceStatus","description":"Current status","default":"pending"},"outputs":{"$ref":"#/components/schemas/InstanceOutputs","description":"Instance outputs"},"container_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Container Id","description":"Docker container ID when deployed"},"container_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Container Name","description":"Container name"},"deployment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id","description":"Reference to Deployment record if remote"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"deployed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deployed At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"integration_type":{"anyOf":[{"$ref":"#/components/schemas/IntegrationType"},{"type":"null"}],"description":"Integration type (filesystem, rest, graphql) - null for non-integrations"},"sync_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sync Enabled","description":"Whether auto-sync is enabled"},"sync_interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sync Interval","description":"Sync interval in seconds (e.g., 21600 for 6 hours)"},"last_sync_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sync At","description":"Timestamp of last successful sync"},"last_sync_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Sync Status","description":"Status of last sync: 'success', 'error', 'in_progress', 'never'"},"last_sync_items_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Sync Items Count","description":"Number of items synced in last sync"},"last_sync_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Sync Error","description":"Error message from last failed sync"},"next_sync_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Sync At","description":"Computed timestamp of next scheduled sync"}},"type":"object","required":["id","template_id","name"],"title":"Instance","description":"An instance of a template with configuration applied.\n\nInstance = Template + Config Set + Deployment Target\n\nInstances have inputs (config values, capability requirements)\nand outputs (resolved config + access URL after deployment)."},"InstanceConfig":{"properties":{"values":{"additionalProperties":true,"type":"object","title":"Values","description":"Config key-value pairs"}},"type":"object","title":"InstanceConfig","description":"Configuration values for an instance."},"InstanceCreate":{"properties":{"id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-z0-9-]+$","title":"Id"},"template_id":{"type":"string","title":"Template Id","description":"Template to instantiate"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Config values"},"deployment_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Target","description":"Where to deploy"}},"type":"object","required":["id","template_id","name"],"title":"InstanceCreate","description":"Request to create a new instance."},"InstanceOutputs":{"properties":{"access_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Url","description":"URL to access the service"},"env_vars":{"additionalProperties":{"type":"string"},"type":"object","title":"Env Vars","description":"Resolved environment variables"},"capability_values":{"additionalProperties":true,"type":"object","title":"Capability Values","description":"Values for the capability this instance provides"}},"type":"object","title":"InstanceOutputs","description":"Outputs from an instance after deployment."},"InstanceStatus":{"type":"string","enum":["pending","deploying","running","stopped","error","n/a"],"title":"InstanceStatus","description":"Status of an instance."},"InstanceSummary":{"properties":{"id":{"type":"string","title":"Id"},"template_id":{"type":"string","title":"Template Id"},"name":{"type":"string","title":"Name"},"status":{"$ref":"#/components/schemas/InstanceStatus"},"provides":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provides"},"deployment_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Target"},"access_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Url"}},"type":"object","required":["id","template_id","name","status"],"title":"InstanceSummary","description":"Lightweight instance info for listings."},"InstanceUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"deployment_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Target"}},"type":"object","title":"InstanceUpdate","description":"Request to update an instance."},"IntegrationType":{"type":"string","enum":["rest","graphql","mcp","websocket","grpc","filesystem","database"],"title":"IntegrationType","description":"How the integration communicates."},"JoinTokenCreate":{"properties":{"role":{"$ref":"#/components/schemas/UNodeRole","default":"worker"},"max_uses":{"type":"integer","title":"Max Uses","default":1},"expires_in_hours":{"type":"integer","title":"Expires In Hours","default":24}},"type":"object","title":"JoinTokenCreate","description":"Request to create a join token."},"JoinTokenResponse":{"properties":{"token":{"type":"string","title":"Token"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"join_command":{"type":"string","title":"Join Command"},"join_command_powershell":{"type":"string","title":"Join Command Powershell"},"join_script_url":{"type":"string","title":"Join Script Url"},"join_script_url_powershell":{"type":"string","title":"Join Script Url Powershell"},"bootstrap_command":{"type":"string","title":"Bootstrap Command"},"bootstrap_command_powershell":{"type":"string","title":"Bootstrap Command Powershell"}},"type":"object","required":["token","expires_at","join_command","join_command_powershell","join_script_url","join_script_url_powershell","bootstrap_command","bootstrap_command_powershell"],"title":"JoinTokenResponse","description":"Response with join token and script."},"KubernetesCluster":{"properties":{"cluster_id":{"type":"string","title":"Cluster Id","description":"Unique identifier for this cluster"},"name":{"type":"string","title":"Name","description":"Human-readable cluster name"},"context":{"type":"string","title":"Context","description":"Kubeconfig context name"},"server":{"type":"string","title":"Server","description":"K8s API server URL"},"status":{"$ref":"#/components/schemas/KubernetesClusterStatus","default":"unreachable"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Kubernetes version"},"node_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Node Count","description":"Number of nodes in cluster"},"namespace":{"type":"string","title":"Namespace","description":"Default namespace for deployments","default":"default"},"labels":{"additionalProperties":{"type":"string"},"type":"object","title":"Labels"}},"type":"object","required":["cluster_id","name","context","server"],"title":"KubernetesCluster","description":"Represents a Kubernetes cluster that Ushadow can deploy to.","example":{"cluster_id":"prod-us-west","context":"gke_myproject_us-west1_prod-cluster","labels":{"env":"production","region":"us-west"},"name":"Production US West","namespace":"ushadow-prod","node_count":5,"server":"https://35.233.123.45","status":"connected","version":"1.28.3"}},"KubernetesClusterCreate":{"properties":{"name":{"type":"string","title":"Name","description":"Human-readable cluster name"},"kubeconfig":{"type":"string","title":"Kubeconfig","description":"Base64-encoded kubeconfig file"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context","description":"Context to use (if not specified, uses current-context)"},"namespace":{"type":"string","title":"Namespace","description":"Default namespace","default":"default"},"labels":{"additionalProperties":{"type":"string"},"type":"object","title":"Labels"}},"type":"object","required":["name","kubeconfig"],"title":"KubernetesClusterCreate","description":"Request to add a new Kubernetes cluster."},"KubernetesClusterStatus":{"type":"string","enum":["connected","unreachable","unauthorized","error"],"title":"KubernetesClusterStatus","description":"Status of a Kubernetes cluster connection."},"LeaderInfoResponse":{"properties":{"hostname":{"type":"string","title":"Hostname"},"tailscale_ip":{"type":"string","title":"Tailscale Ip"},"tailscale_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tailscale Hostname"},"capabilities":{"$ref":"#/components/schemas/UNodeCapabilities"},"api_port":{"type":"integer","title":"Api Port","default":8000},"ushadow_api_url":{"type":"string","title":"Ushadow Api Url"},"chronicle_api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chronicle Api Url"},"ws_pcm_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ws Pcm Url"},"ws_omi_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ws Omi Url"},"unodes":{"items":{"$ref":"#/components/schemas/UNode"},"type":"array","title":"Unodes"},"services":{"items":{"$ref":"#/components/schemas/ServiceDeployment"},"type":"array","title":"Services"}},"type":"object","required":["hostname","tailscale_ip","capabilities","ushadow_api_url","unodes","services"],"title":"LeaderInfoResponse","description":"Full leader information for mobile app connection.\n\nThis endpoint returns everything the mobile app needs after connecting:\n- Leader node details and capabilities\n- WebSocket streaming URLs for audio\n- All unodes in the cluster\n- Services deployed across the cluster"},"LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/UserRead"}},"type":"object","required":["access_token","user"],"title":"LoginResponse","description":"Login response with token and user info."},"LogsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"logs":{"type":"string","title":"Logs"}},"type":"object","required":["success","logs"],"title":"LogsResponse","description":"Service logs response."},"ManagerVersionsResponse":{"properties":{"versions":{"items":{"type":"string"},"type":"array","title":"Versions"},"latest":{"type":"string","title":"Latest"},"registry":{"type":"string","title":"Registry"},"image":{"type":"string","title":"Image"}},"type":"object","required":["versions","latest","registry","image"],"title":"ManagerVersionsResponse","description":"Response with available manager versions."},"MissingKey":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"settings_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Settings Path"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"type":{"type":"string","title":"Type","default":"secret"}},"type":"object","required":["key","label"],"title":"MissingKey","description":"A key/setting that needs to be configured."},"MobileConnectionQR":{"properties":{"qr_code_data":{"type":"string","title":"Qr Code Data"},"connection_data":{"additionalProperties":true,"type":"object","title":"Connection Data"},"hostname":{"type":"string","title":"Hostname"},"tailscale_ip":{"type":"string","title":"Tailscale Ip"},"api_port":{"type":"integer","title":"Api Port"},"api_url":{"type":"string","title":"Api Url"},"auth_token":{"type":"string","title":"Auth Token"}},"type":"object","required":["qr_code_data","connection_data","hostname","tailscale_ip","api_port","api_url","auth_token"],"title":"MobileConnectionQR","description":"QR code for mobile app connection.\n\nContains minimal data for the QR code - just enough to connect.\nAfter connecting, mobile app fetches full details from /api/unodes/leader/info"},"ModelAccessStatus":{"properties":{"model_id":{"type":"string","title":"Model Id"},"has_access":{"type":"boolean","title":"Has Access"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["model_id","has_access"],"title":"ModelAccessStatus","description":"Access status for a single model."},"PlatformInfo":{"properties":{"os_type":{"type":"string","enum":["linux","darwin","windows","unknown"],"title":"Os Type"},"os_version":{"type":"string","title":"Os Version"},"architecture":{"type":"string","title":"Architecture"},"is_docker":{"type":"boolean","title":"Is Docker"},"tailscale_installed":{"type":"boolean","title":"Tailscale Installed","default":false}},"type":"object","required":["os_type","os_version","architecture","is_docker"],"title":"PlatformInfo","description":"Platform detection information"},"PortConfig":{"properties":{"host_port":{"type":"integer","title":"Host Port"},"container_port":{"type":"integer","title":"Container Port"},"protocol":{"type":"string","title":"Protocol","default":"tcp"}},"type":"object","required":["host_port","container_port"],"title":"PortConfig","description":"Configuration for a port mapping."},"PortConflictInfo":{"properties":{"port":{"type":"integer","title":"Port"},"env_var":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env Var"},"used_by":{"type":"string","title":"Used By"},"suggested_port":{"type":"integer","title":"Suggested Port"}},"type":"object","required":["port","used_by","suggested_port"],"title":"PortConflictInfo","description":"Information about a port conflict."},"PortOverrideRequest":{"properties":{"env_var":{"type":"string","title":"Env Var","description":"Environment variable name (e.g., CHRONICLE_PORT)"},"port":{"type":"integer","maximum":65535.0,"minimum":1.0,"title":"Port","description":"New port number"}},"type":"object","required":["env_var","port"],"title":"PortOverrideRequest","description":"Request to override a service's port."},"PreflightCheckResponse":{"properties":{"can_start":{"type":"boolean","title":"Can Start"},"port_conflicts":{"items":{"$ref":"#/components/schemas/PortConflictInfo"},"type":"array","title":"Port Conflicts","default":[]},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["can_start"],"title":"PreflightCheckResponse","description":"Response from pre-start checks."},"ProviderQuery":{"properties":{"capability":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"configured":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Configured"}},"type":"object","title":"ProviderQuery"},"PydanticObjectId":{"type":"string","maxLength":24,"minLength":24,"pattern":"^[0-9a-f]{24}$","example":"5eb7cf5a86d9755df3a6c593"},"QuickstartResponse":{"properties":{"required_capabilities":{"items":{"$ref":"#/components/schemas/CapabilityRequirement"},"type":"array","title":"Required Capabilities"},"services":{"items":{"$ref":"#/components/schemas/ServiceInfo"},"type":"array","title":"Services"},"all_configured":{"type":"boolean","title":"All Configured"}},"type":"object","required":["required_capabilities","services","all_configured"],"title":"QuickstartResponse","description":"Response for quickstart wizard - aggregated capability requirements."},"RegisterServiceRequest":{"properties":{"service_name":{"type":"string","title":"Service Name","description":"Unique service name"},"description":{"type":"string","title":"Description","default":""},"service_type":{"type":"string","title":"Service Type","default":"application"},"endpoints":{"items":{"$ref":"#/components/schemas/ServiceEndpointRequest"},"type":"array","title":"Endpoints","default":[]},"user_controllable":{"type":"boolean","title":"User Controllable","default":true},"compose_file":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compose File"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["service_name"],"title":"RegisterServiceRequest","description":"Request to register a dynamic service."},"SelectionUpdate":{"properties":{"wizard_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wizard Mode"},"selected_providers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Selected Providers"}},"type":"object","title":"SelectionUpdate"},"ServiceDefinition":{"properties":{"service_id":{"type":"string","title":"Service Id","description":"Unique identifier for the service"},"name":{"type":"string","title":"Name","description":"Display name"},"description":{"type":"string","title":"Description","description":"Description of the service","default":""},"image":{"type":"string","title":"Image","description":"Docker image (e.g., 'nginx:latest')"},"ports":{"additionalProperties":{"type":"integer"},"type":"object","title":"Ports","description":"Port mappings: {'container_port/tcp': host_port}"},"environment":{"additionalProperties":{"type":"string"},"type":"object","title":"Environment","description":"Environment variables"},"volumes":{"items":{"type":"string"},"type":"array","title":"Volumes","description":"Volume mounts (e.g., '/host/path:/container/path')"},"command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Command","description":"Override container command"},"restart_policy":{"type":"string","title":"Restart Policy","description":"Restart policy: no, always, unless-stopped, on-failure","default":"unless-stopped"},"network":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network","description":"Docker network to join"},"health_check_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Check Path","description":"HTTP path for health checks (e.g., '/health')"},"health_check_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Health Check Port","description":"Port for health checks"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"type":"object","required":["service_id","name","image"],"title":"ServiceDefinition","description":"A deployable service definition.\n\nDefines the Docker container configuration that can be deployed\nto one or more u-nodes."},"ServiceDefinitionCreate":{"properties":{"service_id":{"type":"string","maxLength":100,"minLength":1,"title":"Service Id"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"type":"string","title":"Description","default":""},"image":{"type":"string","minLength":1,"title":"Image"},"ports":{"additionalProperties":{"type":"integer"},"type":"object","title":"Ports"},"environment":{"additionalProperties":{"type":"string"},"type":"object","title":"Environment"},"volumes":{"items":{"type":"string"},"type":"array","title":"Volumes"},"command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Command"},"restart_policy":{"type":"string","title":"Restart Policy","default":"unless-stopped"},"network":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network"},"health_check_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Check Path"},"health_check_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Health Check Port"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"type":"object","required":["service_id","name","image"],"title":"ServiceDefinitionCreate","description":"Request to create a new service definition."},"ServiceDefinitionUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"ports":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Ports"},"environment":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Environment"},"volumes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Volumes"},"command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Command"},"restart_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restart Policy"},"network":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network"},"health_check_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Check Path"},"health_check_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Health Check Port"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"ServiceDefinitionUpdate","description":"Request to update a service definition."},"ServiceDeployment":{"properties":{"name":{"type":"string","title":"Name"},"display_name":{"type":"string","title":"Display Name"},"status":{"type":"string","title":"Status"},"unode_hostname":{"type":"string","title":"Unode Hostname"},"route_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route Path"},"internal_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Internal Port"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url"},"internal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Internal Url"},"ws_pcm_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ws Pcm Url"},"ws_omi_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ws Omi Url"}},"type":"object","required":["name","display_name","status","unode_hostname"],"title":"ServiceDeployment","description":"A service deployed on a unode."},"ServiceEndpointRequest":{"properties":{"url":{"type":"string","title":"Url"},"integration_type":{"type":"string","title":"Integration Type","default":"rest"},"health_check_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Check Path"},"requires_auth":{"type":"boolean","title":"Requires Auth","default":false},"auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Type"}},"type":"object","required":["url"],"title":"ServiceEndpointRequest","description":"Service endpoint information."},"ServiceInfo":{"properties":{"name":{"type":"string","title":"Name"},"display_name":{"type":"string","title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name","display_name"],"title":"ServiceInfo","description":"Service information for the wizard."},"ServiceTokenRequest":{"properties":{"audiences":{"items":{"type":"string"},"type":"array","title":"Audiences","description":"Services this token should be valid for","default":["ushadow","chronicle"]}},"type":"object","title":"ServiceTokenRequest","description":"Request for generating a cross-service token."},"ServiceTokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"audiences":{"items":{"type":"string"},"type":"array","title":"Audiences"}},"type":"object","required":["access_token","audiences"],"title":"ServiceTokenResponse","description":"Response containing a cross-service JWT token."},"SettingsResponse":{"properties":{"env_name":{"type":"string","title":"Env Name"},"mongodb_database":{"type":"string","title":"Mongodb Database"}},"type":"object","required":["env_name","mongodb_database"],"title":"SettingsResponse","description":"Settings response model - infrastructure settings."},"SetupRequest":{"properties":{"display_name":{"type":"string","maxLength":100,"minLength":1,"title":"Display Name"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","minLength":8,"title":"Password"},"confirm_password":{"type":"string","title":"Confirm Password"}},"type":"object","required":["display_name","email","password","confirm_password"],"title":"SetupRequest","description":"Initial setup request for creating first admin user."},"SetupStatusResponse":{"properties":{"requires_setup":{"type":"boolean","title":"Requires Setup"},"user_count":{"type":"integer","title":"User Count"}},"type":"object","required":["requires_setup","user_count"],"title":"SetupStatusResponse","description":"Setup status response."},"ShadowHeaderConfig":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":true},"header_name":{"type":"string","title":"Header Name","description":"Header name for service identification","default":"X-Shadow-Service"},"header_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Value","description":"Header value (defaults to service name)"},"route_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route Path","description":"Tailscale Serve route path (e.g., /myservice)"}},"type":"object","title":"ShadowHeaderConfig","description":"Configuration for shadow header routing."},"TailscaleConfig":{"properties":{"hostname":{"type":"string","title":"Hostname","description":"Tailscale hostname (e.g., machine-name.tail12345.ts.net)"},"deployment_mode":{"$ref":"#/components/schemas/DeploymentMode"},"https_enabled":{"type":"boolean","title":"Https Enabled","default":true},"use_caddy_proxy":{"type":"boolean","title":"Use Caddy Proxy","description":"True for multi-env, False for single-env"},"backend_port":{"type":"integer","title":"Backend Port","default":8000},"frontend_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Frontend Port"},"environments":{"items":{"type":"string"},"type":"array","title":"Environments"}},"type":"object","required":["hostname","deployment_mode","use_caddy_proxy"],"title":"TailscaleConfig","description":"Complete Tailscale configuration"},"Template":{"properties":{"id":{"type":"string","title":"Id","description":"Template identifier (e.g., 'openmemory', 'openai')"},"source":{"$ref":"#/components/schemas/TemplateSource","description":"Where this was discovered from"},"name":{"type":"string","title":"Name","description":"Display name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Human-readable description"},"requires":{"items":{"type":"string"},"type":"array","title":"Requires","description":"Capability inputs (e.g., ['llm'])"},"optional":{"items":{"type":"string"},"type":"array","title":"Optional","description":"Optional capabilities"},"provides":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provides","description":"Capability this provides (e.g., 'memory')"},"config_schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Config Schema","description":"Schema for configurable fields"},"compose_file":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compose File","description":"Path to compose file (if source=compose)"},"service_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Name","description":"Service name in compose file"},"provider_file":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider File","description":"Path to provider file (if source=provider)"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","description":"'cloud' or 'local'"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"configured":{"type":"boolean","title":"Configured","description":"Whether required config is present","default":true},"available":{"type":"boolean","title":"Available","description":"Whether local service is running/reachable","default":true}},"type":"object","required":["id","source","name"],"title":"Template","description":"A discoverable service or provider template.\n\nTemplates are discovered from compose files or provider definitions.\nThey define the \"shape\" of a service - what it needs and provides."},"TemplateSource":{"type":"string","enum":["compose","provider"],"title":"TemplateSource","description":"Where a template was discovered from."},"UNode":{"properties":{"hostname":{"type":"string","title":"Hostname","description":"Tailscale hostname"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"role":{"$ref":"#/components/schemas/UNodeRole","default":"worker"},"platform":{"$ref":"#/components/schemas/UNodePlatform","default":"unknown"},"tailscale_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tailscale Ip"},"capabilities":{"$ref":"#/components/schemas/UNodeCapabilities"},"labels":{"additionalProperties":{"type":"string"},"type":"object","title":"Labels"},"id":{"type":"string","title":"Id"},"status":{"$ref":"#/components/schemas/UNodeStatus","default":"offline"},"last_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen"},"registered_at":{"type":"string","format":"date-time","title":"Registered At"},"manager_version":{"type":"string","title":"Manager Version","default":"0.1.0"},"services":{"items":{"type":"string"},"type":"array","title":"Services"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"type":"object","required":["hostname","id","registered_at"],"title":"UNode","description":"Full u-node model for API responses."},"UNodeActionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"UNodeActionResponse","description":"Response from a u-node action."},"UNodeCapabilities":{"properties":{"can_run_docker":{"type":"boolean","title":"Can Run Docker","default":true},"can_run_gpu":{"type":"boolean","title":"Can Run Gpu","default":false},"can_become_leader":{"type":"boolean","title":"Can Become Leader","default":false},"available_memory_mb":{"type":"integer","title":"Available Memory Mb","default":0},"available_cpu_cores":{"type":"number","title":"Available Cpu Cores","default":0},"available_disk_gb":{"type":"number","title":"Available Disk Gb","default":0}},"type":"object","title":"UNodeCapabilities","description":"Capabilities of a u-node."},"UNodeHeartbeat":{"properties":{"hostname":{"type":"string","title":"Hostname"},"status":{"$ref":"#/components/schemas/UNodeStatus","default":"online"},"manager_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manager Version"},"services_running":{"items":{"type":"string"},"type":"array","title":"Services Running"},"capabilities":{"anyOf":[{"$ref":"#/components/schemas/UNodeCapabilities"},{"type":"null"}]},"metrics":{"additionalProperties":true,"type":"object","title":"Metrics"}},"type":"object","required":["hostname"],"title":"UNodeHeartbeat","description":"Heartbeat message from a u-node."},"UNodeListResponse":{"properties":{"unodes":{"items":{"$ref":"#/components/schemas/UNode"},"type":"array","title":"Unodes"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["unodes","total"],"title":"UNodeListResponse","description":"Response with list of u-nodes."},"UNodePlatform":{"type":"string","enum":["linux","macos","windows","unknown"],"title":"UNodePlatform","description":"Platform the u-node is running on."},"UNodeRegistrationRequest":{"properties":{"token":{"type":"string","title":"Token"},"hostname":{"type":"string","title":"Hostname"},"tailscale_ip":{"type":"string","title":"Tailscale Ip"},"platform":{"type":"string","title":"Platform","default":"unknown"},"manager_version":{"type":"string","title":"Manager Version","default":"0.1.0"},"capabilities":{"anyOf":[{"$ref":"#/components/schemas/UNodeCapabilities"},{"type":"null"}]}},"type":"object","required":["token","hostname","tailscale_ip"],"title":"UNodeRegistrationRequest","description":"Request to register a u-node."},"UNodeRegistrationResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"unode":{"anyOf":[{"$ref":"#/components/schemas/UNode"},{"type":"null"}]}},"type":"object","required":["success","message"],"title":"UNodeRegistrationResponse","description":"Response from u-node registration."},"UNodeRole":{"type":"string","enum":["leader","standby","worker"],"title":"UNodeRole","description":"Role of a u-node in the cluster."},"UNodeStatus":{"type":"string","enum":["online","offline","connecting","error"],"title":"UNodeStatus","description":"Connection status of a u-node."},"UnifiedImportRequest":{"properties":{"url":{"type":"string","title":"Url","description":"GitHub URL, Docker Hub URL, or image reference"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch","description":"Branch for GitHub (defaults to main)"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag","description":"Tag for Docker Hub (defaults to latest)"},"compose_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compose Path","description":"Path to docker-compose file if not auto-detected"}},"type":"object","required":["url"],"title":"UnifiedImportRequest","description":"Unified request for importing from any supported source."},"UnifiedScanResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"source_type":{"type":"string","enum":["github","dockerhub"],"title":"Source Type"},"github_info":{"anyOf":[{"$ref":"#/components/schemas/GitHubUrlInfo"},{"type":"null"}]},"compose_files":{"items":{"$ref":"#/components/schemas/DetectedComposeFile"},"type":"array","title":"Compose Files"},"dockerhub_info":{"anyOf":[{"$ref":"#/components/schemas/DockerHubImageInfo"},{"type":"null"}]},"available_tags":{"items":{"type":"string"},"type":"array","title":"Available Tags"},"image_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Description"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success","source_type"],"title":"UnifiedScanResponse","description":"Unified response from scanning any import source."},"UpdateCorsRequest":{"properties":{"hostname":{"type":"string","title":"Hostname","description":"Tailscale hostname (e.g., machine.tail12345.ts.net)"}},"type":"object","required":["hostname"],"title":"UpdateCorsRequest","description":"Request to update CORS origins with Tailscale hostname"},"UpgradeRequest":{"properties":{"version":{"type":"string","title":"Version","default":"latest"},"registry":{"type":"string","title":"Registry","default":"ghcr.io/ushadow-io"}},"type":"object","title":"UpgradeRequest","description":"Request to upgrade a u-node's manager."},"UpgradeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"hostname":{"type":"string","title":"Hostname"},"new_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Image"}},"type":"object","required":["success","message","hostname"],"title":"UpgradeResponse","description":"Response from upgrade request."},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","default":true},"is_superuser":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superuser","default":false},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified","default":false},"display_name":{"type":"string","maxLength":100,"minLength":1,"title":"Display Name"}},"type":"object","required":["email","password","display_name"],"title":"UserCreate","description":"Schema for creating new users."},"UserRead":{"properties":{"id":{"$ref":"#/components/schemas/PydanticObjectId"},"email":{"type":"string","format":"email","title":"Email"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_superuser":{"type":"boolean","title":"Is Superuser","default":false},"is_verified":{"type":"boolean","title":"Is Verified","default":false},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","email"],"title":"UserRead","description":"Schema for reading user data (API responses)."},"UserUpdate":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"is_superuser":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superuser"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","title":"UserUpdate","description":"Schema for updating user data."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VolumeConfig":{"properties":{"name":{"type":"string","title":"Name"},"container_path":{"type":"string","title":"Container Path"},"is_named_volume":{"type":"boolean","title":"Is Named Volume","default":true}},"type":"object","required":["name","container_path"],"title":"VolumeConfig","description":"Configuration for a volume mount."},"Wiring":{"properties":{"id":{"type":"string","title":"Id","description":"Unique wiring identifier"},"source_instance_id":{"type":"string","title":"Source Instance Id","description":"Instance providing the capability"},"source_capability":{"type":"string","title":"Source Capability","description":"Capability being provided (e.g., 'llm', 'memory')"},"target_instance_id":{"type":"string","title":"Target Instance Id","description":"Instance consuming the capability"},"target_capability":{"type":"string","title":"Target Capability","description":"Capability slot being filled"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"}},"type":"object","required":["id","source_instance_id","source_capability","target_instance_id","target_capability"],"title":"Wiring","description":"Connects an instance output to an instance input.\n\nWhen wired, the source instance's output values override\nthe target instance's input configuration for that capability."},"WiringCreate":{"properties":{"source_instance_id":{"type":"string","title":"Source Instance Id"},"source_capability":{"type":"string","title":"Source Capability"},"target_instance_id":{"type":"string","title":"Target Instance Id"},"target_capability":{"type":"string","title":"Target Capability"}},"type":"object","required":["source_instance_id","source_capability","target_instance_id","target_capability"],"title":"WiringCreate","description":"Request to create a wiring connection."}},"securitySchemes":{"APIKeyCookie":{"type":"apiKey","in":"cookie","name":"ushadow_auth"},"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"api/auth/login"}}}}}}