-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathopenapi.json
More file actions
1 lines (1 loc) · 767 KB
/
openapi.json
File metadata and controls
1 lines (1 loc) · 767 KB
1
{"openapi":"3.1.0","info":{"title":"Revyl API","description":"Revyl API","version":"1.0.0"},"servers":[{"url":"https://backend.revyl.ai","description":"Production"}],"paths":{"/api/v1/binaries/test-app/upload-url":{"post":{"tags":["App Binaries"],"summary":"Get App Binary Upload Url","description":"Generate a pre-signed URL for uploading an app binary file and optionally update the test record immediately.\nAlso attempts to extract the package identifier from the uploaded file for iOS apps.","operationId":"get_app_binary_upload_url_api_v1_binaries_test_app_upload_url_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppBinaryUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppBinaryUploadResponseWithPackageId"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/binaries/test-app/download-url":{"post":{"tags":["App Binaries"],"summary":"Get App Binary Download Url","description":"Generate a presigned URL for downloading an app binary file","operationId":"get_app_binary_download_url_api_v1_binaries_test_app_download_url_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppBinaryDownloadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppBinaryDownloadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/binaries/test-app/delete":{"delete":{"tags":["App Binaries"],"summary":"Delete App Binary","description":"Delete an app binary file from S3 and clear its reference in the test record.","operationId":"delete_app_binary_api_v1_binaries_test_app_delete_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppBinaryDeleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Delete App Binary Api V1 Binaries Test App Delete Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/binaries/test-app/extract-package-id":{"post":{"tags":["App Binaries"],"summary":"Extract Package Id","description":"Extract bundle ID from uploaded iOS app binary.\nThis should be called after the file upload completes.","operationId":"extract_package_id_api_v1_binaries_test_app_extract_package_id_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractPackageIdRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractPackageIdResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/cloudflare/credentials":{"get":{"tags":["cloudflare"],"summary":"Get Cloudflare Credentials","description":"Fetch Cloudflare credentials from AWS Secrets Manager.\n\nThese credentials are used by the CLI service to create and manage\nnamed Cloudflare tunnels with predictable URLs.\nRestricted to service identity (REVYL_GLOBAL_API_KEY) only.","operationId":"get_cloudflare_credentials_api_v1_cloudflare_credentials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloudflareCredentials"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/entity/users/get_user_uuid":{"get":{"tags":["User"],"summary":"Get User Uuid Endpoint","description":"Get the user id of the current user.\n\nSupports both regular user authentication and service key authentication.\nFor service keys, returns AuthInfo with user_id=\"service\".","operationId":"get_user_uuid_endpoint_api_v1_entity_users_get_user_uuid_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthInfo"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/entity/users/get_user_tests_and_history_count":{"get":{"tags":["User"],"summary":"Get User Tests And History Count Endpoint","description":"Get the list of tests for a user and count the related test history items.\nAlso calculates the average duration of the latest test runs.\n\nParameters:\norg_id (str, optional): Organization ID to filter tests by\n\nReturns:\ndict: A dictionary containing:\n - test_history_count: Total count of test history items\n - latest_success_count: Count of successful latest test runs\n - latest_failure_count: Count of failed latest test runs\n - latest_success_rate: Success rate as a percentage\n - average_duration: Average duration of latest test runs (in seconds)","operationId":"get_user_tests_and_history_count_endpoint_api_v1_entity_users_get_user_tests_and_history_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestStatistics"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/entity/users/get_user_tests_with_details":{"get":{"tags":["User"],"summary":"Get User Tests With Details Endpoint","operationId":"get_user_tests_with_details_endpoint_api_v1_entity_users_get_user_tests_with_details_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status_history_limit","in":"query","required":false,"schema":{"type":"integer","maximum":75,"minimum":1,"default":50,"title":"Status History Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserTestsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/entity/users/get_dashboard_metrics":{"get":{"tags":["User"],"summary":"Get Dashboard Metrics Endpoint","description":"Get dashboard metrics with week-over-week comparisons for tests and workflows.\n\nReturns:\nDashboardMetrics: Dashboard metrics including total tests, workflows, test runs,\n failing tests percentage, average duration, and their WoW comparisons","operationId":"get_dashboard_metrics_endpoint_api_v1_entity_users_get_dashboard_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardMetrics"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/entity/users/get_test_health_time_series":{"get":{"tags":["User"],"summary":"Get Test Health Time Series Endpoint","description":"Get time series data for test health showing passing/failing test executions over time.\nUses efficient SQL aggregation - returns weekly aggregated data for all time.\n\nReturns:\nTestHealthTimeSeries: Time series data with weekly aggregated passing/failing counts","operationId":"get_test_health_time_series_endpoint_api_v1_entity_users_get_test_health_time_series_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestHealthTimeSeries"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/entity/users/create_cli_api_key":{"post":{"tags":["User"],"summary":"Create Cli Api Key Endpoint","description":"Create a long-lived API key for CLI browser-based authentication.\n\nWhen a user authenticates the CLI via the browser, this endpoint generates\na persistent PropelAuth API key so the CLI session never expires. Repeated\nbrowser logins revoke only prior keys for the same local CLI instance when\n`client_instance_id` is provided. Legacy clients without that identifier\nfall back to revoking all existing CLI-generated keys for the user.\n\nParameters:\n auth_info: Authenticated user info injected by require_auth dependency.\n\nReturns:\n CreateCLIApiKeyResponse containing the api_key_token and api_key_id.\n\nRaises:\n HTTPException 500: If PropelAuth key creation or cleanup fails.","operationId":"create_cli_api_key_endpoint_api_v1_entity_users_create_cli_api_key_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CreateCLIApiKeyRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCLIApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/entity/users/revoke_cli_api_key":{"post":{"tags":["User"],"summary":"Revoke Cli Api Key Endpoint","description":"Revoke the current machine's browser-issued CLI API key.","operationId":"revoke_cli_api_key_endpoint_api_v1_entity_users_revoke_cli_api_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeCLIApiKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeCLIApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/get_test_info":{"get":{"tags":["Tests"],"summary":"Get Test Info Endpoint","description":"Get the test info for a specific test id\nAuthentication is required\n- Regular users can only access their own tests or tests in their organization\n- Service authentication can access any test but must specify user_id for context\n- build_id can be provided to override the build version attached to the test\n- app_id can be provided to override the app (backend resolves to current version)","operationId":"get_test_info_endpoint_api_v1_tests_get_test_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"query","required":true,"schema":{"type":"string","title":"Test Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"build_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Id"}},{"name":"app_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Test-Output"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/get_test_info_batch":{"post":{"tags":["Tests"],"summary":"Get Test Info Batch Endpoint","description":"Get test info for multiple test IDs in one database query.","operationId":"get_test_info_batch_endpoint_api_v1_tests_get_test_info_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchTestInfoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Test-Output"},"type":"array","title":"Response Get Test Info Batch Endpoint Api V1 Tests Get Test Info Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/{test_id}/cached_elements":{"put":{"tags":["Tests"],"summary":"Update Cached Elements Endpoint","description":"Persist cached action elements for a test, keyed by node_id, and return updated Test.","operationId":"update_cached_elements_endpoint_api_v1_tests__test_id__cached_elements_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CachedActionStore-Input"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Test-Output"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/add_task_report":{"post":{"tags":["Tests"],"summary":"Add Task Report Endpoint","description":"Add report metadata to test_executions table after test execution completes.\nThis is the new way to handle reports without relying on test_history.\n\n- Service authentication can add reports for any user with proper context\n- Regular users can only add their own reports","operationId":"add_task_report_endpoint_api_v1_tests_add_task_report_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskReportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/create":{"post":{"tags":["Tests"],"summary":"Create Test Endpoint","description":"Create a new test using the normalized schema","operationId":"create_test_endpoint_api_v1_tests_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Test-Input"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Test-Output"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/update/{test_id}":{"put":{"tags":["Tests"],"summary":"Update Test Endpoint","description":"Update an existing test using the normalized schema.\n\nSupports optimistic locking via the expected_version field:\n- If expected_version is provided and doesn't match the current version,\n returns 409 Conflict with details about the conflict.\n- On successful update, version is incremented and a version history entry is created.","operationId":"update_test_endpoint_api_v1_tests_update__test_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Test-Input"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Test-Output"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/{test_id}/versions":{"get":{"tags":["Tests"],"summary":"Get Test Versions Endpoint","description":"Get version history for a test.\nReturns versions in descending order (newest first).","operationId":"get_test_versions_endpoint_api_v1_tests__test_id__versions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Maximum number of versions to return","default":50,"title":"Limit"},"description":"Maximum number of versions to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","description":"Number of versions to skip","default":0,"title":"Offset"},"description":"Number of versions to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestVersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/{test_id}/versions/{version}":{"get":{"tags":["Tests"],"summary":"Get Test Version Endpoint","description":"Get a specific version of a test.","operationId":"get_test_version_endpoint_api_v1_tests__test_id__versions__version__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestVersionInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/{test_id}/restore":{"post":{"tags":["Tests"],"summary":"Restore Test Version Endpoint","description":"Restore a test to a previous version.\nCreates a new version with the tasks from the specified version.","operationId":"restore_test_version_endpoint_api_v1_tests__test_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestRestoreVersionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestRestoreVersionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/get_simple_tests":{"get":{"tags":["Tests"],"summary":"Get Simple Tests Endpoint","description":"Get a lightweight list of tests with app and tag metadata.\n\nReturns id, name, platform, app_id/app_name, and tags for each test.\nHeavier fields (resolved builds, cached elements, execution status) are\nintentionally omitted to keep the response fast for list/filter UIs.\n\nParameters:\n limit: Maximum number of tests to return (default 100).\n offset: Pagination offset.\n auth_info: Injected auth context.\n\nReturns:\n SimpleTestListResponse with enriched test items.\n\nRaises:\n HTTPException: On any unexpected error.","operationId":"get_simple_tests_endpoint_api_v1_tests_get_simple_tests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Maximum number of tests to return","default":100,"title":"Limit"},"description":"Maximum number of tests to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","description":"Number of tests to skip","default":0,"title":"Offset"},"description":"Number of tests to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/get_tests":{"get":{"tags":["Tests"],"summary":"Query Tests Endpoint","operationId":"query_tests_endpoint_api_v1_tests_get_tests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"status","in":"query","required":false,"schema":{"enum":["all","passing","failing","notRun"],"type":"string","default":"all","title":"Status"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"app_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"}},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"}},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["lastRun","name","status","platform","build","duration"],"type":"string","default":"lastRun","title":"Sort By"}},{"name":"sort_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"desc","title":"Sort Dir"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/delete/{test_id}":{"delete":{"tags":["Tests"],"summary":"Delete Test Endpoint","description":"Delete a test\nand its associated data\nUses the normalized schema views for consistency.","operationId":"delete_test_endpoint_api_v1_tests_delete__test_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/bulk_delete":{"post":{"tags":["Tests"],"summary":"Bulk Delete Tests Endpoint","description":"Bulk delete tests (soft delete).\n\nValidates access for each test and performs soft delete by setting deleted=True.\nOnly tests the user has access to will be deleted.","operationId":"bulk_delete_tests_endpoint_api_v1_tests_bulk_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteTestsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteTestsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/get_test_by_id/{test_id}":{"get":{"tags":["Tests"],"summary":"Get Test By Id Endpoint","operationId":"get_test_by_id_endpoint_api_v1_tests_get_test_by_id__test_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Test-Output"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/{test_id}/device-target":{"patch":{"tags":["Tests"],"summary":"Update Device Target","description":"Update the saved device target for a test.\n\nPass a concrete device_model + os_version to pin a target, or ``null/null``\n(or ``AUTO/AUTO``) to store the ``Auto`` sentinel.","operationId":"update_device_target_api_v1_tests__test_id__device_target_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeviceTargetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeviceTargetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/create_enhanced_test_execution_task":{"post":{"tags":["Tests"],"summary":"Create Enhanced Test Execution Task","description":"Create a new enhanced test execution task record with detailed tracking.","operationId":"create_enhanced_test_execution_task_api_v1_tests_create_enhanced_test_execution_task_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionTasksEnhancedCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionTaskCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/update_enhanced_test_execution_task":{"put":{"tags":["Tests"],"summary":"Update Enhanced Test Execution Task","description":"Update an existing enhanced test execution task with detailed tracking support.","operationId":"update_enhanced_test_execution_task_api_v1_tests_update_enhanced_test_execution_task_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionTasksEnhancedUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionTaskUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/get_enhanced_test_execution_task":{"get":{"tags":["Tests"],"summary":"Get Enhanced Test Execution Task","description":"Get an enhanced test execution task status by task ID.","operationId":"get_enhanced_test_execution_task_api_v1_tests_get_enhanced_test_execution_task_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"query","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionTasksEnhanced"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/get_test_execution_task":{"get":{"tags":["Tests"],"summary":"Get Test Execution Task","description":"Get a test execution task status by task ID (legacy endpoint).\n\nThis endpoint queries the test_executions_full view to include status\nfrom device_sessions, which is the source of truth for execution state.\n\nArgs:\n task_id: The execution ID to look up\n auth_info: Authenticated user information\n\nReturns:\n TestStatusResponse: Execution status including status from device_sessions\n\nRaises:\n HTTPException: 404 if not found, 500 on server error","operationId":"get_test_execution_task_api_v1_tests_get_test_execution_task_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"query","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/status/batch":{"get":{"tags":["Tests"],"summary":"Get Test Status Batch","description":"Get status for multiple test executions in a single request.\n\nArgs:\n task_ids: Comma-separated list of task IDs\n auth_info: Authenticated user information\n\nReturns:\n TestExecutionBatchResponse: Status information for each requested test","operationId":"get_test_status_batch_api_v1_tests_status_batch_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_ids","in":"query","required":true,"schema":{"type":"string","title":"Task Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/get_enhanced_test_execution_tasks_batch":{"get":{"tags":["Tests"],"summary":"Get Enhanced Test Execution Tasks Batch","description":"Get enhanced test execution task details for multiple task IDs in a single request.\n\nArgs:\n task_ids: Comma-separated list of task IDs\n auth_info: Authenticated user information\n\nReturns:\n Dict containing task details with enhanced tracking information","operationId":"get_enhanced_test_execution_tasks_batch_api_v1_tests_get_enhanced_test_execution_tasks_batch_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_ids","in":"query","required":true,"schema":{"type":"string","title":"Task Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionTasksBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/get_test_enhanced_history":{"get":{"tags":["Tests"],"summary":"Get Test Enhanced History","description":"Get enhanced test execution history with detailed tracking information for a specific test.\nBackwards compatible - includes both new task-tracked executions and legacy history entries.\n\nArgs:\n test_id: The ID of the test\n limit: Maximum number of history items to return\n offset: Number of items to skip\n auth_info: Authenticated user information\n\nReturns:\n Dict containing enhanced test execution history with tracking details","operationId":"get_test_enhanced_history_api_v1_tests_get_test_enhanced_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"query","required":true,"schema":{"type":"string","title":"Test Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestEnhancedHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/delete_test_execution/{task_id}":{"delete":{"tags":["Tests"],"summary":"Delete Test Execution Endpoint","description":"Delete a test execution task.\n\nAllows deletion if user has god_mode permission or Owner role in the organization.\n\nParameters:\n task_id: The task ID of the test execution to delete\n auth_info: Authenticated user information\n propel_user: Optional PropelAuth user object for role checking\n\nReturns:\n DeleteTaskResponse: Response containing deletion result\n\nRaises:\n HTTPException: 403 if not authorized, 404 if task not found, 500 on error","operationId":"delete_test_execution_endpoint_api_v1_tests_delete_test_execution__task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/bulk_delete_test_executions":{"post":{"tags":["Tests"],"summary":"Bulk Delete Test Executions Endpoint","description":"Bulk delete test execution tasks.\n\nAllows deletion if user has god_mode permission or Owner role in the organization.\nThis endpoint is optimized for bulk operations with caching of access checks.\n\nParameters:\n request: Contains list of task_ids to delete.\n auth_info: Authenticated user information.\n propel_user: Optional PropelAuth user object for role checking.\n\nReturns:\n DeleteTaskResponse: Response containing deletion results with counts.\n\nRaises:\n HTTPException: 400 if no task_ids provided, 500 on critical error.","operationId":"bulk_delete_test_executions_endpoint_api_v1_tests_bulk_delete_test_executions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteTestExecutionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/duplicate":{"post":{"tags":["Tests"],"summary":"Duplicate Test Endpoint","description":"Duplicate an existing test with all its data.","operationId":"duplicate_test_endpoint_api_v1_tests_duplicate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateTestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/active_count":{"get":{"tags":["Tests"],"summary":"Get active test count for organization","description":"Count active (running/queued) tests for an organization. Used for concurrency limit enforcement.","operationId":"get_active_test_count_api_v1_tests_active_count_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":true,"schema":{"type":"string","description":"Organization ID to count active tests for","title":"Org Id"},"description":"Organization ID to count active tests for"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveTestCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/yaml/from-blocks":{"post":{"tags":["YAML Operations"],"summary":"Create Test From Blocks","description":"V2 API: Create test from blocks using Phase 1 services\n\nThis endpoint uses the new backend-first architecture:\n- Uses TestCreationService for orchestration\n- Integrates with existing converters\n- Provides clean error handling","operationId":"create_test_from_blocks_api_v1_tests_yaml_from_blocks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlocksCreationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/yaml/from-yaml":{"post":{"tags":["YAML Operations","public"],"summary":"Create Test From Yaml","description":"V2 API: Create or update test from YAML\n\nThis endpoint provides YAML-to-test creation with upsert logic:\n- If test with same name exists in org: Updates it\n- If not: Creates new test\n- Validates YAML structure\n- Resolves build configuration\n- Infers platform from build if not provided","operationId":"create_test_from_yaml_api_v1_tests_yaml_from_yaml_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YamlCreationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YamlCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/yaml/validate-yaml":{"post":{"tags":["YAML Operations","public"],"summary":"Validate Yaml","description":"V2 API: Validate YAML using Phase 1 services\n\nSupports both full_test and blocks_only validation using\nthe existing platform_validation.py wrapped by ValidationOrchestrator.","operationId":"validate_yaml_api_v1_tests_yaml_validate_yaml_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/yaml/conversion/blocks-to-yaml":{"post":{"tags":["YAML Operations"],"summary":"Convert Blocks To Yaml","description":"V2 API: Convert blocks to YAML using Phase 1 services\n\nUses BidirectionalConversionService which wraps the existing\nBlockToYamlConverter for consistent conversion.","operationId":"convert_blocks_to_yaml_api_v1_tests_yaml_conversion_blocks_to_yaml_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlocksToYamlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/yaml/conversion/yaml-to-blocks":{"post":{"tags":["YAML Operations"],"summary":"Convert Yaml To Blocks","description":"V2 API: Convert YAML to blocks using Phase 1 services\n\nUses BidirectionalConversionService which wraps the existing\nYamlToBlockConverter for consistent conversion.","operationId":"convert_yaml_to_blocks_api_v1_tests_yaml_conversion_yaml_to_blocks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YamlToBlocksRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/scripts":{"get":{"tags":["Code Execution Scripts"],"summary":"List Scripts","description":"List all scripts accessible to the user (own scripts + org scripts).","operationId":"list_scripts_api_v1_tests_scripts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of scripts to return","default":100,"title":"Limit"},"description":"Maximum number of scripts to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of scripts to skip","default":0,"title":"Offset"},"description":"Number of scripts to skip"},{"name":"runtime","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by runtime (python, javascript, typescript, bash)","title":"Runtime"},"description":"Filter by runtime (python, javascript, typescript, bash)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeExecutionScriptListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Code Execution Scripts"],"summary":"Create Script","description":"Create a new script.","operationId":"create_script_api_v1_tests_scripts_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeExecutionScriptCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeExecutionScript"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/scripts/{script_id}/tests":{"get":{"tags":["Code Execution Scripts"],"summary":"Get Script Usage","description":"Get all tests that use a specific script.","operationId":"get_script_usage_api_v1_tests_scripts__script_id__tests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"script_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Script Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/scripts/{script_id}":{"get":{"tags":["Code Execution Scripts"],"summary":"Get Script","description":"Get a specific script by ID.\nUser must own the script or be in the same org.","operationId":"get_script_api_v1_tests_scripts__script_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"script_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Script Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeExecutionScript"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Code Execution Scripts"],"summary":"Update Script","description":"Update an existing script.\nUser must own the script or be in the same org.","operationId":"update_script_api_v1_tests_scripts__script_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"script_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Script Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeExecutionScriptUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeExecutionScript"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Code Execution Scripts"],"summary":"Delete Script","description":"Delete a script.\nUser must own the script or be in the same org.","operationId":"delete_script_api_v1_tests_scripts__script_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"script_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Script Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/tags":{"get":{"tags":["Tags"],"summary":"List Tags","description":"Get all tags for the organization with usage counts.\nSorted by usage count (most used first).","operationId":"list_tags_api_v1_tests_tags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagListResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Tags"],"summary":"Create Tag","description":"Create a new tag using the existing upsert_tag RPC function.\nIf tag with same name exists, returns the existing tag.","operationId":"create_tag_api_v1_tests_tags_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTagRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/tags/tests/{test_id}/sync":{"post":{"tags":["Tags"],"summary":"Sync Test Tags","description":"Sync tags for a test by name.\n- Creates any tags that don't exist\n- Associates all provided tags with the test\n- Removes any tags not in the list\n\nThis is the primary endpoint for the seamless tagging UX.","operationId":"sync_test_tags_api_v1_tests_tags_tests__test_id__sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncTagsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncTagsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/tags/tests/bulk-sync":{"post":{"tags":["Tags"],"summary":"Bulk Sync Test Tags","description":"Bulk sync tags for multiple tests.\n- Adds specified tags to all tests (creates tags if needed)\n- Removes specified tags from all tests\n\nThis is optimized for bulk operations using batch database operations.","operationId":"bulk_sync_test_tags_api_v1_tests_tags_tests_bulk_sync_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSyncTagsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSyncTagsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tests/tags/tests/{test_id}":{"get":{"tags":["Tags"],"summary":"Get Test Tags","description":"Get all tags for a specific test.","operationId":"get_test_tags_api_v1_tests_tags_tests__test_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagResponse"},"title":"Response Get Test Tags Api V1 Tests Tags Tests Test Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tests/tags/{tag_id}":{"patch":{"tags":["Tags"],"summary":"Update Tag","description":"Update a tag (rename, change color, update description).\nChanges apply globally to all tests using this tag.\n\nRaises 409 Conflict if renaming to a name that already exists.","operationId":"update_tag_api_v1_tests_tags__tag_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTagRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tags"],"summary":"Delete Tag","description":"Delete a tag. Automatically removes from all tests (CASCADE).","operationId":"delete_tag_api_v1_tests_tags__tag_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Tag Api V1 Tests Tags Tag Id Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/custom/add":{"post":{"tags":["Custom Variables"],"summary":"Add Variable Endpoint","description":"Add a new variable to the variable table","operationId":"add_variable_endpoint_api_v1_variables_custom_add_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariableModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariableResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/variables/custom/read_variables":{"get":{"tags":["Custom Variables"],"summary":"Read Variables Endpoint","description":"Retrieve all variables (including their unique IDs) associated with a specific test ID","operationId":"read_variables_endpoint_api_v1_variables_custom_read_variables_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_uid","in":"query","required":true,"schema":{"type":"string","title":"Test Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariablesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/custom/delete":{"delete":{"tags":["Custom Variables"],"summary":"Delete Variable Endpoint","description":"Delete a variable for a specific test","operationId":"delete_variable_endpoint_api_v1_variables_custom_delete_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_uid","in":"query","required":true,"schema":{"type":"string","title":"Test Uid"}},{"name":"variable_name","in":"query","required":true,"schema":{"type":"string","title":"Variable Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariablesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/custom/check_exists":{"get":{"tags":["Custom Variables"],"summary":"Check Variable Exists Endpoint","description":"Check if a specific variable exists in the variable table for a given test_uid","operationId":"check_variable_exists_endpoint_api_v1_variables_custom_check_exists_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"}},{"name":"variable_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckVariableExistsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/custom/get_value":{"get":{"tags":["Custom Variables"],"summary":"Get Variable Value Endpoint","description":"Retrieve the value of a specific variable associated with a test ID","operationId":"get_variable_value_endpoint_api_v1_variables_custom_get_value_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_uid","in":"query","required":true,"schema":{"type":"string","title":"Test Uid"}},{"name":"variable_name","in":"query","required":true,"schema":{"type":"string","title":"Variable Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVariableValueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/custom/update/{variable_id}":{"put":{"tags":["Custom Variables"],"summary":"Update Variable Endpoint","description":"Update a variable's name using its stable unique ID.","operationId":"update_variable_endpoint_api_v1_variables_custom_update__variable_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"variable_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Variable Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVariableNameModel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariableResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/custom/update_value":{"put":{"tags":["Custom Variables"],"summary":"Update Variable Value Endpoint","description":"Update a variable's value using its name for a specific test.","operationId":"update_variable_value_endpoint_api_v1_variables_custom_update_value_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVariableValueModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariableResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/variables/custom/delete_all":{"delete":{"tags":["Custom Variables"],"summary":"Delete All Variables Endpoint","description":"Delete all variables for a specific test","operationId":"delete_all_variables_endpoint_api_v1_variables_custom_delete_all_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_uid","in":"query","required":true,"schema":{"type":"string","title":"Test Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariablesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/app_launch_env/add":{"post":{"tags":["App Launch Environment Variables"],"summary":"Add Env Var","description":"Add a new app launch environment variable for a test.\nValue is encrypted using AWS KMS before storage.","operationId":"add_env_var_api_v1_variables_app_launch_env_add_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppLaunchEnvVarModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppLaunchEnvVarResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/variables/app_launch_env/read":{"get":{"tags":["App Launch Environment Variables"],"summary":"Read Env Vars","description":"Read all app launch environment variables for a specific test.\nValues are decrypted before being returned.","operationId":"read_env_vars_api_v1_variables_app_launch_env_read_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"query","required":true,"schema":{"type":"string","title":"Test Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppLaunchEnvVarsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/app_launch_env/delete":{"delete":{"tags":["App Launch Environment Variables"],"summary":"Delete Env Var By Id","description":"Delete a specific app launch environment variable by ID.","operationId":"delete_env_var_by_id_api_v1_variables_app_launch_env_delete_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"env_var_id","in":"query","required":true,"schema":{"type":"string","title":"Env Var Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/app_launch_env/update":{"put":{"tags":["App Launch Environment Variables"],"summary":"Update Env Var","description":"Update an existing app launch environment variable.","operationId":"update_env_var_api_v1_variables_app_launch_env_update_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAppLaunchEnvVarModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppLaunchEnvVarResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/variables/app_launch_env/delete_all":{"delete":{"tags":["App Launch Environment Variables"],"summary":"Delete All Env Vars","description":"Delete all app launch environment variables for a test.","operationId":"delete_all_env_vars_api_v1_variables_app_launch_env_delete_all_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"query","required":true,"schema":{"type":"string","title":"Test Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/global":{"get":{"tags":["Global Variables"],"summary":"List Global Variables","description":"List all global variables for the caller's organization.","operationId":"list_global_variables_api_v1_variables_global_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalVariablesResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Global Variables"],"summary":"Add Global Variable","description":"Create a new global variable for the caller's organization.","operationId":"add_global_variable_api_v1_variables_global_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalVariableCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalVariableResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/variables/global/{variable_id}":{"put":{"tags":["Global Variables"],"summary":"Update Global Variable","description":"Update an existing global variable.","operationId":"update_global_variable_api_v1_variables_global__variable_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"variable_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Variable Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalVariableUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalVariableResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Global Variables"],"summary":"Delete Global Variable","description":"Delete a global variable.","operationId":"delete_global_variable_api_v1_variables_global__variable_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"variable_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Variable Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalVariableResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variables/global/resolve":{"get":{"tags":["Global Variables"],"summary":"Resolve Variables","description":"Return merged local + global variables for a test, with local-wins priority.","operationId":"resolve_variables_api_v1_variables_global_resolve_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_uid","in":"query","required":true,"schema":{"type":"string","title":"Test Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvedVariablesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/report/async-run/generate_shareable_report_link":{"post":{"tags":["Async Test Report"],"summary":"Generate Shareable Report Link","description":"Generate a shareable report link for a test execution\n- Authentication required but no user-specific authorization\n- Shareable links use token-based security model","operationId":"generate_shareable_report_link_api_v1_report_async_run_generate_shareable_report_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/report/async-run/generate_shareable_report_link_by_task":{"post":{"tags":["Async Test Report"],"summary":"Generate Shareable Report Link By Task","description":"Generate a shareable report link using only a task_id.\nLooks up the corresponding test_id for the provided task_id and creates\na tokenized public link identical in behavior to generate_shareable_report_link.","operationId":"generate_shareable_report_link_by_task_api_v1_report_async_run_generate_shareable_report_link_by_task_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportByTaskModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/report/async-run/shareable_report_link_by_task":{"get":{"tags":["Async Test Report"],"summary":"Get Shareable Report Link By Task","operationId":"get_shareable_report_link_by_task_api_v1_report_async_run_shareable_report_link_by_task_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"query","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/report/async-run/shareable_report_link_by_task/{task_id}":{"delete":{"tags":["Async Test Report"],"summary":"Delete Shareable Report Link By Task","operationId":"delete_shareable_report_link_by_task_api_v1_report_async_run_shareable_report_link_by_task__task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/report/async-run/generate_shareable_report_link_by_session":{"post":{"tags":["Async Test Report"],"summary":"Generate Shareable Report Link By Session","description":"Generate a shareable report link for a device session.\n\nValidates org ownership via device_sessions, then upserts into\nshareable_session_reports and returns a token-only public URL.\n\nArgs:\n payload: Contains session_id, optional origin and expiration_hours.\n request: The incoming HTTP request.\n auth_info: Authenticated caller context.\n\nReturns:\n ShareableReportResponse with the generated link.\n\nRaises:\n HTTPException: 400 if session_id missing, 404 if session not found.","operationId":"generate_shareable_report_link_by_session_api_v1_report_async_run_generate_shareable_report_link_by_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportBySessionModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/report/async-run/shareable_report_link_by_session":{"get":{"tags":["Async Test Report"],"summary":"Get Shareable Report Link By Session","description":"Check whether a shareable link exists for a device session.\n\nArgs:\n session_id: The device session UUID.\n request: The incoming HTTP request.\n origin: Unused, kept for parity with the task variant.\n auth_info: Authenticated caller context.\n\nReturns:\n ShareableReportStatusResponse indicating enabled/disabled + link.\n\nRaises:\n HTTPException: 400 if session_id missing, 404 if session not found.","operationId":"get_shareable_report_link_by_session_api_v1_report_async_run_shareable_report_link_by_session_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/report/async-run/shareable_report_link_by_session/{session_id}":{"delete":{"tags":["Async Test Report"],"summary":"Delete Shareable Report Link By Session","description":"Revoke the shareable link for a device session.\n\nArgs:\n session_id: The device session UUID.\n auth_info: Authenticated caller context.\n\nReturns:\n ShareableReportStatusResponse with enabled=False.\n\nRaises:\n HTTPException: 400 if session_id missing, 404 if session not found.","operationId":"delete_shareable_report_link_by_session_api_v1_report_async_run_shareable_report_link_by_session__session_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareableReportStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/report/async-run/unified-report-optimized":{"post":{"tags":["Async Test Report"],"summary":"Get Unified Report Optimized","description":"Unified endpoint that handles both public (token-based) and internal (auth-based) report access.\n\nPublic access modes:\n- testId + token: Look up shareable_reports by test_id\n- taskId + token: Look up shareable_reports by task_id (for workflow child tests)\n\nInternal access mode:\n- taskId (with auth): Direct access for authenticated users","operationId":"get_unified_report_optimized_api_v1_report_async_run_unified_report_optimized_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedReportOptimizedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/report/async-run/workflow_tasks_report_batch":{"post":{"tags":["Async Test Report"],"summary":"Get Workflow Tasks Report Batch","description":"Get enriched task info for workflow report cards.\n\nThis endpoint fetches task info for use in workflow report cards.","operationId":"get_workflow_tasks_report_batch_api_v1_report_async_run_workflow_tasks_report_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowTasksReportBatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowTasksReportBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/report/async-run/video-metadata-batch":{"post":{"tags":["Async Test Report"],"summary":"Get Video Metadata Batch","description":"Lightweight batch endpoint for video + step metadata.\n\nOptimized for replay mode - only returns video URL and step timeline data,\nskipping images and full report content. Much faster than N individual calls\nto the full report endpoint.","operationId":"get_video_metadata_batch_api_v1_report_async_run_video_metadata_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoMetadataBatchRequestV1"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoMetadataBatchResponseV1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/report/async-run/training-image":{"post":{"tags":["Async Test Report"],"summary":"Upload Training Image","description":"Record a grounding correction for a step.\n\nInstead of uploading a new image, looks up the existing\nscreenshot_before_s3_key from report_actions and stores it directly.","operationId":"upload_training_image_api_v1_report_async_run_training_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingImageUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingImageUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/report/evals/run_eval":{"post":{"tags":["Eval"],"summary":"Run Eval","description":"Run a comprehensive evaluation on a test execution.\n\nThis endpoint uses per-step Hatchet workflows to bound gRPC message sizes.\nEach step is evaluated independently (~1-5MB) instead of sending the entire\nreport (~50MB).\n\nArgs:\n request: EvalRequest containing task_id and enabled_judges config\n auth_info: Authentication info from dependency\n\nReturns:\n EvalResponse with the evaluation report or error","operationId":"run_eval_api_v1_report_evals_run_eval_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/report/evals/eval_stream/{task_id}":{"get":{"tags":["Eval"],"summary":"Stream Eval Progress","description":"Stream eval progress updates via Server-Sent Events (SSE).\n\nThe frontend should open this connection before calling run_eval\nto receive real-time progress updates.","operationId":"stream_eval_progress_api_v1_report_evals_eval_stream__task_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/storage/s3/delete/{bucket_name}/{file_key}":{"delete":{"tags":["S3"],"summary":"Delete From S3","description":"Delete a file from S3","operationId":"delete_from_s3_api_v1_storage_s3_delete__bucket_name___file_key__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","title":"Bucket Name"}},{"name":"file_key","in":"path","required":true,"schema":{"type":"string","title":"File Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/storage/s3/presigned-url/{bucket_name}/{file_key}":{"get":{"tags":["S3"],"summary":"Get Presigned Url","description":"Generate a pre-signed URL for an S3 object","operationId":"get_presigned_url_api_v1_storage_s3_presigned_url__bucket_name___file_key__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","title":"Bucket Name"}},{"name":"file_key","in":"path","required":true,"schema":{"type":"string","title":"File Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3PresignedUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/storage/s3/buckets":{"get":{"tags":["S3"],"summary":"List Allowed Buckets","description":"List all allowed buckets and their file type patterns","operationId":"list_allowed_buckets_api_v1_storage_s3_buckets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3BucketsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/storage/s3/data_url":{"get":{"tags":["S3"],"summary":"S3 Data Url","description":"Get file contents from a presigned S3 URL\n\nParameters:\n presigned_url (str): The presigned S3 URL to fetch data from\n\nReturns:\n S3DataUrlResponse: Contains the file contents","operationId":"s3_data_url_api_v1_storage_s3_data_url_get","parameters":[{"name":"presigned_url","in":"query","required":true,"schema":{"type":"string","title":"Presigned Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3DataUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/storage/s3/upload_download_to_supabase_file":{"post":{"tags":["S3"],"summary":"Create Upload File To Supabase","description":"Uploads a file to Supabase Storage.\n\nParameters:\nfile (UploadFile): The file to be uploaded.\nuser_id (str): The ID of the user (this could be obtained from authentication).\nfolder_name (str): The folder to store the file in.\nfile_type (str): The content type of the file.\n\nReturns:\nSupabaseUploadResponse: Information about the uploaded file, including its URL.","operationId":"create_upload_file_to_supabase_api_v1_storage_s3_upload_download_to_supabase_file_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_upload_file_to_supabase_api_v1_storage_s3_upload_download_to_supabase_file_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupabaseUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/storage/s3/upload":{"post":{"tags":["S3"],"summary":"Upload To S3","description":"Upload a file to S3 and return a pre-signed URL","operationId":"upload_to_s3_api_v1_storage_s3_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_to_s3_api_v1_storage_s3_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3UploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workflows/create":{"post":{"tags":["Workflows"],"summary":"Create Workflow","description":"Create a new workflow","operationId":"create_workflow_api_v1_workflows_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowData"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workflows/update_full/{workflow_id}":{"put":{"tags":["Workflows"],"summary":"Update Workflow Full","description":"Update an existing workflow with full workflow data","operationId":"update_workflow_full_api_v1_workflows_update_full__workflow_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowData"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/delete/{workflow_id}":{"delete":{"tags":["Workflows"],"summary":"Delete Workflow Endpoint","description":"Soft delete a workflow by setting the deleted flag to True","operationId":"delete_workflow_endpoint_api_v1_workflows_delete__workflow_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteWorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/get_task_status":{"get":{"tags":["Workflows"],"summary":"Get Workflow Task Status","description":"Retrieve the status of a workflow task.","operationId":"get_workflow_task_status_api_v1_workflows_get_task_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"query","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetWorkflowTaskStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/get_with_last_status":{"get":{"tags":["Workflows"],"summary":"Get Workflows With Last Status","description":"Get workflows with their last execution status and metadata for workflow cards.","operationId":"get_workflows_with_last_status_api_v1_workflows_get_with_last_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"history_limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"History Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetWorkflowsWithLastStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/get_detail/{workflow_id}":{"get":{"tags":["Workflows"],"summary":"Get Workflow Detail","description":"Get enriched workflow data for detail view including:\n- Complete workflow info\n- Test details with last execution status\n- Full execution history\n- Settings and configuration\n\nOptimized: Single SQL query replaces 10+ sequential Supabase calls.","operationId":"get_workflow_detail_api_v1_workflows_get_detail__workflow_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetWorkflowDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/get_info/{workflow_id}":{"get":{"tags":["Workflows"],"summary":"Get Workflow Info Lightweight","description":"Get lightweight workflow info for report pages.\n\nReturns basic workflow data + test info (names, platforms) only.\nMuch faster than get_detail as it skips metrics/charts/execution history.\n\nUse this endpoint when you only need test names and platforms (e.g., report pages).\nUse get_detail when you need full metrics, charts, and execution history.","operationId":"get_workflow_info_lightweight_api_v1_workflows_get_info__workflow_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/update_tests/{workflow_id}":{"put":{"tags":["Workflows"],"summary":"Update Workflow Tests","description":"Update the test list for a workflow (batch update)","operationId":"update_workflow_tests_api_v1_workflows_update_tests__workflow_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Test Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/get_workflow_info":{"get":{"tags":["Workflows"],"summary":"Get Workflow Info Endpoint","description":"Get the workflow info for a specific workflow id.\nIncludes quarantined_test_ids for execution quarantine support.","operationId":"get_workflow_info_endpoint_api_v1_workflows_get_workflow_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"query","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/update_name/{workflow_id}":{"put":{"tags":["Workflows"],"summary":"Update Workflow Name","description":"Update the name of a workflow","operationId":"update_workflow_name_api_v1_workflows_update_name__workflow_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkflowNameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/update_schedule/{workflow_id}":{"put":{"tags":["Workflows"],"summary":"Update Workflow Schedule","description":"Update the schedule configuration of a workflow","operationId":"update_workflow_schedule_api_v1_workflows_update_schedule__workflow_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkflowScheduleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/update_run_config/{workflow_id}":{"put":{"tags":["Workflows"],"summary":"Update Workflow Run Config","description":"Update the run configuration of a workflow","operationId":"update_workflow_run_config_api_v1_workflows_update_run_config__workflow_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkflowRunConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/update_build_config/{workflow_id}":{"put":{"tags":["Workflows"],"summary":"Update Workflow Build Config","description":"Update the build configuration of a workflow","operationId":"update_workflow_build_config_api_v1_workflows_update_build_config__workflow_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkflowBuildConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/update_location_config/{workflow_id}":{"put":{"tags":["Workflows"],"summary":"Update Workflow Location Config","description":"Update the location configuration of a workflow","operationId":"update_workflow_location_config_api_v1_workflows_update_location_config__workflow_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkflowLocationConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/update_timeout_config/{workflow_id}":{"put":{"tags":["Workflows"],"summary":"Update Workflow Timeout Config","description":"Update the per-test execution timeout for a workflow.","operationId":"update_workflow_timeout_config_api_v1_workflows_update_timeout_config__workflow_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkflowTimeoutConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/delete_workflow_task/{task_id}":{"delete":{"tags":["Workflows"],"summary":"Delete Workflow Task Endpoint","description":"Delete a workflow task and all associated test executions.\n\nAllows deletion if user has god_mode permission or Owner role in the organization.","operationId":"delete_workflow_task_endpoint_api_v1_workflows_delete_workflow_task__task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/get_by_test/{test_id}":{"get":{"tags":["Workflows"],"summary":"Get Workflows For Test","description":"Get workflows that contain a specific test in their tests array.","operationId":"get_workflows_for_test_api_v1_workflows_get_by_test__test_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowsForTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/workflow/{workflow_id}/test_matrix":{"get":{"tags":["Workflows","Workflows","public"],"summary":"Get Workflow Test Matrix","description":"Return a test × workflow-run matrix. Columns are workflow executions.","operationId":"get_workflow_test_matrix_api_v1_workflows_workflow__workflow_id__test_matrix_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":2,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/workflow/{workflow_id}/tests":{"get":{"tags":["Workflows","Workflows","public"],"summary":"Get Workflow Tests With Policy","description":"Return workflow_tests rows with failure_policy and test metadata.","operationId":"get_workflow_tests_with_policy_api_v1_workflows_workflow__workflow_id__tests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/workflow-tests/{workflow_test_id}":{"patch":{"tags":["Workflows","Workflows","public"],"summary":"Update Workflow Test Failure Policy","description":"Update failure_policy for a single workflow-test attachment.","operationId":"update_workflow_test_failure_policy_api_v1_workflows_workflow_tests__workflow_test_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_test_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Test Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFailurePolicyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/status/history/{workflow_id}":{"get":{"tags":["Workflow Status"],"summary":"Get Workflow Execution History","description":"Get execution history with org-based authorization.","operationId":"get_workflow_execution_history_api_v1_workflows_status_history__workflow_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"start_date","in":"query","required":false,"schema":{"type":"string","description":"Start date in ISO format (YYYY-MM-DD) - get executions from this date to now","title":"Start Date"},"description":"Start date in ISO format (YYYY-MM-DD) - get executions from this date to now"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/status/active":{"get":{"tags":["Workflow Status"],"summary":"Get Active Workflows","description":"Get all currently active workflows for the user.","operationId":"get_active_workflows_api_v1_workflows_status_active_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WorkflowStatusResponse"},"type":"array","title":"Response Get Active Workflows Api V1 Workflows Status Active Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workflows/status/{task_id}":{"get":{"tags":["Workflow Status"],"summary":"Get Workflow Status","description":"Get real-time status of a specific workflow execution.","operationId":"get_workflow_status_api_v1_workflows_status__task_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/tasks/create_workflow_task":{"post":{"tags":["Workflow Tasks"],"summary":"Create Workflow Task","description":"Create or update a workflow execution record (upsert).","operationId":"create_workflow_task_api_v1_workflows_tasks_create_workflow_task_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionsInsert"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Create Workflow Task Api V1 Workflows Tasks Create Workflow Task Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workflows/tasks/update_workflow_task":{"put":{"tags":["Workflow Tasks"],"summary":"Update Workflow Task","description":"Update an existing workflow execution.","operationId":"update_workflow_task_api_v1_workflows_tasks_update_workflow_task_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Update Workflow Task Api V1 Workflows Tasks Update Workflow Task Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workflows/tasks/workflow_task/{task_id}":{"get":{"tags":["Workflow Tasks"],"summary":"Get Workflow Task","description":"Get a workflow execution status by ID.","operationId":"get_workflow_task_api_v1_workflows_tasks_workflow_task__task_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionsUpdate"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Tasks"],"summary":"Delete Workflow Task","description":"Delete a workflow task (test executions are cascade deleted by the database).","operationId":"delete_workflow_task_api_v1_workflows_tasks_workflow_task__task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteWorkflowTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/tasks/create_test_task":{"post":{"tags":["Workflow Tasks"],"summary":"Create Test Task","description":"Create a new test execution record.\n\nNote: status, phase, and timing are NOT stored on test_executions.\nThey come from device_sessions (source of truth).","operationId":"create_test_task_api_v1_workflows_tasks_create_test_task_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Task Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Create Test Task Api V1 Workflows Tasks Create Test Task Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workflows/tasks/update_test_task":{"put":{"tags":["Workflow Tasks"],"summary":"Update Test Task","description":"Update an existing test execution.\n\nNote: status, phase, and timing are NOT stored on test_executions.\nThey come from device_sessions (source of truth).","operationId":"update_test_task_api_v1_workflows_tasks_update_test_task_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Update Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Update Test Task Api V1 Workflows Tasks Update Test Task Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workflows/share/generate_shareable_link":{"post":{"tags":["Workflow Share"],"summary":"Generate Workflow Shareable Link","description":"Generate a shareable link for a workflow report.","operationId":"generate_workflow_shareable_link_api_v1_workflows_share_generate_shareable_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateWorkflowShareableLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateWorkflowShareableLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workflows/share/shareable_link_status/{workflow_task_id}":{"get":{"tags":["Workflow Share"],"summary":"Get Workflow Shareable Link Status","description":"Get the current share status for a workflow and its child tests.","operationId":"get_workflow_shareable_link_status_api_v1_workflows_share_shareable_link_status__workflow_task_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_task_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowShareStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/share/shareable_link/{workflow_task_id}":{"delete":{"tags":["Workflow Share"],"summary":"Delete Workflow Shareable Link","description":"Delete the shareable link for a workflow.","operationId":"delete_workflow_shareable_link_api_v1_workflows_share_shareable_link__workflow_task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_task_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Task Id"}},{"name":"revoke_child_tests","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Revoke Child Tests"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteWorkflowShareableLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/share/unified-report":{"post":{"tags":["Workflow Share"],"summary":"Get Unified Workflow Report","description":"Unified endpoint for both public and internal workflow report access.","operationId":"get_unified_workflow_report_api_v1_workflows_share_unified_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedWorkflowReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedWorkflowReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/github/verify-installation":{"post":{"tags":["Review Bot"],"summary":"Verify Installation","operationId":"verify_installation_api_v1_review_github_verify_installation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupInstallationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupInstallationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/github/generate-state-token":{"get":{"tags":["Review Bot"],"summary":"Generate State Token","description":"Generate a secure state token for GitHub installation flow.\nThe token is stored in the database and will be used to verify the installation callback.","operationId":"generate_state_token_api_v1_review_github_generate_state_token_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateStateTokenResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/github/organization/users":{"get":{"tags":["Review Bot"],"summary":"Get Organization Users","description":"Get GitHub organization users for the connected installation.","operationId":"get_organization_users_api_v1_review_github_organization_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUsersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/github/disconnect-installation":{"delete":{"tags":["Review Bot"],"summary":"Disconnect Installation","description":"Disconnect the GitHub installation for the authenticated organization.\nSets the installation status to 'inactive' and marks repositories as inactive.","operationId":"disconnect_installation_api_v1_review_github_disconnect_installation_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/github/sync-repositories":{"post":{"tags":["Review Bot"],"summary":"Sync Repositories","description":"Sync repositories for an existing GitHub installation.\nFetches current repositories from GitHub API and updates the database.","operationId":"sync_repositories_api_v1_review_github_sync_repositories_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRepositoriesResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/organization/repositories":{"get":{"tags":["Review Bot"],"summary":"Get Organization Repositories","description":"Get repositories for the authenticated user's organization.\nRequires authentication and verifies user's organization access.","operationId":"get_organization_repositories_api_v1_review_organization_repositories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationRepositoriesResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/analytics/dora":{"post":{"tags":["Review Bot"],"summary":"Get Unified Dora Metrics Api","description":"Unified endpoint for DORA metrics - handles both single and multi-repo queries with fast path optimization.","operationId":"get_unified_dora_metrics_api_api_v1_review_analytics_dora_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoDoraMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/summary":{"post":{"tags":["Review Bot"],"summary":"Get Weekly Summary Api","description":"Unified endpoint for weekly summary - handles both single and multi-repo queries with fast path optimization.","operationId":"get_weekly_summary_api_api_v1_review_analytics_summary_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeeklySummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/analytics/charts":{"post":{"tags":["Review Bot"],"summary":"Get Charts Api","description":"Unified endpoint for chart data - handles both single and multi-repo queries with fast path optimization.","operationId":"get_charts_api_api_v1_review_analytics_charts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"metric_type","in":"query","required":false,"schema":{"type":"string","default":"deployment-frequency","title":"Metric Type"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoChartDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/review/metrics":{"post":{"tags":["Review Bot"],"summary":"Get Unified Review Metrics Api","description":"Unified endpoint for review metrics - handles both single and multi-repo queries with fast path optimization.","operationId":"get_unified_review_metrics_api_api_v1_review_analytics_review_metrics_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoReviewMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/review/leaderboard":{"post":{"tags":["Review Bot"],"summary":"Get Unified Leaderboard Api","description":"Unified endpoint for leaderboard - handles both single and multi-repo queries with fast path optimization.","operationId":"get_unified_leaderboard_api_api_v1_review_analytics_review_leaderboard_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoLeaderboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/review/units-of-work":{"post":{"tags":["Review Bot"],"summary":"Get Unified Units Of Work Api","description":"Unified endpoint for units of work - handles both single and multi-repo queries with fast path optimization.","operationId":"get_unified_units_of_work_api_api_v1_review_analytics_review_units_of_work_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoUnitsOfWorkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/review/recent-comments":{"post":{"tags":["Review Bot"],"summary":"Get Multi Repo Recent Comments Api","description":"Get recent AI-generated code review comments across multiple repositories.","operationId":"get_multi_repo_recent_comments_api_api_v1_review_analytics_review_recent_comments_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepositoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoRecentCommentsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/review/comments-over-time":{"post":{"tags":["Review Bot"],"summary":"Get Unified Comments Over Time Api","description":"Unified endpoint for comments over time - handles both single and multi-repo queries with fast path optimization.","operationId":"get_unified_comments_over_time_api_api_v1_review_analytics_review_comments_over_time_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoCommentsOverTimeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/review/pr-history":{"post":{"tags":["Review Bot"],"summary":"Get Unified Pr History Api","description":"Unified endpoint for PR history - handles both single and multi-repo queries with optimized fast path.","operationId":"get_unified_pr_history_api_api_v1_review_analytics_review_pr_history_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoPRHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/review/developer-profile":{"post":{"tags":["Review Bot"],"summary":"Get Unified Developer Profile Api","description":"Unified endpoint for developer profile - handles both single and multi-repo queries with fast path optimization.","operationId":"get_unified_developer_profile_api_api_v1_review_analytics_review_developer_profile_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"developer","in":"query","required":true,"schema":{"type":"string","title":"Developer"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoDeveloperProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/review/developers":{"post":{"tags":["Review Bot"],"summary":"Get Unified Developers Api","description":"Unified endpoint for developers - handles both single and multi-repo queries with fast path optimization.","operationId":"get_unified_developers_api_api_v1_review_analytics_review_developers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRepoDevelopersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/analytics/ai/usage-metrics":{"post":{"tags":["Review Bot"],"summary":"Get Ai Usage Metrics","description":"Get AI usage overview metrics across repositories.","operationId":"get_ai_usage_metrics_api_v1_review_analytics_ai_usage_metrics_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIUsageMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/ai/effectiveness":{"post":{"tags":["Review Bot"],"summary":"Get Ai Effectiveness Data","description":"Get AI effectiveness data for scatter plot (AI usage vs code output).","operationId":"get_ai_effectiveness_data_api_v1_review_analytics_ai_effectiveness_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIEffectivenessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/ai/cursor-github-mappings":{"get":{"tags":["Review Bot"],"summary":"Get Cursor Github Mappings","description":"Get all cursor to github user mappings for the organization.","operationId":"get_cursor_github_mappings_api_v1_review_analytics_ai_cursor_github_mappings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Review Bot"],"summary":"Save Cursor Github Mapping","description":"Save a cursor to github user mapping.","operationId":"save_cursor_github_mapping_api_v1_review_analytics_ai_cursor_github_mappings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorGithubMapping"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/analytics/ai/usage-over-time":{"post":{"tags":["Review Bot"],"summary":"Get Ai Usage Over Time","description":"Get AI usage trends over time.","operationId":"get_ai_usage_over_time_api_v1_review_analytics_ai_usage_over_time_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIUsageOverTimeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/ai/code-generation":{"post":{"tags":["Review Bot"],"summary":"Get Ai Code Generation","description":"Get AI code generation metrics (additions/deletions by AI).","operationId":"get_ai_code_generation_api_v1_review_analytics_ai_code_generation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedPRHistoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AICodeGenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/ai/cursor/status":{"get":{"tags":["Review Bot"],"summary":"Get Cursor Configuration Status","description":"Check if Cursor is configured for this organization.","operationId":"get_cursor_configuration_status_api_v1_review_analytics_ai_cursor_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorConfigurationStatus"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/analytics/ai/cursor/health":{"get":{"tags":["Review Bot"],"summary":"Get Cursor Health","description":"Check Cursor API integration health and connectivity.","operationId":"get_cursor_health_api_v1_review_analytics_ai_cursor_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/analytics/ai/cursor/sync":{"post":{"tags":["Review Bot"],"summary":"Sync Cursor Data","description":"Sync Cursor analytics data for the organization.\n\nFetches recent data from Cursor API and stores it in our database\nfor analytics processing.","operationId":"sync_cursor_data_api_v1_review_analytics_ai_cursor_sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"override_rate_limit","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Override Rate Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/analytics/enhanced-summary":{"post":{"tags":["Review Bot"],"summary":"Get Enhanced Weekly Summary Api","description":"Get enhanced weekly summary with What Got Done categorization.","operationId":"get_enhanced_weekly_summary_api_api_v1_review_analytics_enhanced_summary_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedSummaryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/analytics/deployment/manual":{"post":{"tags":["Review Bot"],"summary":"Manual Deployment","description":"Manual deployment endpoint for testing DORA metrics.","operationId":"manual_deployment_api_v1_review_analytics_deployment_manual_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/review/analytics/incident/manual":{"post":{"tags":["Review Bot"],"summary":"Manual Incident","description":"Manual incident reporting for testing.","operationId":"manual_incident_api_v1_review_analytics_incident_manual_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/review/analytics/health":{"get":{"tags":["Review Bot"],"summary":"Health Check","description":"Health check endpoint for analytics services.","operationId":"health_check_api_v1_review_analytics_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/review/analytics/debug/{owner}/{repo}":{"get":{"tags":["Review Bot"],"summary":"Debug Data","description":"Debug endpoint to check what data exists in the database.","operationId":"debug_data_api_v1_review_analytics_debug__owner___repo__get","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","title":"Owner"}},{"name":"repo","in":"path","required":true,"schema":{"type":"string","title":"Repo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/billing/check":{"get":{"tags":["Review Bot"],"summary":"Check Billing","operationId":"check_billing_api_v1_review_billing_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/billing/attach":{"post":{"tags":["Review Bot"],"summary":"Attach Billing","operationId":"attach_billing_api_v1_review_billing_attach_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__rebel_routes__billing_xpt__AttachRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__rebel_routes__billing_xpt__AttachResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/billing/seat-check":{"get":{"tags":["Review Bot"],"summary":"Check Seat Assignments","description":"Check seat assignments and auto-assign if seats match GitHub users exactly.","operationId":"check_seat_assignments_api_v1_review_billing_seat_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatCheckResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/billing/update-seats":{"post":{"tags":["Review Bot"],"summary":"Update Seats","description":"Update seat assignments - both assign new seats and unassign existing ones.","operationId":"update_seats_api_v1_review_billing_update_seats_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSeatsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSeatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/billing/assign-seats":{"post":{"tags":["Review Bot"],"summary":"Assign Seats","description":"Assign seats to specific GitHub users.","operationId":"assign_seats_api_v1_review_billing_assign_seats_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignSeatsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignSeatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/billing/backfill/status/{job_id}":{"get":{"tags":["Review Bot"],"summary":"Get Backfill Job Status","description":"Get status of a specific backfill job by database ID.","operationId":"get_backfill_job_status_api_v1_review_billing_backfill_status__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackfillStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/billing/backfill/task/{task_id}":{"get":{"tags":["Review Bot"],"summary":"Get Backfill Task Status","description":"Get status of a specific backfill task by database ID.","operationId":"get_backfill_task_status_api_v1_review_billing_backfill_task__task_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackfillTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/billing/backfill/summary":{"get":{"tags":["Review Bot"],"summary":"Get Backfill Summary","description":"Get overall backfill status summary for the organization.","operationId":"get_backfill_summary_api_v1_review_billing_backfill_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackfillSummary"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/settings/default-role":{"get":{"tags":["Review Bot Settings"],"summary":"Get Default Role","description":"Get the default role assigned to new users in this organization.","operationId":"get_default_role_api_v1_review_settings_default_role_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DefaultRoleResponse"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Review Bot Settings"],"summary":"Update Default Role","description":"Set the default role assigned to new users. Owner/Admin only.","operationId":"update_default_role_api_v1_review_settings_default_role_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDefaultRoleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DefaultRoleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/settings":{"get":{"tags":["Review Bot Settings"],"summary":"Get Org Settings","description":"Get organization settings for Rebel Bot.\n\nUses the propel_org_id from the authenticated user's context.\nNo URL parameters needed since we're using org-based settings.","operationId":"get_org_settings_api_v1_review_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RebelOrgSettings"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Review Bot Settings"],"summary":"Update Org Settings","description":"Update organization settings for Rebel Bot.\n\nUses the propel_org_id from the authenticated user's context.\nNo URL parameters needed since we're using org-based settings.","operationId":"update_org_settings_api_v1_review_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRebelOrgSettings"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RebelOrgSettings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/settings/metadata":{"get":{"tags":["Review Bot Settings"],"summary":"Get Propel Metadata","description":"Get Propel organization metadata settings.\n\nRetrieves settings from PropelAuth organization metadata, not from rebel_config.\nUses the propel_org_id from the authenticated user's context.","operationId":"get_propel_metadata_api_v1_review_settings_metadata_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropelMetadataResponse"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Review Bot Settings"],"summary":"Update Propel Metadata","description":"Update Propel organization metadata settings.\n\nUpdates settings in PropelAuth organization metadata, not in rebel_config.\nUses the propel_org_id from the authenticated user's context.","operationId":"update_propel_metadata_api_v1_review_settings_metadata_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePropelMetadataRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropelMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/settings/expo/project-ids":{"post":{"tags":["Review Bot Settings"],"summary":"Get Expo Project Ids","description":"Extract Expo project IDs from app.json files in a GitHub repository.\n\nUses the organization's GitHub token to fetch app.json from each build path\nand extracts the expo.extra.eas.projectId field.","operationId":"get_expo_project_ids_api_v1_review_settings_expo_project_ids_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpoProjectFromBuildPathRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpoProjectFromBuildPathResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/settings/expo/builds":{"post":{"tags":["Review Bot Settings"],"summary":"List Expo Builds Endpoint","description":"List EAS builds for an Expo project.\n\nRequires a valid Expo token to be configured in the organization's metadata.","operationId":"list_expo_builds_endpoint_api_v1_review_settings_expo_builds_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExpoBuildsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpoBuildsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/settings/expo/manual-trigger":{"post":{"tags":["Review Bot Settings"],"summary":"Manual Trigger Expo Build","description":"Manually upsert an Expo build to a Revyl build variable.\n\nThis endpoint uses the existing build version from-url functionality\nto download and import an Expo build artifact.","operationId":"manual_trigger_expo_build_api_v1_review_settings_expo_manual_trigger_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualTriggerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualTriggerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/settings/expo-projects":{"get":{"tags":["Review Bot Settings"],"summary":"List Expo Projects","description":"List all Expo project configurations for the organization.\n\nReturns configurations from the revyl_expo_config table.","operationId":"list_expo_projects_api_v1_review_settings_expo_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpoProjectListResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Review Bot Settings"],"summary":"Create Expo Project","description":"Create a new Expo project configuration.\n\nStores the configuration in the revyl_expo_config table.","operationId":"create_expo_project_api_v1_review_settings_expo_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExpoProjectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpoProjectDbResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/settings/expo-projects/{config_id}":{"put":{"tags":["Review Bot Settings"],"summary":"Update Expo Project","description":"Update an existing Expo project configuration.\n\nUpdates the configuration in the revyl_expo_config table.\nUses the row UUID (config_id) instead of project_id to avoid path issues\nwith project IDs containing slashes.","operationId":"update_expo_project_api_v1_review_settings_expo_projects__config_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExpoProjectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpoProjectDbResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Review Bot Settings"],"summary":"Delete Expo Project","description":"Delete an Expo project configuration.\n\nRemoves the configuration from the revyl_expo_config table.\nUses the row UUID (config_id) instead of project_id to avoid path issues\nwith project IDs containing slashes.","operationId":"delete_expo_project_api_v1_review_settings_expo_projects__config_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/revyl-ci/repos/{owner}/{repo}":{"get":{"tags":["Revyl CI/CD Integration"],"summary":"Get Repo Revyl Config","description":"Get Revyl CI/CD configuration for a specific repository.","operationId":"get_repo_revyl_config_api_v1_review_revyl_ci_repos__owner___repo__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","title":"Owner"}},{"name":"repo","in":"path","required":true,"schema":{"type":"string","title":"Repo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevylRepoConfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Revyl CI/CD Integration"],"summary":"Save Repo Revyl Config","description":"Create or update Revyl CI/CD configuration for a repository.","operationId":"save_repo_revyl_config_api_v1_review_revyl_ci_repos__owner___repo__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","title":"Owner"}},{"name":"repo","in":"path","required":true,"schema":{"type":"string","title":"Repo"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRevylRepoConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevylRepoConfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Revyl CI/CD Integration"],"summary":"Delete Repo Revyl Config","description":"Delete Revyl CI/CD configuration for a repository.","operationId":"delete_repo_revyl_config_api_v1_review_revyl_ci_repos__owner___repo__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","title":"Owner"}},{"name":"repo","in":"path","required":true,"schema":{"type":"string","title":"Repo"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/revyl-ci/repos":{"get":{"tags":["Revyl CI/CD Integration"],"summary":"List Org Revyl Configs","description":"List all Revyl CI/CD configurations for the authenticated organization.","operationId":"list_org_revyl_configs_api_v1_review_revyl_ci_repos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevylRepoConfigListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/revyl-ci/resolve-build-vars":{"get":{"tags":["Revyl CI/CD Integration"],"summary":"Resolve Apps From Workflows","description":"Resolve unique app_ids from workflow tests.\n\nGiven a list of workflow IDs, fetches all tests in those workflows,\nextracts unique app_ids, and returns their metadata.\n\nUsed by the CI/CD integration UI to auto-populate build paths\nwhen workflows are selected.","operationId":"resolve_apps_from_workflows_api_v1_review_revyl_ci_resolve_build_vars_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_ids","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"},"description":"List of workflow IDs","title":"Workflow Ids"},"description":"List of workflow IDs"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveBuildVarsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/webhook":{"post":{"tags":["Review Bot Webhook"],"summary":"Github Webhook","description":"Main webhook handler that routes events to appropriate handlers.","operationId":"github_webhook_api_v1_review_webhook_post","parameters":[{"name":"x-github-event","in":"header","required":false,"schema":{"type":"string","title":"X-Github-Event"}},{"name":"x-hub-signature-256","in":"header","required":false,"schema":{"type":"string","title":"X-Hub-Signature-256"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/backfill/jobs/{owner}":{"get":{"tags":["Review Bot Backfill"],"summary":"List Backfill Jobs","description":"Get all backfill jobs for an owner - used by backend for status synchronization.","operationId":"list_backfill_jobs_api_v1_review_backfill_jobs__owner__get","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","title":"Owner"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Backfill Jobs Api V1 Review Backfill Jobs Owner Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/backfill/":{"post":{"tags":["Review Bot Backfill"],"summary":"Trigger Backfill","description":"Trigger historical data backfill for specified users across all connected repos.\n\nThis endpoint:\n1. Gets all connected repos for the owner\n2. Checks billing seats for each provided GitHub login\n3. Filters out users who don't have billing seats or have already been backfilled\n4. Starts backfill process for valid users across all repos","operationId":"trigger_backfill_api_v1_review_backfill__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackfillRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackfillResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/backfill/status/{job_id}":{"get":{"tags":["Review Bot Backfill"],"summary":"Get Backfill Status","description":"Get the status of a specific backfill job.","operationId":"get_backfill_status_api_v1_review_backfill_status__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/backfill/active":{"get":{"tags":["Review Bot Backfill"],"summary":"Get Active Backfills","description":"Get all active backfill jobs, optionally filtered by owner/repo.","operationId":"get_active_backfills_api_v1_review_backfill_active_get","parameters":[{"name":"owner","in":"query","required":false,"schema":{"type":"string","title":"Owner"}},{"name":"repo","in":"query","required":false,"schema":{"type":"string","title":"Repo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/auth/callback":{"get":{"tags":["Review Bot Auth"],"summary":"Callback","description":"Handle GitHub OAuth callback and exchange code for access token.","operationId":"callback_api_v1_review_auth_callback_get","parameters":[{"name":"installation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installation Id"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/build-test/pr/comment/update":{"post":{"tags":["Rebel Build and Test"],"summary":"Update Pr Comment Endpoint","description":"Update an existing PR comment.\n\nCalled by python_cli workflows to update PR comments incrementally.","operationId":"update_pr_comment_endpoint_api_v1_review_build_test_pr_comment_update_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePRCommentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/build-test/pr/comment/final":{"post":{"tags":["Rebel Build and Test"],"summary":"Post Final Pr Comment Endpoint","description":"Post final PR comment with complete results.\n\nCalled by python_cli workflows to post final results.","operationId":"post_final_pr_comment_endpoint_api_v1_review_build_test_pr_comment_final_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostFinalPRCommentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/slack/oauth-url":{"get":{"tags":["Slack Integration"],"summary":"Get Oauth Url","description":"Generate a Slack OAuth authorization URL.\n\nThe frontend should redirect the user to this URL to initiate the OAuth flow.\nAfter authorization, Slack will redirect back to the redirect_uri with a code.","operationId":"get_oauth_url_api_v1_review_slack_oauth_url_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","description":"Frontend callback URL","title":"Redirect Uri"},"description":"Frontend callback URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackOAuthUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/slack/oauth-callback":{"get":{"tags":["Slack Integration"],"summary":"Handle Oauth Callback","description":"Handle the OAuth callback from Slack.\n\nThis endpoint verifies the state token, exchanges the code for an access token,\nand stores the Slack integration.","operationId":"handle_oauth_callback_api_v1_review_slack_oauth_callback_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","description":"OAuth authorization code from Slack","title":"Code"},"description":"OAuth authorization code from Slack"},{"name":"state","in":"query","required":true,"schema":{"type":"string","description":"State token for verification","title":"State"},"description":"State token for verification"},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","description":"Frontend callback URL","title":"Redirect Uri"},"description":"Frontend callback URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/slack/integration":{"get":{"tags":["Slack Integration"],"summary":"Get Integration","description":"Get the current Slack integration status for the organization.","operationId":"get_integration_api_v1_review_slack_integration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackIntegrationResponse"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["Slack Integration"],"summary":"Disconnect Integration","description":"Disconnect the Slack integration for the organization.\n\nThis will delete the integration and all associated notification rules.","operationId":"disconnect_integration_api_v1_review_slack_integration_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisconnectSlackResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/slack/channels":{"get":{"tags":["Slack Integration"],"summary":"Get Channels","description":"Get list of Slack channels the bot can post to.","operationId":"get_channels_api_v1_review_slack_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackChannelsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/slack/rules":{"get":{"tags":["Slack Integration"],"summary":"List Rules","description":"Get all notification rules for the organization.","operationId":"list_rules_api_v1_review_slack_rules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackNotificationRulesResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Slack Integration"],"summary":"Create Rule","description":"Create a new notification rule.","operationId":"create_rule_api_v1_review_slack_rules_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSlackNotificationRuleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackNotificationRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/review/slack/rules/{rule_id}":{"get":{"tags":["Slack Integration"],"summary":"Get Rule","description":"Get a specific notification rule.","operationId":"get_rule_api_v1_review_slack_rules__rule_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackNotificationRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Slack Integration"],"summary":"Update Rule","description":"Update an existing notification rule.","operationId":"update_rule_api_v1_review_slack_rules__rule_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSlackNotificationRuleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackNotificationRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Slack Integration"],"summary":"Delete Rule","description":"Delete a notification rule.","operationId":"delete_rule_api_v1_review_slack_rules__rule_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteSlackNotificationRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/slack/rules/{rule_id}/test":{"post":{"tags":["Slack Integration"],"summary":"Test Rule","description":"Send a test notification to the rule's channel.","operationId":"test_rule_api_v1_review_slack_rules__rule_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestNotificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/slack/rules/{rule_id}/workflows/{workflow_id}":{"post":{"tags":["Slack Integration"],"summary":"Add Workflow To Rule","description":"Add a workflow to a notification rule.","operationId":"add_workflow_to_rule_api_v1_review_slack_rules__rule_id__workflows__workflow_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}},{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddWorkflowToRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Slack Integration"],"summary":"Remove Workflow From Rule","description":"Remove a workflow from a notification rule.","operationId":"remove_workflow_from_rule_api_v1_review_slack_rules__rule_id__workflows__workflow_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}},{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveWorkflowFromRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/slack/workflows/{workflow_id}/rules":{"get":{"tags":["Slack Integration"],"summary":"Get Workflow Rules","description":"Get all notification rules associated with a specific workflow.\n\nReturns rules where:\n- The workflow is explicitly in workflow_ids, OR\n- The rule applies_to_all is true","operationId":"get_workflow_rules_api_v1_review_slack_workflows__workflow_id__rules_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRulesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/review/slack/internal/send-notification":{"post":{"tags":["Slack Integration"],"summary":"Internal Send Notification","description":"Internal endpoint for workflow runtime to trigger Slack notifications.\n\nThis endpoint is called by the workflow execution system after a workflow\ncompletes, fails, times out, or is cancelled.","operationId":"internal_send_notification_api_v1_review_slack_internal_send_notification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalSendNotificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalSendNotificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/apps/":{"post":{"tags":["Apps","public"],"summary":"Create App","description":"Create a new app","operationId":"create_app_api_v1_apps__post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Apps","public"],"summary":"List Apps","description":"List apps for the organization with pagination","operationId":"list_apps_api_v1_apps__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by platform","title":"Platform"},"description":"Filter by platform"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Number of items per page (max 500)","default":50,"title":"Page Size"},"description":"Number of items per page (max 500)"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by app name","title":"Search"},"description":"Search by app name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAppsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_id}":{"get":{"tags":["Apps","public"],"summary":"Get App","description":"Get a specific app","operationId":"get_app_api_v1_apps__app_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Apps","public"],"summary":"Update App","description":"Update an app","operationId":"update_app_api_v1_apps__app_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Apps","public"],"summary":"Delete App","description":"Delete an app and all its builds (soft-delete)","operationId":"delete_app_api_v1_apps__app_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAppResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_id}/builds/upload-url":{"post":{"tags":["Apps","public"],"summary":"Create Build Upload Url","description":"Create a new build and get upload URL (mobile platforms only)","operationId":"create_build_upload_url_api_v1_apps__app_id__builds_upload_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"version","in":"query","required":true,"schema":{"type":"string","description":"Version string (must be unique)","title":"Version"},"description":"Version string (must be unique)"},{"name":"file_name","in":"query","required":true,"schema":{"type":"string","description":"Name of the file to upload","title":"File Name"},"description":"Name of the file to upload"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_id}/builds/stream-upload":{"post":{"tags":["Apps","public"],"summary":"Stream Upload Build","description":"Stream upload a build artifact directly to S3.\n\nThis endpoint handles the entire upload flow in one request:\n1. Validates the app and version\n2. Streams the file directly to S3 (memory-efficient for large files)\n3. Extracts package ID from the artifact (Android package name or iOS bundle ID)\n4. Creates the build record with the artifact URL and package info\n\nUse this instead of upload-url + direct S3 upload when you want\na simpler single-request upload flow.","operationId":"stream_upload_build_api_v1_apps__app_id__builds_stream_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"version","in":"query","required":true,"schema":{"type":"string","description":"Version string (must be unique)","title":"Version"},"description":"Version string (must be unique)"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_stream_upload_build_api_v1_apps__app_id__builds_stream_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_id}/builds/from-url":{"post":{"tags":["Apps","public"],"summary":"Create Build From Url","description":"Create a build by fetching an artifact from a protected URL (e.g., EAS).\n\nBehavior:\n- Validates org ownership and mobile platform (service accounts bypass org check)\n- Idempotent on (app_id, version): returns existing row if present\n- Streams download, computes sha256, uploads to S3 under org prefix\n- For tar/tar.gz files: extracts .app directory before uploading\n- Persists builds row with artifact_url and merged metadata","operationId":"create_build_from_url_api_v1_apps__app_id__builds_from_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildFromUrlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/builds/{version_id}/complete-upload":{"post":{"tags":["Apps","public"],"summary":"Complete Build Upload","description":"Mark a build upload as complete and update metadata.\n\nNote: artifact_url is now set in upload-url, so this endpoint\nonly updates metadata and package_name. It's optional but useful\nfor adding additional info after upload completes.","operationId":"complete_build_upload_api_v1_apps_builds__version_id__complete_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildUploadCompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/builds/{version_id}/extract-package-id":{"post":{"tags":["Apps","public"],"summary":"Extract Build Package Id","description":"Extract package identifier from an uploaded build artifact for a specific version.\nThis can be called immediately after the browser finishes uploading the file,\nbefore the client calls complete-upload. We locate the artifact in S3 by prefix.","operationId":"extract_build_package_id_api_v1_apps_builds__version_id__extract_package_id_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractBuildPackageIdResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_id}/builds":{"get":{"tags":["Apps","public"],"summary":"List Builds","description":"List builds for an app with pagination","operationId":"list_builds_api_v1_apps__app_id__builds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"include_download_urls","in":"query","required":false,"schema":{"type":"boolean","description":"Include presigned download URLs","default":false,"title":"Include Download Urls"},"description":"Include presigned download URLs"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of items per page (max 100)","default":20,"title":"Page Size"},"description":"Number of items per page (max 100)"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by version name or package name","title":"Search"},"description":"Search by version name or package name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBuildsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_id}/tests":{"get":{"tags":["Apps","public"],"summary":"Get App Tests","description":"Get tests that use a specific app","operationId":"get_app_tests_api_v1_apps__app_id__tests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_id}/workspace":{"get":{"tags":["Apps","public"],"summary":"Get App Workspace","description":"Get app-level release workspace data.","operationId":"get_app_workspace_api_v1_apps__app_id__workspace_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"trend_days","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":7,"description":"Trend window in days","default":14,"title":"Trend Days"},"description":"Trend window in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppWorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_id}/coverage":{"get":{"tags":["Apps","public"],"summary":"Get App Coverage","description":"Get app-level coverage data for attached tests.","operationId":"get_app_coverage_api_v1_apps__app_id__coverage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppCoverageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/builds/{version_id}":{"get":{"tags":["Apps","public"],"summary":"Get Build","description":"Get a specific build","operationId":"get_build_api_v1_apps_builds__version_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}},{"name":"include_download_url","in":"query","required":false,"schema":{"type":"boolean","description":"Include presigned download URL","default":false,"title":"Include Download Url"},"description":"Include presigned download URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Apps","public"],"summary":"Update Build","description":"Update a build's metadata and/or package_name and/or version","operationId":"update_build_api_v1_apps_builds__version_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Apps","public"],"summary":"Delete Build","description":"Delete a specific build (soft-delete)","operationId":"delete_build_api_v1_apps_builds__version_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/builds/{version_id}/workspace":{"get":{"tags":["Apps","public"],"summary":"Get Build Workspace","description":"Get build-level readiness, coverage, and comparison data.","operationId":"get_build_workspace_api_v1_apps_builds__version_id__workspace_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildWorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/builds/{version_id}/runs":{"get":{"tags":["Apps","public"],"summary":"Get Build Runs","description":"Get exact-attributed run history for a build.","operationId":"get_build_runs_api_v1_apps_builds__version_id__runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of items per page (max 100)","default":20,"title":"Page Size"},"description":"Number of items per page (max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBuildRunsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/resolve":{"post":{"tags":["Apps"],"summary":"Resolve Build","description":"Resolve a build based on the resolution precedence:\n1. pinned_version if provided\n2. current_version if set\n3. latest version","operationId":"resolve_build_api_v1_apps_resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_download_url","in":"query","required":false,"schema":{"type":"boolean","description":"Include presigned download URL","default":false,"title":"Include Download Url"},"description":"Include presigned download URL"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildResolutionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildResolutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/apps/{app_id}/test_matrix":{"get":{"tags":["Apps","Apps","public"],"summary":"Get Test Matrix","description":"Return a test × build matrix with pagination.","operationId":"get_test_matrix_api_v1_apps__app_id__test_matrix_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":2,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestMatrixResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/activity_summary":{"get":{"tags":["Admin Dashboard"],"summary":"Get Activity Summary","description":"Return cached activity information for active organisations.","operationId":"get_activity_summary_api_v1_admin_dashboard_activity_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict results to the specified organisations","title":"Org Ids"},"description":"Restrict results to the specified organisations"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOrgActivityList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/summary":{"get":{"tags":["Admin Dashboard"],"summary":"Get Dashboard Summary","description":"Return aggregated workflow/test metrics for the dashboard summary banner.","operationId":"get_dashboard_summary_api_v1_admin_dashboard_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"description":"Number of hours to summarise","default":24,"title":"Hours"},"description":"Number of hours to summarise"},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict results to a single organisation","title":"Org Id"},"description":"Restrict results to a single organisation"},{"name":"org_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict results to any of these organisations","title":"Org Ids"},"description":"Restrict results to any of these organisations"},{"name":"all_orgs","in":"query","required":false,"schema":{"type":"boolean","description":"Include all organisations (admin only)","default":false,"title":"All Orgs"},"description":"Include all organisations (admin only)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminDashboardSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/debug/test_statuses":{"get":{"tags":["Admin Dashboard"],"summary":"Debug Test Statuses","description":"Debug endpoint to see actual test status values in the database.","operationId":"debug_test_statuses_api_v1_admin_dashboard_debug_test_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","description":"Hours to look back","default":24,"title":"Hours"},"description":"Hours to look back"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/test_status_debug":{"get":{"tags":["Admin Dashboard"],"summary":"Test Status Debug","description":"Debug endpoint to understand test status distribution.","operationId":"test_status_debug_api_v1_admin_dashboard_test_status_debug_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":6,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Status Debug Api V1 Admin Dashboard Test Status Debug Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/debug/redis":{"get":{"tags":["Admin Dashboard"],"summary":"Debug Redis Connections","description":"Debug endpoint to inspect Redis connection pool and identify connection leaks.","operationId":"debug_redis_connections_api_v1_admin_dashboard_debug_redis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/dashboard/kpi":{"get":{"tags":["Admin Dashboard"],"summary":"Get Kpi Metrics","description":"Return comprehensive KPI metrics for the admin dashboard.","operationId":"get_kpi_metrics_api_v1_admin_dashboard_kpi_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"description":"Number of hours to analyze","default":24,"title":"Hours"},"description":"Number of hours to analyze"},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict to a single organisation","title":"Org Id"},"description":"Restrict to a single organisation"},{"name":"org_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict to specific organisations","title":"Org Ids"},"description":"Restrict to specific organisations"},{"name":"all_orgs","in":"query","required":false,"schema":{"type":"boolean","description":"Include all organisations (admin only)","default":false,"title":"All Orgs"},"description":"Include all organisations (admin only)"},{"name":"compare_previous","in":"query","required":false,"schema":{"type":"boolean","description":"Calculate trends vs previous period","default":true,"title":"Compare Previous"},"description":"Calculate trends vs previous period"},{"name":"use_cache","in":"query","required":false,"schema":{"type":"boolean","description":"Use cached KPI data when available (set false to force refresh)","default":true,"title":"Use Cache"},"description":"Use cached KPI data when available (set false to force refresh)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminKPIMetrics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/active_workflows":{"get":{"tags":["Admin Dashboard"],"summary":"Get Active Workflows","description":"Return running or queued workflow tasks for an organisation.","operationId":"get_active_workflows_api_v1_admin_dashboard_active_workflows_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict results to a single organisation","title":"Org Id"},"description":"Restrict results to a single organisation"},{"name":"org_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict results to any of these organisations","title":"Org Ids"},"description":"Restrict results to any of these organisations"},{"name":"all_orgs","in":"query","required":false,"schema":{"type":"boolean","description":"Return workflows from every organisation (admin only)","default":false,"title":"All Orgs"},"description":"Return workflows from every organisation (admin only)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":10,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Override default active statuses","title":"Status"},"description":"Override default active statuses"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by workflow owner","title":"User Id"},"description":"Filter by workflow owner"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by workflow id","title":"Workflow Id"},"description":"Filter by workflow id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminWorkflowTaskList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/workflow_runs":{"get":{"tags":["Admin Dashboard"],"summary":"Get Workflow History","description":"Return historical workflow runs for an organisation.","operationId":"get_workflow_history_api_v1_admin_dashboard_workflow_runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict results to a single organisation","title":"Org Id"},"description":"Restrict results to a single organisation"},{"name":"org_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict results to any of these organisations","title":"Org Ids"},"description":"Restrict results to any of these organisations"},{"name":"all_orgs","in":"query","required":false,"schema":{"type":"boolean","description":"Return workflows from every organisation (admin only)","default":false,"title":"All Orgs"},"description":"Return workflows from every organisation (admin only)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":10,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by workflow status (defaults to completed states)","title":"Status"},"description":"Filter by workflow status (defaults to completed states)"},{"name":"from_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO timestamp inclusive lower bound; defaults to last 24 hours","title":"From Time"},"description":"ISO timestamp inclusive lower bound; defaults to last 24 hours"},{"name":"to_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO timestamp inclusive upper bound","title":"To Time"},"description":"ISO timestamp inclusive upper bound"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor based on started_at (exclusive, RFC3339)","title":"Cursor"},"description":"Pagination cursor based on started_at (exclusive, RFC3339)"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by workflow owner","title":"User Id"},"description":"Filter by workflow owner"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by workflow id","title":"Workflow Id"},"description":"Filter by workflow id"},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by success flag","title":"Success"},"description":"Filter by success flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminWorkflowTaskList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/test_executions":{"get":{"tags":["Admin Dashboard"],"summary":"Get Test Executions","description":"Return individual test executions for an organisation.","operationId":"get_test_executions_api_v1_admin_dashboard_test_executions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict results to a single organisation","title":"Org Id"},"description":"Restrict results to a single organisation"},{"name":"org_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict results to any of these organisations","title":"Org Ids"},"description":"Restrict results to any of these organisations"},{"name":"all_orgs","in":"query","required":false,"schema":{"type":"boolean","description":"Return test executions from every organisation (admin only)","default":false,"title":"All Orgs"},"description":"Return test executions from every organisation (admin only)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":10,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by execution status","title":"Status"},"description":"Filter by execution status"},{"name":"from_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO timestamp inclusive lower bound; defaults to last 24 hours","title":"From Time"},"description":"ISO timestamp inclusive lower bound; defaults to last 24 hours"},{"name":"to_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO timestamp inclusive upper bound","title":"To Time"},"description":"ISO timestamp inclusive upper bound"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor based on started_at (exclusive)","title":"Cursor"},"description":"Pagination cursor based on started_at (exclusive)"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by user","title":"User Id"},"description":"Filter by user"},{"name":"test_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by test id","title":"Test Id"},"description":"Filter by test id"},{"name":"workflow_task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by parent workflow task id","title":"Workflow Task Id"},"description":"Filter by parent workflow task id"},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by success status","title":"Success"},"description":"Filter by success status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTestExecutionList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/orgs":{"get":{"tags":["Admin Dashboard"],"summary":"List Admin Orgs","description":"List all organisations from PropelAuth for admin selection UI.\n\nFetches all pages internally to return the complete org list,\nworking around PropelAuth's 100 item page_size limit.","operationId":"list_admin_orgs_api_v1_admin_dashboard_orgs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter organisations by name substring","title":"Search"},"description":"Filter organisations by name substring"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page (max 100, PropelAuth limit)","default":100,"title":"Page Size"},"description":"Results per page (max 100, PropelAuth limit)"},{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Page number (0-indexed)","default":0,"title":"Page Number"},"description":"Page number (0-indexed)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOrgList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/stream/workflows":{"get":{"tags":["Admin Dashboard"],"summary":"Stream Admin Workflows","description":"Stream live workflow updates for the admin dashboard.","operationId":"stream_admin_workflows_api_v1_admin_dashboard_stream_workflows_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict results to a single organisation","title":"Org Id"},"description":"Restrict results to a single organisation"},{"name":"org_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict results to any of these organisations","title":"Org Ids"},"description":"Restrict results to any of these organisations"},{"name":"all_orgs","in":"query","required":false,"schema":{"type":"boolean","description":"Return workflows from every organisation (admin only)","default":false,"title":"All Orgs"},"description":"Return workflows from every organisation (admin only)"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Override default active statuses","title":"Status"},"description":"Override default active statuses"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by workflow owner","title":"User Id"},"description":"Filter by workflow owner"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by workflow id","title":"Workflow Id"},"description":"Filter by workflow id"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":200,"title":"Limit"}},{"name":"poll_interval","in":"query","required":false,"schema":{"type":"number","maximum":30.0,"minimum":5.0,"description":"Seconds between polling snapshots","default":10.0,"title":"Poll Interval"},"description":"Seconds between polling snapshots"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/stream/tests":{"get":{"tags":["Admin Dashboard"],"summary":"Stream Admin Tests","description":"Stream live test execution updates for the admin dashboard.","operationId":"stream_admin_tests_api_v1_admin_dashboard_stream_tests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict results to a single organisation","title":"Org Id"},"description":"Restrict results to a single organisation"},{"name":"org_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict results to any of these organisations","title":"Org Ids"},"description":"Restrict results to any of these organisations"},{"name":"all_orgs","in":"query","required":false,"schema":{"type":"boolean","description":"Return test executions from every organisation (admin only)","default":false,"title":"All Orgs"},"description":"Return test executions from every organisation (admin only)"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by execution status","title":"Status"},"description":"Filter by execution status"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by user","title":"User Id"},"description":"Filter by user"},{"name":"test_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by test id","title":"Test Id"},"description":"Filter by test id"},{"name":"workflow_task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by parent workflow task id","title":"Workflow Task Id"},"description":"Filter by parent workflow task id"},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by success state","title":"Success"},"description":"Filter by success state"},{"name":"from_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO timestamp inclusive lower bound","title":"From Time"},"description":"ISO timestamp inclusive lower bound"},{"name":"to_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO timestamp inclusive upper bound","title":"To Time"},"description":"ISO timestamp inclusive upper bound"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":200,"title":"Limit"}},{"name":"poll_interval","in":"query","required":false,"schema":{"type":"number","maximum":30.0,"minimum":5.0,"description":"Seconds between polling snapshots","default":10.0,"title":"Poll Interval"},"description":"Seconds between polling snapshots"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/stream/live":{"get":{"tags":["Admin Dashboard"],"summary":"Stream Global Live Events","description":"Live global event stream across all orgs via Redis Streams.\n\nReads from the ``monitor:global:all`` stream and forwards every event\nas an SSE message. Used by the admin live-vitals dashboard.","operationId":"stream_global_live_events_api_v1_admin_dashboard_stream_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/management/workflow-task/{task_id}":{"delete":{"tags":["Admin Dashboard"],"summary":"Delete Workflow Task","description":"Delete a workflow task and all associated test executions.","operationId":"delete_workflow_task_api_v1_admin_management_workflow_task__task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Reason for deletion","title":"Reason"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/management/test-execution-task/{task_id}":{"delete":{"tags":["Admin Dashboard"],"summary":"Delete Test Execution Task","description":"Delete a single test execution task.","operationId":"delete_test_execution_task_api_v1_admin_management_test_execution_task__task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Reason for deletion","title":"Reason"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/management/bulk-delete/workflow-tasks":{"post":{"tags":["Admin Dashboard"],"summary":"Bulk Delete Workflow Tasks","description":"Delete multiple workflow tasks and their associated test executions.","operationId":"bulk_delete_workflow_tasks_api_v1_admin_management_bulk_delete_workflow_tasks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteTasksRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/management/bulk-delete/test-execution-tasks":{"post":{"tags":["Admin Dashboard"],"summary":"Bulk Delete Test Execution Tasks","description":"Delete multiple test execution tasks.","operationId":"bulk_delete_test_execution_tasks_api_v1_admin_management_bulk_delete_test_execution_tasks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteTasksRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/management/workflow-task/{task_id}/cancel":{"patch":{"tags":["Admin Dashboard"],"summary":"Cancel Workflow Task","description":"Cancel a running workflow task.","operationId":"cancel_workflow_task_api_v1_admin_management_workflow_task__task_id__cancel_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Reason for cancellation","title":"Reason"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Workflow Task Api V1 Admin Management Workflow Task Task Id Cancel Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/copy-to-benchmarks":{"post":{"tags":["Admin Dashboard"],"summary":"Copy Test To Benchmarks","description":"Copy a test and all its associated data to a target organization.\n\nThis is a privileged admin operation that copies:\n- Test configuration and tasks\n- Build variables and versions (if applicable)\n- Referenced code execution scripts\n- Environment variables (for mobile tests)\n- Custom variables\n\nSupports bidirectional cross-environment copying:\n- source_from_other_env: Read source test from the other environment's database\n (staging if on prod, production if on staging)\n- target_other_env: Write target test to the other environment's database\n (staging if on prod, production if on staging)\n- target_org_id: Copy to any organization (defaults to benchmarks org)\n\nArgs:\n request: Contains the test_id to copy, optional new_name,\n source_from_other_env, target_other_env, and target_org_id.\n auth: Admin authentication info (injected by dependency).\n\nReturns:\n CopyTestToBenchmarksResponse with details of what was copied.\n\nRaises:\n HTTPException: If the test is not found or copy fails.\n\nNote:\n Requires admin dashboard access permission.","operationId":"copy_test_to_benchmarks_api_v1_admin_dashboard_copy_to_benchmarks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopyTestToBenchmarksRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopyTestToBenchmarksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/dashboard/tests-by-org":{"get":{"tags":["Admin Dashboard"],"summary":"Get Tests By Org","description":"Get all test definitions for a specific organization.\n\nThis endpoint is for admin dashboard use to view all tests\nbelonging to a specific organization.\n\nArgs:\n org_id: Organization UUID to fetch tests for.\n include_deleted: Whether to include soft-deleted tests.\n use_other_env: Whether to query the other environment's database.\n limit: Maximum number of tests to return.\n offset: Pagination offset.\n auth: Admin authentication info.\n\nReturns:\n AdminTestListResponse with list of tests and metadata.\n\nRaises:\n HTTPException: On database or validation errors.","operationId":"get_tests_by_org_api_v1_admin_dashboard_tests_by_org_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":true,"schema":{"type":"string","description":"Organization ID to fetch tests for","title":"Org Id"},"description":"Organization ID to fetch tests for"},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Include soft-deleted tests","default":false,"title":"Include Deleted"},"description":"Include soft-deleted tests"},{"name":"use_other_env","in":"query","required":false,"schema":{"type":"boolean","description":"Query the other environment's database (staging if on prod, production if on staging)","default":false,"title":"Use Other Env"},"description":"Query the other environment's database (staging if on prod, production if on staging)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum tests to return","default":100,"title":"Limit"},"description":"Maximum tests to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset for pagination","default":0,"title":"Offset"},"description":"Offset for pagination"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/orgs-with-custom-tests":{"get":{"tags":["Admin Dashboard"],"summary":"Get Orgs With Custom Tests","description":"Get org IDs that have tests beyond the two default demo tests.\n\nReturns a list of org_id strings for organizations that have at least one\nnon-demo test (i.e., tests whose name is not one of the two onboarding demos).","operationId":"get_orgs_with_custom_tests_api_v1_admin_dashboard_orgs_with_custom_tests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Response Get Orgs With Custom Tests Api V1 Admin Dashboard Orgs With Custom Tests Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/dashboard/workflows-by-org":{"get":{"tags":["Admin Dashboard"],"summary":"Get Workflows By Org","description":"Get all workflow definitions for a specific organization.\n\nThis endpoint is for admin dashboard use to view all workflows\nbelonging to a specific organization.\n\nArgs:\n org_id: Organization UUID to fetch workflows for.\n include_deleted: Whether to include soft-deleted workflows.\n use_other_env: Whether to query the other environment's database.\n limit: Maximum number of workflows to return.\n offset: Pagination offset.\n auth: Admin authentication info.\n\nReturns:\n AdminWorkflowListResponse with list of workflows and metadata.\n\nRaises:\n HTTPException: On database or validation errors.","operationId":"get_workflows_by_org_api_v1_admin_dashboard_workflows_by_org_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":true,"schema":{"type":"string","description":"Organization ID to fetch workflows for","title":"Org Id"},"description":"Organization ID to fetch workflows for"},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Include soft-deleted workflows","default":false,"title":"Include Deleted"},"description":"Include soft-deleted workflows"},{"name":"use_other_env","in":"query","required":false,"schema":{"type":"boolean","description":"Query the other environment's database (staging if on prod, production if on staging)","default":false,"title":"Use Other Env"},"description":"Query the other environment's database (staging if on prod, production if on staging)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum workflows to return","default":100,"title":"Limit"},"description":"Maximum workflows to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset for pagination","default":0,"title":"Offset"},"description":"Offset for pagination"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminWorkflowListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/copy-workflow-to-benchmarks":{"post":{"tags":["Admin Dashboard"],"summary":"Copy Workflow To Benchmarks","description":"Copy a workflow and all its tests to a target organization.\n\nThis is a privileged admin operation that copies:\n- All tests in the workflow (using TestCopyService)\n- Workflow configuration and metadata\n- Creates new workflow with mapped test IDs\n\nIf tests already exist in target org (detected by name pattern), they will\nbe resynced instead of duplicated.\n\nSupports bidirectional cross-environment copying:\n- source_from_other_env: Read source workflow from the other environment's database\n (staging if on prod, production if on staging)\n- target_other_env: Write target workflow to the other environment's database\n (staging if on prod, production if on staging)\n- target_org_id: Copy to any organization (defaults to benchmarks org)\n\nArgs:\n request: Contains the workflow_id to copy, optional new_name,\n source_from_other_env, target_other_env, and target_org_id.\n auth: Admin authentication info (injected by dependency).\n\nReturns:\n CopyWorkflowToBenchmarksResponse with details of what was copied.\n\nRaises:\n HTTPException: If the workflow is not found or copy fails.\n\nNote:\n Requires admin dashboard access permission.","operationId":"copy_workflow_to_benchmarks_api_v1_admin_dashboard_copy_workflow_to_benchmarks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopyWorkflowToBenchmarksRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopyWorkflowToBenchmarksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/dashboard/copy-config":{"get":{"tags":["Admin Dashboard"],"summary":"Get Copy Config","description":"Get the copy configuration for this environment.\n\nReturns information about cross-environment copy capabilities:\n- current_env_name: Name of the current environment (\"staging\" or \"production\")\n- other_env_name: Name of the other environment that can be targeted\n (\"staging\", \"production\", or null if not configured)\n\nThis helps the frontend show/hide cross-environment copy options.\n\nArgs:\n auth: Admin authentication info (injected by dependency).\n\nReturns:\n Dictionary with copy configuration.","operationId":"get_copy_config_api_v1_admin_dashboard_copy_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Copy Config Api V1 Admin Dashboard Copy Config Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/dashboard/internal-slack/channels":{"get":{"tags":["Admin Dashboard"],"summary":"Get Internal Slack Channels","description":"Get list of Slack channels available for internal notifications.\n\nUses the INTERNAL_SLACK_TOKEN environment variable.\nNote: Bot tokens only see channels the bot has been added to.","operationId":"get_internal_slack_channels_api_v1_admin_dashboard_internal_slack_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalSlackChannelsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/dashboard/internal-slack/rules":{"get":{"tags":["Admin Dashboard"],"summary":"List Internal Slack Rules","description":"Get all internal Slack notification rules.","operationId":"list_internal_slack_rules_api_v1_admin_dashboard_internal_slack_rules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalSlackNotificationRulesResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin Dashboard"],"summary":"Create Internal Slack Rule","description":"Create a new internal Slack notification rule (with no workflows initially).","operationId":"create_internal_slack_rule_api_v1_admin_dashboard_internal_slack_rules_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInternalSlackRuleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalSlackRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/dashboard/internal-slack/rules/{rule_id}":{"patch":{"tags":["Admin Dashboard"],"summary":"Update Internal Slack Rule","description":"Update an internal Slack notification rule (events and workflows).","operationId":"update_internal_slack_rule_api_v1_admin_dashboard_internal_slack_rules__rule_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInternalSlackRuleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalSlackRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin Dashboard"],"summary":"Delete Internal Slack Rule","description":"Delete an internal Slack notification rule.","operationId":"delete_internal_slack_rule_api_v1_admin_dashboard_internal_slack_rules__rule_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteInternalSlackRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/org-analytics/heatmap":{"get":{"tags":["Admin Dashboard","Admin Org Analytics"],"summary":"Get Org Heatmap","description":"Activity heatmap: per-org daily session density for the last 90 days.","operationId":"get_org_heatmap_api_v1_admin_org_analytics_heatmap_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeatmapResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/org-analytics/web-usage":{"get":{"tags":["Admin Dashboard","Admin Org Analytics"],"summary":"Get Global Web Usage","description":"Platform-wide daily web + session usage (last 90d).","operationId":"get_global_web_usage_api_v1_admin_org_analytics_web_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Global Web Usage Api V1 Admin Org Analytics Web Usage Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/org-analytics/overview":{"get":{"tags":["Admin Dashboard","Admin Org Analytics"],"summary":"Get Org Overview","description":"Top-level overview of all orgs with usage metrics.","operationId":"get_org_overview_api_v1_admin_org_analytics_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgOverviewResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/org-analytics/detail/{org_id}":{"get":{"tags":["Admin Dashboard","Admin Org Analytics"],"summary":"Get Org Detail","description":"Full customer 360 detail view for a single org.","operationId":"get_org_detail_api_v1_admin_org_analytics_detail__org_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/hitl/create_approval_request":{"post":{"tags":["HITL"],"summary":"Create Approval Request","description":"Create a new HITL approval request.\nCalled by workflow after test execution completes.","operationId":"create_approval_request_api_v1_hitl_create_approval_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HITLApprovalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HITLApprovalResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/hitl/get_approval_status/{task_id}":{"get":{"tags":["HITL"],"summary":"Get Approval Status","description":"Get approval status for a test execution task.\n\nCalled by workflow polling loop and frontend UI.\nAutomatically times out stale pending requests.\nReturns None if no approval request exists for this task (avoiding 404 browser errors).\n\nParameters:\n task_id: The test execution task ID to check approval status for.\n auth_info: Authentication info from the request.\n\nReturns:\n HITLApprovalResponse if approval request exists, None otherwise.\n\nExceptions:\n HTTPException 500: If there's an error fetching approval status.","operationId":"get_approval_status_api_v1_hitl_get_approval_status__task_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/HITLApprovalResponse"},{"type":"null"}],"title":"Response Get Approval Status Api V1 Hitl Get Approval Status Task Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/hitl/record_decision":{"post":{"tags":["HITL"],"summary":"Record Approval Decision","description":"Record an admin's approval/rejection decision.\nRequires admin dashboard access permission.","operationId":"record_approval_decision_api_v1_hitl_record_decision_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HITLApprovalDecision"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HITLDecisionRecorded"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monitor/stream/unified":{"get":{"tags":["monitoring"],"summary":"Stream Unified Updates","description":"Unified SSE stream for all real-time updates (tests, workflows, sessions).\n\nOn connect, fetches the current state from the database and sends it as\nan ``initial_state`` event. Then enters a blocking-read loop on three\nRedis Streams (tests, workflows, sessions) and forwards new entries as\nSSE events. No polling — events are written to streams at DB-write time\nby the backend endpoints themselves.","operationId":"stream_unified_updates_api_v1_monitor_stream_unified_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_queued","in":"query","required":false,"schema":{"type":"boolean","description":"Include queued tests","default":true,"title":"Include Queued"},"description":"Include queued tests"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitor/stream/debug/{entity_id}":{"get":{"tags":["monitoring"],"summary":"Get Stream Debug","description":"Read recent stream entries for a specific entity (test, workflow, or session).\n\nReturns the last N entries from the org's stream that match the given\nentity ID. Useful for debugging event flow and sharing diagnostics.","operationId":"get_stream_debug_api_v1_monitor_stream_debug__entity_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"stream_type","in":"query","required":false,"schema":{"type":"string","description":"Stream type: tests, workflows, sessions","default":"tests","title":"Stream Type"},"description":"Stream type: tests, workflows, sessions"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Stream Debug Api V1 Monitor Stream Debug Entity Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/device-sessions/summary":{"get":{"summary":"Get Session Summary","description":"Get aggregated session counts grouped by source, platform, and status.","operationId":"get_session_summary_api_v1_execution_device_sessions_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionSummaryResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/device-sessions/activity":{"get":{"summary":"Get Session Activity","description":"Get team activity pulse: device time, sessions today, per-user breakdown.","operationId":"get_session_activity_api_v1_execution_device_sessions_activity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/device-sessions/history":{"get":{"summary":"Get Session History","description":"Get paginated history of device sessions for an organization.\n\nArgs:\n limit: Maximum number of sessions to return (default 50, max 100).\n offset: Number of sessions to skip for pagination.\n source: Optional filter by execution source (ui, api, ci_cd, workflow).\n platform: Optional filter by platform (ios, android).\n status: Optional filter by session status.\n search: Optional text search on test name or device model.\n user_id: Optional filter by user ID (from source_metadata).","operationId":"get_session_history_api_v1_execution_device_sessions_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__execution_routes__device_sessions_xpt__SessionHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/device-sessions/active":{"get":{"summary":"Get Active Device Sessions","description":"Get list of active device sessions for an organization.\n\nActive sessions are those with status IN ('starting', 'running').\nReturns sessions with has_test_execution flag to distinguish\nlive device sessions from test executions.\n\nIncludes test_name, app_package, last_activity_at, and org\nconcurrency_limit for control-plane visibility.","operationId":"get_active_device_sessions_api_v1_execution_device_sessions_active_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveDeviceSessionsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/device-sessions/active-count":{"get":{"summary":"Get Active Device Session Count","description":"Get count of active device sessions for an organization.\n\nActive sessions are those with status IN ('starting', 'running').\nThis endpoint is used for concurrency limit enforcement.\n\nUses the existing index: idx_device_sessions_active","operationId":"get_active_device_session_count_api_v1_execution_device_sessions_active_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveDeviceSessionCountResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/device-sessions":{"post":{"summary":"Create Device Session","description":"Create a new device session record.\n\nThis is called when a device is started to track the session lifecycle.\nFor workflow tests, the ID is pre-generated and workflow_run_id is set later.\nFor live device tests, workflow_run_id is set at creation time.","operationId":"create_device_session_api_v1_execution_device_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceSessionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/device-sessions/by-workflow-run/{workflow_run_id}":{"get":{"summary":"Get Device Session By Workflow Run Id","description":"Look up a device session by workflow_run_id.\n\nReturns the session ID if found.","operationId":"get_device_session_by_workflow_run_id_api_v1_execution_device_sessions_by_workflow_run__workflow_run_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_run_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Device Session By Workflow Run Id","description":"Update a device session by workflow_run_id.\n\nUsed to update session status (starting -> running -> completed/failed).\nNote: duration_seconds is auto-calculated by database trigger when ended_at is set.","operationId":"update_device_session_by_workflow_run_id_api_v1_execution_device_sessions_by_workflow_run__workflow_run_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_run_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Run Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceSessionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/device-sessions/{session_id}":{"get":{"summary":"Get Device Session By Id","description":"Get a single device session with joined report/test metadata.","operationId":"get_device_session_by_id_api_v1_execution_device_sessions__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceSessionDetailItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Device Session By Id","description":"Update a device session by its ID.\n\nUsed for workflow tests where the session is pre-created and needs to be\nupdated with workflow_run_id when the test starts.\nNote: duration_seconds is auto-calculated by database trigger when ended_at is set.","operationId":"update_device_session_by_id_api_v1_execution_device_sessions__session_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceSessionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/device-sessions/{session_id}/claim-start":{"post":{"summary":"Claim Device Session Start","description":"Atomically claim a queued session for dispatch by setting status to starting.","operationId":"claim_device_session_start_api_v1_execution_device_sessions__session_id__claim_start_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceSessionClaimStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/device-sessions/{session_id}/artifacts/upload-url":{"post":{"summary":"Create Session Artifact Upload Url","description":"Generate presigned S3 URLs for an ephemeral session artifact.\n\nUsed by the CLI dev-loop to push delta zips to the worker without\ncreating persistent database records. Artifacts are scoped to the\nsession and expire automatically via S3 presigned URL TTLs.\n\nParams:\n session_id: The device session to associate the artifact with.\n request: File size and content type of the artifact.\n auth_info: Caller identity (injected via Depends).\n\nReturns:\n SessionArtifactUploadResponse with upload_url, download_url, s3_key.\n\nRaises:\n HTTPException 403: If org context is missing.\n HTTPException 404: If the session is not found or not owned by the org.","operationId":"create_session_artifact_upload_url_api_v1_execution_device_sessions__session_id__artifacts_upload_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionArtifactUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionArtifactUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/llm-calls":{"post":{"summary":"Create Llm Call","description":"Record an LLM call for cost tracking.\n\nThis is called by cognisim_action after each LLM invocation.\nFire-and-forget pattern - failures are logged but don't block execution.","operationId":"create_llm_call_api_v1_execution_llm_calls_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMCallCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMCallResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/test-executions":{"post":{"summary":"Create Test Execution","description":"Create a new test execution record.\n\nRequires session_id - the test execution is always linked to a device_session.\nSource and platform information comes from the linked device_session.","operationId":"create_test_execution_api_v1_execution_test_executions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/test-executions/{execution_id}":{"get":{"summary":"Get Test Execution","description":"Get a test execution record by ID.\n\nIncludes workflow_run_id, status, and timing from the linked device_session\nvia FK traversal. These fields are the source of truth after the schema\nmigration where device_sessions holds status/timing data.\nFiltered by org_id to prevent cross-org data access.","operationId":"get_test_execution_api_v1_execution_test_executions__execution_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Test Execution Api V1 Execution Test Executions Execution Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Test Execution","description":"Update a test execution record.\n\nUsed to update execution status (running -> completed/failed/cancelled).","operationId":"update_test_execution_api_v1_execution_test_executions__execution_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExecutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/test-executions/by-workflow/{workflow_execution_id}":{"get":{"summary":"List Test Executions For Workflow","description":"List all test executions for a workflow execution with status from device_sessions.\n\nUsed by the workflow orchestrator to recover dispatch state after crash/restart.","operationId":"list_test_executions_for_workflow_api_v1_execution_test_executions_by_workflow__workflow_execution_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_execution_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Execution Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Test Executions For Workflow Api V1 Execution Test Executions By Workflow Workflow Execution Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/workflow-executions":{"post":{"summary":"Create Workflow Execution","description":"Create a new workflow execution record.","operationId":"create_workflow_execution_api_v1_execution_workflow_executions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/workflow-executions/{execution_id}":{"get":{"summary":"Get Workflow Execution","description":"Get a workflow execution record by ID.","operationId":"get_workflow_execution_api_v1_execution_workflow_executions__execution_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Workflow Execution Api V1 Execution Workflow Executions Execution Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Workflow Execution","description":"Update a workflow execution record.","operationId":"update_workflow_execution_api_v1_execution_workflow_executions__execution_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/streaming/worker-connection/{workflow_run_id}":{"get":{"summary":"Get Worker Connection","description":"Get worker WebSocket connection info for a workflow run.\n\nFrontend calls this after starting a device to get the direct\nWebSocket URL for control messages.\n\nReturns:\n - status=\"ready\" with worker_ws_url when worker is available\n - status=\"not_ready\" while worker is initializing\n - status=\"cancelled\"/\"stopped\"/\"failed\" if session is terminated\n\nArgs:\n workflow_run_id: The workflow run ID to get connection info for.\n _auth: Authentication info (validated but not used directly).\n\nReturns:\n WorkerConnectionResponse with status and optional worker_ws_url.","operationId":"get_worker_connection_api_v1_execution_streaming_worker_connection__workflow_run_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_run_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkerConnectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/streaming/worker-connection/session/{session_id}":{"get":{"summary":"Get Worker Connection For Session","description":"Resolve worker WebSocket URL using a device_sessions row (org-scoped).\n\nUse when the UI has ``session_id`` but ``workflow_run_id`` is not yet\nloaded in client state — polls the same way as the workflow_run_id route\nonce the row has been updated after Hatchet dispatch.","operationId":"get_worker_connection_for_session_api_v1_execution_streaming_worker_connection_session__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkerConnectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/start_device":{"post":{"summary":"Start Device","description":"Start a device session and return task and websocket details.","operationId":"start_device_api_v1_execution_start_device_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Revyl-Client","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Revyl-Client"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartDeviceInfo"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartDeviceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/device/status/cancel/{workflow_run_id}":{"post":{"summary":"Cancel Device","description":"Stop or cancel a device session.\n\nCalled by ``revyl device stop`` and the frontend stop button. Despite\nthe endpoint name, this handles both true cancellations (test was\ninterrupted) and normal stops (bare device session ended by user).\n\nThe final status depends on session type:\n - **Bare sessions** (``is_simulation=True``, no ``test_id``): these\n have no ``test_executions`` row. Stopping is a normal completion,\n so the status is set to ``\"completed\"``.\n - **Test sessions** (started from test editor, ``revyl create``, etc.):\n these have a ``test_executions`` row. Stopping interrupts the test,\n so the status is ``\"cancelled\"`` with an error message.\n\nAfter updating the DB, a Hatchet workflow cancel is attempted\n(best-effort). Hatchet failures are logged and surfaced in the\nresponse but do not cause the endpoint to return an error.\n\nArgs:\n workflow_run_id: The Hatchet workflow run ID to stop/cancel.\n auth_info: Authenticated caller (injected by Depends).\n\nReturns:\n JSON dict with ``success``, ``db_updated``, and ``hatchet_cancelled``.","operationId":"cancel_device_api_v1_execution_device_status_cancel__workflow_run_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_run_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/device/sessions/{session_id}/cancel":{"post":{"summary":"Cancel Device Session","description":"Cancel a live device session by its session ID.\n\nPermissions:\n- Admin/Owner can cancel any session in their org\n- Member can only cancel their own sessions\n- Viewer cannot cancel (blocked by require_member_role)\n- Code-review-only orgs cannot reach this route (require_platform_access)\n\nArgs:\n session_id: The device_sessions UUID.\n auth_info: Authenticated caller (injected by Depends).\n\nReturns:\n JSON dict with ``success``, ``db_updated``, and ``hatchet_cancelled``.","operationId":"cancel_device_session_api_v1_execution_device_sessions__session_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/api/execute_test_id_async":{"post":{"tags":["Tests","public"],"summary":"Execute Test Id Async","description":"Trigger a test execution asynchronously via Hatchet event.","operationId":"execute_test_id_async_api_v1_execution_api_execute_test_id_async_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Revyl-Client","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Revyl-Client"}},{"name":"X-CI-System","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-System"}},{"name":"X-CI-Commit-SHA","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Commit-Sha"}},{"name":"X-CI-Branch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Branch"}},{"name":"X-CI-PR-Number","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Ci-Pr-Number"}},{"name":"X-CI-Run-URL","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Run-Url"}},{"name":"X-CI-Run-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Run-Id"}},{"name":"X-CI-Repository","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Repository"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskID"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteTestAsyncAPIResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/tests/bulk_execute":{"post":{"tags":["Tests","public"],"summary":"Bulk Execute Tests","description":"Trigger multiple test executions asynchronously via Hatchet events.","operationId":"bulk_execute_tests_api_v1_execution_tests_bulk_execute_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Revyl-Client","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Revyl-Client"}},{"name":"X-CI-System","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-System"}},{"name":"X-CI-Commit-SHA","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Commit-Sha"}},{"name":"X-CI-Branch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Branch"}},{"name":"X-CI-PR-Number","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Ci-Pr-Number"}},{"name":"X-CI-Run-URL","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Run-Url"}},{"name":"X-CI-Run-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Run-Id"}},{"name":"X-CI-Repository","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Repository"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkExecuteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkExecuteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/tests/status/cancel/{task_id}":{"post":{"tags":["Tests","public"],"summary":"Cancel Test","description":"Cancel a running test execution by task ID.\n\nThis endpoint:\n1. Fetches the test execution status from the database\n2. Checks if the test is already in a terminal state\n3. Updates test_executions and device_sessions status to 'cancelled'\n4. Cancels the Hatchet workflow run if one exists\n\nArgs:\n task_id: The test execution ID to cancel\n auth_info: Authentication info from the request\n\nReturns:\n CancelTestResponse with success status and message\n\nRaises:\n HTTPException: 404 if test not found, 500 on internal error","operationId":"cancel_test_api_v1_execution_tests_status_cancel__task_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/api/execute_workflow_id_async":{"post":{"tags":["Workflows","public"],"summary":"Execute Workflow Id Async","description":"Execute a workflow by its ID asynchronously via Hatchet event push.","operationId":"execute_workflow_id_async_api_v1_execution_api_execute_workflow_id_async_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Revyl-Client","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Revyl-Client"}},{"name":"X-CI-System","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-System"}},{"name":"X-CI-Commit-SHA","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Commit-Sha"}},{"name":"X-CI-Branch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Branch"}},{"name":"X-CI-PR-Number","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Ci-Pr-Number"}},{"name":"X-CI-Run-URL","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Run-Url"}},{"name":"X-CI-Run-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Run-Id"}},{"name":"X-CI-Repository","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ci-Repository"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowInfo-Input"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkflowAsyncAPIResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/api/v1/workflows/status/cancel/{task_id}":{"post":{"tags":["Workflows","public"],"summary":"Cancel Workflow","description":"Cancel a running workflow and all its child tests.","operationId":"cancel_workflow_api_v1_execution_api_v1_workflows_status_cancel__task_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCancelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/ground":{"post":{"summary":"Ground Element","description":"Locate a UI element in a screenshot using AI vision grounding.\n\nWraps the request in a StepOutputData payload and triggers the\n`get_cached_step_output` Hatchet workflow (grounder-only, no LLM).\n\nArgs:\n request: GroundRequest with target description and screenshot.\n auth_info: Authenticated user/org info from token.\n\nReturns:\n GroundResponse with pixel coordinates.\n\nRaises:\n HTTPException: 500 if the Hatchet workflow fails.","operationId":"ground_element_api_v1_execution_ground_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroundRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroundResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/device-proxy/{workflow_run_id}/step_status/{step_id}":{"get":{"summary":"Proxy Step Status","description":"Poll async step execution status on the worker.\n\nArgs:\n workflow_run_id: Hatchet workflow run powering the device session.\n step_id: Step identifier returned by POST /execute_step.\n request: Incoming FastAPI request.\n auth_info: Authenticated caller from ``require_platform_access``.\n\nReturns:\n Response: Worker's step status response, proxied through.","operationId":"proxy_step_status_api_v1_execution_device_proxy__workflow_run_id__step_status__step_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_run_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Run Id"}},{"name":"step_id","in":"path","required":true,"schema":{"type":"string","title":"Step Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/device-proxy/{workflow_run_id}/{action}":{"get":{"summary":"Proxy Worker Request Get","description":"Proxy a GET device action request (e.g. screenshot, health) to the worker.\n\nArgs:\n workflow_run_id: Hatchet workflow run powering the device session.\n action: Worker endpoint name (e.g. ``screenshot``, ``health``).\n request: Incoming FastAPI request.\n auth_info: Authenticated caller from ``require_platform_access``.\n\nReturns:\n Response: Worker's response, proxied through.","operationId":"proxy_worker_request_get_api_v1_execution_device_proxy__workflow_run_id___action__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_run_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Run Id"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Proxy Worker Request Post","description":"Proxy a POST device action request (e.g. tap, swipe, input) to the worker.\n\nArgs:\n workflow_run_id: Hatchet workflow run powering the device session.\n action: Worker endpoint name (e.g. ``tap``, ``swipe``).\n request: Incoming FastAPI request (body is forwarded).\n auth_info: Authenticated caller from ``require_platform_access``.\n\nReturns:\n Response: Worker's response, proxied through.","operationId":"proxy_worker_request_post_api_v1_execution_device_proxy__workflow_run_id___action__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workflow_run_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Run Id"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/billing/finalize-session":{"post":{"summary":"Finalize Session","description":"Finalize billing for a completed device session.\n\nIdempotent — safe to call multiple times for the same session.","operationId":"finalize_session_api_v1_execution_billing_finalize_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinalizeSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinalizeSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/billing/check":{"get":{"summary":"Billing Check","description":"Check if the org can start a device session.","operationId":"billing_check_api_v1_execution_billing_check_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"platform","in":"query","required":true,"schema":{"type":"string","description":"ios or android","title":"Platform"},"description":"ios or android"},{"name":"is_real_device","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Real Device"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/billing/summary":{"get":{"summary":"Billing Summary","description":"Get aggregated billing summary for the org.","operationId":"billing_summary_api_v1_execution_billing_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"}},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/billing/breakdown":{"get":{"summary":"Billing Breakdown","description":"Get per-platform billing breakdown.","operationId":"billing_breakdown_api_v1_execution_billing_breakdown_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"}},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingBreakdownResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/billing/sessions":{"get":{"summary":"Billing Sessions","description":"Get paginated session billing history.","operationId":"billing_sessions_api_v1_execution_billing_sessions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"}},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__execution_routes__billing_xpt__SessionHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/billing/daily-spend":{"get":{"summary":"Billing Daily Spend","description":"Get daily spend data points for charting.","operationId":"billing_daily_spend_api_v1_execution_billing_daily_spend_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"}},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailySpendResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/billing/daily-usage":{"get":{"summary":"Billing Daily Usage","description":"Get daily usage data points for charting.","operationId":"billing_daily_usage_api_v1_execution_billing_daily_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"}},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/execution/billing/rates":{"get":{"summary":"Billing Rates","description":"Return the current rate card.","operationId":"billing_rates_api_v1_execution_billing_rates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateCardResponse"}}}}}}},"/api/v1/execution/billing/attach":{"post":{"summary":"Billing Attach","description":"Subscribe the org to a billing plan (returns Stripe checkout URL).\n\nproduct_id: \"starter\" (free base, 30 min credits) or \"team\" ($250/mo, 10h credits).","operationId":"billing_attach_api_v1_execution_billing_attach_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__execution_routes__billing_xpt__AttachRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__execution_routes__billing_xpt__AttachResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/billing/portal":{"post":{"summary":"Billing Portal","description":"Return a Stripe billing portal URL where the customer can manage their subscription.","operationId":"billing_portal_api_v1_execution_billing_portal_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/billing/credits":{"get":{"summary":"Billing Credits","description":"Return the org's current credit balances from Autumn.","operationId":"billing_credits_api_v1_execution_billing_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditsBalanceResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/billing/plan":{"get":{"summary":"Billing Plan","description":"Return the org's current billing plan.","operationId":"billing_plan_api_v1_execution_billing_plan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanInfo"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/execution/device-targets":{"get":{"summary":"Get the device target matrix for all platforms","description":"Returns available device models, OS runtimes, default pairs, and model-runtime compatibility rules for every supported platform.","operationId":"get_device_targets_api_v1_execution_device_targets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllPlatformTargets"}}}}}}},"/api/v1/modules/list":{"get":{"tags":["Modules"],"summary":"List Modules","description":"List all modules for the user's organization","operationId":"list_modules_api_v1_modules_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModulesListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/modules/usage-counts":{"get":{"tags":["Modules"],"summary":"Get Module Usage Counts","description":"Get test usage counts for all modules in the organization.\nReturns a map of module_id -> number of tests using that module.","operationId":"get_module_usage_counts_api_v1_modules_usage_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleUsageCountsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/modules/check_exists":{"get":{"tags":["Modules"],"summary":"Check Module Exists","description":"Check if a module with the given name exists in the organization","operationId":"check_module_exists_api_v1_modules_check_exists_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckModuleExistsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/modules/{module_id}":{"get":{"tags":["Modules"],"summary":"Get Module","description":"Get a specific module by ID","operationId":"get_module_api_v1_modules__module_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"module_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Module Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleSingleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/modules/create":{"post":{"tags":["Modules"],"summary":"Create Module","description":"Create a new module from blocks","operationId":"create_module_api_v1_modules_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateModuleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleSingleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/modules/update/{module_id}":{"put":{"tags":["Modules"],"summary":"Update Module","description":"Update an existing module","operationId":"update_module_api_v1_modules_update__module_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"module_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Module Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateModuleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleSingleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/modules/{module_id}/tests":{"get":{"tags":["Modules"],"summary":"Get Module Usage","description":"Get all tests that use a specific module","operationId":"get_module_usage_api_v1_modules__module_id__tests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"module_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Module Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/modules/{module_id}/versions":{"get":{"tags":["Modules"],"summary":"Get Module Versions","description":"Get version history for a module","operationId":"get_module_versions_api_v1_modules__module_id__versions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"module_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Module Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleVersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/modules/{module_id}/versions/{version}":{"get":{"tags":["Modules"],"summary":"Get Module Version","description":"Get a specific version of a module","operationId":"get_module_version_api_v1_modules__module_id__versions__version__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"module_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Module Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleVersionInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/modules/{module_id}/restore":{"post":{"tags":["Modules"],"summary":"Restore Module Version","description":"Restore a module to a previous version","operationId":"restore_module_version_api_v1_modules__module_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"module_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Module Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleRestoreVersionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleRestoreVersionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/modules/delete/{module_id}":{"delete":{"tags":["Modules"],"summary":"Delete Module","description":"Delete a module","operationId":"delete_module_api_v1_modules_delete__module_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"module_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Module Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteModuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/reports":{"post":{"summary":"Create Report","description":"Create a new report when test execution starts.\n\nNote: status and platform are not stored on reports - they are derived\nfrom the linked test_executions table.","operationId":"create_report_api_v1_reports_v3_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/reports-v3/reports/{report_id}/steps":{"post":{"summary":"Create Step","description":"Create a new report step when step execution starts.\n\nThis creates a step row and optionally a type-specific row.","operationId":"create_step_api_v1_reports_v3_reports__report_id__steps_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStepRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStepResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/steps/{step_id}":{"patch":{"summary":"Update Step","description":"Update a report step when step execution completes.","operationId":"update_step_api_v1_reports_v3_steps__step_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"step_id","in":"path","required":true,"schema":{"type":"string","title":"Step Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStepRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStepResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/steps/{step_id}/actions":{"post":{"summary":"Create Action","description":"Create a new report action after each agent action cycle.\n\nThis creates a base action row and inserts type-specific data into the\nappropriate subtable based on action_type.","operationId":"create_action_api_v1_reports_v3_steps__step_id__actions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"step_id","in":"path","required":true,"schema":{"type":"string","title":"Step Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/actions/{action_id}/screenshot":{"patch":{"summary":"Update Action Screenshot","description":"Attach a screenshot S3 key to an existing action row.","operationId":"update_action_screenshot_api_v1_reports_v3_actions__action_id__screenshot_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"action_id","in":"path","required":true,"schema":{"type":"string","title":"Action Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateActionScreenshotRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/reports/{report_id}":{"patch":{"summary":"Update Report","description":"Update a report when test execution completes.\n\nNote: status is not stored on reports - it's derived from test_executions.","operationId":"update_report_api_v1_reports_v3_reports__report_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Report","description":"Get a report by ID with optional nested steps and actions.\n\nSupports both authenticated and public (token-based) access:\n- Authenticated: Requires valid auth token, enforces org_id filtering\n- Public: Requires valid share token, no org filtering\n\nArgs:\n report_id: The report UUID\n include_steps: Whether to include steps (default: True)\n include_actions: Whether to include actions within steps (default: True)\n include_llm_calls: Whether to include LLM call details (default: True)\n token: Optional share token for public access","operationId":"get_report_api_v1_reports_v3_reports__report_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"include_steps","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Steps"}},{"name":"include_actions","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Actions"}},{"name":"include_llm_calls","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Llm Calls"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Public share token for unauthenticated access","title":"Token"},"description":"Public share token for unauthenticated access"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportV3Response"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/reports/by-token":{"get":{"summary":"Get Report By Token","description":"Get a report by share token only.\n\nThis is the cleanest public share endpoint - just pass the token.\nThe backend looks up the execution_id from the shareable_reports table.\n\nURL format: /reports/by-token?token=xxx","operationId":"get_report_by_token_api_v1_reports_v3_reports_by_token_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"Public share token","title":"Token"},"description":"Public share token"},{"name":"include_steps","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Steps"}},{"name":"include_actions","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Actions"}},{"name":"include_llm_calls","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Llm Calls"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportV3Response"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/reports/{report_id}/device-logs":{"get":{"summary":"Get Device Logs Download Url","description":"Get a presigned download URL for device logs (logcat/iOS system logs).\n\nSupports both authenticated and public (token-based) access.\nReturns a presigned S3 URL that expires in 1 hour.","operationId":"get_device_logs_download_url_api_v1_reports_v3_reports__report_id__device_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Public share token for unauthenticated access","title":"Token"},"description":"Public share token for unauthenticated access"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceLogsDownloadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/reports/by-execution/{execution_id}":{"get":{"summary":"Get Report By Execution","description":"Get a report by execution_id (test_executions.id).\n\nThis is the primary lookup method for the trace visualizer,\nas it uses the task_id which maps to execution_id.\n\nSupports both authenticated and public (token-based) access:\n- Authenticated: Requires valid auth token, enforces org_id filtering\n- Public: Requires valid share token, no org filtering","operationId":"get_report_by_execution_api_v1_reports_v3_reports_by_execution__execution_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}},{"name":"include_steps","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Steps"}},{"name":"include_actions","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Actions"}},{"name":"include_llm_calls","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Llm Calls"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Public share token for unauthenticated access","title":"Token"},"description":"Public share token for unauthenticated access"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportV3Response"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/reports/by-session/{session_id}":{"get":{"summary":"Get Report By Session","description":"Get a report by device session_id.\n\nUsed for standalone device sessions that don't have a test_execution.\nLooks up the report via the session_id FK on the reports table.\n\nArgs:\n session_id: The device_sessions UUID.\n include_steps: Whether to include steps (default: True).\n include_actions: Whether to include actions within steps (default: True).\n include_llm_calls: Whether to include LLM call details (default: True).","operationId":"get_report_by_session_api_v1_reports_v3_reports_by_session__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"include_steps","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Steps"}},{"name":"include_actions","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Actions"}},{"name":"include_llm_calls","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Llm Calls"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportV3Response"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/reports/by-session/{session_id}/context":{"get":{"summary":"Get Report Context By Session","description":"Get a high-context report by device session_id for CLI/MCP consumption.\n\nSame enrichment as the by-execution context endpoint but keyed by\ndevice session rather than test execution.\n\nArgs:\n session_id: The device_sessions UUID.\n include_steps: Whether to include steps (default: True).\n include_actions: Whether to include actions within steps (default: True).\n include_llm_calls: Whether to include LLM call details (default: True).","operationId":"get_report_context_by_session_api_v1_reports_v3_reports_by_session__session_id__context_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"include_steps","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Steps"}},{"name":"include_actions","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Actions"}},{"name":"include_llm_calls","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Llm Calls"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportContextResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/reports/by-execution/{execution_id}/context":{"get":{"summary":"Get Report Context By Execution","description":"Get a high-context report by execution_id for CLI JSON and coding-agent use.\n\nThis stays close to the raw report payload, but adds backend-derived\nrendering/media fields so downstream consumers do not need to reconstruct\nreport semantics client-side.","operationId":"get_report_context_by_execution_api_v1_reports_v3_reports_by_execution__execution_id__context_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}},{"name":"include_steps","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Steps"}},{"name":"include_actions","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Actions"}},{"name":"include_llm_calls","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Llm Calls"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Public share token for unauthenticated access","title":"Token"},"description":"Public share token for unauthenticated access"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportContextResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports-v3/reports/video-metadata-batch":{"post":{"summary":"Get Video Metadata Batch","description":"Get lightweight video metadata for multiple executions.\n\nThis is optimized for workflow replay mode - returns only video URL,\nduration, and step timeline data (no screenshots, no LLM calls).\n\nArgs:\n execution_ids: List of execution IDs (task_ids) to fetch\n\nReturns:\n Dictionary mapping execution_id to video metadata (or null if not found)","operationId":"get_video_metadata_batch_api_v1_reports_v3_reports_video_metadata_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoMetadataBatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoMetadataBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/reports-v3/reports/step-summaries-batch":{"post":{"summary":"Get Step Summaries Batch","description":"Get lightweight step summaries for multiple test executions.\n\nThis is optimized for test history list views - returns only step type,\nstatus, and validation results for progress bar visualization.\n\nColor mapping for frontend:\n- instruction/extraction/etc with status=\"success\" -> blue\n- instruction/extraction/etc with status=\"warning\" -> yellow\n- instruction/extraction/etc with status=\"failed\" -> red\n- validation with validation_result=true -> purple\n- validation with validation_result=false -> red\n\nArgs:\n task_ids: List of test_execution IDs to fetch\n\nReturns:\n Dictionary mapping task_id to list of step summaries (or null if not found)","operationId":"get_step_summaries_batch_api_v1_reports_v3_reports_step_summaries_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepSummariesBatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepSummariesBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/recordings/compile":{"post":{"tags":["Recording Compilation"],"summary":"Start Compile","description":"Build a compile plan and launch the compilation workflow.","operationId":"start_compile_api_v1_recordings_compile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompileRecordingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompileRecordingStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/recordings/compile/{job_id}":{"get":{"tags":["Recording Compilation"],"summary":"Get Compile Status","description":"Poll the status of a compile job.","operationId":"get_compile_status_api_v1_recordings_compile__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompileRecordingStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recordings/compile/{job_id}/status":{"post":{"tags":["Recording Compilation"],"summary":"Update Compile Status","description":"Internal callback for the action service to update job progress.","operationId":"update_compile_status_api_v1_recordings_compile__job_id__status_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-service-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Service-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompileProgressUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Compile Status Api V1 Recordings Compile Job Id Status Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trace/llm-details/{unique_id}":{"get":{"tags":["trace"],"summary":"Get Llm Details","description":"Fetch full LLM call details from KeywordsAI.\n\nThis endpoint retrieves the complete prompt/completion data for an LLM call,\nincluding any images that were sent as part of the request.\n\nNOTE: Admin-only endpoint - requires can_access_admin_dashboard permission.\n\nArgs:\n unique_id: The keywords_ai_unique_id from the step's LLM metadata\n\nReturns:\n Full LLM call details including messages, metrics, and cost","operationId":"get_llm_details_api_v1_trace_llm_details__unique_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"unique_id","in":"path","required":true,"schema":{"type":"string","title":"Unique Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMDetailsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trace/llm-details/batch":{"post":{"tags":["trace"],"summary":"Get Llm Details Batch","description":"Fetch multiple LLM call details in a single request.\n\nUseful for preloading all LLM details for a trace at once.\nLimited to 50 unique_ids per request.\n\nNOTE: Admin-only endpoint - requires can_access_admin_dashboard permission.\n\nArgs:\n request: Batch request containing list of unique_ids\n\nReturns:\n Dict mapping unique_id to LLM details (only successful fetches included)","operationId":"get_llm_details_batch_api_v1_trace_llm_details_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchLLMDetailsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/LLMDetailsResponse"},"type":"object","title":"Response Get Llm Details Batch Api V1 Trace Llm Details Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/trace/llm-details/by-id/{llm_call_id}":{"get":{"tags":["trace"],"summary":"Get Llm Details By Id","description":"Fetch full LLM call details from KeywordsAI using our database llm_call_id.\n\nThis endpoint first looks up the llm_calls table to get the source_id\n(KeywordsAI unique_id), then fetches the full details from KeywordsAI.\n\nNOTE: Admin-only endpoint - requires can_access_admin_dashboard permission.\n\nArgs:\n llm_call_id: The UUID from our llm_calls table\n\nReturns:\n Full LLM call details including messages, metrics, and cost","operationId":"get_llm_details_by_id_api_v1_trace_llm_details_by_id__llm_call_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"llm_call_id","in":"path","required":true,"schema":{"type":"string","title":"Llm Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMDetailsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trace/cost-analysis/by-session/{session_id}":{"get":{"tags":["trace"],"summary":"Get Cost Analysis By Session","description":"Get cost analysis for all LLM calls in a session.\n\nAggregates token usage and costs across all LLM calls for the given session,\nwith breakdown by model.\n\nNOTE: Admin-only endpoint - requires can_access_admin_dashboard permission.\n\nArgs:\n session_id: The device session UUID\n\nReturns:\n Cost analysis with totals and per-model breakdown","operationId":"get_cost_analysis_by_session_api_v1_trace_cost_analysis_by_session__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trace/cost-analysis/by-execution/{execution_id}":{"get":{"tags":["trace"],"summary":"Get Cost Analysis By Execution","description":"Get cost analysis for all LLM calls in a test execution.\n\nFirst looks up the session_id from the test_executions table,\nthen aggregates token usage and costs across all LLM calls.\n\nNOTE: Admin-only endpoint - requires can_access_admin_dashboard permission.\n\nArgs:\n execution_id: The test execution UUID (task_id)\n\nReturns:\n Cost analysis with totals and per-model breakdown","operationId":"get_cost_analysis_by_execution_api_v1_trace_cost_analysis_by_execution__execution_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/auth/validate":{"get":{"tags":["Fleet"],"summary":"Validate Auth","description":"Validate API key and return user information.\n\nUsed by FleetDashboard to verify API key on launch and get user context.\nThe require_auth dependency handles the actual validation.\n\nArgs:\n auth_info: Authenticated user info from require_auth dependency.\n\nReturns:\n FleetAuthValidateResponse: User info if valid, error otherwise.","operationId":"validate_auth_api_v1_fleet_auth_validate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetAuthValidateResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/fleet/status":{"get":{"tags":["Fleet"],"summary":"Get Fleet Status","description":"Get Fleet pool status summary.\n\nReturns aggregate counts of sandbox availability for quick\npool health assessment. This is an alias for /sandboxes/status\nfor backwards compatibility with FleetDashboard.\n\nArgs:\n auth_info: Authenticated user info.\n\nReturns:\n FleetPoolStatus: Pool status summary with counts.\n\nRaises:\n HTTPException: If database query fails.","operationId":"get_fleet_status_api_v1_fleet_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetPoolStatus"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/fleet/sandboxes":{"get":{"tags":["Fleet"],"summary":"List Sandboxes","description":"List sandboxes in the Fleet pool.\n\nBy default returns all sandboxes (shared pool + org-owned).\nUse org_only=true to filter to only sandboxes owned by the user's org.\n\nArgs:\n org_only: If True, only return sandboxes owned by user's organization.\n auth_info: Authenticated user info.\n\nReturns:\n List[FleetSandbox]: Sandboxes matching the filter criteria.\n\nRaises:\n HTTPException: If database query fails.","operationId":"list_sandboxes_api_v1_fleet_sandboxes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Org Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FleetSandbox"},"title":"Response List Sandboxes Api V1 Fleet Sandboxes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/sandboxes/status":{"get":{"tags":["Fleet"],"summary":"Get Pool Status","description":"Get Fleet pool status summary.\n\nReturns aggregate counts of sandbox availability for quick\npool health assessment.\n\nArgs:\n org_only: If True, only count sandboxes owned by user's organization.\n auth_info: Authenticated user info.\n\nReturns:\n FleetPoolStatus: Pool status summary with counts.\n\nRaises:\n HTTPException: If database query fails.","operationId":"get_pool_status_api_v1_fleet_sandboxes_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Org Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetPoolStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/sandboxes/dashboard":{"get":{"tags":["Fleet"],"summary":"Get Dashboard","description":"Get combined dashboard data in a single call.\n\nReturns all data needed to render the Fleet Dashboard UI:\n- Pool status summary\n- All sandboxes (or org-only if filtered)\n- User's claimed sandbox (if any)\n- Worktrees on user's sandbox\n\nThis reduces round-trips compared to calling individual endpoints.\n\nArgs:\n org_only: If True, only return sandboxes owned by user's organization.\n auth_info: Authenticated user info.\n\nReturns:\n FleetDashboardResponse: Combined dashboard data.\n\nRaises:\n HTTPException: If database query fails.","operationId":"get_dashboard_api_v1_fleet_sandboxes_dashboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Org Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetDashboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/sandboxes/claim":{"post":{"tags":["Fleet"],"summary":"Claim Sandbox","description":"Claim an available sandbox for the current user.\n\nUses atomic database operation to prevent race conditions when\nmultiple users try to claim simultaneously.\n\nArgs:\n auth_info: Authenticated user info.\n allow_multiple: If True, allow claiming even if user already has one.\n\nReturns:\n ClaimSandboxResponse: Result with claimed sandbox details.\n\nRaises:\n HTTPException: If user already has a sandbox (and allow_multiple=False)\n or no sandboxes are available.","operationId":"claim_sandbox_api_v1_fleet_sandboxes_claim_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"allow_multiple","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Allow Multiple"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimSandboxResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/sandboxes/{sandbox_id}/release":{"post":{"tags":["Fleet"],"summary":"Release Sandbox","description":"Release a claimed sandbox back to the pool.\n\nOnly the user who claimed the sandbox can release it, unless\nforce=True (requires admin permissions).\n\nArgs:\n sandbox_id: UUID or vm_name of the sandbox to release.\n auth_info: Authenticated user info.\n force: If True, allow releasing sandbox claimed by another user (admin only).\n\nReturns:\n ReleaseSandboxResponse: Result of the release operation.\n\nRaises:\n HTTPException: If sandbox not found or user doesn't own it.","operationId":"release_sandbox_api_v1_fleet_sandboxes__sandbox_id__release_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sandbox_id","in":"path","required":true,"schema":{"type":"string","title":"Sandbox Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseSandboxResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/sandboxes/register":{"post":{"tags":["Fleet"],"summary":"Register Sandbox","description":"Register (upsert) a sandbox during provisioning.\n\nCalled by the fleet CLI after provisioning a Mac, or by the Ansible\nplaybook during sandbox setup. Inserts a new row if the vm_name doesn't\nexist, or updates the existing row if it does.\n\nThis is the bridge between SSM-based provisioning (admin) and\nSupabase-based state (developer CLI / FleetDashboard).\n\nArgs:\n request: Sandbox registration data (vm_name is the unique key).\n response: FastAPI response object (to set 201 status on create).\n auth_info: Authenticated user info (service key or admin user).\n\nReturns:\n RegisterSandboxResponse: The registered sandbox and whether it was\n newly created or updated.\n\nRaises:\n HTTPException: If the database operation fails.","operationId":"register_sandbox_api_v1_fleet_sandboxes_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterSandboxRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterSandboxResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/fleet/sandboxes/mine":{"get":{"tags":["Fleet"],"summary":"Get My Sandboxes","description":"Get sandboxes claimed by the current user.\n\nArgs:\n auth_info: Authenticated user info.\n\nReturns:\n List[FleetSandbox]: User's claimed sandboxes.\n\nRaises:\n HTTPException: If database query fails.","operationId":"get_my_sandboxes_api_v1_fleet_sandboxes_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FleetSandbox"},"type":"array","title":"Response Get My Sandboxes Api V1 Fleet Sandboxes Mine Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/fleet/sandboxes/{sandbox_id}":{"patch":{"tags":["Fleet"],"summary":"Update Sandbox","description":"Update sandbox properties (admin only).\n\nAllows admins to update sandbox configuration like tunnel_hostname,\nstatus, SSH settings, etc. Regular users can only update their own\nclaimed sandboxes with limited fields.\n\nArgs:\n sandbox_id: Sandbox ID or vm_name to update.\n request: Update request with fields to change.\n auth_info: Authenticated user info.\n\nReturns:\n UpdateSandboxResponse: Success status and updated sandbox.\n\nRaises:\n HTTPException: If sandbox not found or user lacks permission.","operationId":"update_sandbox_api_v1_fleet_sandboxes__sandbox_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sandbox_id","in":"path","required":true,"schema":{"type":"string","title":"Sandbox Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSandboxRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSandboxResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/sandboxes/{sandbox_id}/maintenance":{"post":{"tags":["Fleet"],"summary":"Set Maintenance Mode","description":"Set sandbox maintenance mode (admin only).\n\nPuts a sandbox into or out of maintenance mode. Sandboxes in maintenance\ncannot be claimed by users.\n\nArgs:\n sandbox_id: Sandbox ID or vm_name.\n enable: True to enable maintenance, False to disable.\n auth_info: Authenticated user info.\n\nReturns:\n dict: Success status and message.\n\nRaises:\n HTTPException: If sandbox not found or user is not admin.","operationId":"set_maintenance_mode_api_v1_fleet_sandboxes__sandbox_id__maintenance_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sandbox_id","in":"path","required":true,"schema":{"type":"string","title":"Sandbox Id"}},{"name":"enable","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Enable"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Maintenance Mode Api V1 Fleet Sandboxes Sandbox Id Maintenance Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/sandboxes/{sandbox_name}":{"delete":{"tags":["Fleet"],"summary":"Delete Sandbox","description":"Delete a sandbox from the fleet database (admin unprovision).\n\nPermanently removes the sandbox row from fleet_sandboxes.\nCalled by the fleet CLI during `fleet sandbox unprovision`.\n\nArgs:\n sandbox_name: The vm_name of the sandbox to delete.\n auth_info: Authenticated user info (service key or admin).\n\nReturns:\n dict with success status and message.\n\nRaises:\n HTTPException 403: If user is not an admin.\n HTTPException 404: If the sandbox does not exist.\n HTTPException 409: If the sandbox is currently claimed.\n HTTPException 500: If the database operation fails.","operationId":"delete_sandbox_api_v1_fleet_sandboxes__sandbox_name__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sandbox_name","in":"path","required":true,"schema":{"type":"string","title":"Sandbox Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Sandbox Api V1 Fleet Sandboxes Sandbox Name Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/sandboxes/{sandbox_id}/ssh-key":{"post":{"tags":["Fleet"],"summary":"Push Ssh Key","description":"Push an SSH public key to a sandbox.\n\nAdds the provided SSH public key to the sandbox's authorized_keys file.\nThe backend SSHs into the sandbox using its existing credentials to add the key.\n\nArgs:\n sandbox_id: UUID of the sandbox to push the key to.\n request: Request containing the public key.\n auth_info: Authenticated user info.\n\nReturns:\n PushSSHKeyResponse: Result of the key push operation.\n\nRaises:\n HTTPException: If sandbox not found or SSH operation fails.","operationId":"push_ssh_key_api_v1_fleet_sandboxes__sandbox_id__ssh_key_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sandbox_id","in":"path","required":true,"schema":{"type":"string","title":"Sandbox Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSSHKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSSHKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/sandboxes/{sandbox_id}/ssh-key/status":{"get":{"tags":["Fleet"],"summary":"Get Ssh Key Status","description":"Check SSH key configuration status on a sandbox.\n\nTests SSH connectivity to the sandbox to determine if the user's\nSSH key is properly configured.\n\nArgs:\n sandbox_id: UUID of the sandbox to check.\n auth_info: Authenticated user info.\n\nReturns:\n SSHKeyStatusResponse: SSH key configuration status.\n\nRaises:\n HTTPException: If sandbox not found.","operationId":"get_ssh_key_status_api_v1_fleet_sandboxes__sandbox_id__ssh_key_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sandbox_id","in":"path","required":true,"schema":{"type":"string","title":"Sandbox Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSHKeyStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/worktrees":{"get":{"tags":["Fleet"],"summary":"List Worktrees","description":"List worktrees on a sandbox.\n\nIf sandbox_id is not provided, lists worktrees on user's claimed sandbox.\n\nNote: This endpoint currently returns an empty list as worktree listing\nrequires SSH access to the sandbox. Full implementation will be added\nwhen SSH infrastructure is available in the backend.\n\nArgs:\n sandbox_id: Optional specific sandbox to query.\n auth_info: Authenticated user info.\n\nReturns:\n List[FleetWorktree]: Worktrees on the sandbox.\n\nRaises:\n HTTPException: If sandbox not found or user doesn't have access.","operationId":"list_worktrees_api_v1_fleet_worktrees_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sandbox_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sandbox Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FleetWorktree"},"title":"Response List Worktrees Api V1 Fleet Worktrees Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Fleet"],"summary":"Create Worktree","description":"Create a new worktree on a sandbox.\n\nNote: This endpoint is not yet implemented as it requires SSH access\nto the sandbox to run git commands.\n\nArgs:\n request: Worktree creation parameters.\n auth_info: Authenticated user info.\n\nReturns:\n FleetWorktree: The created worktree.\n\nRaises:\n HTTPException: Not implemented.","operationId":"create_worktree_api_v1_fleet_worktrees_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorktreeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetWorktree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/worktrees/{branch}":{"delete":{"tags":["Fleet"],"summary":"Remove Worktree","description":"Remove a worktree from a sandbox.\n\nNote: This endpoint is not yet implemented as it requires SSH access\nto the sandbox to run git commands.\n\nArgs:\n branch: Branch name of the worktree to remove.\n sandbox_id: Optional specific sandbox (uses claimed if not specified).\n auth_info: Authenticated user info.\n\nReturns:\n dict: Success message.\n\nRaises:\n HTTPException: Not implemented.","operationId":"remove_worktree_api_v1_fleet_worktrees__branch__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}},{"name":"sandbox_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sandbox Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Worktree Api V1 Fleet Worktrees Branch Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flywheel/config":{"get":{"tags":["Flywheel"],"summary":"Get Flywheel Config","description":"Get the global flywheel enabled/disabled config. Requires god_mode.","operationId":"get_flywheel_config_api_v1_flywheel_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelConfigResponse"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["Flywheel"],"summary":"Update Flywheel Config","description":"Toggle the global flywheel enabled/disabled config. Requires god_mode.","operationId":"update_flywheel_config_api_v1_flywheel_config_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelConfigUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/flywheel/trigger":{"post":{"tags":["Flywheel"],"summary":"Trigger Flywheel Eval","description":"Fire-and-forget trigger for flywheel grounding eval.\n\nCalled by the CLI after workflow completion. Spawns a Hatchet workflow\n(flywheel_grounding_eval) that runs in the cognisim_action worker with\nparallel eval_step child workflows.","operationId":"trigger_flywheel_eval_api_v1_flywheel_trigger_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelTriggerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelTriggerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/flywheel/eval-queue":{"get":{"tags":["Flywheel"],"summary":"Get Eval Queue","description":"List grounding eval results for the annotation queue.\n\nDefaults to showing pending and in_progress items, sorted by created_at DESC.\nRequires god_mode permission.","operationId":"get_eval_queue_api_v1_flywheel_eval_queue_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"review_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by review_status (pending, in_progress, reviewed, dismissed)","title":"Review Status"},"description":"Filter by review_status (pending, in_progress, reviewed, dismissed)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalQueueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flywheel/eval-results":{"delete":{"tags":["Flywheel"],"summary":"Delete Eval Results","description":"Bulk-delete eval results by id. Requires god_mode permission.","operationId":"delete_eval_results_api_v1_flywheel_eval_results_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteEvalResultsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteEvalResultsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/flywheel/monitor":{"get":{"tags":["Flywheel"],"summary":"Get Monitor","description":"Aggregate grounding error monitor.\n\nReturns KPIs, trend comparison with previous period, judge/platform/grounder\nbreakdowns, and daily timeseries for charting.\nRequires god_mode permission.","operationId":"get_monitor_api_v1_flywheel_monitor_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"description":"Time window in hours (default 7d)","default":168,"title":"Hours"},"description":"Time window in hours (default 7d)"},{"name":"timeseries_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Days of timeseries data","default":14,"title":"Timeseries Days"},"description":"Days of timeseries data"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelMonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flywheel/eval-results/{eval_id}":{"get":{"tags":["Flywheel"],"summary":"Get Eval Result","description":"Get a single eval result with full step_results.\n\nReturns the full flywheel_eval_results row including step-level detail.\nRegenerates fresh presigned S3 URLs for images from the manifest.\nRequires god_mode permission.","operationId":"get_eval_result_api_v1_flywheel_eval_results__eval_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eval_id","in":"path","required":true,"schema":{"type":"string","title":"Eval Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelEvalResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flywheel/eval-results/{eval_id}/steps/{step_id}/dismiss":{"patch":{"tags":["Flywheel"],"summary":"Dismiss Step","description":"Dismiss a step as a false positive.\n\nAtomically updates the step in step_results JSONB and increments false_positive_count.\nRequires god_mode permission.","operationId":"dismiss_step_api_v1_flywheel_eval_results__eval_id__steps__step_id__dismiss_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eval_id","in":"path","required":true,"schema":{"type":"string","title":"Eval Id"}},{"name":"step_id","in":"path","required":true,"schema":{"type":"string","title":"Step Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flywheel/eval-results/{eval_id}/steps/{step_id}/annotated":{"patch":{"tags":["Flywheel"],"summary":"Mark Step Annotated","description":"Mark a step as annotated (after GroundingReportModal submission).\n\nAtomically updates the step in step_results JSONB and increments annotated_count.\nRequires god_mode permission.","operationId":"mark_step_annotated_api_v1_flywheel_eval_results__eval_id__steps__step_id__annotated_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eval_id","in":"path","required":true,"schema":{"type":"string","title":"Eval Id"}},{"name":"step_id","in":"path","required":true,"schema":{"type":"string","title":"Step Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flywheel/eval-results/{eval_id}/complete-review":{"patch":{"tags":["Flywheel"],"summary":"Complete Review","description":"Mark an eval result as fully reviewed.\n\nSets review_status='reviewed', reviewed_at=now(), reviewed_by=user_id.\nRequires god_mode permission.","operationId":"complete_review_api_v1_flywheel_eval_results__eval_id__complete_review_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eval_id","in":"path","required":true,"schema":{"type":"string","title":"Eval Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/flywheel/internal/load-steps":{"post":{"tags":["Flywheel Internal"],"summary":"Load Steps","description":"Load a test report and filter to grounding-applicable steps.\n\nReturns serialized StepEvalInput[] ready for eval_step child workflows.\nCalled by the flywheel_grounding_eval Hatchet workflow.","operationId":"load_steps_api_v1_flywheel_internal_load_steps_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelLoadStepsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelLoadStepsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/flywheel/internal/store-results":{"post":{"tags":["Flywheel Internal"],"summary":"Store Results","description":"Store flywheel eval results into the database.\n\nCalled by the flywheel_grounding_eval Hatchet workflow after evaluation.","operationId":"store_results_api_v1_flywheel_internal_store_results_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelStoreResultsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlywheelStoreResultsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/onboarding/status":{"get":{"tags":["Onboarding"],"summary":"Get Onboarding Status","description":"Check org provisioning status and user tour state.","operationId":"get_onboarding_status_api_v1_onboarding_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingStatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/onboarding/provision":{"post":{"tags":["Onboarding"],"summary":"Provision Org","description":"Trigger demo data creation for the org. Idempotent -- calling twice\nreturns the existing resources without creating duplicates.","operationId":"provision_org_api_v1_onboarding_provision_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/onboarding/tour-complete":{"post":{"tags":["Onboarding"],"summary":"Complete Tour","description":"Mark the current user's tour as completed.","operationId":"complete_tour_api_v1_onboarding_tour_complete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TourResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/onboarding/tour-reset":{"post":{"tags":["Onboarding"],"summary":"Reset Tour","description":"Reset tour for the current user so they can re-take it.","operationId":"reset_tour_api_v1_onboarding_tour_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TourResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/onboarding/tour-skip":{"post":{"tags":["Onboarding"],"summary":"Skip Tour","description":"Mark the tour as skipped (dismisses welcome modal without starting tour).","operationId":"skip_tour_api_v1_onboarding_tour_skip_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TourResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/waitlist/join":{"post":{"tags":["Waitlist"],"summary":"Join Waitlist","description":"Add a user to the waitlist. No authentication required.","operationId":"join_waitlist_api_v1_waitlist_join_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistJoinRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistJoinResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/files/upload-url":{"post":{"tags":["Org Files","Org Files"],"summary":"Get Upload Url","description":"Generate a presigned S3 upload URL and create the file record.\n\nThe client should PUT the file directly to the returned URL.","operationId":"get_upload_url_api_v1_files_upload_url_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFileUploadRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFileUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/files/":{"get":{"tags":["Org Files","Org Files"],"summary":"List Org Files","description":"List all files for the authenticated user's org.","operationId":"list_org_files_api_v1_files__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFileListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/files/check_exists":{"get":{"tags":["Org Files","Org Files"],"summary":"Check File Exists","description":"Check if a file with the given name exists in the organization.","operationId":"check_file_exists_api_v1_files_check_exists_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Filename to check","title":"Name"},"description":"Filename to check"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckFileExistsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/files/{file_id}/download-url":{"get":{"tags":["Org Files","Org Files"],"summary":"Get File Download Url","description":"Generate a presigned download URL for an org file.","operationId":"get_file_download_url_api_v1_files__file_id__download_url_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFileDownloadUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/files/{file_id}":{"put":{"tags":["Org Files","Org Files"],"summary":"Update Org File","description":"Update file name and/or description.","operationId":"update_org_file_api_v1_files__file_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"File Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Org Files","Org Files"],"summary":"Delete Org File","description":"Delete a file from S3 and the database (works on both pending and ready files).","operationId":"delete_org_file_api_v1_files__file_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"File Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/files/{file_id}/replace-url":{"put":{"tags":["Org Files","Org Files"],"summary":"Get Replace Url","description":"Generate a presigned URL to replace an existing file's content.\n\nPreserves the file ID so references (e.g. revyl-file://) remain valid.\nThe DB record is NOT modified here — it stays unchanged until the\nclient confirms the upload via POST /{file_id}/complete-upload.","operationId":"get_replace_url_api_v1_files__file_id__replace_url_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"File Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFileUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFileUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/files/{file_id}/complete-upload":{"post":{"tags":["Org Files","Org Files"],"summary":"Complete Upload","description":"Confirm that an S3 upload completed successfully.\n\nFor new uploads: flips status from 'pending' to 'ready'.\nFor replacements: updates s3_key/filename/size and keeps status 'ready'.","operationId":"complete_upload_api_v1_files__file_id__complete_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"File Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFileCompleteUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgFile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/android-task-count":{"get":{"tags":["internal"],"summary":"Get Android Task Count","description":"Get running and queued Android task counts for KEDA scaling.\n\nThis endpoint is called by KEDA's metrics-api trigger to determine how\nmany Android worker pods should be running. It aggregates counts from\nboth durable (interactive/live session) and headless (test execution)\nworkflows.\n\nArgs:\n env: The environment to get task counts for (staging or production).\n auth_info: Authentication info (requires service or admin access).\n\nReturns:\n AndroidTaskCountResponse: Task counts broken down by workflow type.\n\nRaises:\n HTTPException: If auth fails or there's an error fetching counts.","operationId":"get_android_task_count_internal_android_task_count_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"env","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Environment","description":"Environment to get counts for"},"description":"Environment to get counts for"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AndroidTaskCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/system-apps":{"get":{"tags":["internal"],"summary":"Get All System Apps","description":"Get all system apps for both iOS and Android platforms.\n\nReturns:\n AllSystemAppsResponse: System apps for both platforms.","operationId":"get_all_system_apps_api_v1_system_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllSystemAppsResponse"}}}}}}},"/api/v1/system-apps/{platform}":{"get":{"tags":["internal"],"summary":"Get System Apps By Platform","description":"Get system apps for a specific platform.\n\nArgs:\n platform: Platform identifier ('ios' or 'android').\n\nReturns:\n SystemAppsResponse: System apps for the specified platform.\n\nRaises:\n HTTPException: If platform is not 'ios' or 'android'.","operationId":"get_system_apps_by_platform_api_v1_system_apps__platform__get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemAppsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health_check":{"get":{"summary":"Health Check","description":"Simple health check endpoint that returns OK if the service is running","operationId":"health_check_health_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckResponse"}}}}}}},"/test_tracing":{"get":{"summary":"Test Tracing","description":"Test endpoint to verify OpenTelemetry tracing and log correlation is working.\nReturns the current trace ID if tracing is active.\n\nThis endpoint demonstrates:\n- Trace/span ID capture\n- Semantic conventions usage\n- Log correlation with traces\n- Execution context propagation","operationId":"test_tracing_test_tracing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/workflow_monitor_types":{"get":{"summary":"Workflow Monitor Types","description":"Get the types for the workflow monitor","operationId":"workflow_monitor_types_workflow_monitor_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OrgWorkflowMonitorItem"},{"$ref":"#/components/schemas/OrgWorkflowMonitorState"},{"$ref":"#/components/schemas/OrgTestMonitorItem"},{"$ref":"#/components/schemas/CompletedTestData"}],"title":"Response Workflow Monitor Types Workflow Monitor Types Get"}}}}}}}},"components":{"schemas":{"AICodeGenerationDataPoint":{"properties":{"date":{"type":"string","title":"Date"},"totalAdditions":{"type":"integer","title":"Totaladditions"},"totalDeletions":{"type":"integer","title":"Totaldeletions"},"aiAdditions":{"type":"integer","title":"Aiadditions"},"aiDeletions":{"type":"integer","title":"Aideletions"},"aiAdditionPercentage":{"type":"number","title":"Aiadditionpercentage"},"aiDeletionPercentage":{"type":"number","title":"Aideletionpercentage"}},"type":"object","required":["date","totalAdditions","totalDeletions","aiAdditions","aiDeletions","aiAdditionPercentage","aiDeletionPercentage"],"title":"AICodeGenerationDataPoint"},"AICodeGenerationResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"data":{"items":{"$ref":"#/components/schemas/AICodeGenerationDataPoint"},"type":"array","title":"Data"},"summary":{"$ref":"#/components/schemas/AICodeGenerationSummary"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","data","summary","retrieved_at"],"title":"AICodeGenerationResponse"},"AICodeGenerationSummary":{"properties":{"totalAiAdditions":{"type":"integer","title":"Totalaiadditions"},"totalAiDeletions":{"type":"integer","title":"Totalaideletions"},"averageAiPercentage":{"type":"number","title":"Averageaipercentage"},"trend":{"type":"string","title":"Trend"}},"type":"object","required":["totalAiAdditions","totalAiDeletions","averageAiPercentage","trend"],"title":"AICodeGenerationSummary"},"AIEffectivenessDataPoint":{"properties":{"developer":{"type":"string","title":"Developer"},"aiUsage":{"type":"integer","title":"Aiusage"},"codeOutput":{"type":"number","title":"Codeoutput"},"aiAcceptanceRate":{"type":"number","title":"Aiacceptancerate"},"totalLines":{"type":"integer","title":"Totallines"}},"type":"object","required":["developer","aiUsage","codeOutput","aiAcceptanceRate","totalLines"],"title":"AIEffectivenessDataPoint"},"AIEffectivenessResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"data":{"items":{"$ref":"#/components/schemas/AIEffectivenessDataPoint"},"type":"array","title":"Data"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","data","retrieved_at"],"title":"AIEffectivenessResponse"},"AIMetric":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"value":{"type":"number","title":"Value"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"percentage_change":{"type":"number","title":"Percentage Change"},"period":{"type":"string","title":"Period"}},"type":"object","required":["id","title","value","percentage_change","period"],"title":"AIMetric"},"AIUsageMetricsResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"metrics":{"items":{"$ref":"#/components/schemas/AIMetric"},"type":"array","title":"Metrics"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","metrics","retrieved_at"],"title":"AIUsageMetricsResponse"},"AIUsageOverTimeResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"data":{"items":{"$ref":"#/components/schemas/AIUsageTimeSeriesDataPoint"},"type":"array","title":"Data"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","data","retrieved_at"],"title":"AIUsageOverTimeResponse"},"AIUsageTimeSeriesDataPoint":{"properties":{"date":{"type":"string","title":"Date"},"aiLinesAdded":{"type":"integer","title":"Ailinesadded"},"aiLinesDeleted":{"type":"integer","title":"Ailinesdeleted"},"normalizedOutput":{"type":"number","title":"Normalizedoutput"},"aiAcceptanceRate":{"type":"number","title":"Aiacceptancerate"}},"type":"object","required":["date","aiLinesAdded","aiLinesDeleted","normalizedOutput","aiAcceptanceRate"],"title":"AIUsageTimeSeriesDataPoint"},"ActionBlock":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for the block (auto-generated if not provided)"},"type":{"type":"string","enum":["instructions","extraction","manual","validation","code_execution","module_import"],"title":"Type","description":"Must be one of: instructions, extraction, manual, validation, code_execution, module_import"},"step_type":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/StepType"},{"type":"null"}],"title":"Step Type","description":"Type of step action (inferred when omitted)"},"step_description":{"type":"string","title":"Step Description","description":"Description of the step"},"variable_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Name","description":"Name of the variable captured by extraction blocks"},"module_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Module Id","description":"ID of the module to import (for module_import blocks)"}},"type":"object","required":["type","step_description"],"title":"ActionBlock","description":"Block for actions (instructions, extraction, manual, validation, code_execution, module_import)."},"ActionRange":{"properties":{"start":{"type":"integer","title":"Start","description":"Inclusive start action_index"},"end":{"type":"integer","title":"End","description":"Inclusive end action_index"}},"type":"object","required":["start","end"],"title":"ActionRange","description":"A contiguous range of source action indices."},"ActionStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"step_index":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Index"},"eval_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eval Id"}},"type":"object","required":["status"],"title":"ActionStatusResponse","description":"Response model for step action endpoints (dismiss, annotate, review)."},"ActiveDeviceSessionCountResponse":{"properties":{"count":{"type":"integer","title":"Count"},"org_id":{"type":"string","title":"Org Id"}},"type":"object","required":["count","org_id"],"title":"ActiveDeviceSessionCountResponse","description":"Response model for active device session count."},"ActiveDeviceSessionItem":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"source":{"type":"string","title":"Source"},"platform":{"type":"string","title":"Platform"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"status":{"type":"string","title":"Status"},"whep_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whep Url"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"has_test_execution":{"type":"boolean","title":"Has Test Execution","default":false},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"screen_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Width"},"screen_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Height"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Package"},"last_activity_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Activity At"},"idle_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Idle Timeout Seconds"},"can_interact":{"type":"boolean","title":"Can Interact","default":false},"can_cancel":{"type":"boolean","title":"Can Cancel","default":false},"interaction_disabled_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interaction Disabled Reason"}},"type":"object","required":["id","org_id","source","platform","status"],"title":"ActiveDeviceSessionItem","description":"Response model for a single active device session."},"ActiveDeviceSessionsResponse":{"properties":{"sessions":{"items":{"$ref":"#/components/schemas/ActiveDeviceSessionItem"},"type":"array","title":"Sessions"},"org_id":{"type":"string","title":"Org Id"},"concurrency_limit":{"type":"integer","title":"Concurrency Limit","default":1}},"type":"object","required":["sessions","org_id"],"title":"ActiveDeviceSessionsResponse","description":"Response model for list of active device sessions."},"ActiveTestCountResponse":{"properties":{"count":{"type":"integer","title":"Count"},"org_id":{"type":"string","title":"Org Id"}},"type":"object","required":["count","org_id"],"title":"ActiveTestCountResponse","description":"Response model for active test count endpoint."},"ActiveUser":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"session_count":{"type":"integer","title":"Session Count","default":0},"completed":{"type":"integer","title":"Completed","default":0},"failed":{"type":"integer","title":"Failed","default":0},"pass_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Rate"},"last_active":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Active"},"device_minutes":{"type":"number","title":"Device Minutes","default":0},"surfaces":{"items":{"type":"string"},"type":"array","title":"Surfaces"},"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms"}},"type":"object","required":["user_id"],"title":"ActiveUser"},"ActivityResponse":{"properties":{"total_device_minutes":{"type":"number","title":"Total Device Minutes"},"device_time_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Device Time Wow"},"ios_minutes":{"type":"number","title":"Ios Minutes"},"android_minutes":{"type":"number","title":"Android Minutes"},"sessions_today":{"type":"integer","title":"Sessions Today"},"sessions_yesterday":{"type":"integer","title":"Sessions Yesterday"},"active_users_7d":{"type":"integer","title":"Active Users 7D"},"user_activity":{"items":{"$ref":"#/components/schemas/UserActivityItem"},"type":"array","title":"User Activity"},"daily_activity":{"items":{"$ref":"#/components/schemas/DailyActivityPoint"},"type":"array","title":"Daily Activity"},"org_id":{"type":"string","title":"Org Id"}},"type":"object","required":["total_device_minutes","ios_minutes","android_minutes","sessions_today","sessions_yesterday","active_users_7d","user_activity","daily_activity","org_id"],"title":"ActivityResponse","description":"Aggregate activity metrics for the team pulse view."},"AddWorkflowToRuleResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"rule":{"$ref":"#/components/schemas/SlackNotificationRuleWithWorkflows"}},"type":"object","required":["success","rule"],"title":"AddWorkflowToRuleResponse","description":"Response after adding a workflow to a rule."},"AdminDashboardSummary":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"time_window_hours":{"type":"integer","title":"Time Window Hours"},"workflows":{"$ref":"#/components/schemas/AdminSummaryMetric"},"tests":{"$ref":"#/components/schemas/AdminSummaryMetric"},"test_platforms":{"items":{"$ref":"#/components/schemas/AdminMetricBreakdown"},"type":"array","title":"Test Platforms"}},"type":"object","required":["generated_at","time_window_hours","workflows","tests","test_platforms"],"title":"AdminDashboardSummary"},"AdminKPIMetrics":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"time_window_hours":{"type":"integer","title":"Time Window Hours"},"total_workflows_run":{"type":"integer","title":"Total Workflows Run"},"total_tests_run":{"type":"integer","title":"Total Tests Run"},"overall_success_rate":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Overall Success Rate"},"workflow_success_rate":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Workflow Success Rate"},"avg_workflow_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Workflow Duration Seconds"},"workflows_in_progress":{"type":"integer","title":"Workflows In Progress"},"workflows_queued":{"type":"integer","title":"Workflows Queued"},"test_success_rate":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Test Success Rate"},"avg_test_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Test Duration Seconds"},"tests_in_progress":{"type":"integer","title":"Tests In Progress"},"tests_queued":{"type":"integer","title":"Tests Queued"},"platform_distribution":{"items":{"$ref":"#/components/schemas/AdminMetricBreakdown"},"type":"array","title":"Platform Distribution"},"top_failing_tests":{"items":{"$ref":"#/components/schemas/AdminMetricBreakdown"},"type":"array","title":"Top Failing Tests"},"active_orgs_count":{"type":"integer","title":"Active Orgs Count"},"total_unique_users":{"type":"integer","title":"Total Unique Users"},"workflow_trend":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Workflow Trend"},"test_trend":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Test Trend"},"success_rate_trend":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Success Rate Trend"},"peak_concurrent_workflows":{"type":"integer","title":"Peak Concurrent Workflows"},"peak_concurrent_tests":{"type":"integer","title":"Peak Concurrent Tests"},"most_common_error_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Most Common Error Type"},"error_rate":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Error Rate"}},"type":"object","required":["generated_at","time_window_hours","total_workflows_run","total_tests_run","overall_success_rate","workflow_success_rate","workflows_in_progress","workflows_queued","test_success_rate","tests_in_progress","tests_queued","platform_distribution","top_failing_tests","active_orgs_count","total_unique_users","peak_concurrent_workflows","peak_concurrent_tests","error_rate"],"title":"AdminKPIMetrics","description":"Quick KPI metrics for dashboard display."},"AdminMetricBreakdown":{"properties":{"label":{"type":"string","title":"Label"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["label","count"],"title":"AdminMetricBreakdown"},"AdminOrg":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"legacy_org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legacy Org Id"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}},"type":"object","required":["id"],"title":"AdminOrg"},"AdminOrgActivity":{"properties":{"org_id":{"type":"string","title":"Org Id"},"workflow_execution_ids":{"items":{"type":"string"},"type":"array","title":"Workflow Execution Ids","description":"Workflow execution IDs (was workflow_task_ids)"},"workflow_ids":{"items":{"type":"string"},"type":"array","title":"Workflow Ids"},"test_execution_ids":{"items":{"type":"string"},"type":"array","title":"Test Execution Ids","description":"Test execution IDs (was test_task_ids)"},"orphan_test_ids":{"items":{"type":"string"},"type":"array","title":"Orphan Test Ids"},"active_workflow_count":{"type":"integer","title":"Active Workflow Count"},"active_test_count":{"type":"integer","title":"Active Test Count"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["org_id","workflow_ids","orphan_test_ids","active_workflow_count","active_test_count","updated_at"],"title":"AdminOrgActivity"},"AdminOrgActivityList":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"items":{"items":{"$ref":"#/components/schemas/AdminOrgActivity"},"type":"array","title":"Items"}},"type":"object","required":["generated_at","items"],"title":"AdminOrgActivityList"},"AdminOrgList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminOrg"},"type":"array","title":"Items"},"page_number":{"type":"integer","title":"Page Number"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"has_more":{"type":"boolean","title":"Has More","default":false},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count"}},"type":"object","required":["items","page_number"],"title":"AdminOrgList"},"AdminSummaryMetric":{"properties":{"total":{"type":"integer","title":"Total"},"success":{"type":"integer","title":"Success"},"failed":{"type":"integer","title":"Failed"},"cancelled":{"type":"integer","title":"Cancelled"},"running":{"type":"integer","title":"Running"},"queued":{"type":"integer","title":"Queued"},"other":{"type":"integer","title":"Other"},"success_rate":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Success Rate"}},"type":"object","required":["total","success","failed","cancelled","running","queued","other","success_rate"],"title":"AdminSummaryMetric"},"AdminTestDefinition":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"deleted":{"type":"boolean","title":"Deleted","default":false}},"type":"object","required":["id","name"],"title":"AdminTestDefinition","description":"Test definition for admin view.\n\nAttributes:\n id: Test UUID.\n name: Test name.\n platform: Test platform (ios, android).\n org_id: Organization ID.\n owner: Owner user ID.\n created_at: Test creation timestamp.\n updated_at: Test update timestamp.\n app_id: Associated app ID.\n deleted: Soft delete flag."},"AdminTestExecution":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Execution ID"},"test_id":{"type":"string","title":"Test Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Execution source: ui, cli, api, ci_cd, or workflow (was user_id)"},"status":{"type":"string","title":"Status"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"current_step_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Step Index"},"total_steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Steps"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"workflow_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Task Id","description":"Parent workflow execution ID"},"test_history_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test History Id"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["task_id","test_id","status"],"title":"AdminTestExecution","description":"Test execution data for admin dashboard."},"AdminTestExecutionList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminTestExecution"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"AdminTestExecutionList"},"AdminTestListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminTestDefinition"},"type":"array","title":"Items"},"total_count":{"type":"integer","title":"Total Count"},"org_id":{"type":"string","title":"Org Id"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"}},"type":"object","required":["items","total_count","org_id"],"title":"AdminTestListResponse","description":"Response model for admin test list endpoint.\n\nAttributes:\n items: List of test definitions.\n total_count: Total number of tests matching the query.\n org_id: Organization ID for the query.\n org_name: Organization name (if available)."},"AdminWorkflowDefinition":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"},"tests":{"items":{"type":"string"},"type":"array","title":"Tests"},"test_count":{"type":"integer","title":"Test Count","default":0},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"schedule_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Schedule Enabled"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"deleted":{"type":"boolean","title":"Deleted","default":false}},"type":"object","required":["id","name"],"title":"AdminWorkflowDefinition","description":"Workflow definition for admin view.\n\nAttributes:\n id: Workflow UUID.\n name: Workflow name.\n org_id: Organization ID.\n owner: Owner user ID.\n tests: List of test IDs in the workflow.\n test_count: Number of tests in the workflow.\n schedule: Cron schedule string (if any).\n schedule_enabled: Whether schedule is active.\n created_at: Workflow creation timestamp.\n updated_at: Workflow update timestamp.\n deleted: Soft delete flag."},"AdminWorkflowListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminWorkflowDefinition"},"type":"array","title":"Items"},"total_count":{"type":"integer","title":"Total Count"},"org_id":{"type":"string","title":"Org Id"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"}},"type":"object","required":["items","total_count","org_id"],"title":"AdminWorkflowListResponse","description":"Response model for admin workflow list endpoint.\n\nAttributes:\n items: List of workflow definitions.\n total_count: Total number of workflows matching the query.\n org_id: Organization ID for the query.\n org_name: Organization name (if available)."},"AdminWorkflowTask":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Execution ID"},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id"},"workflow_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Name"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Execution source: ui, cli, api, ci_cd, or workflow (was user_id)"},"status":{"type":"string","title":"Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"total_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tests"},"completed_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completed Tests"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"concurrency_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Concurrency Limit"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress","description":"0-1 progress ratio"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","required":["task_id","status"],"title":"AdminWorkflowTask","description":"Workflow task data for admin dashboard."},"AdminWorkflowTaskList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminWorkflowTask"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"AdminWorkflowTaskList"},"AllPlatformTargets":{"properties":{"platforms":{"additionalProperties":{"$ref":"#/components/schemas/PlatformTargetConfig"},"type":"object","title":"Platforms","description":"Keyed by lowercase platform name"}},"type":"object","required":["platforms"],"title":"AllPlatformTargets","description":"Device target configs for every supported platform."},"AllSystemAppsResponse":{"properties":{"ios":{"additionalProperties":{"$ref":"#/components/schemas/SystemApp"},"type":"object","title":"Ios","description":"iOS system apps"},"android":{"additionalProperties":{"$ref":"#/components/schemas/SystemApp"},"type":"object","title":"Android","description":"Android system apps"}},"type":"object","required":["ios","android"],"title":"AllSystemAppsResponse","description":"Response model for all system apps across platforms."},"AndroidTaskCountResponse":{"properties":{"all":{"$ref":"#/components/schemas/TaskCount","description":"Aggregated counts across all workflow types"},"live_sessions":{"$ref":"#/components/schemas/TaskCount","description":"Counts for durable (interactive) workflows"},"test_executions":{"$ref":"#/components/schemas/TaskCount","description":"Counts for headless test execution workflows"},"environment":{"type":"string","title":"Environment","description":"Environment identifier"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Timestamp of the count"}},"type":"object","required":["all","live_sessions","test_executions","environment","timestamp"],"title":"AndroidTaskCountResponse","description":"Response model for Android task count endpoint.\n\nUsed by KEDA to determine scaling decisions for GKE Android worker pods.\n\nAttributes:\n all: Aggregated counts across all workflow types.\n live_sessions: Counts for durable (interactive) workflows.\n test_executions: Counts for headless test execution workflows.\n environment: The environment these counts are for.\n timestamp: When this count was taken."},"AppBinaryDeleteRequest":{"properties":{"id":{"type":"string","title":"Id","description":"Test ID whose app binary should be deleted"}},"type":"object","required":["id"],"title":"AppBinaryDeleteRequest","description":"Request model for deleting an app binary file."},"AppBinaryDownloadRequest":{"properties":{"id":{"type":"string","title":"Id","description":"Test id for which to fetch the app binary download url"}},"type":"object","required":["id"],"title":"AppBinaryDownloadRequest","description":"Request model for generating a presigned download url for an app binary file"},"AppBinaryDownloadResponse":{"properties":{"download_url":{"type":"string","title":"Download Url","description":"Presigned download url for the app binary file"},"expires_at":{"type":"integer","title":"Expires At","description":"Timestamp (unix) when the download url expires"}},"type":"object","required":["download_url","expires_at"],"title":"AppBinaryDownloadResponse","description":"Response model for a presigned download url for an app binary file"},"AppBinaryUploadRequest":{"properties":{"id":{"type":"string","title":"Id"},"file_name":{"type":"string","title":"File Name"}},"type":"object","required":["id","file_name"],"title":"AppBinaryUploadRequest"},"AppBinaryUploadResponseWithPackageId":{"properties":{"upload_url":{"type":"string","title":"Upload Url"},"expires_at":{"type":"integer","title":"Expires At"},"content_type":{"type":"string","title":"Content Type"},"download_url":{"type":"string","title":"Download Url"},"package_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Id","description":"Extracted package identifier (bundle ID for iOS, package name for Android)"}},"type":"object","required":["upload_url","expires_at","content_type","download_url"],"title":"AppBinaryUploadResponseWithPackageId","description":"Extended response that includes extracted package ID"},"AppBuildHealthItem":{"properties":{"build_id":{"type":"string","title":"Build Id"},"version":{"type":"string","title":"Version"},"uploaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Uploaded At"},"observed_tests":{"type":"integer","title":"Observed Tests","default":0},"passed_tests":{"type":"integer","title":"Passed Tests","default":0},"failed_tests":{"type":"integer","title":"Failed Tests","default":0},"coverage_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coverage Rate"},"exact_runs":{"type":"integer","title":"Exact Runs","default":0},"completed_runs":{"type":"integer","title":"Completed Runs","default":0},"passed_runs":{"type":"integer","title":"Passed Runs","default":0},"failed_runs":{"type":"integer","title":"Failed Runs","default":0},"pass_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Rate"}},"type":"object","required":["build_id","version"],"title":"AppBuildHealthItem"},"AppCoverageItem":{"properties":{"test_id":{"type":"string","title":"Test Id"},"test_name":{"type":"string","title":"Test Name"},"pinned_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Version"},"target_build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Build Version"},"relationship":{"type":"string","title":"Relationship"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"},"last_execution_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Execution Time"},"last_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Execution Id"},"last_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Duration Seconds"},"last_observed_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Observed Build Id"},"last_observed_build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Observed Build Version"}},"type":"object","required":["test_id","test_name","relationship"],"title":"AppCoverageItem"},"AppCoverageResponse":{"properties":{"app_id":{"type":"string","title":"App Id"},"current_build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Build Version"},"latest_build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Build Version"},"total":{"type":"integer","title":"Total","default":0},"items":{"items":{"$ref":"#/components/schemas/AppCoverageItem"},"type":"array","title":"Items"}},"type":"object","required":["app_id"],"title":"AppCoverageResponse"},"AppCreateRequest":{"properties":{"name":{"type":"string","title":"Name","description":"App name (e.g., 'iOS-Prod', 'Android-Staging')"},"platform":{"$ref":"#/components/schemas/AppPlatform","description":"Platform type: iOS or Android"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description"}},"type":"object","required":["name","platform"],"title":"AppCreateRequest","description":"Request model for creating an app."},"AppExecutionTrendPoint":{"properties":{"date":{"type":"string","title":"Date"},"executions":{"type":"integer","title":"Executions","default":0},"passed":{"type":"integer","title":"Passed","default":0},"failed":{"type":"integer","title":"Failed","default":0}},"type":"object","required":["date"],"title":"AppExecutionTrendPoint"},"AppLaunchEnvVarDecryptedRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Unique identifier of the env var"},"test_id":{"type":"string","format":"uuid","title":"Test Id","description":"Test ID associated with the env var"},"key":{"type":"string","title":"Key","description":"Environment variable key"},"value":{"type":"string","title":"Value","description":"Decrypted environment variable value"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Update timestamp"}},"type":"object","required":["id","test_id","key","value"],"title":"AppLaunchEnvVarDecryptedRow","description":"Decrypted app launch environment variable for client use"},"AppLaunchEnvVarModel":{"properties":{"test_id":{"type":"string","title":"Test Id","description":"Test ID associated with the env var"},"key":{"type":"string","title":"Key","description":"Environment variable key"},"value":{"type":"string","title":"Value","description":"Environment variable value (will be encrypted)"}},"type":"object","required":["test_id","key","value"],"title":"AppLaunchEnvVarModel","description":"Model for app launch environment variable"},"AppLaunchEnvVarResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Response message"},"result":{"$ref":"#/components/schemas/AppLaunchEnvVarDecryptedRow","description":"Env var record"}},"type":"object","required":["message","result"],"title":"AppLaunchEnvVarResponse","description":"Response model for single env var operations"},"AppLaunchEnvVarsResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Response message"},"result":{"items":{"$ref":"#/components/schemas/AppLaunchEnvVarDecryptedRow"},"type":"array","title":"Result","description":"List of env var records"}},"type":"object","required":["message","result"],"title":"AppLaunchEnvVarsResponse","description":"Response model for env var list operations"},"AppPlatform":{"type":"string","enum":["iOS","Android"],"title":"AppPlatform","description":"Platform types for apps."},"AppPlatformCounts":{"properties":{"total":{"type":"integer","title":"Total","description":"Total number of apps across all platforms","default":0},"ios":{"type":"integer","title":"Ios","description":"Number of iOS apps","default":0},"android":{"type":"integer","title":"Android","description":"Number of Android apps","default":0}},"type":"object","title":"AppPlatformCounts","description":"Per-platform app counts."},"AppResponse":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"org_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"static_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Static Url"},"current_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Version"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"latest_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Version"},"versions_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Versions Count","default":0},"latest_build_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Latest Build Id"},"current_build_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Current Build Id"},"attached_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Attached Tests","default":0},"pinned_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pinned Tests","default":0},"recent_executions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recent Executions","default":0},"rolling_pass_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rolling Pass Rate"},"attribution_ready":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attribution Ready","default":false}},"type":"object","title":"AppResponse","description":"Response model for an app."},"AppUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"App name"},"static_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Static Url","description":"Static URL for legacy web builds"},"current_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Version","description":"Current version pointer"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Description"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt","description":"App-level system prompt injected into LLM calls"}},"type":"object","title":"AppUpdateRequest","description":"Request model for updating an app."},"AppUsageResponse":{"properties":{"tests":{"items":{"$ref":"#/components/schemas/AppUsageTestItem"},"type":"array","title":"Tests"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["tests","total"],"title":"AppUsageResponse"},"AppUsageTestItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"pinned_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Version"}},"type":"object","required":["id","name"],"title":"AppUsageTestItem"},"AppWorkspaceResponse":{"properties":{"app":{"$ref":"#/components/schemas/AppResponse"},"current_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Build Id"},"current_build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Build Version"},"latest_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Build Id"},"latest_build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Build Version"},"attached_tests":{"type":"integer","title":"Attached Tests","default":0},"pinned_tests":{"type":"integer","title":"Pinned Tests","default":0},"recent_executions":{"type":"integer","title":"Recent Executions","default":0},"rolling_pass_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rolling Pass Rate"},"attribution_ready":{"type":"boolean","title":"Attribution Ready","default":false},"execution_trend":{"items":{"$ref":"#/components/schemas/AppExecutionTrendPoint"},"type":"array","title":"Execution Trend"},"build_health":{"items":{"$ref":"#/components/schemas/AppBuildHealthItem"},"type":"array","title":"Build Health"}},"type":"object","required":["app"],"title":"AppWorkspaceResponse"},"AssignSeatsRequest":{"properties":{"user_assignments":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"User Assignments"}},"type":"object","required":["user_assignments"],"title":"AssignSeatsRequest"},"AssignSeatsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"assigned_count":{"type":"integer","title":"Assigned Count"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","assigned_count","message"],"title":"AssignSeatsResponse"},"AsyncStatus":{"type":"string","enum":["initialized","failed","queued","running","completed","cancelled","initializing"],"title":"AsyncStatus"},"AuthInfo":{"properties":{"user_id":{"type":"string","title":"User Id"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"service":{"type":"boolean","title":"Service","default":false},"concurrency_limit":{"type":"integer","title":"Concurrency Limit","default":3},"proxy_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Proxy Enabled"},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"},"user_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Role"},"billing_exempt":{"type":"boolean","title":"Billing Exempt","default":false}},"type":"object","required":["user_id"],"title":"AuthInfo","description":"Class that represents authentication information.\nCan be returned from the require_auth dependency."},"BackfillJobInfo":{"properties":{"job_id":{"type":"string","title":"Job Id"},"repo":{"type":"string","title":"Repo"},"github_logins":{"items":{"type":"string"},"type":"array","title":"Github Logins"}},"type":"object","required":["job_id","repo","github_logins"],"title":"BackfillJobInfo","description":"Information about a single backfill job."},"BackfillRequest":{"properties":{"owner":{"type":"string","title":"Owner"},"github_logins":{"items":{"type":"string"},"type":"array","title":"Github Logins"}},"type":"object","required":["owner","github_logins"],"title":"BackfillRequest","description":"Request model for backfill endpoint."},"BackfillResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"filtered_users":{"items":{"type":"string"},"type":"array","title":"Filtered Users"},"unauthorized_users":{"items":{"type":"string"},"type":"array","title":"Unauthorized Users"},"repos_to_backfill":{"items":{"type":"string"},"type":"array","title":"Repos To Backfill"},"backfill_jobs":{"items":{"$ref":"#/components/schemas/BackfillJobInfo"},"type":"array","title":"Backfill Jobs"}},"type":"object","required":["status","message","filtered_users","unauthorized_users","repos_to_backfill","backfill_jobs"],"title":"BackfillResponse","description":"Response model for backfill endpoint."},"BackfillStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["job_id","status"],"title":"BackfillStatusResponse"},"BackfillSummary":{"properties":{"total_jobs":{"type":"integer","title":"Total Jobs"},"completed_jobs":{"type":"integer","title":"Completed Jobs"},"in_progress_jobs":{"type":"integer","title":"In Progress Jobs"},"failed_jobs":{"type":"integer","title":"Failed Jobs"},"overall_status":{"type":"string","title":"Overall Status"}},"type":"object","required":["total_jobs","completed_jobs","in_progress_jobs","failed_jobs","overall_status"],"title":"BackfillSummary"},"BackfillTaskResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"job_id":{"type":"string","title":"Job Id"},"task_type":{"type":"string","title":"Task Type"},"repo":{"type":"string","title":"Repo"},"status":{"type":"string","title":"Status"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress"},"processed_count":{"type":"integer","title":"Processed Count","default":0},"error_count":{"type":"integer","title":"Error Count","default":0},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["task_id","job_id","task_type","repo","status"],"title":"BackfillTaskResponse"},"BatchLLMDetailsRequest":{"properties":{"unique_ids":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Unique Ids","description":"List of KeywordsAI unique IDs to fetch"}},"type":"object","required":["unique_ids"],"title":"BatchLLMDetailsRequest","description":"Request for batch LLM details fetch."},"BatchTestInfoRequest":{"properties":{"test_ids":{"items":{"type":"string"},"type":"array","title":"Test Ids"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["test_ids"],"title":"BatchTestInfoRequest","description":"Batch request for test metadata lookups."},"BillingBreakdownItem":{"properties":{"platform":{"type":"string","title":"Platform"},"is_real_device":{"type":"boolean","title":"Is Real Device"},"session_count":{"type":"integer","title":"Session Count"},"total_seconds":{"type":"number","title":"Total Seconds"},"device_cost":{"type":"number","title":"Device Cost"},"llm_cost":{"type":"number","title":"Llm Cost"},"total_cost":{"type":"number","title":"Total Cost"}},"type":"object","required":["platform","is_real_device","session_count","total_seconds","device_cost","llm_cost","total_cost"],"title":"BillingBreakdownItem"},"BillingBreakdownResponse":{"properties":{"breakdown":{"items":{"$ref":"#/components/schemas/BillingBreakdownItem"},"type":"array","title":"Breakdown"},"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"}},"type":"object","required":["breakdown","period_start","period_end"],"title":"BillingBreakdownResponse"},"BillingCheckResponse":{"properties":{"allowed":{"type":"boolean","title":"Allowed"},"balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Balance"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["allowed"],"title":"BillingCheckResponse"},"BillingResponse":{"properties":{"customer_id":{"type":"string","title":"Customer Id"},"code":{"type":"string","title":"Code"},"allowed":{"type":"boolean","title":"Allowed"},"feature_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Id"},"balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Balance"}},"type":"object","required":["customer_id","code","allowed"],"title":"BillingResponse"},"BillingSummaryResponse":{"properties":{"total_sessions":{"type":"integer","title":"Total Sessions"},"total_seconds":{"type":"number","title":"Total Seconds"},"total_device_cost":{"type":"number","title":"Total Device Cost"},"total_llm_cost":{"type":"number","title":"Total Llm Cost"},"total_cost":{"type":"number","title":"Total Cost"},"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"}},"type":"object","required":["total_sessions","total_seconds","total_device_cost","total_llm_cost","total_cost","period_start","period_end"],"title":"BillingSummaryResponse"},"BlocksCreationRequest":{"properties":{"blocks":{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Input"},{"$ref":"#/components/schemas/WhileBlock-Input"}]},"type":"array","title":"Blocks","description":"List of test blocks"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Test metadata"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options","description":"Optional creation options"}},"type":"object","required":["blocks","metadata"],"title":"BlocksCreationRequest","description":"Request model for creating tests from blocks"},"BlocksToYamlRequest":{"properties":{"blocks":{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Input"},{"$ref":"#/components/schemas/WhileBlock-Input"}]},"type":"array","title":"Blocks","description":"Blocks to convert"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Optional metadata to include"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options","description":"Conversion options"}},"type":"object","required":["blocks"],"title":"BlocksToYamlRequest","description":"Request model for blocks to YAML conversion"},"Body_create_upload_file_to_supabase_api_v1_storage_s3_upload_download_to_supabase_file_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"user_id":{"type":"string","title":"User Id","default":"user_id_example"},"folder_name":{"type":"string","title":"Folder Name","default":"download_folder"},"file_type":{"type":"string","title":"File Type","default":"text/plain;charset=UTF-8"}},"type":"object","required":["file"],"title":"Body_create_upload_file_to_supabase_api_v1_storage_s3_upload_download_to_supabase_file_post"},"Body_stream_upload_build_api_v1_apps__app_id__builds_stream_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"The build artifact file to upload"}},"type":"object","required":["file"],"title":"Body_stream_upload_build_api_v1_apps__app_id__builds_stream_upload_post"},"Body_upload_to_s3_api_v1_storage_s3_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"bucket_name":{"type":"string","title":"Bucket Name"},"test_id":{"type":"string","title":"Test Id"}},"type":"object","required":["file","bucket_name","test_id"],"title":"Body_upload_to_s3_api_v1_storage_s3_upload_post"},"BoundingBoxErrorType":{"type":"string","enum":["none","target_outside","partial_overlap","bbox_too_large","element_not_visible"],"title":"BoundingBoxErrorType","description":"Types of bounding box errors that can occur."},"BoundingBoxEval":{"properties":{"correct":{"type":"boolean","title":"Correct","description":"Whether the specified bounding box contained the target element"},"error_type":{"$ref":"#/components/schemas/BoundingBoxErrorType","default":"none"},"specified_bbox":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Specified Bbox","description":"The bbox specified by Instructional LLM (e.g., 'A2-C4')"},"used_bbox":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Used Bbox","description":"The bbox actually used after fallback expansion"},"fallback_used":{"type":"boolean","title":"Fallback Used","description":"True if fallback expansion was needed to find the element","default":false},"target_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Description","description":"What element the bbox was supposed to contain"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation","description":"Brief reasoning"}},"type":"object","required":["correct"],"title":"BoundingBoxEval","description":"Evaluation result for Instructional LLM bounding box accuracy."},"BuildComparisonItem":{"properties":{"test_id":{"type":"string","title":"Test Id"},"test_name":{"type":"string","title":"Test Name"},"current_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Status"},"previous_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Status"},"delta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delta"},"current_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Execution Id"},"previous_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Execution Id"}},"type":"object","required":["test_id","test_name"],"title":"BuildComparisonItem"},"BuildCoverageItem":{"properties":{"test_id":{"type":"string","title":"Test Id"},"test_name":{"type":"string","title":"Test Name"},"pinned_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Version"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"},"last_execution_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Execution Time"},"last_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Execution Id"},"last_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Duration Seconds"}},"type":"object","required":["test_id","test_name"],"title":"BuildCoverageItem"},"BuildCreateResponse":{"properties":{"version_id":{"type":"string","format":"uuid","title":"Version Id"},"version":{"type":"string","title":"Version"},"upload_url":{"type":"string","title":"Upload Url"},"upload_expires_at":{"type":"integer","title":"Upload Expires At"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["version_id","version","upload_url","upload_expires_at","content_type"],"title":"BuildCreateResponse","description":"Response model for creating a build with upload URL."},"BuildFromUrlRequest":{"properties":{"from_url":{"type":"string","title":"From Url","description":"Source URL of the artifact to ingest"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","description":"Optional HTTP headers to include when fetching the URL"},"version":{"type":"string","title":"Version","description":"Version string (must be unique within the app)"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"additionalProperties":true,"title":"Metadata"},"set_as_current":{"type":"boolean","title":"Set As Current","description":"If True, set this version as the current version for the app","default":false}},"type":"object","required":["from_url","version"],"title":"BuildFromUrlRequest","description":"Request to create a build by ingesting an artifact from a URL (e.g., Expo EAS)."},"BuildPathConfig":{"properties":{"path":{"type":"string","title":"Path"},"app_id":{"type":"string","title":"App Id"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"eas_token_env_var":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eas Token Env Var"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"}},"type":"object","required":["path","app_id"],"title":"BuildPathConfig","description":"Configuration for a build path in revyl_repo_configs JSONB."},"BuildResolutionRequest":{"properties":{"build_var_id":{"type":"string","format":"uuid","title":"Build Var Id"},"pinned_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Version"},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters","description":"Optional resolution filters matched against build metadata (e.g., pr_number, commit_sha)"}},"type":"object","required":["build_var_id"],"title":"BuildResolutionRequest","description":"Request to resolve a build for a test."},"BuildResolutionResponse":{"properties":{"build_var_id":{"type":"string","format":"uuid","title":"Build Var Id"},"platform":{"type":"string","title":"Platform"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"version_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Version Id","description":"Resolved build row ID for fetching build details"},"artifact_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artifact Url"},"static_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Static Url"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"}},"type":"object","required":["build_var_id","platform"],"title":"BuildResolutionResponse","description":"Response with resolved build information."},"BuildResponse":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"app_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"App Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"artifact_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artifact Url"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"owner":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner"},"uploaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Uploaded At"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"package_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Name"},"was_reused":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Was Reused"}},"type":"object","title":"BuildResponse","description":"Response model for a build (specific artifact/version of an app)."},"BuildRunItem":{"properties":{"execution_id":{"type":"string","title":"Execution Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"execution_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Execution Time Seconds"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"resolved_build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Build Version"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"report_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Report Metadata"}},"type":"object","required":["execution_id"],"title":"BuildRunItem"},"BuildUpdateRequest":{"properties":{"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"additionalProperties":true,"title":"Metadata"},"package_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Name","description":"Package name override"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Rename version string (must be unique within app)"}},"type":"object","title":"BuildUpdateRequest","description":"Request model for updating a build."},"BuildUploadCompleteRequest":{"properties":{"version_id":{"type":"string","format":"uuid","title":"Version Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"additionalProperties":true,"title":"Metadata"},"package_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Name","description":"Package name"}},"type":"object","required":["version_id"],"title":"BuildUploadCompleteRequest","description":"Request to mark upload as complete."},"BuildWorkspaceResponse":{"properties":{"app":{"$ref":"#/components/schemas/AppResponse"},"build":{"$ref":"#/components/schemas/BuildResponse"},"previous_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Build Id"},"previous_build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Build Version"},"attached_tests":{"type":"integer","title":"Attached Tests","default":0},"exact_runs":{"type":"integer","title":"Exact Runs","default":0},"completed_runs":{"type":"integer","title":"Completed Runs","default":0},"pass_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Rate"},"new_failures":{"type":"integer","title":"New Failures","default":0},"fixed_tests":{"type":"integer","title":"Fixed Tests","default":0},"not_run":{"type":"integer","title":"Not Run","default":0},"readiness":{"type":"string","title":"Readiness","default":"Not run"},"attribution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution Note"},"coverage":{"items":{"$ref":"#/components/schemas/BuildCoverageItem"},"type":"array","title":"Coverage"},"compare":{"items":{"$ref":"#/components/schemas/BuildComparisonItem"},"type":"array","title":"Compare"}},"type":"object","required":["app","build"],"title":"BuildWorkspaceResponse"},"BulkDeleteTasksRequest":{"properties":{"task_ids":{"items":{"type":"string"},"type":"array","title":"Task Ids"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["task_ids"],"title":"BulkDeleteTasksRequest","description":"Request to delete multiple tasks."},"BulkDeleteTestExecutionsRequest":{"properties":{"task_ids":{"items":{"type":"string"},"type":"array","title":"Task Ids"}},"type":"object","required":["task_ids"],"title":"BulkDeleteTestExecutionsRequest","description":"Request model for bulk deleting test executions.\n\nAttributes:\n task_ids: List of task IDs to delete."},"BulkDeleteTestsRequest":{"properties":{"test_ids":{"items":{"type":"string"},"type":"array","title":"Test Ids","description":"List of test IDs to delete"}},"type":"object","required":["test_ids"],"title":"BulkDeleteTestsRequest","description":"Request model for bulk test deletion."},"BulkDeleteTestsResponse":{"properties":{"success_count":{"type":"integer","title":"Success Count","description":"Number of tests successfully deleted"},"error_count":{"type":"integer","title":"Error Count","description":"Number of tests that failed to delete"},"deleted_ids":{"items":{"type":"string"},"type":"array","title":"Deleted Ids","description":"List of successfully deleted test IDs"},"failed_ids":{"items":{"type":"string"},"type":"array","title":"Failed Ids","description":"List of test IDs that failed to delete"}},"type":"object","required":["success_count","error_count"],"title":"BulkDeleteTestsResponse","description":"Response model for bulk test deletion."},"BulkExecuteRequest":{"properties":{"test_ids":{"items":{"type":"string"},"type":"array","title":"Test Ids"},"build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Id"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Input"},{"type":"null"}]}},"type":"object","required":["test_ids"],"title":"BulkExecuteRequest","description":"Request model for bulk test execution."},"BulkExecuteResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/BulkExecuteResultItem"},"type":"array","title":"Results"},"success_count":{"type":"integer","title":"Success Count"},"error_count":{"type":"integer","title":"Error Count"}},"type":"object","required":["results","success_count","error_count"],"title":"BulkExecuteResponse","description":"Response from bulk execution."},"BulkExecuteResultItem":{"properties":{"test_id":{"type":"string","title":"Test Id"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"success":{"type":"boolean","title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["test_id","success"],"title":"BulkExecuteResultItem","description":"Result item for a single test in bulk execution."},"BulkSyncTagsRequest":{"properties":{"test_ids":{"items":{"type":"string"},"type":"array","title":"Test Ids"},"tags_to_add":{"items":{"type":"string"},"type":"array","title":"Tags To Add","default":[]},"tags_to_remove":{"items":{"type":"string"},"type":"array","title":"Tags To Remove","default":[]}},"type":"object","required":["test_ids"],"title":"BulkSyncTagsRequest","description":"Request to bulk sync tags for multiple tests."},"BulkSyncTagsResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/BulkSyncTagsResultItem"},"type":"array","title":"Results"},"success_count":{"type":"integer","title":"Success Count"},"error_count":{"type":"integer","title":"Error Count"}},"type":"object","required":["results","success_count","error_count"],"title":"BulkSyncTagsResponse","description":"Response from bulk sync operation."},"BulkSyncTagsResultItem":{"properties":{"test_id":{"type":"string","title":"Test Id"},"success":{"type":"boolean","title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["test_id","success"],"title":"BulkSyncTagsResultItem","description":"Result item for a single test in bulk sync."},"CacheRetryMode":{"type":"string","enum":["none","full_rerun"],"title":"CacheRetryMode","description":"Cache retry policy for test execution.\n\n- NONE: No cache fallback, fail if cached steps fail\n- FULL_RERUN: If cached run fails, rerun entire test without cache"},"CachedActionElement":{"properties":{"target":{"type":"string","title":"Target","description":"Primary grounding target for the element"},"action_type":{"type":"string","title":"Action Type","description":"Action type of the element"},"node_id":{"type":"string","title":"Node Id","description":"Canonical graph node identifier for the cached step"},"step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Id","description":"Step index from frontend for debugging purposes"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"Input value for actions like INPUT (e.g., text to be entered)"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description","description":"Human-readable step description"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description","description":"Human-readable instruction describing what the agent did, e.g. 'Click the Sign In button'"},"action_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Action Params","description":"Action-specific parameters (e.g., direction/distance/speed for SWIPE, end_target for DRAG)"},"bounding_box":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Bounding Box","description":"Grid cells defining the grounding region for cropping, e.g. ['A2', 'C4']"},"reflections":{"anyOf":[{"items":{"$ref":"#/components/schemas/CachedReflections"},"type":"array"},{"type":"null"}],"title":"Reflections","description":"Cached reflection/substep actions, preserving nested structure"},"wait_time_after_action":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wait Time After Action","description":"Custom wait time in seconds after executing this cached action (to allow UI transitions)"}},"type":"object","required":["target","action_type","node_id"],"title":"CachedActionElement","description":"Represents a cached action element for a specific step in a test.\n\nAttributes:\n target (str): The primary grounding target of the element.\n action_type (str): The action type of the element.\n node_id (str): The canonical graph node ID for the cached step.\n step_id (Optional[str]): Step index from frontend for debugging purposes.\n value (Optional[str]): Input value for actions like INPUT (e.g., text to be entered).\n step_description (Optional[str]): Human-readable step description.\n agent_description (Optional[str]): Human-readable instruction describing what the agent did.\n action_params (Optional[Dict[str, Any]]): Action-specific parameters (e.g., direction/distance/speed for SWIPE).\n bounding_box (Optional[List[str]]): Grid cells defining the grounding region (e.g., ['A2', 'C4']).\n reflections (Optional[List[CachedReflections]]): Recursive cache entries for child reflections/substeps.\n wait_time_after_action (Optional[float]): Custom wait time in seconds after executing this cached action."},"CachedActionStore-Input":{"properties":{"test_id":{"type":"string","title":"Test Id","description":"Unique identifier for the test"},"cached_elements":{"additionalProperties":{"$ref":"#/components/schemas/CachedActionElement"},"type":"object","title":"Cached Elements","description":"Dictionary of cached action elements keyed by node_id"}},"type":"object","required":["test_id"],"title":"CachedActionStore","description":"Stores cached action elements for a test, indexed by node_id.\n\nAttributes:\n test_id (str): The unique identifier for the test.\n cached_elements (Dict[str, CachedActionElement]): Dictionary of cached action elements keyed by node_id."},"CachedActionStore-Output":{"properties":{"test_id":{"type":"string","title":"Test Id","description":"Unique identifier for the test"},"cached_elements":{"additionalProperties":{"$ref":"#/components/schemas/CachedActionElement"},"type":"object","title":"Cached Elements","description":"Dictionary of cached action elements keyed by node_id"}},"type":"object","required":["test_id"],"title":"CachedActionStore","description":"Stores cached action elements for a test, indexed by node_id.\n\nAttributes:\n test_id (str): The unique identifier for the test.\n cached_elements (Dict[str, CachedActionElement]): Dictionary of cached action elements keyed by node_id."},"CachedReflections":{"properties":{"node_id":{"type":"string","title":"Node Id","description":"Canonical graph node identifier for the cached reflection/substep"},"step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Id","description":"Step index from frontend for debugging purposes"},"action_type":{"type":"string","title":"Action Type","description":"Action type of the element"},"target":{"type":"string","title":"Target","description":"Primary grounding target for the element"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"Input value for actions like INPUT (e.g., text to be entered)"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description","description":"Human-readable step description for this reflection"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description","description":"Human-readable instruction describing what the agent did, e.g. 'Click the Sign In button'"},"action_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Action Params","description":"Action-specific parameters (e.g., direction/distance/speed for SWIPE, end_target for DRAG)"},"bounding_box":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Bounding Box","description":"Grid cells defining the grounding region for cropping, e.g. ['A2', 'C4']"},"wait_time_after_action":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wait Time After Action","description":"Custom wait time in seconds after executing this cached action (to allow UI transitions)"}},"type":"object","required":["node_id","action_type","target"],"title":"CachedReflections","description":"Represents a cached reflection/substep action.\n\nAttributes:\n node_id (str): Canonical graph node identifier for the cached reflection/substep.\n step_id (Optional[str]): Step index from frontend for debugging purposes.\n action_type (str): Action type of the element.\n target (str): Primary grounding target for the element.\n value (Optional[str]): Input value for actions like INPUT (e.g., text to be entered).\n step_description (Optional[str]): Human-readable step description for this reflection.\n agent_description (Optional[str]): Human-readable instruction describing what the agent did.\n action_params (Optional[Dict[str, Any]]): Action-specific parameters (e.g., direction/distance/speed for SWIPE).\n bounding_box (Optional[List[str]]): Grid cells defining the grounding region (e.g., ['A2', 'C4']).\n wait_time_after_action (Optional[float]): Custom wait time in seconds after executing this cached action."},"CancelTestResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"task_id":{"type":"string","title":"Task Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","required":["success","message","task_id"],"title":"CancelTestResponse","description":"Response model for test cancellation."},"CategoryValue":{"properties":{"category":{"type":"string","title":"Category"},"value":{"type":"number","title":"Value"}},"type":"object","required":["category","value"],"title":"CategoryValue"},"CheckFileExistsResponse":{"properties":{"exists":{"type":"boolean","title":"Exists","description":"Whether a file with this name exists"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"The filename if it exists"}},"type":"object","required":["exists"],"title":"CheckFileExistsResponse","description":"Response model for checking if a file with a given name exists."},"CheckModuleExistsResponse":{"properties":{"exists":{"type":"boolean","title":"Exists"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["exists"],"title":"CheckModuleExistsResponse","description":"Response model for checking if a module exists"},"CheckVariableExistsResponse":{"properties":{"exists":{"type":"boolean","title":"Exists","description":"Whether the variable exists"},"variable_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Name","description":"Name of the variable"},"variable_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Value","description":"Value of the variable"}},"type":"object","required":["exists"],"title":"CheckVariableExistsResponse","description":"Response for check variable exists endpoint."},"ChildTaskReportInfo":{"properties":{"task_id":{"type":"string","title":"Task Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"execution_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Execution Time Seconds"},"steps_completed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steps Completed"},"total_steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Steps"},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"is_shared":{"type":"boolean","title":"Is Shared","default":false},"share_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Token"}},"type":"object","required":["task_id"],"title":"ChildTaskReportInfo"},"ClaimSandboxResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether claim succeeded"},"sandbox":{"anyOf":[{"$ref":"#/components/schemas/FleetSandbox"},{"type":"null"}],"description":"Claimed sandbox details"},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["success","message"],"title":"ClaimSandboxResponse","description":"Response from claiming a sandbox.\n\nAttributes:\n success: Whether the claim was successful.\n sandbox: The claimed sandbox details (if successful).\n message: Human-readable status message."},"CleanupLevel":{"type":"string","enum":["none","thorough","deep_clean"],"title":"CleanupLevel","description":"Cleanup intensity level for AVD state reset between test runs."},"CloudflareCredentials":{"properties":{"account_id":{"type":"string","title":"Account Id","description":"Cloudflare account ID"},"tunnel_token":{"type":"string","title":"Tunnel Token","description":"Cloudflare tunnel token for authentication"},"zone_id":{"type":"string","title":"Zone Id","description":"Cloudflare zone ID for DNS management"}},"type":"object","required":["account_id","tunnel_token","zone_id"],"title":"CloudflareCredentials","description":"Cloudflare credentials fetched from backend service.\n\nThese credentials are used by the CLI service to create and manage\nnamed Cloudflare tunnels with predictable URLs."},"CodeExecutionScript":{"properties":{"name":{"type":"string","title":"Name","description":"Script name"},"code":{"type":"string","title":"Code","description":"Script code content"},"runtime":{"type":"string","enum":["python","javascript","typescript","bash"],"title":"Runtime","description":"Runtime language"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Script description"},"id":{"type":"string","format":"uuid","title":"Id","description":"Script ID"},"user_id":{"type":"string","format":"uuid","title":"User Id","description":"User ID who owns the script"},"org_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id","description":"Organization ID"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["name","code","runtime","id","user_id","created_at","updated_at"],"title":"CodeExecutionScript","description":"Full script model with database fields."},"CodeExecutionScriptCreate":{"properties":{"name":{"type":"string","title":"Name","description":"Script name"},"code":{"type":"string","title":"Code","description":"Script code content"},"runtime":{"type":"string","enum":["python","javascript","typescript","bash"],"title":"Runtime","description":"Runtime language"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Script description"}},"type":"object","required":["name","code","runtime"],"title":"CodeExecutionScriptCreate","description":"Model for creating a new script."},"CodeExecutionScriptListResponse":{"properties":{"scripts":{"items":{"$ref":"#/components/schemas/CodeExecutionScript"},"type":"array","title":"Scripts","description":"List of scripts"},"count":{"type":"integer","title":"Count","description":"Total count of scripts"}},"type":"object","required":["scripts","count"],"title":"CodeExecutionScriptListResponse","description":"Response model for listing scripts."},"CodeExecutionScriptUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Script name"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Script code content"},"runtime":{"anyOf":[{"type":"string","enum":["python","javascript","typescript","bash"]},{"type":"null"}],"title":"Runtime","description":"Runtime language"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Script description"}},"type":"object","title":"CodeExecutionScriptUpdate","description":"Model for updating an existing script."},"CommentsOverTimeData":{"properties":{"date":{"type":"string","title":"Date"},"bestPractices":{"type":"integer","title":"Bestpractices"},"security":{"type":"integer","title":"Security"},"performance":{"type":"integer","title":"Performance"},"bugFix":{"type":"integer","title":"Bugfix"},"codeStyle":{"type":"integer","title":"Codestyle"}},"type":"object","required":["date","bestPractices","security","performance","bugFix","codeStyle"],"title":"CommentsOverTimeData"},"CompileJobProgress":{"properties":{"stage":{"$ref":"#/components/schemas/CompileJobStatus","description":"Current stage of the pipeline","default":"queued"},"total_chunks":{"type":"integer","title":"Total Chunks","default":0},"completed_chunks":{"type":"integer","title":"Completed Chunks","default":0},"completed_chunk_indices":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Completed Chunk Indices","description":"Which specific chunk indices have completed"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Human-readable progress note"}},"type":"object","title":"CompileJobProgress","description":"Progress metadata returned by the status endpoint."},"CompileJobStatus":{"type":"string","enum":["queued","preparing","summarizing","merging","formatting","completed","failed"],"title":"CompileJobStatus","description":"Lifecycle states for a recording compile job."},"CompileProgressUpdate":{"properties":{"status":{"type":"string","title":"Status"},"progress_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Progress Metadata"},"result_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result Payload"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["status"],"title":"CompileProgressUpdate","description":"Callback payload from the action service to update job progress."},"CompileRecordingRequest":{"properties":{"source_type":{"$ref":"#/components/schemas/CompileSourceType","description":"recording or session"},"source_id":{"type":"string","title":"Source Id","description":"session_id or report_id depending on source_type"},"interval_start":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval Start","description":"Start action index (inclusive)"},"interval_end":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval End","description":"End action index (inclusive)"},"user_feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Feedback","description":"Optional user instructions for how to adjust compilation (e.g. 'more validations', 'less verbose')"},"interval_start_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interval Start Time","description":"Start time in seconds from recording start"},"interval_end_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interval End Time","description":"End time in seconds from recording start"}},"type":"object","required":["source_type","source_id"],"title":"CompileRecordingRequest","description":"Request body for POST /recordings/compile."},"CompileRecordingStartResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"UUID of the compile job"},"status":{"type":"string","title":"Status","default":"queued"}},"type":"object","required":["job_id"],"title":"CompileRecordingStartResponse","description":"Response from POST /recordings/compile."},"CompileRecordingStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"progress":{"anyOf":[{"$ref":"#/components/schemas/CompileJobProgress"},{"type":"null"}]},"result":{"anyOf":[{"$ref":"#/components/schemas/CompileResult"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["job_id","status"],"title":"CompileRecordingStatusResponse","description":"Response from GET /recordings/compile/{job_id}."},"CompileResult":{"properties":{"compiled_steps":{"items":{"$ref":"#/components/schemas/CompiledIntentStep"},"type":"array","title":"Compiled Steps","description":"Ordered intent steps"},"blocks":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Blocks","description":"Editor Block[] dicts ready for the frontend"},"yaml":{"type":"string","title":"Yaml","description":"YAML string of the compiled test blocks","default":""},"suggested_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Title","description":"Short LLM-generated title with a 4-hex suffix for uniqueness"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"Any quality or ambiguity warnings from compilation"},"total_actions_compiled":{"type":"integer","title":"Total Actions Compiled","default":0},"total_chunks_processed":{"type":"integer","title":"Total Chunks Processed","default":0}},"type":"object","title":"CompileResult","description":"Final output of a compile job, stored on the job row."},"CompileSourceType":{"type":"string","enum":["recording","session"],"title":"CompileSourceType","description":"How the compile was triggered."},"CompiledIntentStep":{"properties":{"step_type":{"type":"string","title":"Step Type","description":"instruction, validation, or manual"},"step_description":{"type":"string","title":"Step Description","description":"Natural language instruction an agent can follow to reproduce the action"},"manual_subtype":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manual Subtype","description":"For manual steps: go_home, open_app, kill_app, back, set_location, set_orientation, wait, navigate"},"source_action_ranges":{"items":{"$ref":"#/components/schemas/ActionRange"},"type":"array","title":"Source Action Ranges","description":"Which raw actions this step covers"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence","description":"Model confidence 0-1 if available"}},"type":"object","required":["step_type","step_description"],"title":"CompiledIntentStep","description":"One natural-language test step produced by the final merge pass."},"CompletedTestData":{"properties":{"id":{"type":"string","title":"Id","description":"Test history ID or task-based ID"},"test_uid":{"type":"string","title":"Test Uid","description":"Test ID"},"execution_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Time","description":"Execution timestamp"},"status":{"type":"string","title":"Status","description":"Test status (completed, failed, etc.)"},"execution_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Execution Time Seconds","description":"Test duration in seconds"},"metadata":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata","description":"JSON metadata string"},"enhanced_task":{"$ref":"#/components/schemas/TestExecutionTasksEnhanced","description":"Enhanced task data"}},"type":"object","required":["id","test_uid","status","enhanced_task"],"title":"CompletedTestData","description":"Model for completed test data structure used in SSE events."},"CompletionMessage":{"properties":{"role":{"type":"string","title":"Role","description":"Always 'assistant' for completions","default":"assistant"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Text response content"},"tool_calls":{"anyOf":[{"items":{"$ref":"#/components/schemas/ToolCall"},"type":"array"},{"type":"null"}],"title":"Tool Calls","description":"Tool/function calls made by the assistant"},"refusal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refusal","description":"Refusal message if request was refused"}},"additionalProperties":true,"type":"object","title":"CompletionMessage","description":"The assistant's completion/response message."},"ConversionResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the conversion was successful"},"converted_content":{"anyOf":[{"type":"string"},{"items":{"anyOf":[{"$ref":"#/components/schemas/NormalizedActionBlock"},{"$ref":"#/components/schemas/NormalizedIfBlock"},{"$ref":"#/components/schemas/NormalizedWhileBlock"}]},"type":"array"}],"title":"Converted Content","description":"Converted content (YAML string or blocks array)"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Extracted or included metadata"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"Any errors that occurred"}},"type":"object","required":["success","converted_content"],"title":"ConversionResponse","description":"Response model for conversion operations"},"CopyTestToBenchmarksRequest":{"properties":{"test_id":{"type":"string","title":"Test Id","description":"UUID of the test to copy"},"new_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Name","description":"New name for the copied test. Defaults to '{original}_bench_{timestamp}'"},"source_from_other_env":{"type":"boolean","title":"Source From Other Env","description":"Read source test from the other environment's database (staging if on prod, production if on staging)","default":false},"target_other_env":{"type":"boolean","title":"Target Other Env","description":"Write target test to the other environment's database (staging if on prod, production if on staging)","default":false},"target_org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Org Id","description":"Target organization ID. Defaults to benchmarks org if not provided."}},"type":"object","required":["test_id"],"title":"CopyTestToBenchmarksRequest","description":"Request model for copying a test to the benchmarks organization.\n\nAttributes:\n test_id: UUID of the test to copy.\n new_name: Optional new name for the copied test.\n Defaults to \"{original_name}_bench_{timestamp}\" if not provided.\n source_from_other_env: Whether to read source test from the other environment's database."},"CopyTestToBenchmarksResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the copy operation succeeded"},"message":{"type":"string","title":"Message","description":"Human-readable summary of the operation"},"new_test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Test Id","description":"UUID of the newly created test"},"new_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New App Id","description":"UUID of the newly created app"},"builds_copied":{"type":"integer","title":"Builds Copied","description":"Number of builds copied","default":0},"env_vars_copied":{"type":"integer","title":"Env Vars Copied","description":"Number of environment variables copied","default":0},"cookies_copied":{"type":"integer","title":"Cookies Copied","description":"Number of cookies copied","default":0},"variables_copied":{"type":"integer","title":"Variables Copied","description":"Number of custom variables copied","default":0},"scripts_copied":{"type":"integer","title":"Scripts Copied","description":"Number of scripts copied","default":0},"modules_copied":{"type":"integer","title":"Modules Copied","description":"Number of modules copied","default":0},"is_resync":{"type":"boolean","title":"Is Resync","description":"Whether this was a resync of an existing benchmark test","default":false}},"type":"object","required":["success","message"],"title":"CopyTestToBenchmarksResponse","description":"Response model for copy test to benchmarks operation.\n\nAttributes:\n success: Whether the copy operation completed successfully.\n message: Human-readable summary of the operation.\n new_test_id: UUID of the newly created test (if successful).\n new_app_id: UUID of the newly created app (if any).\n builds_copied: Number of builds copied.\n env_vars_copied: Number of environment variables copied.\n cookies_copied: Number of cookies copied.\n variables_copied: Number of custom variables copied.\n scripts_copied: Number of scripts copied.\n is_resync: Whether this was a resync of an existing benchmark test."},"CopyWorkflowToBenchmarksRequest":{"properties":{"workflow_id":{"type":"string","title":"Workflow Id","description":"UUID of the workflow to copy"},"new_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Name","description":"New name for the copied workflow"},"source_from_other_env":{"type":"boolean","title":"Source From Other Env","description":"Read source workflow from the other environment's database (staging if on prod, production if on staging)","default":false},"target_other_env":{"type":"boolean","title":"Target Other Env","description":"Write target workflow to the other environment's database (staging if on prod, production if on staging)","default":false},"target_org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Org Id","description":"Target organization ID. Defaults to benchmarks org if not provided."}},"type":"object","required":["workflow_id"],"title":"CopyWorkflowToBenchmarksRequest","description":"Request model for copying a workflow to the benchmarks organization.\n\nAttributes:\n workflow_id: UUID of the workflow to copy.\n new_name: Optional new name for the copied workflow.\n source_from_other_env: Whether to read source workflow from the other environment's database."},"CopyWorkflowToBenchmarksResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the copy operation succeeded"},"message":{"type":"string","title":"Message","description":"Human-readable summary of the operation"},"new_workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Workflow Id","description":"UUID of the newly created workflow"},"tests_copied":{"type":"integer","title":"Tests Copied","description":"Number of tests newly copied","default":0},"tests_resynced":{"type":"integer","title":"Tests Resynced","description":"Number of existing tests resynced","default":0},"tests_failed":{"type":"integer","title":"Tests Failed","description":"Number of tests that failed","default":0},"is_resync":{"type":"boolean","title":"Is Resync","description":"Whether this was a resync of an existing benchmark workflow","default":false}},"type":"object","required":["success","message"],"title":"CopyWorkflowToBenchmarksResponse","description":"Response model for copy workflow to benchmarks operation.\n\nAttributes:\n success: Whether the copy operation completed successfully.\n message: Human-readable summary of the operation.\n new_workflow_id: UUID of the newly created workflow (if successful).\n tests_copied: Number of tests newly copied.\n tests_resynced: Number of existing tests that were resynced.\n tests_failed: Number of tests that failed to copy.\n is_resync: Whether this was a resync of an existing benchmark workflow."},"CostAnalysisResponse":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Session ID if queried by session"},"execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Id","description":"Execution ID if queried by execution"},"total_calls":{"type":"integer","title":"Total Calls","description":"Total number of LLM calls"},"total_prompt_tokens":{"type":"integer","title":"Total Prompt Tokens","description":"Total prompt tokens across all calls"},"total_completion_tokens":{"type":"integer","title":"Total Completion Tokens","description":"Total completion tokens across all calls"},"total_tokens":{"type":"integer","title":"Total Tokens","description":"Total tokens across all calls"},"total_cost_usd":{"type":"number","title":"Total Cost Usd","description":"Total cost in USD"},"by_model":{"items":{"$ref":"#/components/schemas/ModelCostBreakdown"},"type":"array","title":"By Model","description":"Cost breakdown by model"}},"type":"object","required":["total_calls","total_prompt_tokens","total_completion_tokens","total_tokens","total_cost_usd"],"title":"CostAnalysisResponse","description":"Response containing cost analysis for a session or execution."},"CreateActionRequest":{"properties":{"action_index":{"type":"integer","title":"Action Index"},"action_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type"},"llm_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Call Id"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"reflection_llm_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Llm Call Id"},"reflection_decision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Decision"},"reflection_reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Reasoning"},"reflection_suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Suggestion"},"is_terminal":{"type":"boolean","title":"Is Terminal","default":false},"screenshot_before_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Before S3 Key"},"screenshot_before_clean_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Before Clean S3 Key"},"screenshot_after_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot After S3 Key"},"video_timestamp_start":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp Start"},"video_timestamp_end":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp End"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"action_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Action Data"}},"type":"object","required":["action_index"],"title":"CreateActionRequest","description":"Request model for creating a report action (normalized structure)."},"CreateActionResponse":{"properties":{"id":{"type":"string","title":"Id"},"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["id","message","success"],"title":"CreateActionResponse","description":"Response model for action creation."},"CreateCLIApiKeyRequest":{"properties":{"client_instance_id":{"anyOf":[{"type":"string","maxLength":128,"pattern":"^(?:[A-Za-z0-9][A-Za-z0-9._:\\-]*)?$"},{"type":"null"}],"title":"Client Instance Id","description":"Stable per-install CLI identifier used to rotate only this device's key."},"device_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Label","description":"Human-readable device label to attach to the browser-issued CLI key."}},"type":"object","title":"CreateCLIApiKeyRequest","description":"Request to create or rotate a browser-issued CLI API key."},"CreateCLIApiKeyResponse":{"properties":{"api_key_token":{"type":"string","title":"Api Key Token"},"api_key_id":{"type":"string","title":"Api Key Id"}},"type":"object","required":["api_key_token","api_key_id"],"title":"CreateCLIApiKeyResponse","description":"Response from creating a long-lived CLI API key via PropelAuth.\n\nAttributes:\n api_key_token: The API key token string used for authentication.\n api_key_id: The PropelAuth-assigned ID for this API key (used for deletion/rotation)."},"CreateExpoProjectRequest":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"Expo project ID (EAS project UUID)"},"project_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Name","description":"Display name for the project"}},"type":"object","required":["project_id"],"title":"CreateExpoProjectRequest","description":"Request to create a new Expo project configuration."},"CreateInternalSlackRuleRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"notify_on_failure":{"type":"boolean","title":"Notify On Failure","default":true},"notify_on_success":{"type":"boolean","title":"Notify On Success","default":false},"notify_on_timeout":{"type":"boolean","title":"Notify On Timeout","default":true},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["channel_id"],"title":"CreateInternalSlackRuleRequest","description":"Request to create an internal notification rule."},"CreateModuleRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Name of the module"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description"},"blocks":{"items":{"$ref":"#/components/schemas/ModuleBlock"},"type":"array","title":"Blocks","description":"Array of block objects"}},"type":"object","required":["name","blocks"],"title":"CreateModuleRequest","description":"Request model for creating a new module"},"CreateReportRequest":{"properties":{"execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Version Id"},"org_id":{"type":"string","title":"Org Id"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"test_goal_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Goal Summary"},"expected_states":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Expected States"},"run_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Run Config"},"s3_bucket":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Bucket"}},"type":"object","required":["org_id"],"title":"CreateReportRequest","description":"Request model for creating a report."},"CreateReportResponse":{"properties":{"id":{"type":"string","title":"Id"},"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["id","message","success"],"title":"CreateReportResponse","description":"Response model for report creation."},"CreateRevylRepoConfigRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"build_paths":{"items":{"$ref":"#/components/schemas/BuildPathConfig"},"type":"array","title":"Build Paths"},"workflows":{"items":{"$ref":"#/components/schemas/WorkflowConfig"},"type":"array","title":"Workflows"},"trigger_events":{"items":{"type":"string"},"type":"array","title":"Trigger Events"}},"type":"object","title":"CreateRevylRepoConfigRequest","description":"Request model for creating/updating Revyl repo config."},"CreateSlackNotificationRuleRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"channel_id":{"type":"string","minLength":1,"title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"notify_on_start":{"type":"boolean","title":"Notify On Start","default":false},"notify_on_failure":{"type":"boolean","title":"Notify On Failure","default":true},"notify_on_success":{"type":"boolean","title":"Notify On Success","default":false},"notify_on_timeout":{"type":"boolean","title":"Notify On Timeout","default":true},"notify_on_cancelled":{"type":"boolean","title":"Notify On Cancelled","default":false},"mention_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mention Preference"},"workflow_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Workflow Ids"},"applies_to_all":{"type":"boolean","title":"Applies To All","default":false},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["name","channel_id"],"title":"CreateSlackNotificationRuleRequest","description":"Request to create a new notification rule."},"CreateStepRequest":{"properties":{"parent_step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Step Id"},"execution_order":{"type":"integer","title":"Execution Order"},"node_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Node Id"},"step_type":{"type":"string","title":"Step Type"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"llm_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Call Id"},"source_module_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Module Id"},"video_timestamp_start":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp Start"},"video_timestamp_end":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp End"},"validation_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Validation Data"},"decision_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Decision Data"},"loop_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Loop Data"},"extraction_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extraction Data"},"manual_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Manual Data"},"code_execution_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Code Execution Data"}},"type":"object","required":["execution_order","step_type"],"title":"CreateStepRequest","description":"Request model for creating a report step."},"CreateStepResponse":{"properties":{"id":{"type":"string","title":"Id"},"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["id","message","success"],"title":"CreateStepResponse","description":"Response model for step creation."},"CreateTagRequest":{"properties":{"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","default":"#6B7280"}},"type":"object","required":["name"],"title":"CreateTagRequest","description":"Request to create a tag."},"CreateWorkflowResponse":{"properties":{"data":{"$ref":"#/components/schemas/WorkflowsBaseSchema","description":"Created or updated workflow record"}},"type":"object","required":["data"],"title":"CreateWorkflowResponse"},"CreateWorktreeRequest":{"properties":{"branch":{"type":"string","title":"Branch","description":"New branch name"},"base_branch":{"type":"string","title":"Base Branch","description":"Base branch to branch from","default":"main"},"sandbox_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sandbox Id","description":"Target sandbox (uses claimed if not specified)"},"repo":{"type":"string","title":"Repo","description":"Repository name","default":"cognisim-monorepo"},"copy_env":{"type":"boolean","title":"Copy Env","description":"Copy .env files from local","default":true},"install_deps":{"type":"boolean","title":"Install Deps","description":"Run dependency installation","default":false},"setup_script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Setup Script","description":"Custom setup script"}},"type":"object","required":["branch"],"title":"CreateWorktreeRequest","description":"Request payload for creating a new worktree.\n\nAttributes:\n branch: Name for the new branch/worktree.\n base_branch: Branch to create the worktree from (default: main).\n sandbox_id: Optional specific sandbox to create on (uses claimed if not specified).\n repo: Repository name (default: cognisim-monorepo).\n copy_env: Whether to copy .env files from local repo.\n install_deps: Whether to run dependency installation.\n setup_script: Optional custom setup script to run."},"CreditsBalanceItem":{"properties":{"feature_id":{"type":"string","title":"Feature Id"},"feature_name":{"type":"string","title":"Feature Name"},"balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Balance"},"usage":{"type":"integer","title":"Usage","default":0},"granted":{"type":"integer","title":"Granted","default":0}},"type":"object","required":["feature_id","feature_name"],"title":"CreditsBalanceItem"},"CreditsBalanceResponse":{"properties":{"balances":{"items":{"$ref":"#/components/schemas/CreditsBalanceItem"},"type":"array","title":"Balances"}},"type":"object","required":["balances"],"title":"CreditsBalanceResponse"},"CursorConfigurationStatus":{"properties":{"cursor_configured":{"type":"boolean","title":"Cursor Configured","description":"Whether Cursor is fully configured"},"status":{"type":"string","enum":["configured","not_configured"],"title":"Status","description":"Configuration status"},"message":{"type":"string","title":"Message","description":"Status message"},"requires_setup":{"type":"boolean","title":"Requires Setup","description":"Whether setup is required"},"setup_action":{"anyOf":[{"$ref":"#/components/schemas/CursorSetupAction"},{"type":"null"}],"description":"Setup action details if required"}},"type":"object","required":["cursor_configured","status","message","requires_setup","setup_action"],"title":"CursorConfigurationStatus","description":"Response model for Cursor configuration status."},"CursorGithubMapping":{"properties":{"cursor_user_id":{"type":"string","title":"Cursor User Id","description":"Cursor user ID"},"cursor_name":{"type":"string","title":"Cursor Name","description":"Cursor user name"},"developer_id":{"type":"string","title":"Developer Id","description":"Developer ID"},"github_login":{"type":"string","title":"Github Login","description":"GitHub login username"}},"type":"object","required":["cursor_user_id","cursor_name","developer_id","github_login"],"title":"CursorGithubMapping","description":"Model for Cursor GitHub user mapping."},"CursorSetupAction":{"properties":{"button_text":{"type":"string","title":"Button Text","description":"Text to display on action button"},"requirements":{"type":"string","title":"Requirements","description":"Requirements description"},"setup_url":{"type":"string","title":"Setup Url","description":"URL for setup page"}},"type":"object","required":["button_text","requirements","setup_url"],"title":"CursorSetupAction","description":"Model for Cursor setup action details."},"DOMMetadata":{"properties":{"a11y_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"A11Y Data"},"input_selector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Selector"},"wait_time":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wait Time"},"validation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Type"},"code_input":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Input"},"validation_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Text"},"variable_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Name"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"selector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selector"}},"additionalProperties":true,"type":"object","title":"DOMMetadata"},"DailyActivityPoint":{"properties":{"date":{"type":"string","title":"Date"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"session_count":{"type":"integer","title":"Session Count"},"device_minutes":{"type":"number","title":"Device Minutes"}},"type":"object","required":["date","session_count","device_minutes"],"title":"DailyActivityPoint","description":"Single day+source in the activity time series."},"DailySpendItem":{"properties":{"date":{"type":"string","title":"Date"},"session_count":{"type":"integer","title":"Session Count"},"device_cost":{"type":"number","title":"Device Cost"},"llm_cost":{"type":"number","title":"Llm Cost"},"total_cost":{"type":"number","title":"Total Cost"}},"type":"object","required":["date","session_count","device_cost","llm_cost","total_cost"],"title":"DailySpendItem"},"DailySpendResponse":{"properties":{"data_points":{"items":{"$ref":"#/components/schemas/DailySpendItem"},"type":"array","title":"Data Points"}},"type":"object","required":["data_points"],"title":"DailySpendResponse"},"DailyUsageItem":{"properties":{"date":{"type":"string","title":"Date"},"session_count":{"type":"integer","title":"Session Count"},"total_minutes":{"type":"number","title":"Total Minutes"},"ios_minutes":{"type":"number","title":"Ios Minutes"},"android_minutes":{"type":"number","title":"Android Minutes"}},"type":"object","required":["date","session_count","total_minutes","ios_minutes","android_minutes"],"title":"DailyUsageItem"},"DailyUsageResponse":{"properties":{"data_points":{"items":{"$ref":"#/components/schemas/DailyUsageItem"},"type":"array","title":"Data Points"}},"type":"object","required":["data_points"],"title":"DailyUsageResponse"},"DailyUsageTrend":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"day":{"type":"string","title":"Day"},"pageviews":{"type":"integer","title":"Pageviews","default":0},"tests_views":{"type":"integer","title":"Tests Views","default":0},"workflows_views":{"type":"integer","title":"Workflows Views","default":0},"dashboard_views":{"type":"integer","title":"Dashboard Views","default":0},"sessions_views":{"type":"integer","title":"Sessions Views","default":0},"execute_views":{"type":"integer","title":"Execute Views","default":0}},"type":"object","required":["day"],"title":"DailyUsageTrend"},"DashboardMetrics":{"properties":{"total_tests":{"type":"integer","title":"Total Tests","description":"Total number of tests"},"total_tests_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Tests Wow","description":"Week-over-week percentage change in total tests (positive = increase)"},"test_runs":{"type":"integer","title":"Test Runs","description":"Total number of test executions"},"test_runs_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Test Runs Wow","description":"Week-over-week percentage change in test runs (positive = increase)"},"tests_failing_percent":{"type":"number","title":"Tests Failing Percent","description":"Percentage of tests currently failing"},"tests_failing_percent_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tests Failing Percent Wow","description":"Week-over-week percentage point change in failing tests percentage (positive = increase)"},"tests_failing_count":{"type":"integer","title":"Tests Failing Count","description":"Raw number of tests currently failing"},"tests_failing_count_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tests Failing Count Wow","description":"Week-over-week percentage change in failing tests count (positive = increase)"},"avg_test_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Test Duration","description":"Average test execution duration in seconds"},"avg_test_duration_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Test Duration Wow","description":"Week-over-week percentage change in average duration (positive = increase)"},"total_workflows":{"type":"integer","title":"Total Workflows","description":"Total number of workflows"},"total_workflows_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Workflows Wow","description":"Week-over-week percentage change in total workflows (positive = increase)"}},"type":"object","required":["total_tests","test_runs","tests_failing_percent","tests_failing_count","avg_test_duration","total_workflows"],"title":"DashboardMetrics","description":"Model representing dashboard metrics with week-over-week comparisons."},"DefaultRoleResponse":{"properties":{"default_role":{"type":"string","title":"Default Role","default":"Member"}},"type":"object","title":"DefaultRoleResponse","description":"Response for the default role setting."},"DeleteAppResponse":{"properties":{"message":{"type":"string","title":"Message"},"detached_tests":{"type":"integer","title":"Detached Tests","description":"Number of tests that were detached from this app","default":0}},"type":"object","required":["message"],"title":"DeleteAppResponse","description":"Response after deleting an app."},"DeleteEvalResultsRequest":{"properties":{"eval_ids":{"items":{"type":"string"},"type":"array","title":"Eval Ids"}},"type":"object","required":["eval_ids"],"title":"DeleteEvalResultsRequest","description":"Request body for bulk-deleting eval results."},"DeleteEvalResultsResponse":{"properties":{"deleted_count":{"type":"integer","title":"Deleted Count"}},"type":"object","required":["deleted_count"],"title":"DeleteEvalResultsResponse","description":"Response for bulk delete."},"DeleteInternalSlackRuleResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"DeleteInternalSlackRuleResponse","description":"Response for deleting a rule."},"DeleteModuleResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"DeleteModuleResponse","description":"Response model for delete operations"},"DeleteSlackNotificationRuleResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"DeleteSlackNotificationRuleResponse","description":"Response after deleting a notification rule."},"DeleteTaskResponse":{"properties":{"deleted_count":{"type":"integer","title":"Deleted Count"},"failed_count":{"type":"integer","title":"Failed Count"},"failed_task_ids":{"items":{"type":"string"},"type":"array","title":"Failed Task Ids","default":[]},"message":{"type":"string","title":"Message"}},"type":"object","required":["deleted_count","failed_count","message"],"title":"DeleteTaskResponse","description":"Response after deleting tasks."},"DeleteWorkflowResponse":{"properties":{"data":{"$ref":"#/components/schemas/WorkflowsBaseSchema","description":"Deleted workflow record"},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["data","message"],"title":"DeleteWorkflowResponse"},"DeleteWorkflowShareableLinkResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"child_links_revoked":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Child Links Revoked"}},"type":"object","title":"DeleteWorkflowShareableLinkResponse"},"DeleteWorkflowTaskResponse":{"properties":{"message":{"type":"string","title":"Message"},"task_id":{"type":"string","title":"Task Id"}},"type":"object","required":["message","task_id"],"title":"DeleteWorkflowTaskResponse","description":"Response after deleting a workflow task."},"DeveloperItem":{"properties":{"login":{"type":"string","title":"Login"},"name":{"type":"string","title":"Name"},"avatar_url":{"type":"string","title":"Avatar Url"}},"type":"object","required":["login","name","avatar_url"],"title":"DeveloperItem"},"DeveloperProfile":{"properties":{"commit_type_distribution":{"items":{"$ref":"#/components/schemas/CategoryValue"},"type":"array","title":"Commit Type Distribution"},"technical_skills":{"items":{"$ref":"#/components/schemas/CategoryValue"},"type":"array","title":"Technical Skills"}},"type":"object","required":["commit_type_distribution","technical_skills"],"title":"DeveloperProfile"},"DeviceCleanupConfig":{"properties":{"cleanup_level":{"$ref":"#/components/schemas/CleanupLevel","description":"Level of cleanup to perform (default: THOROUGH for maximum cleanup)","default":"thorough"},"clear_app_data":{"type":"boolean","title":"Clear App Data","description":"Clear app data and cache via pm clear","default":true},"revoke_permissions":{"type":"boolean","title":"Revoke Permissions","description":"Revoke runtime permissions granted during test","default":true},"clear_downloads":{"type":"boolean","title":"Clear Downloads","description":"Clear /sdcard/Download folder","default":true},"clear_shared_storage":{"type":"boolean","title":"Clear Shared Storage","description":"Clear Pictures, DCIM, Movies, Music, Documents folders","default":true},"clear_clipboard":{"type":"boolean","title":"Clear Clipboard","description":"Clear clipboard contents","default":true},"clear_notifications":{"type":"boolean","title":"Clear Notifications","description":"Clear all pending notifications from previous test sessions","default":true},"reset_system_ui":{"type":"boolean","title":"Reset System Ui","description":"Reset SystemUI state including wallpaper to defaults. Expensive (~2-3s). Auto-enabled for DEEP_CLEAN.","default":false},"clear_recent_apps":{"type":"boolean","title":"Clear Recent Apps","description":"Clear recent apps list (requires root access, restarts framework). Expensive (~15-30s), broken on Play Store images. Auto-enabled for DEEP_CLEAN.","default":false},"kill_background_apps":{"type":"boolean","title":"Kill Background Apps","description":"Kill all background applications","default":true},"clear_browser_data":{"type":"boolean","title":"Clear Browser Data","description":"Clear browsing data (history, cookies, cache) from all browsers","default":true},"uninstall_new_apps":{"type":"boolean","title":"Uninstall New Apps","description":"Uninstall apps that were installed during the test session","default":true},"custom_paths_to_clear":{"items":{"type":"string"},"type":"array","title":"Custom Paths To Clear","description":"Additional paths to clear on device"}},"type":"object","title":"DeviceCleanupConfig","description":"Configuration for AVD cleanup between test runs.\n\nControls what gets reset when resetting device state between tests\nwhile keeping the emulator running."},"DeviceLogsDownloadResponse":{"properties":{"download_url":{"type":"string","title":"Download Url"},"filename":{"type":"string","title":"Filename"},"compressed":{"type":"boolean","title":"Compressed"},"file_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size Bytes"}},"type":"object","required":["download_url","filename","compressed"],"title":"DeviceLogsDownloadResponse","description":"Response model for device logs download URL."},"DeviceMetadata":{"properties":{"width":{"type":"integer","title":"Width","description":"Device screen width in logical pixels"},"height":{"type":"integer","title":"Height","description":"Device screen height in logical pixels"},"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type","description":"Device type/model (e.g., 'iPhone 16', 'Pixel 7')"},"runtime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runtime","description":"Device runtime version (e.g., 'iOS 18.5', 'Android 34')"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Platform name ('ios' or 'android')"}},"type":"object","required":["width","height"],"title":"DeviceMetadata","description":"Device metadata captured at runtime for accurate coordinate scaling.\n\nThis schema is still actively used and stored in the reports.device_metadata\ncolumn in the database."},"DevicePair":{"properties":{"model":{"type":"string","title":"Model","description":"Device model name (e.g. 'iPhone 16')"},"runtime":{"type":"string","title":"Runtime","description":"OS runtime version (e.g. 'iOS 18.5')"}},"type":"object","required":["model","runtime"],"title":"DevicePair","description":"A device model + runtime combination."},"DeviceSessionClaimStartResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"claimed":{"type":"boolean","title":"Claimed"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["session_id","claimed","message"],"title":"DeviceSessionClaimStartResponse","description":"Response model for atomic queued->starting claim."},"DeviceSessionCreate":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"source":{"type":"string","title":"Source"},"source_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Metadata"},"platform":{"type":"string","enum":["ios","android"],"title":"Platform"},"status":{"type":"string","title":"Status","default":"queued"}},"type":"object","required":["source","platform"],"title":"DeviceSessionCreate","description":"Request model for creating a device session."},"DeviceSessionDetailItem":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"source_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Metadata"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"status":{"type":"string","title":"Status"},"whep_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whep Url"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ended At"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"screen_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Width"},"screen_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Height"},"report_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Id"},"has_video":{"type":"boolean","title":"Has Video","default":false},"step_count":{"type":"integer","title":"Step Count","default":0},"action_count":{"type":"integer","title":"Action Count","default":0},"has_test_execution":{"type":"boolean","title":"Has Test Execution","default":false},"test_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Execution Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"workflow_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Execution Id"},"workflow_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Name"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"can_interact":{"type":"boolean","title":"Can Interact","default":false},"can_cancel":{"type":"boolean","title":"Can Cancel","default":false},"interaction_disabled_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interaction Disabled Reason"}},"type":"object","required":["id","org_id","status"],"title":"DeviceSessionDetailItem","description":"Detailed device session payload for the canonical session viewer."},"DeviceSessionResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["message","success"],"title":"DeviceSessionResponse","description":"Response model for device session operations."},"DeviceSessionUpdate":{"properties":{"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ended At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"whep_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whep Url"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"screen_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Width"},"screen_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Height"}},"type":"object","title":"DeviceSessionUpdate","description":"Request model for updating a device session."},"DisconnectSlackResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"DisconnectSlackResponse","description":"Response after disconnecting Slack."},"DoraMetrics":{"properties":{"deployment_frequency_per_day":{"type":"number","title":"Deployment Frequency Per Day"},"lead_time_hours":{"type":"number","title":"Lead Time Hours"},"mttr_hours":{"type":"number","title":"Mttr Hours"},"change_failure_rate_percent":{"type":"number","title":"Change Failure Rate Percent"}},"type":"object","required":["deployment_frequency_per_day","lead_time_hours","mttr_hours","change_failure_rate_percent"],"title":"DoraMetrics"},"DuplicateTestRequest":{"properties":{"test_id":{"type":"string","title":"Test Id","description":"ID of the test to duplicate"},"new_name":{"type":"string","title":"New Name","description":"Name for the duplicated test"},"copy_cookies":{"type":"boolean","title":"Copy Cookies","description":"Whether to copy cookies from the original test","default":true},"copy_variables":{"type":"boolean","title":"Copy Variables","description":"Whether to copy custom variables from the original test","default":true},"target_platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Platform","description":"Target platform for cross-platform duplication (ios or android). If not provided, keeps original platform."},"new_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New App Id","description":"App ID to assign to the duplicated test. If not provided, keeps original app (or clears if cross-platform)."}},"type":"object","required":["test_id","new_name"],"title":"DuplicateTestRequest","description":"Request model for duplicating a test."},"DuplicateTestResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the duplication was successful"},"test_id":{"type":"string","title":"Test Id","description":"ID of the newly created test"},"name":{"type":"string","title":"Name","description":"Name of the duplicated test"},"platform":{"type":"string","title":"Platform","description":"Platform of the duplicated test (android/ios)"},"steps_count":{"type":"integer","title":"Steps Count","description":"Number of steps/tasks in the duplicated test","default":0},"message":{"type":"string","title":"Message","description":"Success or error message"},"cookies_copied":{"type":"integer","title":"Cookies Copied","description":"Number of cookies copied (if applicable)","default":0},"variables_copied":{"type":"integer","title":"Variables Copied","description":"Number of custom variables copied","default":0},"tags_copied":{"type":"integer","title":"Tags Copied","description":"Number of tags copied","default":0}},"type":"object","required":["success","test_id","name","platform","message"],"title":"DuplicateTestResponse","description":"Response model for test duplication."},"EnhancedSummaryRequest":{"properties":{"repositories":{"anyOf":[{"items":{"$ref":"#/components/schemas/RepositoryIdentifier"},"type":"array"},{"type":"null"}],"title":"Repositories"},"all_repos":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"All Repos","default":false},"week_offset":{"type":"integer","title":"Week Offset","default":0}},"type":"object","title":"EnhancedSummaryRequest","description":"Request model for enhanced weekly summary with What Got Done support."},"EnhancedSummaryResponse":{"properties":{"summary":{"$ref":"#/components/schemas/WhatGotDoneSummary","description":"Categorized summary"},"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories","description":"List of 'owner/repo' strings"},"week_start_date":{"type":"string","title":"Week Start Date","description":"Start date of the week"},"week_end_date":{"type":"string","title":"Week End Date","description":"End date of the week"},"is_complete_week":{"type":"boolean","title":"Is Complete Week","description":"Whether this is a complete week"},"merged_prs_count":{"type":"integer","title":"Merged Prs Count","description":"Total number of merged PRs"},"retrieved_at":{"type":"string","title":"Retrieved At","description":"Timestamp when data was retrieved"},"from_cache":{"type":"boolean","title":"From Cache","description":"Whether data was served from cache"}},"type":"object","required":["summary","repositories","week_start_date","week_end_date","is_complete_week","merged_prs_count","retrieved_at","from_cache"],"title":"EnhancedSummaryResponse","description":"Response model for enhanced weekly summary."},"Environment":{"type":"string","enum":["staging","production"],"title":"Environment","description":"Environment identifier for workflow name resolution.\n\nAttributes:\n STAGING: Staging environment.\n PRODUCTION: Production environment."},"ErrorImage":{"properties":{"step_index":{"type":"integer","title":"Step Index"},"retry_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry Index"},"image_type":{"type":"string","title":"Image Type"},"error_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Type"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description"},"data":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["step_index","image_type"],"title":"ErrorImage","description":"Model for error images returned in eval response."},"ErrorTypeBreakdownItem":{"properties":{"label":{"type":"string","title":"Label"},"errors":{"type":"integer","title":"Errors"}},"type":"object","required":["label","errors"],"title":"ErrorTypeBreakdownItem","description":"A single row in the grounding error type breakdown."},"EvalErrorSummary":{"properties":{"grounding_errors":{"type":"integer","title":"Grounding Errors","default":0},"reflection_errors":{"type":"integer","title":"Reflection Errors","default":0},"instruction_errors":{"type":"integer","title":"Instruction Errors","default":0},"validation_errors":{"type":"integer","title":"Validation Errors","default":0},"bounding_box_errors":{"type":"integer","title":"Bounding Box Errors","default":0},"grounder_hint_errors":{"type":"integer","title":"Grounder Hint Errors","default":0}},"type":"object","title":"EvalErrorSummary","description":"Summary of errors from evaluation."},"EvalQueueItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"task_id":{"type":"string","format":"uuid","title":"Task Id"},"test_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Test Id"},"org_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"total_steps":{"type":"integer","title":"Total Steps"},"grounded_steps":{"type":"integer","title":"Grounded Steps"},"grounding_errors":{"type":"integer","title":"Grounding Errors"},"error_types":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Error Types"},"review_status":{"type":"string","title":"Review Status"},"grounder_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grounder Type"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"false_positive_count":{"type":"integer","title":"False Positive Count","default":0},"annotated_count":{"type":"integer","title":"Annotated Count","default":0}},"type":"object","required":["id","created_at","task_id","total_steps","grounded_steps","grounding_errors","review_status"],"title":"EvalQueueItem"},"EvalQueueResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EvalQueueItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"EvalQueueResponse"},"EvalRequest":{"properties":{"task_id":{"type":"string","title":"Task Id"},"enabled_judges":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Enabled Judges"}},"type":"object","required":["task_id","enabled_judges"],"title":"EvalRequest","description":"Request model for running an eval."},"EvalResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"report":{"anyOf":[{"$ref":"#/components/schemas/TestEvalReport"},{"type":"null"}]},"log_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Text"},"error_images":{"anyOf":[{"items":{"$ref":"#/components/schemas/ErrorImage"},"type":"array"},{"type":"null"}],"title":"Error Images"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"EvalResponse","description":"Response model for eval results."},"ExecuteTestAsyncAPIResponse":{"properties":{"status":{"$ref":"#/components/schemas/AsyncStatus"},"message":{"type":"string","title":"Message"},"id":{"type":"string","format":"uuid","title":"Id","description":"Execution ID"},"task_id":{"type":"string","title":"Task Id","description":"Alias for id, for backwards compatibility with older clients.","readOnly":true}},"type":"object","required":["status","message","id","task_id"],"title":"ExecuteTestAsyncAPIResponse","description":"Response for async test execution start."},"ExecuteWorkflowAsyncAPIResponse":{"properties":{"status":{"$ref":"#/components/schemas/AsyncStatus"},"message":{"type":"string","title":"Message"},"id":{"type":"string","format":"uuid","title":"Id","description":"Execution ID"},"task_id":{"type":"string","title":"Task Id","description":"Alias for id, for backwards compatibility with older clients.","readOnly":true}},"type":"object","required":["status","message","id","task_id"],"title":"ExecuteWorkflowAsyncAPIResponse","description":"Response for async workflow execution start."},"ExecutionModeConfig-Input":{"properties":{"human_in_the_loop":{"type":"boolean","title":"Human In The Loop","description":"Enable human approval for test results","default":false},"enable_reflection":{"type":"boolean","title":"Enable Reflection","description":"Enable reflection on failed steps","default":true},"enable_planning":{"type":"boolean","title":"Enable Planning","description":"Enable planning for complex steps","default":false},"retries":{"type":"integer","title":"Retries","description":"Number of retry attempts","default":1},"reflection_retries":{"type":"integer","title":"Reflection Retries","description":"Number of reflection retry attempts","default":1},"skip_app_install":{"type":"boolean","title":"Skip App Install","description":"Skip app installation during test execution","default":false},"grounder_type":{"anyOf":[{"$ref":"#/components/schemas/GrounderType"},{"type":"null"}],"default":"moondream3"},"cleanup_config":{"anyOf":[{"$ref":"#/components/schemas/DeviceCleanupConfig"},{"type":"null"}],"description":"Configuration for AVD cleanup between test runs"},"initial_location":{"anyOf":[{"$ref":"#/components/schemas/LocationConfig"},{"type":"null"}],"description":"Initial GPS location to set when simulator boots"},"initial_orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initial Orientation","description":"Initial device orientation: 'portrait' or 'landscape'"}},"type":"object","title":"ExecutionModeConfig","description":"Configuration for execution modes and features."},"ExecutionModeConfig-Output":{"properties":{"human_in_the_loop":{"type":"boolean","title":"Human In The Loop","description":"Enable human approval for test results","default":false},"enable_reflection":{"type":"boolean","title":"Enable Reflection","description":"Enable reflection on failed steps","default":true},"enable_planning":{"type":"boolean","title":"Enable Planning","description":"Enable planning for complex steps","default":false},"retries":{"type":"integer","title":"Retries","description":"Number of retry attempts","default":1},"reflection_retries":{"type":"integer","title":"Reflection Retries","description":"Number of reflection retry attempts","default":1},"skip_app_install":{"type":"boolean","title":"Skip App Install","description":"Skip app installation during test execution","default":false},"grounder_type":{"anyOf":[{"$ref":"#/components/schemas/GrounderType"},{"type":"null"}],"default":"moondream3"},"cleanup_config":{"anyOf":[{"$ref":"#/components/schemas/DeviceCleanupConfig"},{"type":"null"}],"description":"Configuration for AVD cleanup between test runs"},"initial_location":{"anyOf":[{"$ref":"#/components/schemas/LocationConfig"},{"type":"null"}],"description":"Initial GPS location to set when simulator boots"},"initial_orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initial Orientation","description":"Initial device orientation: 'portrait' or 'landscape'"}},"type":"object","title":"ExecutionModeConfig","description":"Configuration for execution modes and features."},"ExpoBuildArtifacts":{"properties":{"buildUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buildurl"},"applicationArchiveUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicationarchiveurl"}},"additionalProperties":true,"type":"object","title":"ExpoBuildArtifacts","description":"Artifacts associated with an Expo/EAS build."},"ExpoBuildItem":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"distribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Distribution"},"buildProfile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buildprofile"},"appVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appversion"},"sdkVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sdkversion"},"gitCommitHash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gitcommithash"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Createdat"},"completedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completedat"},"artifacts":{"anyOf":[{"$ref":"#/components/schemas/ExpoBuildArtifacts"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"ExpoBuildItem","description":"A single Expo/EAS build entry."},"ExpoBuildsResponse":{"properties":{"builds":{"items":{"$ref":"#/components/schemas/ExpoBuildItem"},"type":"array","title":"Builds","description":"List of builds from all projects"},"total_count":{"type":"integer","title":"Total Count","description":"Total number of builds returned","default":0}},"type":"object","title":"ExpoBuildsResponse","description":"Response containing Expo builds."},"ExpoProjectDbResponse":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"project_id":{"type":"string","title":"Project Id"},"project_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","org_id","project_id","created_at","updated_at"],"title":"ExpoProjectDbResponse","description":"Response model for Expo project configuration from database."},"ExpoProjectFromBuildPathRequest":{"properties":{"owner":{"type":"string","title":"Owner","description":"GitHub repository owner"},"repo":{"type":"string","title":"Repo","description":"GitHub repository name"},"build_paths":{"items":{"type":"string"},"type":"array","title":"Build Paths","description":"List of paths to Expo app directories (e.g., ['apps/expo-demo'])"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch","description":"Branch name (defaults to repo's default branch)"}},"type":"object","required":["owner","repo","build_paths"],"title":"ExpoProjectFromBuildPathRequest","description":"Request to extract Expo project IDs from build paths."},"ExpoProjectFromBuildPathResponse":{"properties":{"projects":{"items":{"$ref":"#/components/schemas/ExpoProjectInfo"},"type":"array","title":"Projects","description":"List of extracted project info"}},"type":"object","title":"ExpoProjectFromBuildPathResponse","description":"Response containing extracted Expo project info."},"ExpoProjectInfo":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"Expo project ID (UUID)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"App name from app.json"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug","description":"App slug from app.json"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner","description":"Expo owner from app.json"},"build_path":{"type":"string","title":"Build Path","description":"Build path this was extracted from"}},"type":"object","required":["project_id","build_path"],"title":"ExpoProjectInfo","description":"Extracted Expo project information."},"ExpoProjectListResponse":{"properties":{"projects":{"items":{"$ref":"#/components/schemas/ExpoProjectDbResponse"},"type":"array","title":"Projects","description":"List of Expo project configurations"}},"type":"object","title":"ExpoProjectListResponse","description":"Response containing list of Expo project configurations."},"ExpoProjectMetadataEntry":{"properties":{"id":{"type":"string","title":"Id","description":"Expo project ID (UUID)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Display name for the project"}},"type":"object","required":["id"],"title":"ExpoProjectMetadataEntry","description":"Expo project entry stored in PropelAuth organization metadata (id + name only)."},"ExtractBuildPackageIdResponse":{"properties":{"package_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Id","description":"Extracted bundle ID (iOS) or package name (Android)"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if extraction failed"}},"type":"object","title":"ExtractBuildPackageIdResponse","description":"Response model for extracting package ID for a build."},"ExtractPackageIdRequest":{"properties":{"id":{"type":"string","title":"Id","description":"Test ID"}},"type":"object","required":["id"],"title":"ExtractPackageIdRequest","description":"Request to extract package ID from uploaded binary"},"ExtractPackageIdResponse":{"properties":{"package_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Id","description":"Extracted bundle ID or package name"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if extraction failed"}},"type":"object","title":"ExtractPackageIdResponse","description":"Response with extracted package identifier"},"FallbackTrigger":{"type":"string","enum":["final_fail"],"title":"FallbackTrigger","description":"When to trigger cache fallback.\n\n- FINAL_FAIL: Only trigger fallback if overall test fails"},"FinalizeSessionRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["session_id"],"title":"FinalizeSessionRequest"},"FinalizeSessionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"usage_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usage Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"FinalizeSessionResponse"},"FleetAuthValidateResponse":{"properties":{"valid":{"type":"boolean","title":"Valid","description":"Whether API key is valid"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"User ID"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"User email"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id","description":"Organization ID"},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions","description":"User permissions"}},"type":"object","required":["valid"],"title":"FleetAuthValidateResponse","description":"Response from validating an API key for Fleet access.\n\nUsed by FleetDashboard to verify API key and get user info.\n\nAttributes:\n valid: Whether the API key is valid.\n user_id: User ID associated with the key.\n email: User's email address.\n org_id: Organization ID.\n permissions: List of user permissions."},"FleetDashboardResponse":{"properties":{"status":{"$ref":"#/components/schemas/FleetPoolStatus","description":"Pool status summary"},"sandboxes":{"items":{"$ref":"#/components/schemas/FleetSandbox"},"type":"array","title":"Sandboxes","description":"All sandboxes"},"worktrees":{"items":{"$ref":"#/components/schemas/FleetWorktree"},"type":"array","title":"Worktrees","description":"User's worktrees"},"claimed_sandbox":{"anyOf":[{"$ref":"#/components/schemas/FleetSandbox"},{"type":"null"}],"description":"User's claimed sandbox"},"tunnels":{"items":{"$ref":"#/components/schemas/FleetTunnel"},"type":"array","title":"Tunnels","description":"Active tunnels"}},"type":"object","required":["status","sandboxes"],"title":"FleetDashboardResponse","description":"Combined response for the Fleet dashboard view.\n\nProvides all data needed to render the main Fleet Dashboard UI\nin a single API call.\n\nAttributes:\n status: Pool status summary.\n sandboxes: List of all sandboxes.\n worktrees: List of worktrees on user's claimed sandbox(es).\n claimed_sandbox: The user's currently claimed sandbox (if any).\n tunnels: List of active tunnels on user's sandbox(es)."},"FleetPoolStatus":{"properties":{"total":{"type":"integer","title":"Total","description":"Total sandboxes in pool"},"available":{"type":"integer","title":"Available","description":"Available sandboxes"},"claimed":{"type":"integer","title":"Claimed","description":"Claimed sandboxes"},"maintenance":{"type":"integer","title":"Maintenance","description":"Sandboxes under maintenance","default":0}},"type":"object","required":["total","available","claimed"],"title":"FleetPoolStatus","description":"Summary statistics for the Fleet sandbox pool.\n\nProvides a quick overview of pool availability and usage.\n\nAttributes:\n total: Total number of sandboxes in the pool.\n available: Number of sandboxes available for claiming.\n claimed: Number of sandboxes currently claimed.\n maintenance: Number of sandboxes under maintenance."},"FleetSandbox":{"properties":{"id":{"type":"string","title":"Id","description":"Unique sandbox identifier (UUID)"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id","description":"Organization ID (NULL = shared pool)"},"vm_name":{"type":"string","title":"Vm Name","description":"VM name (e.g., 'sandbox-1')"},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname","description":"Human-readable hostname"},"sandbox_type":{"type":"string","enum":["dedicated","container"],"title":"Sandbox Type","description":"Sandbox type (dedicated or container)","default":"dedicated"},"host_identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Identifier","description":"Physical host grouping identifier"},"tunnel_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tunnel Hostname","description":"Cloudflare tunnel hostname for SSH"},"status":{"type":"string","enum":["available","claimed","maintenance","reserved"],"title":"Status","description":"Current sandbox state","default":"available"},"claimed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claimed By","description":"User ID of claiming developer"},"claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed At","description":"When sandbox was claimed"},"ssh_user":{"type":"string","title":"Ssh User","description":"SSH username","default":"revyl-admin"},"ssh_port":{"type":"integer","title":"Ssh Port","description":"SSH port","default":22},"ssm_instance_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ssm Instance Id","description":"AWS SSM managed instance ID for remote command execution"},"specs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Specs","description":"Hardware specs (cpu_cores, memory_gb, chip)"},"tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tags","description":"Flexible labels for filtering"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","vm_name"],"title":"FleetSandbox","description":"Represents a virtual machine sandbox in the Fleet pool.\n\nSandboxes are Mac Mini VMs that developers can claim for development work.\nEach sandbox can host multiple git repositories and worktrees.\n\nAttributes:\n id: Unique identifier for the sandbox (UUID).\n org_id: Organization ID that owns this sandbox (NULL = shared pool).\n vm_name: VM name (e.g., \"sandbox-1\").\n hostname: Human-readable hostname for display.\n sandbox_type: Type of sandbox (dedicated machine or container).\n host_identifier: Groups sandboxes running on the same physical host.\n tunnel_hostname: Cloudflare tunnel hostname for SSH access.\n status: Current sandbox state (available, claimed, maintenance, reserved).\n claimed_by: User ID of the developer who claimed this sandbox.\n claimed_at: Timestamp when the sandbox was claimed.\n ssh_user: SSH username for connections (default: revyl-admin).\n ssh_port: SSH port number (default: 22).\n specs: Hardware specifications (cpu_cores, memory_gb, chip).\n tags: Flexible labels for filtering (location, tier, etc.).\n created_at: When the sandbox was added to the pool.\n updated_at: Last modification timestamp."},"FleetTunnel":{"properties":{"port":{"type":"integer","title":"Port","description":"Local port being tunneled"},"url":{"type":"string","title":"Url","description":"Public tunnel URL"},"pid":{"type":"integer","title":"Pid","description":"cloudflared process ID"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch","description":"Associated worktree branch"},"sandbox_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sandbox Name","description":"Sandbox VM name"},"service_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Name","description":"Service name"}},"type":"object","required":["port","url","pid"],"title":"FleetTunnel","description":"Represents an active Cloudflare tunnel on a sandbox.\n\nTunnels provide temporary public URLs for accessing services\nrunning on sandboxes (e.g., frontend dev server, API).\n\nAttributes:\n port: Local port being tunneled.\n url: Public Cloudflare tunnel URL.\n pid: Process ID of the cloudflared process.\n branch: Optional worktree branch associated with this tunnel.\n sandbox_name: Name of the sandbox hosting this tunnel.\n service_name: Human-readable service name (e.g., \"frontend\", \"backend\")."},"FleetWorktree":{"properties":{"branch":{"type":"string","title":"Branch","description":"Git branch name"},"path":{"type":"string","title":"Path","description":"Filesystem path on sandbox"},"is_main":{"type":"boolean","title":"Is Main","description":"Is main worktree","default":false},"repo":{"type":"string","title":"Repo","description":"Repository name"},"sandbox_name":{"type":"string","title":"Sandbox Name","description":"Sandbox VM name"},"sandbox_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sandbox Id","description":"Sandbox UUID"},"branched_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branched From","description":"Base branch for this worktree"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"}},"type":"object","required":["branch","path","repo","sandbox_name"],"title":"FleetWorktree","description":"Represents a git worktree on a Fleet sandbox.\n\nWorktrees allow multiple branches to be checked out simultaneously\non the same sandbox, enabling parallel development work.\n\nAttributes:\n branch: Git branch name for this worktree.\n path: Filesystem path on the sandbox.\n is_main: Whether this is the main/primary worktree.\n repo: Repository name (e.g., \"cognisim-monorepo\").\n sandbox_name: Name of the sandbox hosting this worktree.\n sandbox_id: UUID of the sandbox hosting this worktree.\n branched_from: Base branch this worktree was created from.\n created_at: When the worktree was created."},"FlywheelConfigResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"FlywheelConfigResponse"},"FlywheelConfigUpdateRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"FlywheelConfigUpdateRequest"},"FlywheelEvalResultResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"task_id":{"type":"string","format":"uuid","title":"Task Id"},"test_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Test Id"},"org_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"total_steps":{"type":"integer","title":"Total Steps","default":0},"grounded_steps":{"type":"integer","title":"Grounded Steps","default":0},"grounding_errors":{"type":"integer","title":"Grounding Errors","default":0},"error_types":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Error Types"},"step_results":{"anyOf":[{"items":{"$ref":"#/components/schemas/FlywheelStepResult"},"type":"array"},{"type":"null"}],"title":"Step Results"},"review_status":{"type":"string","title":"Review Status","default":"pending"},"grounder_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grounder Type"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"manifest_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Url"},"false_positive_count":{"type":"integer","title":"False Positive Count","default":0},"annotated_count":{"type":"integer","title":"Annotated Count","default":0},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"reviewed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewed By"},"enabled_judges":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Enabled Judges"},"device_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Device Width"},"device_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Device Height"}},"type":"object","required":["id","task_id"],"title":"FlywheelEvalResultResponse","description":"Response model for a single flywheel eval result."},"FlywheelLoadStepsRequest":{"properties":{"task_id":{"type":"string","title":"Task Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"manifest_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Url"},"grounder_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grounder Type"}},"type":"object","required":["task_id"],"title":"FlywheelLoadStepsRequest","description":"Request body for the internal load-steps endpoint."},"FlywheelLoadStepsResponse":{"properties":{"step_inputs":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Step Inputs"},"total_steps":{"type":"integer","title":"Total Steps"},"grounded_steps":{"type":"integer","title":"Grounded Steps"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"manifest_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Url"}},"type":"object","required":["step_inputs","total_steps","grounded_steps"],"title":"FlywheelLoadStepsResponse","description":"Response from the internal load-steps endpoint.\n\nstep_inputs is a list of dicts (serialized StepEvalInput) to avoid\nimporting the full eval schema in the workflow."},"FlywheelMonitorResponse":{"properties":{"total_errors":{"type":"integer","title":"Total Errors"},"total_grounded_steps":{"type":"integer","title":"Total Grounded Steps"},"total_evals":{"type":"integer","title":"Total Evals"},"error_rate":{"type":"number","title":"Error Rate"},"error_trend":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Error Trend"},"errors_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Errors Delta"},"evals_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Evals Delta"},"error_type_breakdown":{"items":{"$ref":"#/components/schemas/ErrorTypeBreakdownItem"},"type":"array","title":"Error Type Breakdown"},"platform_breakdown":{"items":{"$ref":"#/components/schemas/MonitorBreakdownItem"},"type":"array","title":"Platform Breakdown"},"grounder_breakdown":{"items":{"$ref":"#/components/schemas/MonitorBreakdownItem"},"type":"array","title":"Grounder Breakdown"},"timeseries":{"items":{"$ref":"#/components/schemas/MonitorTimeseriesPoint"},"type":"array","title":"Timeseries"}},"type":"object","required":["total_errors","total_grounded_steps","total_evals","error_rate","error_type_breakdown","platform_breakdown","grounder_breakdown","timeseries"],"title":"FlywheelMonitorResponse","description":"Top-level response for GET /monitor."},"FlywheelStepImageUrls":{"properties":{"before":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Before"},"tagged":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagged"},"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After"}},"type":"object","title":"FlywheelStepImageUrls","description":"Image URLs for a flywheel step result."},"FlywheelStepResult":{"properties":{"step_index":{"type":"integer","title":"Step Index"},"step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Id"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description"},"action_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type"},"correct":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Correct"},"error_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Type"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"},"actual_element":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual Element"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"grounder_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grounder Hint"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description"},"x":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X"},"y":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Y"},"is_retry":{"type":"boolean","title":"Is Retry","default":false},"retry_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry Index"},"image_urls":{"anyOf":[{"$ref":"#/components/schemas/FlywheelStepImageUrls"},{"type":"null"}]},"dismissed":{"type":"boolean","title":"Dismissed","default":false},"annotated":{"type":"boolean","title":"Annotated","default":false},"reviewed":{"type":"boolean","title":"Reviewed","default":false}},"type":"object","required":["step_index"],"title":"FlywheelStepResult","description":"A single step result in a flywheel eval."},"FlywheelStoreResultsRequest":{"properties":{"task_id":{"type":"string","title":"Task Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id"},"total_steps":{"type":"integer","title":"Total Steps","default":0},"grounded_steps":{"type":"integer","title":"Grounded Steps","default":0},"grounding_errors":{"type":"integer","title":"Grounding Errors","default":0},"error_types":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Error Types"},"step_results":{"items":{"$ref":"#/components/schemas/FlywheelStepResult"},"type":"array","title":"Step Results","default":[]},"review_status":{"type":"string","title":"Review Status","default":"pending"},"grounder_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grounder Type"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"manifest_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Url"},"enabled_judges":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Enabled Judges"}},"type":"object","required":["task_id"],"title":"FlywheelStoreResultsRequest","description":"Request body for the internal store-results endpoint."},"FlywheelStoreResultsResponse":{"properties":{"eval_result_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eval Result Id"}},"type":"object","title":"FlywheelStoreResultsResponse","description":"Response from the internal store-results endpoint."},"FlywheelTriggerRequest":{"properties":{"task_id":{"type":"string","title":"Task Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"grounder_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grounder Type"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"manifest_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Url"}},"type":"object","required":["task_id"],"title":"FlywheelTriggerRequest","description":"Request from CLI to trigger flywheel eval for a completed test."},"FlywheelTriggerResponse":{"properties":{"accepted":{"type":"boolean","title":"Accepted"},"message":{"type":"string","title":"Message"}},"type":"object","required":["accepted","message"],"title":"FlywheelTriggerResponse"},"GenerateStateTokenResponse":{"properties":{"state_token":{"type":"string","title":"State Token"}},"type":"object","required":["state_token"],"title":"GenerateStateTokenResponse"},"GenerateWorkflowShareableLinkRequest":{"properties":{"workflow_task_id":{"type":"string","title":"Workflow Task Id"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin","default":"https://app.revyl.ai"},"expiration_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expiration Hours"},"include_child_tests":{"type":"boolean","title":"Include Child Tests","default":false}},"type":"object","required":["workflow_task_id"],"title":"GenerateWorkflowShareableLinkRequest"},"GenerateWorkflowShareableLinkResponse":{"properties":{"shareable_link":{"type":"string","title":"Shareable Link"},"child_links_created":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Child Links Created"}},"type":"object","required":["shareable_link"],"title":"GenerateWorkflowShareableLinkResponse"},"GetVariableValueResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Status message"},"result":{"type":"string","title":"Result","description":"Value of the variable"}},"type":"object","required":["message","result"],"title":"GetVariableValueResponse","description":"Response for get variable value endpoint."},"GetWorkflowDetailResponse":{"properties":{"data":{"$ref":"#/components/schemas/WorkflowDetailData","description":"Enriched workflow data for detail view"}},"type":"object","required":["data"],"title":"GetWorkflowDetailResponse"},"GetWorkflowTaskStatusResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Status of the workflow task"}},"type":"object","required":["status"],"title":"GetWorkflowTaskStatusResponse"},"GetWorkflowsWithLastStatusResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WorkflowWithLastStatus"},"type":"array","title":"Data","description":"List of workflows with last execution status"},"count":{"type":"integer","title":"Count","description":"Number of workflows in this page"},"total_count":{"type":"integer","title":"Total Count","description":"Total number of workflows across all pages","default":0},"offset":{"type":"integer","title":"Offset","description":"Offset used for this page","default":0},"limit":{"type":"integer","title":"Limit","description":"Limit used for this page","default":100},"has_more":{"type":"boolean","title":"Has More","description":"Whether more workflows exist beyond this page","default":false},"total_workflows_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Workflows Wow","description":"Week-over-week percentage change in total workflows (positive = increase)"},"passing_workflows_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Passing Workflows Wow","description":"Week-over-week percentage change in passing workflows (positive = increase)"},"failing_workflows_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Failing Workflows Wow","description":"Week-over-week percentage change in failing workflows (positive = increase)"},"not_run_workflows_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Not Run Workflows Wow","description":"Week-over-week percentage change in not run workflows (positive = increase)"}},"type":"object","required":["data","count"],"title":"GetWorkflowsWithLastStatusResponse"},"GitHubUser":{"properties":{"id":{"type":"integer","title":"Id"},"login":{"type":"string","title":"Login"},"avatar_url":{"type":"string","title":"Avatar Url"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["id","login","avatar_url"],"title":"GitHubUser"},"GlobalVariableCreate":{"properties":{"variable_name":{"type":"string","title":"Variable Name","description":"Name of the variable"},"variable_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Value","description":"Value of the variable"},"is_secret":{"type":"boolean","title":"Is Secret","description":"Whether the value should be masked","default":false},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Description of the variable"}},"type":"object","required":["variable_name"],"title":"GlobalVariableCreate","description":"Request model for creating a global variable."},"GlobalVariableResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Response message"},"result":{"$ref":"#/components/schemas/GlobalVariableRow","description":"Global variable record"}},"type":"object","required":["message","result"],"title":"GlobalVariableResponse","description":"Response model for single global variable operations."},"GlobalVariableRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Unique identifier"},"org_id":{"type":"string","format":"uuid","title":"Org Id","description":"Organization ID"},"variable_name":{"type":"string","title":"Variable Name","description":"Name of the variable"},"variable_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Value","description":"Value"},"is_secret":{"type":"boolean","title":"Is Secret","description":"Whether the value should be masked","default":false},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Description"},"created_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By","description":"User who created it"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","org_id","variable_name","created_at","updated_at"],"title":"GlobalVariableRow","description":"Row model for a global variable."},"GlobalVariableUpdate":{"properties":{"variable_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Name","description":"New name"},"variable_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Value","description":"New value"},"is_secret":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Secret","description":"New secret flag"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"New description"}},"type":"object","title":"GlobalVariableUpdate","description":"Request model for updating a global variable."},"GlobalVariablesResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Response message"},"result":{"items":{"$ref":"#/components/schemas/GlobalVariableRow"},"type":"array","title":"Result","description":"List of global variable records"}},"type":"object","required":["message","result"],"title":"GlobalVariablesResponse","description":"Response model for global variable list operations."},"GroundRequest":{"properties":{"target":{"type":"string","title":"Target","description":"Natural language description of the element to locate"},"image_base64":{"type":"string","title":"Image Base64","description":"Base64-encoded screenshot image (PNG or JPEG)"},"width":{"type":"integer","exclusiveMinimum":0.0,"title":"Width","description":"Screenshot width in pixels"},"height":{"type":"integer","exclusiveMinimum":0.0,"title":"Height","description":"Screenshot height in pixels"},"platform":{"type":"string","title":"Platform","description":"Device platform","default":"android"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Device session ID for cost tracking"},"grounder_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grounder Type","description":"Grounder model override"}},"type":"object","required":["target","image_base64","width","height"],"title":"GroundRequest","description":"Request body for the grounding proxy endpoint.\n\nAttributes:\n target: Natural language description of the UI element to locate.\n image_base64: Base64-encoded screenshot (PNG or JPEG).\n width: Width of the screenshot in pixels.\n height: Height of the screenshot in pixels.\n platform: Device platform ('android' or 'ios').\n session_id: Optional device session ID for cost tracking.\n grounder_type: Optional grounder model override."},"GroundResponse":{"properties":{"x":{"type":"integer","title":"X","description":"Absolute X pixel coordinate","default":0},"y":{"type":"integer","title":"Y","description":"Absolute Y pixel coordinate","default":0},"found":{"type":"boolean","title":"Found","description":"Whether the element was located","default":false},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","title":"GroundResponse","description":"Response body from the grounding proxy endpoint.\n\nAttributes:\n x: Absolute X pixel coordinate of the located element.\n y: Absolute Y pixel coordinate of the located element.\n found: Whether the element was successfully located.\n error: Error message if grounding failed."},"GrounderHintErrorType":{"type":"string","enum":["none","ui_jargon","no_visual_cues","wrong_element","empty_space_not_described"],"title":"GrounderHintErrorType","description":"Types of grounder_hint quality errors that can occur."},"GrounderHintEval":{"properties":{"correct":{"type":"boolean","title":"Correct","description":"Whether the grounder_hint is a good Moondream-friendly description"},"error_type":{"$ref":"#/components/schemas/GrounderHintErrorType","default":"none"},"grounder_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grounder Hint","description":"The grounder_hint that was evaluated"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target","description":"The original target for comparison"},"uses_visual_cues":{"type":"boolean","title":"Uses Visual Cues","description":"Whether it describes shapes, colors, or visible text","default":true},"avoids_ui_jargon":{"type":"boolean","title":"Avoids Ui Jargon","description":"Whether it avoids UI-specific terminology","default":true},"describes_empty_space":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Describes Empty Space","description":"For INPUT actions: whether it describes the empty area"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation","description":"Brief reasoning"}},"type":"object","required":["correct"],"title":"GrounderHintEval","description":"Evaluation result for grounder_hint quality (Moondream-friendliness)."},"GrounderType":{"type":"string","enum":["unified","moondream","moondream3","moondream_custom","modal-custom","ui-tars","qwen3-vl","auto","null"],"title":"GrounderType","description":"Unified grounder configuration that determines both approach and model.\n\n- UNIFIED: Use instruction LLM for both instruction and grounding (returns coordinates)\n- MOONDREAM3/UI_TARS/QWEN3_VL: Two-step with specific grounder model\n- AUTO: Use GROUNDER_TYPE env var to determine grounder\n- NULL: Skip grounding (for testing/debugging)"},"GroundingErrorType":{"type":"string","enum":["none","wrong_element","empty_space","near_miss","wrong_direction","wrong_area","eval_failure"],"title":"GroundingErrorType","description":"Types of grounding errors that can occur."},"GroundingEval":{"properties":{"correct":{"type":"boolean","title":"Correct","description":"Whether the click landed on the correct element"},"error_type":{"$ref":"#/components/schemas/GroundingErrorType","default":"none"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target","description":"The intended target element"},"actual_element":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual Element","description":"What the click actually hit"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation","description":"Brief reasoning"}},"type":"object","required":["correct"],"title":"GroundingEval","description":"Evaluation result for grounding accuracy."},"HITLApprovalDecision":{"properties":{"approval_id":{"type":"string","title":"Approval Id"},"decision":{"type":"string","enum":["approved","rejected"],"title":"Decision"},"comments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comments"}},"type":"object","required":["approval_id","decision"],"title":"HITLApprovalDecision","description":"Request to record approval decision"},"HITLApprovalRequest":{"properties":{"test_execution_task_id":{"type":"string","title":"Test Execution Task Id"},"org_id":{"type":"string","title":"Org Id"},"user_id":{"type":"string","title":"User Id"},"automated_result":{"type":"boolean","title":"Automated Result"},"timeout_minutes":{"type":"integer","title":"Timeout Minutes","default":30},"report_url":{"type":"string","title":"Report Url"}},"type":"object","required":["test_execution_task_id","org_id","user_id","automated_result","report_url"],"title":"HITLApprovalRequest","description":"Request to create HITL approval record.\n\nNote: 'test_execution_task_id' is kept for API compatibility.\nInternally this maps to 'test_execution_id' in the new schema."},"HITLApprovalResponse":{"properties":{"id":{"type":"string","title":"Id"},"test_execution_task_id":{"type":"string","title":"Test Execution Task Id"},"org_id":{"type":"string","title":"Org Id"},"approver_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approver User Id"},"automated_result":{"type":"boolean","title":"Automated Result"},"decision":{"type":"string","title":"Decision"},"final_result":{"type":"boolean","title":"Final Result"},"comments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comments"},"approval_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Approval Timestamp"},"timeout_minutes":{"type":"integer","title":"Timeout Minutes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"report_url":{"type":"string","title":"Report Url"}},"type":"object","required":["id","test_execution_task_id","org_id","automated_result","decision","final_result","timeout_minutes","created_at","updated_at","report_url"],"title":"HITLApprovalResponse","description":"Response with approval record details.\n\nNote: 'test_execution_task_id' is kept for API compatibility."},"HITLDecisionRecorded":{"properties":{"success":{"type":"boolean","title":"Success"},"approval_id":{"type":"string","title":"Approval Id"},"decision":{"type":"string","title":"Decision"},"final_result":{"type":"boolean","title":"Final Result"}},"type":"object","required":["success","approval_id","decision","final_result"],"title":"HITLDecisionRecorded","description":"Response after recording decision"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthCheckResponse":{"properties":{"status":{"type":"string","const":"OK","title":"Status","description":"Status of the health check"}},"type":"object","required":["status"],"title":"HealthCheckResponse"},"HeatmapDayData":{"properties":{"total":{"type":"integer","title":"Total","default":0},"completed":{"type":"integer","title":"Completed","default":0},"failed":{"type":"integer","title":"Failed","default":0},"other":{"type":"integer","title":"Other","default":0},"from_ui":{"type":"integer","title":"From Ui","default":0},"from_api":{"type":"integer","title":"From Api","default":0},"from_ci":{"type":"integer","title":"From Ci","default":0},"from_workflow":{"type":"integer","title":"From Workflow","default":0},"ios":{"type":"integer","title":"Ios","default":0},"android":{"type":"integer","title":"Android","default":0},"unique_users":{"type":"integer","title":"Unique Users","default":0}},"type":"object","title":"HeatmapDayData"},"HeatmapOrgRow":{"properties":{"org_id":{"type":"string","title":"Org Id"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"},"days":{"additionalProperties":{"$ref":"#/components/schemas/HeatmapDayData"},"type":"object","title":"Days"}},"type":"object","required":["org_id","days"],"title":"HeatmapOrgRow"},"HeatmapResponse":{"properties":{"orgs":{"items":{"$ref":"#/components/schemas/HeatmapOrgRow"},"type":"array","title":"Orgs"},"date_range":{"items":{"type":"string"},"type":"array","title":"Date Range"}},"type":"object","required":["orgs","date_range"],"title":"HeatmapResponse"},"Highlight":{"properties":{"type":{"type":"string","title":"Type"},"text":{"type":"string","title":"Text"}},"type":"object","required":["type","text"],"title":"Highlight"},"IfBlock-Input":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for the block (auto-generated if not provided)"},"type":{"type":"string","const":"if","title":"Type"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description","description":"Condition to evaluate (alternative to 'condition')"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition","description":"Condition to evaluate (alternative to 'step_description')"},"thenChildren":{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Input"},{"$ref":"#/components/schemas/WhileBlock-Input"}]},"type":"array","title":"Thenchildren","description":"Blocks to execute if condition is true"},"elseChildren":{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Input"},{"$ref":"#/components/schemas/WhileBlock-Input"}]},"type":"array","title":"Elsechildren","description":"Blocks to execute if condition is false"}},"type":"object","required":["type"],"title":"IfBlock","description":"Block for conditional logic."},"IfBlock-Output":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for the block (auto-generated if not provided)"},"type":{"type":"string","const":"if","title":"Type"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description","description":"Condition to evaluate (alternative to 'condition')"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition","description":"Condition to evaluate (alternative to 'step_description')"},"thenChildren":{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Output"},{"$ref":"#/components/schemas/WhileBlock-Output"}]},"type":"array","title":"Thenchildren","description":"Blocks to execute if condition is true"},"elseChildren":{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Output"},{"$ref":"#/components/schemas/WhileBlock-Output"}]},"type":"array","title":"Elsechildren","description":"Blocks to execute if condition is false"}},"type":"object","required":["type"],"title":"IfBlock","description":"Block for conditional logic."},"Installation":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"string","format":"uuid"}],"title":"Id"},"propel_org_id":{"type":"string","title":"Propel Org Id"},"installation_id":{"type":"integer","title":"Installation Id"},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"}],"title":"Created At"},"gh_installation_owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gh Installation Owner Id"},"verified_at":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified At"}},"type":"object","required":["id","propel_org_id","installation_id","status","created_at"],"title":"Installation"},"InstructionEval":{"properties":{"followed_suggestion":{"type":"boolean","title":"Followed Suggestion","description":"Whether the instruction LLM followed the reflection suggestion"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion","description":"The suggestion that was given"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation","description":"How well it aligned or why it diverged"}},"type":"object","required":["followed_suggestion"],"title":"InstructionEval","description":"Evaluation result for instruction LLM suggestion compliance."},"InternalSendNotificationRequest":{"properties":{"org_id":{"type":"string","title":"Org Id"},"workflow_id":{"type":"string","title":"Workflow Id"},"workflow_name":{"type":"string","title":"Workflow Name"},"success":{"type":"boolean","title":"Success"},"test_results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Test Results"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"report_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Url"},"status":{"type":"string","title":"Status","default":"completed"},"test_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Test Count"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"}},"type":"object","required":["org_id","workflow_id","workflow_name","success","test_results","duration_seconds"],"title":"InternalSendNotificationRequest","description":"Request from workflow runtime to send notifications."},"InternalSendNotificationResponse":{"properties":{"sent_count":{"type":"integer","title":"Sent Count","default":0},"failed_count":{"type":"integer","title":"Failed Count","default":0},"skipped_count":{"type":"integer","title":"Skipped Count","default":0}},"type":"object","title":"InternalSendNotificationResponse","description":"Response from internal notification endpoint."},"InternalSlackChannel":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"is_private":{"type":"boolean","title":"Is Private","default":false}},"type":"object","required":["id","name"],"title":"InternalSlackChannel","description":"A Slack channel available for internal notifications."},"InternalSlackChannelsResponse":{"properties":{"channels":{"items":{"$ref":"#/components/schemas/InternalSlackChannel"},"type":"array","title":"Channels"},"configured":{"type":"boolean","title":"Configured"}},"type":"object","required":["channels","configured"],"title":"InternalSlackChannelsResponse","description":"Response for listing internal Slack channels."},"InternalSlackNotificationRule":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"workflow_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Workflow Ids","default":[]},"org_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"},"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"notify_on_failure":{"type":"boolean","title":"Notify On Failure","default":true},"notify_on_success":{"type":"boolean","title":"Notify On Success","default":false},"notify_on_timeout":{"type":"boolean","title":"Notify On Timeout","default":true},"created_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By"},"enabled":{"type":"boolean","title":"Enabled","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"workflows":{"items":{"$ref":"#/components/schemas/WorkflowInfo-Output"},"type":"array","title":"Workflows","default":[]},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"}},"type":"object","required":["id","channel_id","created_at","updated_at"],"title":"InternalSlackNotificationRule","description":"An internal Slack notification rule."},"InternalSlackNotificationRulesResponse":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/InternalSlackNotificationRule"},"type":"array","title":"Rules"},"configured":{"type":"boolean","title":"Configured"}},"type":"object","required":["rules","configured"],"title":"InternalSlackNotificationRulesResponse","description":"Response for listing internal notification rules."},"InternalSlackRuleResponse":{"properties":{"rule":{"$ref":"#/components/schemas/InternalSlackNotificationRule"}},"type":"object","required":["rule"],"title":"InternalSlackRuleResponse","description":"Response for a single rule operation."},"KeyMetric":{"properties":{"label":{"type":"string","title":"Label"},"value":{"type":"string","title":"Value"},"change":{"type":"string","title":"Change"}},"type":"object","required":["label","value","change"],"title":"KeyMetric"},"LLMCallCreate":{"properties":{"session_id":{"type":"string","title":"Session Id"},"model_name":{"type":"string","title":"Model Name"},"function_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Function Name"},"prompt_tokens":{"type":"integer","title":"Prompt Tokens","default":0},"completion_tokens":{"type":"integer","title":"Completion Tokens","default":0},"cost_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Usd"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms"},"source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}},"type":"object","required":["session_id","model_name"],"title":"LLMCallCreate","description":"Request model for creating an LLM call record."},"LLMCallResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["message","success"],"title":"LLMCallResponse","description":"Response model for LLM call operations."},"LLMConfig":{"properties":{"primary_model":{"type":"string","title":"Primary Model","description":"Primary LLM model for step execution","default":"gemini/gemini-3-flash-preview"},"reflection_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Model","description":"LLM model for reflection, defaults to primary_model if not set"},"planning_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planning Model","description":"LLM model for planning, defaults to primary_model if not set"}},"type":"object","title":"LLMConfig","description":"Configuration for LLM models used in different stages."},"LLMDetailsResponse":{"properties":{"unique_id":{"type":"string","title":"Unique Id","description":"KeywordsAI unique identifier"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"LLM model used"},"log_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Type","description":"Type of log (chat, completion, etc.)"},"prompt_messages":{"anyOf":[{"items":{"$ref":"#/components/schemas/LLMMessage"},"type":"array"},{"type":"null"}],"title":"Prompt Messages","description":"Full input messages array"},"completion_message":{"anyOf":[{"$ref":"#/components/schemas/CompletionMessage"},{"type":"null"}],"description":"Full output message object"},"raw_input":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Input","description":"JSON-serialized raw input"},"raw_output":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Output","description":"JSON-serialized raw output"},"prompt_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Tokens","description":"Input token count"},"completion_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completion Tokens","description":"Output token count"},"total_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tokens","description":"Total token count"},"cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost","description":"Request cost in USD"},"latency_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latency Seconds","description":"Total latency in seconds"},"time_to_first_token":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Time To First Token","description":"TTFT in seconds"},"tokens_per_second":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tokens Per Second","description":"Output throughput"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Request status"},"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp","description":"Request timestamp"}},"type":"object","required":["unique_id"],"title":"LLMDetailsResponse","description":"Response containing full LLM call details from KeywordsAI."},"LLMMessage":{"properties":{"role":{"type":"string","title":"Role","description":"Message role (system, user, assistant, tool)"},"content":{"anyOf":[{"type":"string"},{"items":{"$ref":"#/components/schemas/MultimodalContentPart"},"type":"array"},{"type":"null"}],"title":"Content","description":"Message content (string or multimodal array)"},"tool_calls":{"anyOf":[{"items":{"$ref":"#/components/schemas/ToolCall"},"type":"array"},{"type":"null"}],"title":"Tool Calls","description":"Tool/function calls if role is assistant"},"tool_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Call Id","description":"ID of the tool call this message responds to"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Name for tool/function messages"}},"additionalProperties":true,"type":"object","required":["role"],"title":"LLMMessage","description":"A single message in the LLM conversation (OpenAI-compatible format)."},"LeaderboardItemResponse":{"properties":{"rank":{"type":"integer","title":"Rank"},"developer":{"$ref":"#/components/schemas/DeveloperItem"},"units_of_work":{"type":"number","title":"Units Of Work"},"trend":{"type":"string","title":"Trend"},"work_breakdown":{"$ref":"#/components/schemas/WorkBreakdown"}},"type":"object","required":["rank","developer","units_of_work","trend","work_breakdown"],"title":"LeaderboardItemResponse"},"ListExpoBuildsRequest":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"Expo project ID (UUID)"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","description":"Max builds to return (1-50)","default":50}},"type":"object","required":["project_id"],"title":"ListExpoBuildsRequest","description":"Request to list Expo builds for a single project."},"LocationConfig":{"properties":{"latitude":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Latitude","description":"GPS latitude coordinate (-90 to 90)"},"longitude":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Longitude","description":"GPS longitude coordinate (-180 to 180)"}},"type":"object","required":["latitude","longitude"],"title":"LocationConfig","description":"GPS location configuration for simulator/emulator."},"ManualTriggerRequest":{"properties":{"expo_build_url":{"type":"string","title":"Expo Build Url","description":"URL to the Expo build artifact"},"app_id":{"type":"string","title":"App Id","description":"Revyl build variable ID to update"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Version string for the build (auto-generated if not provided)"}},"type":"object","required":["expo_build_url","app_id"],"title":"ManualTriggerRequest","description":"Request to manually upsert an Expo build to a Revyl build variable."},"ManualTriggerResponse":{"properties":{"message":{"type":"string","title":"Message"},"build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},"type":"object","required":["message"],"title":"ManualTriggerResponse","description":"Response from manual trigger."},"MobileTarget":{"properties":{"device_model":{"type":"string","title":"Device Model"},"os_version":{"type":"string","title":"Os Version"}},"type":"object","required":["device_model","os_version"],"title":"MobileTarget","description":"Persisted device target for a test (from ``test_mobile_targets``).\n\n``AUTO/AUTO`` represents \"follow the platform default at runtime\"."},"ModelCostBreakdown":{"properties":{"model_name":{"type":"string","title":"Model Name","description":"Name of the LLM model"},"call_count":{"type":"integer","title":"Call Count","description":"Number of calls to this model"},"prompt_tokens":{"type":"integer","title":"Prompt Tokens","description":"Total prompt tokens"},"completion_tokens":{"type":"integer","title":"Completion Tokens","description":"Total completion tokens"},"total_tokens":{"type":"integer","title":"Total Tokens","description":"Total tokens (prompt + completion)"},"cost_usd":{"type":"number","title":"Cost Usd","description":"Total cost in USD"}},"type":"object","required":["model_name","call_count","prompt_tokens","completion_tokens","total_tokens","cost_usd"],"title":"ModelCostBreakdown","description":"Cost breakdown for a single model."},"ModuleBlock":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Block ID (auto-generated if not provided)"},"type":{"type":"string","title":"Type"},"step_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Type"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description"},"variable_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Name"},"module_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Module Id"},"thenChildren":{"anyOf":[{"items":{"$ref":"#/components/schemas/ModuleBlock"},"type":"array"},{"type":"null"}],"title":"Thenchildren"},"elseChildren":{"anyOf":[{"items":{"$ref":"#/components/schemas/ModuleBlock"},"type":"array"},{"type":"null"}],"title":"Elsechildren"},"children":{"anyOf":[{"items":{"$ref":"#/components/schemas/ModuleBlock"},"type":"array"},{"type":"null"}],"title":"Children"}},"type":"object","required":["type"],"title":"ModuleBlock","description":"Individual block within a module - matches FrontendBlock structure.\n\nThe id field is auto-generated if not provided, so blocks from any client\n(frontend, CLI, direct API) are always stored with valid IDs."},"ModuleResponse":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"blocks":{"items":{},"type":"array","title":"Blocks"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"version":{"type":"integer","title":"Version","default":1},"last_modified_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Modified By"},"last_modified_by_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Modified By Email"}},"type":"object","required":["id","org_id","name","blocks","created_at","updated_at"],"title":"ModuleResponse","description":"Response model for a single module"},"ModuleRestoreVersionRequest":{"properties":{"version":{"type":"integer","title":"Version","description":"Version number to restore"}},"type":"object","required":["version"],"title":"ModuleRestoreVersionRequest","description":"Request to restore a module to a previous version"},"ModuleRestoreVersionResponse":{"properties":{"message":{"type":"string","title":"Message"},"result":{"$ref":"#/components/schemas/ModuleResponse"},"new_version":{"type":"integer","title":"New Version"},"restored_from":{"type":"integer","title":"Restored From"}},"type":"object","required":["message","result","new_version","restored_from"],"title":"ModuleRestoreVersionResponse","description":"Response after restoring a module version"},"ModuleSingleResponse":{"properties":{"message":{"type":"string","title":"Message"},"result":{"$ref":"#/components/schemas/ModuleResponse"}},"type":"object","required":["message","result"],"title":"ModuleSingleResponse","description":"Response model for single module operations"},"ModuleUsageCountsResponse":{"properties":{"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"}},"type":"object","required":["counts"],"title":"ModuleUsageCountsResponse","description":"Response model for batch module usage counts"},"ModuleUsageResponse":{"properties":{"tests":{"items":{"$ref":"#/components/schemas/ModuleUsageTestItem"},"type":"array","title":"Tests"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["tests","total"],"title":"ModuleUsageResponse","description":"Response model for module usage lookup"},"ModuleUsageTestItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"ModuleUsageTestItem","description":"A test that uses a specific module"},"ModuleVersionInfo":{"properties":{"id":{"type":"string","title":"Id"},"module_id":{"type":"string","title":"Module Id"},"version":{"type":"integer","title":"Version"},"blocks":{"items":{},"type":"array","title":"Blocks"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"modified_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modified By"},"modified_by_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modified By Email"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","module_id","version","blocks","created_at"],"title":"ModuleVersionInfo","description":"A single version history entry"},"ModuleVersionListResponse":{"properties":{"versions":{"items":{"$ref":"#/components/schemas/ModuleVersionInfo"},"type":"array","title":"Versions"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["versions","total"],"title":"ModuleVersionListResponse","description":"Response for listing module versions"},"ModulesListResponse":{"properties":{"message":{"type":"string","title":"Message"},"result":{"items":{"$ref":"#/components/schemas/ModuleResponse"},"type":"array","title":"Result"}},"type":"object","required":["message","result"],"title":"ModulesListResponse","description":"Response model for listing modules"},"MonitorBreakdownItem":{"properties":{"label":{"type":"string","title":"Label"},"eval_count":{"type":"integer","title":"Eval Count"},"errors":{"type":"integer","title":"Errors"},"grounded_steps":{"type":"integer","title":"Grounded Steps"}},"type":"object","required":["label","eval_count","errors","grounded_steps"],"title":"MonitorBreakdownItem","description":"A single row in platform or grounder breakdown."},"MonitorTimeseriesPoint":{"properties":{"date":{"type":"string","title":"Date"},"errors":{"type":"integer","title":"Errors"},"grounded_steps":{"type":"integer","title":"Grounded Steps"},"evals":{"type":"integer","title":"Evals"},"error_rate":{"type":"number","title":"Error Rate"}},"type":"object","required":["date","errors","grounded_steps","evals","error_rate"],"title":"MonitorTimeseriesPoint","description":"A single day in the timeseries chart."},"MultiRepoChartDataResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"metric_type":{"type":"string","title":"Metric Type"},"data":{"items":{"$ref":"#/components/schemas/app__routes__rebel_routes__analytics_xpt__ChartDataPoint"},"type":"array","title":"Data"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","metric_type","data","retrieved_at"],"title":"MultiRepoChartDataResponse"},"MultiRepoCommentsOverTimeResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"data":{"items":{"$ref":"#/components/schemas/CommentsOverTimeData"},"type":"array","title":"Data"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","data","retrieved_at"],"title":"MultiRepoCommentsOverTimeResponse"},"MultiRepoDeveloperProfileResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"developer":{"type":"string","title":"Developer"},"profile":{"$ref":"#/components/schemas/DeveloperProfile"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","developer","profile","retrieved_at"],"title":"MultiRepoDeveloperProfileResponse"},"MultiRepoDevelopersResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"developers":{"items":{"$ref":"#/components/schemas/DeveloperItem"},"type":"array","title":"Developers"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","developers","retrieved_at"],"title":"MultiRepoDevelopersResponse"},"MultiRepoDoraMetricsResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"period_days":{"type":"integer","title":"Period Days"},"dora_metrics":{"$ref":"#/components/schemas/DoraMetrics"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","period_days","dora_metrics","retrieved_at"],"title":"MultiRepoDoraMetricsResponse"},"MultiRepoLeaderboardResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"leaderboard":{"items":{"$ref":"#/components/schemas/LeaderboardItemResponse"},"type":"array","title":"Leaderboard"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","leaderboard","retrieved_at"],"title":"MultiRepoLeaderboardResponse"},"MultiRepoPRHistoryResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"prs":{"items":{"$ref":"#/components/schemas/PullRequest"},"type":"array","title":"Prs"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","prs","retrieved_at"],"title":"MultiRepoPRHistoryResponse"},"MultiRepoRecentCommentsResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"comments":{"items":{"$ref":"#/components/schemas/RecentComment"},"type":"array","title":"Comments"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","comments","retrieved_at"],"title":"MultiRepoRecentCommentsResponse"},"MultiRepoReviewMetricsResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"metrics":{"items":{"$ref":"#/components/schemas/ReviewMetric"},"type":"array","title":"Metrics"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","metrics","retrieved_at"],"title":"MultiRepoReviewMetricsResponse"},"MultiRepoUnitsOfWorkResponse":{"properties":{"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"},"chart_data":{"items":{"$ref":"#/components/schemas/UnitsOfWorkData"},"type":"array","title":"Chart Data"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["repositories","chart_data","retrieved_at"],"title":"MultiRepoUnitsOfWorkResponse"},"MultiRepositoryRequest":{"properties":{"repositories":{"anyOf":[{"items":{"$ref":"#/components/schemas/RepositoryIdentifier"},"type":"array"},{"type":"null"}],"title":"Repositories"},"all_repos":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"All Repos","default":false}},"type":"object","title":"MultiRepositoryRequest"},"MultimodalContentPart":{"properties":{"type":{"type":"string","title":"Type","description":"Content type: 'text' or 'image_url'"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"Text content if type is 'text'"},"image_url":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Image Url","description":"Image URL object if type is 'image_url'"}},"additionalProperties":true,"type":"object","required":["type"],"title":"MultimodalContentPart","description":"A single part of multimodal content (text or image)."},"NormalizedActionBlock":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","enum":["instructions","extraction","manual","validation","code_execution","module_import"],"title":"Type"},"step_description":{"type":"string","title":"Step Description"},"step_type":{"type":"string","title":"Step Type"},"variable_name":{"type":"string","title":"Variable Name"},"module_id":{"type":"string","title":"Module Id"}},"type":"object","required":["id","type","step_description","step_type"],"title":"NormalizedActionBlock","description":"Leaf/action block in normalized dictionary form.\n\nNote: ID is always present after conversion (auto-generated by ConversionService)."},"NormalizedIfBlock":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","const":"if","title":"Type"},"step_description":{"type":"string","title":"Step Description"},"thenChildren":{"items":{"anyOf":[{"$ref":"#/components/schemas/NormalizedActionBlock"},{"$ref":"#/components/schemas/NormalizedIfBlock"},{"$ref":"#/components/schemas/NormalizedWhileBlock"}]},"type":"array","title":"Thenchildren"},"elseChildren":{"items":{"anyOf":[{"$ref":"#/components/schemas/NormalizedActionBlock"},{"$ref":"#/components/schemas/NormalizedIfBlock"},{"$ref":"#/components/schemas/NormalizedWhileBlock"}]},"type":"array","title":"Elsechildren"}},"type":"object","required":["id","type","step_description","thenChildren","elseChildren"],"title":"NormalizedIfBlock","description":"Conditional block in normalized dictionary form.\n\nNote: ID is always present after conversion (auto-generated by ConversionService)."},"NormalizedWhileBlock":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","const":"while","title":"Type"},"step_description":{"type":"string","title":"Step Description"},"children":{"items":{"anyOf":[{"$ref":"#/components/schemas/NormalizedActionBlock"},{"$ref":"#/components/schemas/NormalizedIfBlock"},{"$ref":"#/components/schemas/NormalizedWhileBlock"}]},"type":"array","title":"Children"}},"type":"object","required":["id","type","step_description","children"],"title":"NormalizedWhileBlock","description":"Loop block in normalized dictionary form.\n\nNote: ID is always present after conversion (auto-generated by ConversionService)."},"NotificationRuleWorkflow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"NotificationRuleWorkflow","description":"Minimal workflow info for display in notification rules."},"OnboardingStatusResponse":{"properties":{"provision_status":{"type":"string","title":"Provision Status"},"provision_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provision Error"},"provisioned_resources":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Provisioned Resources"},"tour_completed":{"type":"boolean","title":"Tour Completed"},"tour_skipped":{"type":"boolean","title":"Tour Skipped"}},"type":"object","required":["provision_status","tour_completed","tour_skipped"],"title":"OnboardingStatusResponse"},"OrgDetailResponse":{"properties":{"headline":{"$ref":"#/components/schemas/OrgHeadline"},"weekly_activity":{"items":{"$ref":"#/components/schemas/WeeklyActivityPoint"},"type":"array","title":"Weekly Activity"},"source_mix":{"items":{"$ref":"#/components/schemas/SourceMixItem"},"type":"array","title":"Source Mix"},"investment":{"$ref":"#/components/schemas/OrgInvestment"},"active_users":{"items":{"$ref":"#/components/schemas/ActiveUser"},"type":"array","title":"Active Users"},"top_tests":{"items":{"$ref":"#/components/schemas/TopTest"},"type":"array","title":"Top Tests"},"top_workflows":{"items":{"$ref":"#/components/schemas/TopWorkflow"},"type":"array","title":"Top Workflows"},"timeline":{"items":{"$ref":"#/components/schemas/TimelineEvent"},"type":"array","title":"Timeline"},"web_engagement":{"$ref":"#/components/schemas/WebEngagement"}},"type":"object","required":["headline","weekly_activity","source_mix","investment","active_users","top_tests","top_workflows","timeline"],"title":"OrgDetailResponse"},"OrgFile":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"File ID"},"org_id":{"type":"string","format":"uuid","title":"Org Id","description":"Organization ID"},"user_id":{"type":"string","title":"User Id","description":"User ID who uploaded the file"},"filename":{"type":"string","title":"Filename","description":"Display name"},"file_size":{"type":"integer","title":"File Size","description":"File size in bytes"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"MIME content type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"File description"},"status":{"type":"string","title":"Status","description":"Upload status: 'pending' or 'ready'","default":"ready"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Upload timestamp"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","org_id","user_id","filename","file_size","created_at","updated_at"],"title":"OrgFile","description":"Full org file model with database fields."},"OrgFileCompleteUploadRequest":{"properties":{"s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Key","description":"New S3 key (required for replace flow)"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename","description":"New display name (for replace flow)"},"file_size":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"File Size","description":"New file size in bytes (for replace flow)"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"New content type (for replace flow)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"New description (for replace flow)"}},"type":"object","title":"OrgFileCompleteUploadRequest","description":"Request body for confirming a file upload completed successfully."},"OrgFileDownloadUrlResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Presigned download URL"},"filename":{"type":"string","title":"Filename","description":"Original filename"},"expires_in":{"type":"integer","title":"Expires In","description":"URL expiry in seconds"}},"type":"object","required":["url","filename","expires_in"],"title":"OrgFileDownloadUrlResponse","description":"Response model for file download URL."},"OrgFileListResponse":{"properties":{"files":{"items":{"$ref":"#/components/schemas/OrgFile"},"type":"array","title":"Files","description":"List of files"},"count":{"type":"integer","title":"Count","description":"Total count of files"}},"type":"object","required":["files","count"],"title":"OrgFileListResponse","description":"Response model for listing org files."},"OrgFileUpdate":{"properties":{"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename","description":"Display name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Description"}},"type":"object","title":"OrgFileUpdate","description":"Model for updating an org file."},"OrgFileUploadRequest":{"properties":{"filename":{"type":"string","title":"Filename","description":"Original filename (used for extension validation)"},"file_size":{"type":"integer","minimum":1.0,"title":"File Size","description":"File size in bytes (used for size validation)"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Display name (defaults to filename)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"File description"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"MIME content type"}},"type":"object","required":["filename","file_size"],"title":"OrgFileUploadRequest","description":"Request model for generating a presigned upload URL."},"OrgFileUploadResponse":{"properties":{"file":{"$ref":"#/components/schemas/OrgFile","description":"Created file record"},"upload_url":{"type":"string","title":"Upload Url","description":"Presigned S3 PUT URL"},"expires_in":{"type":"integer","title":"Expires In","description":"URL expiry in seconds"},"content_type":{"type":"string","title":"Content Type","description":"Content-Type to use in the PUT request"},"s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Key","description":"S3 object key (used by client in confirm step for replace flow)"}},"type":"object","required":["file","upload_url","expires_in","content_type"],"title":"OrgFileUploadResponse","description":"Response model for presigned upload URL."},"OrgHeadline":{"properties":{"org_id":{"type":"string","title":"Org Id"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"},"first_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen"},"last_activity":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity"},"total_sessions":{"type":"integer","title":"Total Sessions","default":0},"sessions_7d":{"type":"integer","title":"Sessions 7D","default":0},"sessions_prior_7d":{"type":"integer","title":"Sessions Prior 7D","default":0},"sessions_30d":{"type":"integer","title":"Sessions 30D","default":0},"trend":{"type":"string","title":"Trend","default":"stable"},"active_users_7d":{"type":"integer","title":"Active Users 7D","default":0},"active_users_30d":{"type":"integer","title":"Active Users 30D","default":0},"completed_30d":{"type":"integer","title":"Completed 30D","default":0},"failed_30d":{"type":"integer","title":"Failed 30D","default":0},"other_30d":{"type":"integer","title":"Other 30D","default":0},"pass_rate_30d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Rate 30D"},"spend_30d":{"type":"number","title":"Spend 30D","default":0},"device_minutes_30d":{"type":"number","title":"Device Minutes 30D","default":0}},"type":"object","required":["org_id"],"title":"OrgHeadline"},"OrgInvestment":{"properties":{"test_count":{"type":"integer","title":"Test Count","default":0},"workflow_count":{"type":"integer","title":"Workflow Count","default":0},"app_count":{"type":"integer","title":"App Count","default":0},"platform_count":{"type":"integer","title":"Platform Count","default":0},"module_count":{"type":"integer","title":"Module Count","default":0},"script_count":{"type":"integer","title":"Script Count","default":0},"tag_count":{"type":"integer","title":"Tag Count","default":0},"has_slack":{"type":"boolean","title":"Has Slack","default":false},"has_ci_config":{"type":"boolean","title":"Has Ci Config","default":false},"shared_reports":{"type":"integer","title":"Shared Reports","default":0}},"type":"object","title":"OrgInvestment"},"OrgOverviewItem":{"properties":{"org_id":{"type":"string","title":"Org Id"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"},"sessions_7d":{"type":"integer","title":"Sessions 7D","default":0},"sessions_prior_7d":{"type":"integer","title":"Sessions Prior 7D","default":0},"trend":{"type":"string","title":"Trend","default":"stable"},"active_users_7d":{"type":"integer","title":"Active Users 7D","default":0},"active_users_30d":{"type":"integer","title":"Active Users 30D","default":0},"completed_7d":{"type":"integer","title":"Completed 7D","default":0},"failed_7d":{"type":"integer","title":"Failed 7D","default":0},"pass_rate_7d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Rate 7D"},"last_activity":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity"},"spend_30d":{"type":"number","title":"Spend 30D","default":0},"device_minutes_30d":{"type":"number","title":"Device Minutes 30D","default":0},"source_count_30d":{"type":"integer","title":"Source Count 30D","default":0},"has_ci_activity":{"type":"boolean","title":"Has Ci Activity","default":false}},"type":"object","required":["org_id"],"title":"OrgOverviewItem"},"OrgOverviewResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OrgOverviewItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"OrgOverviewResponse"},"OrgTestMonitorItem":{"properties":{"id":{"type":"string","title":"Id","description":"Execution ID"},"test_id":{"type":"string","title":"Test Id"},"test_name":{"type":"string","title":"Test Name"},"source":{"type":"string","title":"Source","description":"Execution source: ui, cli, api, ci_cd, or workflow","default":"api"},"status":{"$ref":"#/components/schemas/SessionStatus"},"progress":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Progress"},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"current_step_index":{"type":"integer","title":"Current Step Index","default":0},"total_steps":{"type":"integer","title":"Total Steps","default":1},"steps_completed":{"type":"integer","title":"Steps Completed","default":0},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"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"},"can_cancel":{"type":"boolean","title":"Can Cancel","description":"Whether current user can cancel this test","default":false},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Package"},"estimated_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Duration Seconds"},"error_message":{"type":"string","title":"Error Message","description":"Error headline, empty if no errors","default":""},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"OpenTelemetry trace ID for Grafana correlation"},"workflow_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Execution Id","description":"Workflow execution ID if running as part of a workflow"},"whep_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whep Url","description":"WHEP URL for live video stream playback"},"task_id":{"type":"string","title":"Task Id","description":"Alias for id, for backwards compatibility with older clients.","readOnly":true},"parent_workflow_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Workflow Task Id","description":"Alias for workflow_execution_id, for backwards compatibility.","readOnly":true}},"type":"object","required":["id","test_id","test_name","status","progress","task_id","parent_workflow_task_id"],"title":"OrgTestMonitorItem","description":"Single test item for org-wide monitoring.\n\nUses 'id' instead of 'task_id' as the primary identifier.\nStatus uses SessionStatus directly (queued, starting, running, etc.)."},"OrgWorkflowMonitorItem":{"properties":{"task":{"$ref":"#/components/schemas/WorkflowExecutionsBaseSchema"},"workflow_name":{"type":"string","title":"Workflow Name"},"source":{"type":"string","title":"Source","default":"api"},"progress":{"type":"number","title":"Progress"},"can_cancel":{"type":"boolean","title":"Can Cancel"}},"type":"object","required":["task","workflow_name","progress","can_cancel"],"title":"OrgWorkflowMonitorItem","description":"Workflow monitor item for organization monitoring.\n\nUses WorkflowExecutionsBaseSchema (new schema with 'id' instead of 'task_id')."},"OrgWorkflowMonitorState":{"properties":{"org_id":{"type":"string","title":"Org Id"},"running_workflows":{"items":{"$ref":"#/components/schemas/OrgWorkflowMonitorItem"},"type":"array","title":"Running Workflows"},"total_active":{"type":"integer","title":"Total Active"},"last_update":{"type":"string","format":"date-time","title":"Last Update"}},"type":"object","required":["org_id","running_workflows","total_active","last_update"],"title":"OrgWorkflowMonitorState","description":"State model for organization workflow monitoring."},"OrganizationRepositoriesResponse":{"properties":{"repositories":{"items":{"$ref":"#/components/schemas/Repository"},"type":"array","title":"Repositories"},"installation":{"anyOf":[{"$ref":"#/components/schemas/Installation"},{"type":"null"}]},"has_access":{"type":"boolean","title":"Has Access"}},"type":"object","required":["repositories","installation","has_access"],"title":"OrganizationRepositoriesResponse"},"OrganizationUsersResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/GitHubUser"},"type":"array","title":"Users"},"total_count":{"type":"integer","title":"Total Count"}},"type":"object","required":["users","total_count"],"title":"OrganizationUsersResponse"},"PRReference":{"properties":{"pr_number":{"type":"integer","title":"Pr Number","description":"Pull request number"},"repo":{"type":"string","title":"Repo","description":"Repository name"}},"type":"object","required":["pr_number","repo"],"title":"PRReference","description":"PR reference with number and repo name."},"PaginatedAppsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AppResponse"},"type":"array","title":"Items","description":"List of apps for the current page"},"total":{"type":"integer","title":"Total","description":"Total number of apps"},"page":{"type":"integer","title":"Page","description":"Current page number (1-indexed)"},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page"},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages"},"has_next":{"type":"boolean","title":"Has Next","description":"Whether there is a next page"},"has_previous":{"type":"boolean","title":"Has Previous","description":"Whether there is a previous page"},"platform_counts":{"anyOf":[{"$ref":"#/components/schemas/AppPlatformCounts"},{"type":"null"}],"description":"Unfiltered per-platform counts"}},"type":"object","required":["total","page","page_size","total_pages","has_next","has_previous"],"title":"PaginatedAppsResponse","description":"Paginated response for apps."},"PaginatedBuildRunsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BuildRunItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"},"has_next":{"type":"boolean","title":"Has Next"},"has_previous":{"type":"boolean","title":"Has Previous"}},"type":"object","required":["total","page","page_size","total_pages","has_next","has_previous"],"title":"PaginatedBuildRunsResponse"},"PaginatedBuildsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BuildResponse"},"type":"array","title":"Items","description":"List of builds for the current page"},"total":{"type":"integer","title":"Total","description":"Total number of builds"},"page":{"type":"integer","title":"Page","description":"Current page number (1-indexed)"},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page"},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages"},"has_next":{"type":"boolean","title":"Has Next","description":"Whether there is a next page"},"has_previous":{"type":"boolean","title":"Has Previous","description":"Whether there is a previous page"}},"type":"object","required":["total","page","page_size","total_pages","has_next","has_previous"],"title":"PaginatedBuildsResponse","description":"Paginated response for builds."},"PlanInfo":{"properties":{"plan":{"type":"string","title":"Plan"},"display_name":{"type":"string","title":"Display Name"},"monthly_base":{"type":"number","title":"Monthly Base"},"free_credit_label":{"type":"string","title":"Free Credit Label"},"billing_exempt":{"type":"boolean","title":"Billing Exempt","default":false},"scheduled_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Plan"}},"type":"object","required":["plan","display_name","monthly_base","free_credit_label"],"title":"PlanInfo"},"PlatformApp":{"properties":{"app_id":{"type":"string","title":"App Id","description":"App UUID"},"pinned_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Version","description":"Optional pinned version string"}},"type":"object","required":["app_id"],"title":"PlatformApp","description":"App configuration for a single platform.\n\nUsed to specify an app override for iOS or Android in workflow configurations.\n\nAttributes:\n app_id: UUID of the app to use.\n pinned_version: Optional specific version to pin to. If None, uses current/latest."},"PlatformTargetConfig":{"properties":{"default_pair":{"$ref":"#/components/schemas/DevicePair","description":"Default device+runtime used for warm pool and frontend auto-selection"},"available_runtimes":{"items":{"type":"string"},"type":"array","title":"Available Runtimes","description":"OS runtimes that workers have installed"},"available_models":{"items":{"type":"string"},"type":"array","title":"Available Models","description":"Device models selectable by users"},"compatible_runtimes":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Compatible Runtimes","description":"Model -> list of runtimes it can run. Models not listed are assumed to support all available_runtimes."}},"type":"object","required":["default_pair","available_runtimes","available_models"],"title":"PlatformTargetConfig","description":"Available targets and default pair for a single platform."},"PortalRequest":{"properties":{"return_url":{"type":"string","title":"Return Url"}},"type":"object","required":["return_url"],"title":"PortalRequest"},"PortalResponse":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"PortalResponse"},"PostFinalPRCommentRequest":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"pr_number":{"type":"integer","title":"Pr Number"},"comment_id":{"type":"string","title":"Comment Id"},"workflow_results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Workflow Results"},"uploaded_builds":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Uploaded Builds"},"build_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Error"}},"type":"object","required":["owner","repo","pr_number","comment_id","workflow_results","uploaded_builds"],"title":"PostFinalPRCommentRequest","description":"Request to post final PR comment with results."},"PropelMetadataResponse":{"properties":{"expo_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expo Token"},"expo_projects":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExpoProjectMetadataEntry"},"type":"array"},{"type":"null"}],"title":"Expo Projects"},"browser_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Browser Provider"},"concurrency_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Concurrency Limit"},"proxy_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Proxy Enabled"}},"type":"object","title":"PropelMetadataResponse","description":"Response model for Propel organization metadata."},"ProvisionResponse":{"properties":{"status":{"type":"string","title":"Status"},"provisioned_resources":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Provisioned Resources"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","message"],"title":"ProvisionResponse"},"PullRequest":{"properties":{"id":{"type":"string","title":"Id"},"pr_number":{"type":"integer","title":"Pr Number"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"author":{"type":"string","title":"Author"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name"},"author_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Avatar Url"},"state":{"type":"string","title":"State"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"merged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Merged At"},"closed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closed At"},"merge_commit_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merge Commit Sha"},"lines_added":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lines Added"},"lines_deleted":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lines Deleted"},"files_changed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Files Changed"},"complexity_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Complexity Score"},"review_cycles_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Cycles Count"},"time_to_merge_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Time To Merge Hours"},"time_to_first_review_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Time To First Review Hours"},"labels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Labels"},"technology_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Technology Tags"},"commit_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Type"},"units_of_work":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Units Of Work"},"is_hotfix":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Hotfix"},"is_rollback":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Rollback"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"},"repo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repo"}},"type":"object","required":["id","pr_number","title","description","author","author_name","author_avatar_url","state","created_at","updated_at","merged_at","closed_at","merge_commit_sha","lines_added","lines_deleted","files_changed","complexity_score","review_cycles_count","time_to_merge_hours","time_to_first_review_hours","labels","technology_tags","commit_type","units_of_work","is_hotfix","is_rollback"],"title":"PullRequest"},"PushSSHKeyRequest":{"properties":{"public_key":{"type":"string","title":"Public Key","description":"SSH public key content"}},"type":"object","required":["public_key"],"title":"PushSSHKeyRequest","description":"Request payload for pushing an SSH public key to a sandbox.\n\nThe backend will SSH into the sandbox and add the key to authorized_keys.\n\nAttributes:\n public_key: The SSH public key content (e.g., \"ssh-ed25519 AAAA... user@host\")."},"PushSSHKeyResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether key push succeeded"},"message":{"type":"string","title":"Message","description":"Status message"},"already_exists":{"type":"boolean","title":"Already Exists","description":"Whether key was already present","default":false}},"type":"object","required":["success","message"],"title":"PushSSHKeyResponse","description":"Response from pushing an SSH key to a sandbox.\n\nAttributes:\n success: Whether the key was successfully added.\n message: Human-readable status message.\n already_exists: Whether the key was already present."},"QualityBreakdown":{"properties":{"retry_rate":{"type":"number","title":"Retry Rate","description":"Score for retry rate (0-100)"},"grounding_accuracy":{"type":"number","title":"Grounding Accuracy","description":"Score for grounding accuracy (0-100)"},"reflection_accuracy":{"type":"number","title":"Reflection Accuracy","description":"Score for reflection accuracy (0-100)"},"suggestion_compliance":{"type":"number","title":"Suggestion Compliance","description":"Score for suggestion compliance (0-100)"},"path_efficiency":{"type":"number","title":"Path Efficiency","description":"Score for path efficiency (0-100)"},"bounding_box_accuracy":{"type":"number","title":"Bounding Box Accuracy","description":"Score for bounding box accuracy (0-100)","default":100.0}},"type":"object","required":["retry_rate","grounding_accuracy","reflection_accuracy","suggestion_compliance","path_efficiency"],"title":"QualityBreakdown","description":"Breakdown of quality score components."},"QualityGrade":{"type":"string","enum":["A","B","C","D","F"],"title":"QualityGrade","description":"Quality grades for test execution."},"QualityScore":{"properties":{"score":{"type":"number","title":"Score","description":"Overall quality score (0-100)"},"grade":{"$ref":"#/components/schemas/QualityGrade","description":"Letter grade (A-F)"},"breakdown":{"$ref":"#/components/schemas/QualityBreakdown","description":"Component scores"},"reliability_estimate":{"$ref":"#/components/schemas/ReliabilityEstimate","description":"Estimate of re-run reliability"},"weakest_component":{"$ref":"#/components/schemas/WeakestComponent","description":"Which component needs most improvement"},"is_false_positive":{"type":"boolean","title":"Is False Positive","description":"Whether this might be an accidental success","default":false},"false_positive_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"False Positive Reason","description":"Reason for false positive flag"},"improvement_suggestions":{"items":{"type":"string"},"type":"array","title":"Improvement Suggestions","description":"Suggestions for improvement"}},"type":"object","required":["score","grade","breakdown","reliability_estimate","weakest_component"],"title":"QualityScore","description":"Overall quality assessment for a test execution."},"RateCardItem":{"properties":{"platform":{"type":"string","title":"Platform"},"device_type":{"type":"string","title":"Device Type"},"rate_per_second":{"type":"number","title":"Rate Per Second"},"rate_per_minute":{"type":"number","title":"Rate Per Minute"},"autumn_feature_id":{"type":"string","title":"Autumn Feature Id"}},"type":"object","required":["platform","device_type","rate_per_second","rate_per_minute","autumn_feature_id"],"title":"RateCardItem"},"RateCardResponse":{"properties":{"rates":{"items":{"$ref":"#/components/schemas/RateCardItem"},"type":"array","title":"Rates"}},"type":"object","required":["rates"],"title":"RateCardResponse"},"RebelOrgSettings":{"properties":{"propel_org_id":{"type":"string","title":"Propel Org Id"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"custom_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Prompt"},"response_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Language"},"cursor_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Api Key"},"expo_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expo Token"},"enabled":{"type":"boolean","title":"Enabled","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"modified_at":{"type":"string","format":"date-time","title":"Modified At"}},"type":"object","required":["propel_org_id","created_at","modified_at"],"title":"RebelOrgSettings","description":"Organization settings for Rebel Bot."},"RecentComment":{"properties":{"id":{"type":"string","title":"Id"},"comment_id":{"type":"string","title":"Comment Id"},"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"pr_number":{"type":"integer","title":"Pr Number"},"commit_sha":{"type":"string","title":"Commit Sha"},"file_path":{"type":"string","title":"File Path"},"line_number":{"type":"integer","title":"Line Number"},"comment":{"type":"string","title":"Comment"},"confidence":{"type":"number","title":"Confidence"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"author":{"type":"string","title":"Author"},"type":{"type":"string","title":"Type"}},"type":"object","required":["id","comment_id","owner","repo","pr_number","commit_sha","file_path","line_number","comment","confidence","created_at","author","type"],"title":"RecentComment"},"ReflectionAttemptEval":{"properties":{"retry_index":{"type":"integer","title":"Retry Index","description":"Index of this retry (0-based)"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning","description":"Instructional LLM's visual analysis and reasoning for this retry"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description","description":"Human-readable action description from Instructional LLM for this retry"},"prev_suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prev Suggestion","description":"The suggestion from the previous attempt that led to this retry"},"grounding_eval":{"anyOf":[{"$ref":"#/components/schemas/GroundingEval"},{"type":"null"}]},"reflection_eval":{"anyOf":[{"$ref":"#/components/schemas/ReflectionEval"},{"type":"null"}]},"instruction_eval":{"anyOf":[{"$ref":"#/components/schemas/InstructionEval"},{"type":"null"}]},"suggestion_eval":{"anyOf":[{"$ref":"#/components/schemas/SuggestionQualityEval"},{"type":"null"}]},"bounding_box_eval":{"anyOf":[{"$ref":"#/components/schemas/BoundingBoxEval"},{"type":"null"}]},"grounder_hint_eval":{"anyOf":[{"$ref":"#/components/schemas/GrounderHintEval"},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL to before screenshot"},"tagged_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagged Image Url","description":"URL to tagged screenshot (with crosshair)"},"post_action_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Action Image Url","description":"URL to after screenshot"},"image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base64","description":"Base64 before screenshot (fallback)"},"tagged_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagged Image Base64","description":"Base64 tagged screenshot (fallback)"},"post_action_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Action Image Base64","description":"Base64 after screenshot (fallback)"}},"type":"object","required":["retry_index"],"title":"ReflectionAttemptEval","description":"Evaluation of a single reflection/retry attempt within a step."},"ReflectionErrorType":{"type":"string","enum":["none","false_positive","false_negative"],"title":"ReflectionErrorType","description":"Types of reflection errors that can occur."},"ReflectionEval":{"properties":{"correct":{"type":"boolean","title":"Correct","description":"Whether the reflection decision (next_step) was correct"},"error_type":{"$ref":"#/components/schemas/ReflectionErrorType","default":"none"},"expected_next_step":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Expected Next Step","description":"What next_step should have been"},"actual_next_step":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actual Next Step","description":"What next_step was"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation","description":"Brief reasoning"}},"type":"object","required":["correct"],"title":"ReflectionEval","description":"Evaluation result for reflection decision."},"RegisterSandboxRequest":{"properties":{"vm_name":{"type":"string","title":"Vm Name","description":"Unique VM name (e.g., 'Revyl-Mac-mini-W641QMFKQR')"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id","description":"Organization ID to reserve this sandbox for. If set, only users from this org can claim it. NULL means shared pool (available to all orgs)."},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname","description":"mDNS hostname"},"tunnel_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tunnel Hostname","description":"Cloudflare tunnel hostname for SSH"},"ssh_user":{"type":"string","title":"Ssh User","description":"SSH username","default":"revyl-admin"},"ssh_port":{"type":"integer","title":"Ssh Port","description":"SSH port","default":22},"ssm_instance_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ssm Instance Id","description":"AWS SSM managed instance ID (e.g., mi-0123...) for remote command execution"},"status":{"type":"string","enum":["available","claimed","maintenance","reserved"],"title":"Status","description":"Initial sandbox status","default":"available"},"specs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Specs","description":"Hardware specs (cpu_cores, memory_gb, chip)"},"tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tags","description":"Flexible labels for filtering"},"db_env":{"anyOf":[{"type":"string","enum":["staging","production"]},{"type":"null"}],"title":"Db Env","description":"Target database environment override. If not specified, uses the backend's configured default."}},"type":"object","required":["vm_name"],"title":"RegisterSandboxRequest","description":"Request payload for registering (upserting) a sandbox during provisioning.\n\nCalled by the fleet CLI or Ansible playbook after provisioning a Mac.\nUpserts into fleet_sandboxes by vm_name so the sandbox is discoverable\nby the developer CLI and FleetDashboard.\n\nAttributes:\n vm_name: Unique VM name (e.g., \"Revyl-Mac-mini-W641QMFKQR\").\n hostname: mDNS hostname (e.g., \"Revyl-Mac-mini-W641QMFKQR.local\").\n org_id: Organization ID to reserve this sandbox for. If set, only\n users from this org can claim it. NULL means shared pool.\n tunnel_hostname: Cloudflare tunnel hostname for SSH access.\n ssh_user: SSH username for connections (default: revyl-admin).\n ssh_port: SSH port number (default: 22).\n status: Initial sandbox status (default: available).\n specs: Hardware specifications (cpu_cores, memory_gb, chip).\n tags: Flexible labels for filtering (location, tier, etc.).\n db_env: Target database environment override. When set, the backend\n routes the registration to the specified Supabase instance\n instead of the backend's default. Use \"staging\" for internal\n sandboxes and \"production\" for external/customer sandboxes."},"RegisterSandboxResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether registration succeeded"},"created":{"type":"boolean","title":"Created","description":"True if new row inserted, False if updated"},"sandbox":{"$ref":"#/components/schemas/FleetSandbox","description":"Registered sandbox data"},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["success","created","sandbox","message"],"title":"RegisterSandboxResponse","description":"Response from registering a sandbox.\n\nAttributes:\n success: Whether the registration succeeded.\n created: True if a new row was inserted, False if\n an existing row was updated.\n sandbox: The registered sandbox data.\n message: Human-readable status message."},"ReleaseSandboxResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether release succeeded"},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["success","message"],"title":"ReleaseSandboxResponse","description":"Response from releasing a sandbox.\n\nAttributes:\n success: Whether the release was successful.\n message: Human-readable status message."},"ReliabilityEstimate":{"type":"string","enum":["high","medium","low"],"title":"ReliabilityEstimate","description":"Estimate of how reliably this test would pass on re-run."},"RemoveWorkflowFromRuleResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"rule":{"$ref":"#/components/schemas/SlackNotificationRuleWithWorkflows"}},"type":"object","required":["success","rule"],"title":"RemoveWorkflowFromRuleResponse","description":"Response after removing a workflow from a rule."},"ReportContextActionResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Id"},"action_index":{"type":"integer","title":"Action Index"},"action_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type"},"llm_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Call Id"},"reflection_llm_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Llm Call Id"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"reflection_decision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Decision"},"reflection_reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Reasoning"},"reflection_suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Suggestion"},"is_terminal":{"type":"boolean","title":"Is Terminal","default":false},"screenshot_before_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Before Url"},"screenshot_before_clean_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Before Clean Url"},"screenshot_after_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot After Url"},"video_timestamp_start":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp Start"},"video_timestamp_end":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp End"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"type_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Type Data"},"llm_call":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Llm Call"},"reflection_llm_call":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Reflection Llm Call"}},"type":"object","required":["action_index"],"title":"ReportContextActionResponse","description":"High-context action payload for CLI/agent report consumption."},"ReportContextResponse":{"properties":{"id":{"type":"string","title":"Id"},"report_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Url"},"execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Version Id"},"org_id":{"type":"string","title":"Org Id"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"total_steps":{"type":"integer","title":"Total Steps","default":0},"passed_steps":{"type":"integer","title":"Passed Steps","default":0},"warning_steps":{"type":"integer","title":"Warning Steps","default":0},"failed_steps":{"type":"integer","title":"Failed Steps","default":0},"total_validations":{"type":"integer","title":"Total Validations","default":0},"validations_passed":{"type":"integer","title":"Validations Passed","default":0},"effective_passed_steps":{"type":"integer","title":"Effective Passed Steps","default":0},"effective_warning_steps":{"type":"integer","title":"Effective Warning Steps","default":0},"effective_failed_steps":{"type":"integer","title":"Effective Failed Steps","default":0},"effective_running_steps":{"type":"integer","title":"Effective Running Steps","default":0},"effective_pending_steps":{"type":"integer","title":"Effective Pending Steps","default":0},"test_goal_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Goal Summary"},"tldr":{"anyOf":[{"$ref":"#/components/schemas/TLDROutput"},{"type":"null"}]},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"session_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Status"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"whep_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whep Url"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"device_metadata":{"anyOf":[{"$ref":"#/components/schemas/DeviceMetadata"},{"type":"null"}]},"screen_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Width"},"screen_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Height"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"workflow_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Execution Id"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt"},"build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Version"},"test_version_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Test Version Number"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"perfetto_trace_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Perfetto Trace Url"},"hardware_metrics_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hardware Metrics Url"},"steps":{"anyOf":[{"items":{"$ref":"#/components/schemas/ReportContextStepResponse"},"type":"array"},{"type":"null"}],"title":"Steps"}},"type":"object","required":["id","org_id"],"title":"ReportContextResponse","description":"Canonical high-context report payload for CLI JSON consumption."},"ReportContextStepResponse":{"properties":{"id":{"type":"string","title":"Id"},"report_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Id"},"parent_step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Step Id"},"execution_order":{"type":"integer","title":"Execution Order"},"node_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Node Id"},"step_type":{"type":"string","title":"Step Type"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"llm_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Call Id"},"source_module_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Module Id"},"source_module_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Module Name"},"video_timestamp_start":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp Start"},"video_timestamp_end":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp End"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason"},"effective_status":{"type":"string","title":"Effective Status","default":"pending"},"effective_status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Status Reason"},"validation_result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Validation Result"},"validation_reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Reasoning"},"type_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Type Data"},"actions":{"items":{"$ref":"#/components/schemas/ReportContextActionResponse"},"type":"array","title":"Actions","default":[]},"llm_call":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Llm Call"}},"type":"object","required":["id","execution_order","step_type"],"title":"ReportContextStepResponse","description":"High-context step payload for CLI/agent report consumption."},"ReportV3Response":{"properties":{"id":{"type":"string","title":"Id"},"execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Version Id"},"org_id":{"type":"string","title":"Org Id"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"total_steps":{"type":"integer","title":"Total Steps","default":0},"passed_steps":{"type":"integer","title":"Passed Steps","default":0},"failed_steps":{"type":"integer","title":"Failed Steps","default":0},"total_validations":{"type":"integer","title":"Total Validations","default":0},"validations_passed":{"type":"integer","title":"Validations Passed","default":0},"test_goal_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Goal Summary"},"expected_states":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Expected States"},"tldr":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tldr"},"run_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Run Config"},"s3_bucket":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Bucket"},"video_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video S3 Key"},"device_logs_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Logs S3 Key"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"session_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Status"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"whep_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whep Url"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"device_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Device Metadata"},"screen_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Width"},"screen_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Screen Height"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"workflow_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Execution Id"},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"resolved_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Build Id"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt"},"build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Version"},"test_version_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Test Version Number"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"perfetto_trace_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Perfetto Trace Url"},"hardware_metrics_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hardware Metrics Url"},"steps":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Steps","default":[]}},"type":"object","required":["id","org_id"],"title":"ReportV3Response","description":"Full report with steps and actions."},"Repository":{"properties":{"id":{"type":"string","title":"Id"},"propel_org_id":{"type":"string","title":"Propel Org Id"},"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"status":{"type":"string","title":"Status"},"added_at":{"type":"string","title":"Added At"}},"type":"object","required":["id","propel_org_id","owner","repo","status","added_at"],"title":"Repository"},"RepositoryIdentifier":{"properties":{"owner":{"type":"string","title":"Owner","description":"Repository owner/organization"},"repo":{"type":"string","title":"Repo","description":"Repository name"}},"type":"object","required":["owner","repo"],"title":"RepositoryIdentifier","description":"Repository identifier with owner and repo name."},"ResolveBuildVarsResponse":{"properties":{"apps":{"items":{"$ref":"#/components/schemas/ResolvedApp"},"type":"array","title":"Apps"}},"type":"object","required":["apps"],"title":"ResolveBuildVarsResponse","description":"Response model for resolved build vars from workflows."},"ResolvedApp":{"properties":{"app_id":{"type":"string","title":"App Id"},"app_name":{"type":"string","title":"App Name"},"platform":{"type":"string","title":"Platform"}},"type":"object","required":["app_id","app_name","platform"],"title":"ResolvedApp","description":"App resolved from workflow tests."},"ResolvedBuild":{"properties":{"build_var_id":{"type":"string","title":"Build Var Id"},"version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"static_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Static Url"},"artifact_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artifact Url"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"build_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt"},"package_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Name"},"uploaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Uploaded At"}},"type":"object","required":["build_var_id"],"title":"ResolvedBuild","description":"Normalized representation of a resolved build artifact."},"ResolvedVariable":{"properties":{"variable_name":{"type":"string","title":"Variable Name","description":"Name of the variable"},"variable_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Value","description":"Resolved value"},"source":{"type":"string","title":"Source","description":"Source: 'local' or 'global'"}},"type":"object","required":["variable_name","source"],"title":"ResolvedVariable","description":"A variable resolved from either local or global scope."},"ResolvedVariablesResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Response message"},"result":{"items":{"$ref":"#/components/schemas/ResolvedVariable"},"type":"array","title":"Result","description":"Merged list of resolved variables"}},"type":"object","required":["message","result"],"title":"ResolvedVariablesResponse","description":"Response model for the resolve endpoint."},"ReviewMetric":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"value":{"type":"number","title":"Value"},"previous_value":{"type":"number","title":"Previous Value"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"percentage_change":{"type":"number","title":"Percentage Change"},"period":{"type":"string","title":"Period"}},"type":"object","required":["id","title","value","previous_value","format","percentage_change","period"],"title":"ReviewMetric"},"RevokeCLIApiKeyRequest":{"properties":{"api_key_id":{"type":"string","title":"Api Key Id","description":"The PropelAuth-assigned API key ID to revoke."}},"type":"object","required":["api_key_id"],"title":"RevokeCLIApiKeyRequest","description":"Request to revoke a browser-issued CLI API key."},"RevokeCLIApiKeyResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the CLI API key was revoked."},"message":{"type":"string","title":"Message","description":"Human-readable status message."}},"type":"object","required":["success","message"],"title":"RevokeCLIApiKeyResponse","description":"Response from revoking a browser-issued CLI API key."},"RevylRepoConfig":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"enabled":{"type":"boolean","title":"Enabled"},"build_paths":{"items":{"$ref":"#/components/schemas/BuildPathConfig"},"type":"array","title":"Build Paths"},"workflows":{"items":{"$ref":"#/components/schemas/WorkflowConfig"},"type":"array","title":"Workflows"},"trigger_events":{"items":{"type":"string"},"type":"array","title":"Trigger Events"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","org_id","owner","repo","enabled","created_at","updated_at"],"title":"RevylRepoConfig","description":"Revyl repository configuration - workflow-centric with multiple workflows."},"RevylRepoConfigListResponse":{"properties":{"configs":{"items":{"$ref":"#/components/schemas/RevylRepoConfig"},"type":"array","title":"Configs"}},"type":"object","required":["configs"],"title":"RevylRepoConfigListResponse"},"RunningTestCoreInfo":{"properties":{"test_name":{"type":"string","title":"Test Name","description":"Name of the test"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id","description":"Test identifier"},"platform":{"type":"string","title":"Platform","description":"Platform (ios, android)"}},"type":"object","required":["test_name","platform"],"title":"RunningTestCoreInfo","description":"Core identification info for a running test."},"RunningTestMetadataContent":{"properties":{"_partial":{"type":"boolean","title":"Partial","description":"Indicates this is a partial report","default":true},"_upload_status":{"$ref":"#/components/schemas/RunningTestUploadStatus","description":"Upload status information"},"test_name":{"type":"string","title":"Test Name","description":"Name of the test"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id","description":"Test identifier"},"platform":{"type":"string","title":"Platform","description":"Platform (ios, android)"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success","description":"None indicates in-progress, True/False for completed"},"execution_time":{"type":"string","title":"Execution Time","description":"ISO timestamp when execution started"},"steps_data":{"items":{},"type":"array","title":"Steps Data","description":"Steps uploaded so far"},"core_info":{"$ref":"#/components/schemas/RunningTestCoreInfo","description":"Core test identification info"},"total_validations":{"type":"integer","title":"Total Validations","description":"Total validation steps","default":0},"validations_passed":{"type":"integer","title":"Validations Passed","description":"Validations passed so far","default":0},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id","description":"OpenTelemetry trace ID for correlation"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id","description":"Hatchet workflow run ID if part of a workflow"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Output"},{"type":"null"}],"description":"Test run configuration (LLM models, execution mode)"},"device_metadata":{"anyOf":[{"$ref":"#/components/schemas/DeviceMetadata"},{"type":"null"}],"description":"Device metadata (screen size, runtime, etc.)"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name","description":"Name of the app used for this test"},"build_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Version","description":"Version of the build used for this test"}},"additionalProperties":true,"type":"object","required":["test_name","platform","execution_time","core_info"],"title":"RunningTestMetadataContent","description":"Typed metadata content for running tests (partial reports).\n\nThis model provides structured fields for the metadata_content when a test\nis still in progress. It shares a common interface with ReportView (used for\ncompleted tests) to ensure consistent frontend consumption.\n\nCommon fields with ReportView:\n - test_name, test_id, platform: Test identification\n - success: Test result (None = in-progress, True/False = completed)\n - steps_data: Step execution data\n - run_config: LLM and execution configuration\n - device_metadata: Device screen size, type, runtime\n - run_id: OpenTelemetry trace ID for correlation\n - workflow_run_id: Hatchet workflow ID (if part of workflow)\n\nRunning-test specific fields:\n - _partial: Always True for running tests\n - _upload_status: Upload progress information\n - core_info: Nested test identification (for backwards compatibility)"},"RunningTestUploadStatus":{"properties":{"status":{"type":"string","const":"test_running","title":"Status","description":"Status indicating test is still running","default":"test_running"},"message":{"type":"string","title":"Message","description":"Human-readable status message","default":"Test execution is still in progress"}},"type":"object","title":"RunningTestUploadStatus","description":"Upload status for a running test."},"S3BucketInfo":{"properties":{"patterns":{"items":{"type":"string"},"type":"array","title":"Patterns","description":"Allowed file patterns for the bucket"},"description":{"type":"string","title":"Description","description":"Description of the bucket's purpose"}},"type":"object","required":["patterns","description"],"title":"S3BucketInfo","description":"Model for S3 bucket information."},"S3BucketsResponse":{"properties":{"buckets":{"additionalProperties":{"$ref":"#/components/schemas/S3BucketInfo"},"type":"object","title":"Buckets","description":"Map of bucket names to their configurations"}},"type":"object","required":["buckets"],"title":"S3BucketsResponse","description":"Response model for listing allowed S3 buckets.","example":{"buckets":{"my-bucket":{"description":"Document storage bucket","patterns":["*.txt","*.pdf"]}}}},"S3DataUrlResponse":{"properties":{"contents":{"type":"string","title":"Contents","description":"Contents of the file"}},"type":"object","required":["contents"],"title":"S3DataUrlResponse","description":"Response model for S3 data URL contents.","example":{"contents":"File contents here..."}},"S3DeleteResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Status message"},"bucket":{"type":"string","title":"Bucket","description":"Name of the S3 bucket"},"key":{"type":"string","title":"Key","description":"Key/path of the deleted file"}},"type":"object","required":["message","bucket","key"],"title":"S3DeleteResponse","description":"Response model for S3 delete operation.","example":{"bucket":"my-bucket","key":"user123/file.txt","message":"File deleted successfully"}},"S3PresignedUrlResponse":{"properties":{"url":{"type":"string","title":"Url","description":"The presigned URL"},"bucket":{"type":"string","title":"Bucket","description":"Name of the S3 bucket"},"key":{"type":"string","title":"Key","description":"Key/path of the file"}},"type":"object","required":["url","bucket","key"],"title":"S3PresignedUrlResponse","description":"Response model for S3 presigned URL generation.","example":{"bucket":"my-bucket","key":"user123/file.txt","url":"https://s3.amazonaws.com/..."}},"S3UploadResponse":{"properties":{"url":{"type":"string","title":"Url"},"key":{"type":"string","title":"Key"},"bucket":{"type":"string","title":"Bucket"}},"type":"object","required":["url","key","bucket"],"title":"S3UploadResponse"},"SSHKeyStatusResponse":{"properties":{"configured":{"type":"boolean","title":"Configured","description":"Whether SSH key is configured"},"key_fingerprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Fingerprint","description":"Key fingerprint if configured"},"sandbox_reachable":{"type":"boolean","title":"Sandbox Reachable","description":"Whether sandbox is reachable","default":false}},"type":"object","required":["configured"],"title":"SSHKeyStatusResponse","description":"Response from checking SSH key status on a sandbox.\n\nAttributes:\n configured: Whether an SSH key is configured for the user.\n key_fingerprint: Fingerprint of the configured key (if any).\n sandbox_reachable: Whether the sandbox is reachable via SSH."},"ScriptUsageResponse":{"properties":{"tests":{"items":{"$ref":"#/components/schemas/ScriptUsageTestItem"},"type":"array","title":"Tests"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["tests","total"],"title":"ScriptUsageResponse","description":"Response model for script usage lookup"},"ScriptUsageTestItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"ScriptUsageTestItem","description":"A test that uses a specific script"},"SeatCheckResponse":{"properties":{"total_seats":{"type":"integer","title":"Total Seats"},"assigned_seats":{"type":"integer","title":"Assigned Seats"},"unassigned_seats":{"type":"integer","title":"Unassigned Seats"},"github_users_count":{"type":"integer","title":"Github Users Count"},"needs_assignment":{"type":"boolean","title":"Needs Assignment"},"auto_assigned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Assigned"},"assigned_users":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Assigned Users"},"backfill_status":{"anyOf":[{"$ref":"#/components/schemas/BackfillSummary"},{"type":"null"}]},"user_backfill_status":{"items":{"$ref":"#/components/schemas/UserBackfillStatus"},"type":"array","title":"User Backfill Status"}},"type":"object","required":["total_seats","assigned_seats","unassigned_seats","github_users_count","needs_assignment"],"title":"SeatCheckResponse"},"SessionArtifactUploadRequest":{"properties":{"file_size":{"type":"integer","maximum":104857600.0,"exclusiveMinimum":0.0,"title":"File Size"},"content_type":{"type":"string","title":"Content Type","default":"application/zip"}},"type":"object","required":["file_size"],"title":"SessionArtifactUploadRequest","description":"Request body for generating an ephemeral artifact upload URL.\n\nParams:\n file_size: Size of the artifact in bytes. Must be <= 100 MB.\n content_type: MIME type of the artifact. Defaults to application/zip."},"SessionArtifactUploadResponse":{"properties":{"upload_url":{"type":"string","title":"Upload Url"},"download_url":{"type":"string","title":"Download Url"},"s3_key":{"type":"string","title":"S3 Key"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["upload_url","download_url","s3_key","expires_in"],"title":"SessionArtifactUploadResponse","description":"Presigned URLs for uploading and downloading an ephemeral artifact.\n\nParams:\n upload_url: Presigned PUT URL for uploading the artifact to S3.\n download_url: Presigned GET URL the worker uses to fetch the artifact.\n s3_key: The S3 object key for the uploaded artifact.\n expires_in: Upload URL expiry in seconds."},"SessionStatus":{"type":"string","enum":["queued","starting","running","verifying","stopping","completed","failed","cancelled","timeout"],"title":"SessionStatus","description":"Device session status - the single source of truth for test execution state.\n\nMatches the session_status enum in the database.\nNote: Ordering matters - follows the typical lifecycle progression.\n\nStatus flow:\n QUEUED → STARTING → RUNNING → STOPPING → COMPLETED/FAILED/TIMEOUT/CANCELLED\n ↘ VERIFYING → STOPPING"},"SessionSummaryBucket":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["count"],"title":"SessionSummaryBucket","description":"A single aggregation bucket in the session summary."},"SessionSummaryResponse":{"properties":{"buckets":{"items":{"$ref":"#/components/schemas/SessionSummaryBucket"},"type":"array","title":"Buckets"},"org_id":{"type":"string","title":"Org Id"}},"type":"object","required":["buckets","org_id"],"title":"SessionSummaryResponse","description":"Aggregated session counts for the overview metrics."},"SetupInstallationRequest":{"properties":{"github_code":{"type":"string","title":"Github Code"},"state_token":{"type":"string","title":"State Token"},"installation_id":{"type":"integer","title":"Installation Id"}},"type":"object","required":["github_code","state_token","installation_id"],"title":"SetupInstallationRequest"},"SetupInstallationResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"action":{"type":"string","title":"Action"},"installation_id":{"type":"integer","title":"Installation Id"},"propel_org_id":{"type":"string","title":"Propel Org Id"},"repositories":{"type":"integer","title":"Repositories"}},"type":"object","required":["success","action","installation_id","propel_org_id","repositories"],"title":"SetupInstallationResponse"},"ShardedReportMetadata":{"properties":{"version":{"type":"string","const":"2.0","title":"Version"},"type":{"type":"string","const":"sharded","title":"Type"},"manifest_url":{"type":"string","title":"Manifest Url"},"created_at":{"type":"string","title":"Created At"},"processing":{"type":"boolean","title":"Processing","default":false}},"type":"object","required":["version","type","manifest_url","created_at"],"title":"ShardedReportMetadata","description":"Metadata string we store in DB for sharded reports (v2)."},"ShareableReportBySessionModel":{"properties":{"session_id":{"type":"string","title":"Session Id","description":"Device session UUID"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin","description":"Origin URL for constructing the shareable link","default":"https://app.revyl.ai"},"expiration_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expiration Hours","description":"Hours until the link expires. None means never (100 years)."}},"type":"object","required":["session_id"],"title":"ShareableReportBySessionModel","description":"Request model for generating a shareable report link by session_id."},"ShareableReportByTaskModel":{"properties":{"task_id":{"type":"string","title":"Task Id"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin","default":"https://app.revyl.ai"},"expiration_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expiration Hours"}},"type":"object","required":["task_id"],"title":"ShareableReportByTaskModel"},"ShareableReportModel":{"properties":{"test_id":{"type":"string","title":"Test Id"},"task_id":{"type":"string","title":"Task Id"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin","default":"https://app.revyl.ai"}},"type":"object","required":["test_id","task_id"],"title":"ShareableReportModel","description":"Model for generating shareable report links.\n\nNote: 'task_id' is kept for URL compatibility (existing shareable links).\nInternally this maps to 'id' in the new test_executions schema."},"ShareableReportResponse":{"properties":{"shareable_link":{"type":"string","title":"Shareable Link","description":"Generated shareable link for the report"}},"type":"object","required":["shareable_link"],"title":"ShareableReportResponse","description":"Response model for generate_shareable_report_link endpoint.","example":{"shareable_link":"https://app.revyl.ai/tests/report?token=uuid-token-here"}},"ShareableReportStatusResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"shareable_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shareable Link"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["enabled"],"title":"ShareableReportStatusResponse","description":"Response model describing whether a shareable report link exists for a task."},"SharedReportOptimizedResponse":{"properties":{"status":{"type":"string","const":"success","title":"Status","description":"Status of the request, always 'success' on success"},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the test execution record (was task_id)"},"metadata_content":{"anyOf":[{"$ref":"#/components/schemas/RunningTestMetadataContent"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata Content","description":"Full or partial metadata content for the execution (can be _partial)"},"video_data":{"anyOf":[{},{"type":"null"}],"title":"Video Data","description":"Video events or data associated with the test execution, if available"},"cached_at":{"type":"string","title":"Cached At","description":"ISO timestamp when this response was created or cached"}},"type":"object","required":["status","execution_id","cached_at"],"title":"SharedReportOptimizedResponse","description":"Response model combining shared report metadata, execution history info, and optional video data.\nThis is used by the `/shared-report-optimized` endpoint for a single consolidated payload.","example":{"cached_at":"2024-03-14T12:05:00Z","execution_id":"exec-123","history_info":{"duration":45.5,"execution_time":"2024-03-14T12:00:00Z","id":"history-123","metadata":"https://s3.amazonaws.com/...","success":true,"test_uid":"test-456"},"metadata_content":{"_partial":false},"status":"success"}},"SimpleTestItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"platform":{"type":"string","title":"Platform"},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"},"tags":{"items":{"$ref":"#/components/schemas/SimpleTestTagItem"},"type":"array","title":"Tags","default":[]}},"type":"object","required":["id","name","platform"],"title":"SimpleTestItem","description":"Simple test item with essential fields for dropdowns/lists.\n\nAttributes:\n id: Test UUID.\n name: Human-readable test name.\n platform: Target platform (e.g. \"android\", \"ios\").\n app_id: Optional associated app UUID.\n app_name: Optional resolved app name (empty when no app is linked).\n tags: Tags attached to this test."},"SimpleTestListResponse":{"properties":{"tests":{"items":{"$ref":"#/components/schemas/SimpleTestItem"},"type":"array","title":"Tests"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["tests","count"],"title":"SimpleTestListResponse","description":"Response model for simple test list endpoint."},"SimpleTestTagItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"}},"type":"object","required":["id","name"],"title":"SimpleTestTagItem","description":"Lightweight tag reference attached to a SimpleTestItem."},"SlackChannel":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"is_private":{"type":"boolean","title":"Is Private","default":false}},"type":"object","required":["id","name"],"title":"SlackChannel","description":"A Slack channel that the bot can post to."},"SlackChannelsResponse":{"properties":{"channels":{"items":{"$ref":"#/components/schemas/SlackChannel"},"type":"array","title":"Channels"}},"type":"object","required":["channels"],"title":"SlackChannelsResponse","description":"Response containing list of available Slack channels."},"SlackIntegration":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"org_id":{"type":"string","format":"uuid","title":"Org Id"},"workspace_id":{"type":"string","title":"Workspace Id"},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name"},"bot_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot User Id"},"connected_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Connected By"},"connected_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Connected At"},"enabled":{"type":"boolean","title":"Enabled","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","org_id","workspace_id","created_at","updated_at"],"title":"SlackIntegration","description":"Slack integration details for an organization."},"SlackIntegrationResponse":{"properties":{"connected":{"type":"boolean","title":"Connected"},"integration":{"anyOf":[{"$ref":"#/components/schemas/SlackIntegration"},{"type":"null"}]}},"type":"object","required":["connected"],"title":"SlackIntegrationResponse","description":"Response for getting Slack integration status."},"SlackNotificationRuleResponse":{"properties":{"rule":{"$ref":"#/components/schemas/SlackNotificationRuleWithWorkflows"}},"type":"object","required":["rule"],"title":"SlackNotificationRuleResponse","description":"Response containing a single notification rule."},"SlackNotificationRuleWithWorkflows":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"org_id":{"type":"string","format":"uuid","title":"Org Id"},"slack_integration_id":{"type":"string","format":"uuid","title":"Slack Integration Id"},"name":{"type":"string","title":"Name"},"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"notify_on_start":{"type":"boolean","title":"Notify On Start","default":false},"notify_on_failure":{"type":"boolean","title":"Notify On Failure","default":true},"notify_on_success":{"type":"boolean","title":"Notify On Success","default":false},"notify_on_timeout":{"type":"boolean","title":"Notify On Timeout","default":true},"notify_on_cancelled":{"type":"boolean","title":"Notify On Cancelled","default":false},"mention_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mention Preference"},"workflow_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Workflow Ids"},"applies_to_all":{"type":"boolean","title":"Applies To All","default":false},"enabled":{"type":"boolean","title":"Enabled","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"workflows":{"items":{"$ref":"#/components/schemas/NotificationRuleWorkflow"},"type":"array","title":"Workflows"}},"type":"object","required":["id","org_id","slack_integration_id","name","channel_id","created_at","updated_at"],"title":"SlackNotificationRuleWithWorkflows","description":"Notification rule with enriched workflow details."},"SlackNotificationRulesResponse":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/SlackNotificationRuleWithWorkflows"},"type":"array","title":"Rules"}},"type":"object","required":["rules"],"title":"SlackNotificationRulesResponse","description":"Response containing list of notification rules."},"SlackOAuthUrlResponse":{"properties":{"oauth_url":{"type":"string","title":"Oauth Url"},"state_token":{"type":"string","title":"State Token"}},"type":"object","required":["oauth_url","state_token"],"title":"SlackOAuthUrlResponse","description":"Response containing the Slack OAuth URL for authorization."},"SourceMixItem":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"session_count":{"type":"integer","title":"Session Count","default":0},"unique_users":{"type":"integer","title":"Unique Users","default":0},"device_minutes":{"type":"number","title":"Device Minutes","default":0},"completed":{"type":"integer","title":"Completed","default":0},"failed":{"type":"integer","title":"Failed","default":0}},"type":"object","title":"SourceMixItem"},"StartDeviceInfo":{"properties":{"platform":{"type":"string","title":"Platform","default":"android"},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id","description":"CogniSim `apps` table row UUID. The backend resolves the latest build (presigned `app_link` / `app_url`) and native `package_name` from this id. Do not use for Android package name or iOS bundle id — use `app_package`."},"build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Id","description":"Specific `builds` table row UUID. When provided, the backend uses this exact build instead of resolving the latest build for the given `app_id`."},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Package"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_info":{"anyOf":[{"$ref":"#/components/schemas/Test-Input"},{"type":"null"}]},"device_local":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Device Local","default":false},"backend_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backend Url"},"viewport":{"anyOf":[{"$ref":"#/components/schemas/Viewport"},{"type":"null"}]},"app_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Link"},"app_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Url"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Input"},{"type":"null"}]},"idle_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Idle Timeout Seconds"},"is_simulation":{"type":"boolean","title":"Is Simulation","default":false},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"env_vars":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Env Vars"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"startup_session_start_monotonic":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Startup Session Start Monotonic"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"worker_ws_server":{"anyOf":[{},{"type":"null"}],"title":"Worker Ws Server"}},"type":"object","title":"StartDeviceInfo"},"StartDeviceResponse":{"properties":{"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"websocket_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Websocket Url"},"status":{"$ref":"#/components/schemas/AsyncStatus"},"iframe_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iframe Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"retry_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Retry Allowed"},"platform":{"type":"string","title":"Platform"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"OpenTelemetry trace ID for Grafana correlation"}},"type":"object","required":["status","platform"],"title":"StartDeviceResponse","description":"Structured response for the `start_device` endpoint."},"StepEval":{"properties":{"step_index":{"type":"integer","title":"Step Index","description":"Index of this step"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description","description":"Description of the step"},"action_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type","description":"Type of action taken"},"retries":{"type":"integer","title":"Retries","description":"Number of retries for this step","default":0},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning","description":"Instructional LLM's visual analysis and reasoning"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description","description":"Human-readable action description from Instructional LLM"},"grounding_applicable":{"type":"boolean","title":"Grounding Applicable","description":"Whether grounding eval applies (needs x,y coords)","default":true},"reflection_applicable":{"type":"boolean","title":"Reflection Applicable","description":"Whether reflection eval applies (needs before/after images)","default":true},"validation_applicable":{"type":"boolean","title":"Validation Applicable","description":"Whether validation eval applies (validation steps only)","default":false},"bounding_box_applicable":{"type":"boolean","title":"Bounding Box Applicable","description":"Whether bbox eval applies (needs grounder_bounding_box in llm_metadata)","default":false},"grounder_hint_applicable":{"type":"boolean","title":"Grounder Hint Applicable","description":"Whether grounder_hint eval applies (needs grounder_hint in llm_metadata)","default":false},"grounding_eval":{"anyOf":[{"$ref":"#/components/schemas/GroundingEval"},{"type":"null"}]},"reflection_eval":{"anyOf":[{"$ref":"#/components/schemas/ReflectionEval"},{"type":"null"}]},"instruction_eval":{"anyOf":[{"$ref":"#/components/schemas/InstructionEval"},{"type":"null"}]},"validation_eval":{"anyOf":[{"$ref":"#/components/schemas/ValidationEval"},{"type":"null"}]},"suggestion_eval":{"anyOf":[{"$ref":"#/components/schemas/SuggestionQualityEval"},{"type":"null"}]},"bounding_box_eval":{"anyOf":[{"$ref":"#/components/schemas/BoundingBoxEval"},{"type":"null"}]},"grounder_hint_eval":{"anyOf":[{"$ref":"#/components/schemas/GrounderHintEval"},{"type":"null"}]},"reflections":{"items":{"$ref":"#/components/schemas/ReflectionAttemptEval"},"type":"array","title":"Reflections","description":"Evaluations of retry attempts"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL to before screenshot"},"tagged_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagged Image Url","description":"URL to tagged screenshot (with crosshair)"},"post_action_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Action Image Url","description":"URL to after screenshot"},"image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base64","description":"Base64 before screenshot (fallback)"},"tagged_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagged Image Base64","description":"Base64 tagged screenshot (fallback)"},"post_action_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Action Image Base64","description":"Base64 after screenshot (fallback)"}},"type":"object","required":["step_index"],"title":"StepEval","description":"Complete evaluation of a single step including all retries."},"StepSummariesBatchRequest":{"properties":{"task_ids":{"items":{"type":"string"},"type":"array","title":"Task Ids"}},"type":"object","required":["task_ids"],"title":"StepSummariesBatchRequest","description":"Request for batch step summaries."},"StepSummariesBatchResponse":{"properties":{"summaries":{"additionalProperties":{"anyOf":[{"items":{"$ref":"#/components/schemas/StepSummaryV3"},"type":"array"},{"type":"null"}]},"type":"object","title":"Summaries"},"requested_count":{"type":"integer","title":"Requested Count"},"found_count":{"type":"integer","title":"Found Count"}},"type":"object","required":["summaries","requested_count","found_count"],"title":"StepSummariesBatchResponse","description":"Response for batch step summaries."},"StepSummaryV3":{"properties":{"execution_order":{"type":"integer","title":"Execution Order"},"step_type":{"type":"string","title":"Step Type"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description"},"validation_result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Validation Result"}},"type":"object","required":["execution_order","step_type"],"title":"StepSummaryV3","description":"Lightweight step summary for progress visualization."},"StepType":{"type":"string","enum":["instruction","validation","extract","scrape","decision","loop","end","wait","navigate","back","open_app","kill_app","go_home","code_execution","download_file","set_location","set_orientation","module_import","tap","click","double_tap","input","swipe","drag","pinch","scroll_up","scroll_down","clear_text","long_press","select"],"title":"StepType","description":"User-facing step types for YAML test definitions.\n\nThese are the high-level step types that users write in their tests.\nThey map to TASK_TYPES for routing and ActionType for execution."},"StreamingReportMetadata":{"properties":{"version":{"type":"string","title":"Version"},"type":{"type":"string","title":"Type","default":"streaming"},"manifest_url":{"type":"string","title":"Manifest Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"status":{"type":"string","title":"Status"},"viewable":{"type":"boolean","title":"Viewable"},"has_tldr":{"type":"boolean","title":"Has Tldr"},"steps_uploaded":{"type":"integer","title":"Steps Uploaded"},"step_results":{"items":{"$ref":"#/components/schemas/StreamingStepResult"},"type":"array","title":"Step Results"},"total_validations":{"type":"integer","title":"Total Validations","default":0},"validations_passed":{"type":"integer","title":"Validations Passed","default":0},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"}},"type":"object","required":["version","manifest_url","created_at","status","viewable","has_tldr","steps_uploaded"],"title":"StreamingReportMetadata","description":"DEPRECATED: Metadata persisted in the database for streaming reports.\n\nUsed only for reading legacy S3 reports. New reports use the\nreports_v3 database tables directly."},"StreamingStepResult":{"properties":{"step_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Step Index","description":"Step index for ordering (extracted from step_id)"},"action_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type"},"validation_result":{"anyOf":[{},{"type":"null"}],"title":"Validation Result"},"has_error":{"type":"boolean","title":"Has Error","default":false},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"cache_used":{"type":"boolean","title":"Cache Used","default":false}},"type":"object","title":"StreamingStepResult","description":"DEPRECATED: Aggregated step result for downstream analytics.\n\nUsed only for reading legacy S3 reports."},"SuggestionQualityEval":{"properties":{"quality_rating":{"$ref":"#/components/schemas/SuggestionQualityRating","description":"Overall quality rating of the suggestion"},"is_actionable":{"type":"boolean","title":"Is Actionable","description":"Whether the suggestion is specific and actionable"},"is_correct_approach":{"type":"boolean","title":"Is Correct Approach","description":"Whether the suggestion identifies the right approach to complete the step"},"addresses_failure":{"type":"boolean","title":"Addresses Failure","description":"Whether the suggestion addresses why the previous action failed"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion","description":"The suggestion that was evaluated"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation","description":"Reasoning for the evaluation"}},"type":"object","required":["quality_rating","is_actionable","is_correct_approach","addresses_failure"],"title":"SuggestionQualityEval","description":"Evaluation result for reflection suggestion quality."},"SuggestionQualityRating":{"type":"string","enum":["excellent","good","adequate","poor","incorrect"],"title":"SuggestionQualityRating","description":"Quality rating for reflection suggestions."},"SummaryData":{"properties":{"summary_text":{"type":"string","title":"Summary Text"},"key_metrics":{"items":{"$ref":"#/components/schemas/KeyMetric"},"type":"array","title":"Key Metrics"},"highlights":{"items":{"$ref":"#/components/schemas/Highlight"},"type":"array","title":"Highlights"},"generated_at":{"type":"string","title":"Generated At"}},"type":"object","required":["summary_text","key_metrics","highlights","generated_at"],"title":"SummaryData"},"SupabaseUploadResponse":{"properties":{"filename":{"type":"string","title":"Filename","description":"Name of the uploaded file"},"url":{"type":"string","title":"Url","description":"URL where the file can be accessed"}},"type":"object","required":["filename","url"],"title":"SupabaseUploadResponse","description":"Response model for Supabase file upload.","example":{"filename":"document.pdf","url":"https://supabase.storage/..."}},"SyncRepositoriesResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"repositories":{"type":"integer","title":"Repositories"}},"type":"object","required":["success","repositories"],"title":"SyncRepositoriesResponse"},"SyncTagsRequest":{"properties":{"tag_names":{"items":{"type":"string"},"type":"array","title":"Tag Names"}},"type":"object","required":["tag_names"],"title":"SyncTagsRequest","description":"Request to sync tags for a test by name."},"SyncTagsResponse":{"properties":{"test_id":{"type":"string","title":"Test Id"},"tags":{"items":{"$ref":"#/components/schemas/TagSyncResultItem"},"type":"array","title":"Tags"}},"type":"object","required":["test_id","tags"],"title":"SyncTagsResponse","description":"Response from sync operation."},"SystemApp":{"properties":{"display_name":{"type":"string","title":"Display Name","description":"Human-readable name for the app"},"bundle_id":{"type":"string","title":"Bundle Id","description":"Platform-specific bundle/package ID"},"description":{"type":"string","title":"Description","description":"Brief description of the app's purpose"}},"type":"object","required":["display_name","bundle_id","description"],"title":"SystemApp","description":"Represents a system application on a mobile device."},"SystemAppsResponse":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform identifier (ios or android)"},"apps":{"additionalProperties":{"$ref":"#/components/schemas/SystemApp"},"type":"object","title":"Apps","description":"Dictionary of app key to SystemApp"}},"type":"object","required":["platform","apps"],"title":"SystemAppsResponse","description":"Response model for system apps endpoint."},"TLDRKeyMoment":{"properties":{"step_reference":{"type":"string","title":"Step Reference"},"description":{"type":"string","title":"Description"},"importance":{"type":"string","title":"Importance"}},"type":"object","required":["step_reference","description","importance"],"title":"TLDRKeyMoment","description":"Key moment extracted from test execution"},"TLDROutput":{"properties":{"test_case":{"type":"string","title":"Test Case"},"key_moments":{"items":{"$ref":"#/components/schemas/TLDRKeyMoment"},"type":"array","title":"Key Moments"},"insights":{"items":{"type":"string"},"type":"array","title":"Insights"},"llm_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Llm Metadata"}},"type":"object","required":["test_case","key_moments","insights"],"title":"TLDROutput","description":"TLDR output with structured citations"},"Tag":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","default":"#6B7280"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["id","name"],"title":"Tag","description":"Tag model for API responses - used for test categorization."},"TagListResponse":{"properties":{"tags":{"items":{"$ref":"#/components/schemas/TagWithCountResponse"},"type":"array","title":"Tags"}},"type":"object","required":["tags"],"title":"TagListResponse","description":"Response model for listing tags."},"TagResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","default":"#6B7280"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["id","name"],"title":"TagResponse","description":"Response model for a single tag."},"TagSyncResultItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"}},"type":"object","required":["id","name","color"],"title":"TagSyncResultItem","description":"Result item from sync operation."},"TagWithCountResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","default":"#6B7280"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"test_count":{"type":"integer","title":"Test Count"}},"type":"object","required":["id","name","test_count"],"title":"TagWithCountResponse","description":"Tag with usage count for listings."},"TaskCount":{"properties":{"running":{"type":"integer","title":"Running","description":"Number of currently running tasks"},"queued":{"type":"integer","title":"Queued","description":"Number of tasks waiting in queue"},"total":{"type":"integer","title":"Total","description":"Sum of running and queued tasks"}},"type":"object","required":["running","queued","total"],"title":"TaskCount","description":"Task count metrics for a workflow type.\n\nAttributes:\n running: Number of currently running tasks.\n queued: Number of tasks waiting in queue.\n total: Sum of running and queued tasks."},"TaskID":{"properties":{"test_id":{"type":"string","title":"Test Id"},"get_downloads":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Get Downloads","default":false},"device_local":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Device Local"},"backend_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backend Url"},"test_entrypoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Entrypoint"},"retries":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retries","default":1},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Execution source: ui, cli, api, ci_cd, or workflow. Defaults to 'api' for direct API calls.","default":"api"},"app_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Link"},"build_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Version Id","description":"Override the build to use for this test execution. If provided, this will override the build attached to the test."},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model","description":"Override the target device model for this execution"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version","description":"Override the target OS/runtime version for this execution"},"llm_model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model Name","description":"Simple way to set the primary LLM model (automatically configures run_config.llm_config.primary_model)"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Input"},{"type":"null"}],"description":"Complete configuration for the test run (overrides flattened fields if provided)"},"variable_overrides":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Variable Overrides","description":"Runtime variable overrides. These take highest priority over local and global variables."}},"type":"object","required":["test_id"],"title":"TaskID"},"TaskMetadata-Input":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"step_type":{"type":"string","title":"Step Type"},"step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step","description":"Deprecated: Use step_description instead"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description","description":"Human-readable description of the step"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description","description":"Human-readable instruction describing what the agent did, e.g. 'Click the Sign In button'"},"download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Download","default":false},"metadata":{"anyOf":[{"$ref":"#/components/schemas/DOMMetadata"},{"type":"null"}]},"step_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Input"},{"type":"null"}],"description":"Step-level configuration that overrides test-level config"}},"type":"object","required":["step_type"],"title":"TaskMetadata"},"TaskMetadata-Output":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"step_type":{"type":"string","title":"Step Type"},"step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step","description":"Deprecated: Use step_description instead"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description","description":"Human-readable description of the step"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description","description":"Human-readable instruction describing what the agent did, e.g. 'Click the Sign In button'"},"download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Download","default":false},"metadata":{"anyOf":[{"$ref":"#/components/schemas/DOMMetadata"},{"type":"null"}]},"step_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Output"},{"type":"null"}],"description":"Step-level configuration that overrides test-level config"}},"type":"object","required":["step_type"],"title":"TaskMetadata"},"TaskReportRequest":{"properties":{"task_id":{"type":"string","title":"Task Id"},"test_id":{"type":"string","title":"Test Id"},"run_info":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/TestRunInfo"}],"title":"Run Info"},"success":{"type":"boolean","title":"Success"},"duration":{"type":"number","title":"Duration"},"user_id":{"type":"string","title":"User Id"},"run_info_compressed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Run Info Compressed","default":false},"execution_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Execution Time Seconds"}},"type":"object","required":["task_id","test_id","run_info","success","duration","user_id"],"title":"TaskReportRequest","description":"Request model for adding report to test executions.\n\nNote: 'task_id' and 'user_id' are kept for API compatibility.\nInternally these map to 'id' and 'source' in the new schema."},"TaskReportResponse":{"properties":{"id":{"type":"string","title":"Id"},"test_id":{"type":"string","title":"Test Id"},"source":{"type":"string","title":"Source","description":"Execution source: ui, cli, api, ci_cd, or workflow","default":"ui"},"success":{"type":"boolean","title":"Success"},"duration":{"type":"number","title":"Duration"},"report_metadata":{"anyOf":[{"$ref":"#/components/schemas/StreamingReportMetadata"},{"$ref":"#/components/schemas/ShardedReportMetadata"}],"title":"Report Metadata"},"status":{"type":"string","title":"Status"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","test_id","success","duration","report_metadata","status"],"title":"TaskReportResponse","description":"Response model for task report endpoint.\n\nUses 'id' as the primary identifier (was 'task_id' in old schema).\n'source' replaces 'user_id' to indicate how the test was triggered."},"Test-Input":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"},"platform":{"type":"string","title":"Platform","default":"Android"},"flowdescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flowdescription","default":""},"tasks":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Input"},{"$ref":"#/components/schemas/WhileBlock-Input"}]},"type":"array"},{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"items":{"$ref":"#/components/schemas/TaskMetadata-Input"},"type":"array"}],"title":"Tasks","default":[]},"cached_elements":{"anyOf":[{"$ref":"#/components/schemas/CachedActionStore-Input"},{"type":"null"}]},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link","default":""},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"device_local":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Device Local","default":false},"get_downloads":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Get Downloads","default":false},"backend_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backend Url"},"retries":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retries","default":1},"app_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Link"},"package_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Name"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Package"},"viewport":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Viewport"},"llm_model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model Name"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Input"},{"type":"null"}]},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"pinned_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Version"},"resolved_build":{"anyOf":[{"$ref":"#/components/schemas/ResolvedBuild"},{"type":"null"}]},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation","description":"Device orientation from test_mobile_details ('portrait' or 'landscape')"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status","description":"Status of the most recent execution (success, failure, timeout, cancelled, running, queued, setup, verifying, or None)"},"last_execution_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Execution Time","description":"ISO timestamp of the most recent execution completion"},"last_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Duration","description":"Duration of the most recent execution in seconds"},"last_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Execution Id","description":"Execution ID of the most recent execution for deep-linking to report (was last_task_id)"},"tags":{"anyOf":[{"items":{"$ref":"#/components/schemas/Tag"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Tags associated with this test for categorization and filtering"},"mobile_targets":{"anyOf":[{"items":{"$ref":"#/components/schemas/MobileTarget"},"type":"array"},{"type":"null"}],"title":"Mobile Targets","description":"Saved device model + runtime targets for this test"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version","description":"Current version number for optimistic locking. Increments on each save."},"last_modified_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Modified By","description":"UUID of the user who last modified this test."},"expected_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version","description":"Expected version for optimistic locking. If provided and doesn't match current version, update will fail with 409 Conflict."}},"additionalProperties":true,"type":"object","title":"Test"},"Test-Output":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"},"platform":{"type":"string","title":"Platform","default":"Android"},"flowdescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flowdescription","default":""},"tasks":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Output"},{"$ref":"#/components/schemas/WhileBlock-Output"}]},"type":"array"},{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"items":{"$ref":"#/components/schemas/TaskMetadata-Output"},"type":"array"}],"title":"Tasks","default":[]},"cached_elements":{"anyOf":[{"$ref":"#/components/schemas/CachedActionStore-Output"},{"type":"null"}]},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link","default":""},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"device_local":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Device Local","default":false},"get_downloads":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Get Downloads","default":false},"backend_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backend Url"},"retries":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retries","default":1},"app_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Link"},"package_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Name"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Package"},"viewport":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Viewport"},"llm_model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model Name"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Output"},{"type":"null"}]},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"pinned_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Version"},"resolved_build":{"anyOf":[{"$ref":"#/components/schemas/ResolvedBuild"},{"type":"null"}]},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation","description":"Device orientation from test_mobile_details ('portrait' or 'landscape')"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status","description":"Status of the most recent execution (success, failure, timeout, cancelled, running, queued, setup, verifying, or None)"},"last_execution_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Execution Time","description":"ISO timestamp of the most recent execution completion"},"last_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Duration","description":"Duration of the most recent execution in seconds"},"last_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Execution Id","description":"Execution ID of the most recent execution for deep-linking to report (was last_task_id)"},"tags":{"anyOf":[{"items":{"$ref":"#/components/schemas/Tag"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Tags associated with this test for categorization and filtering"},"mobile_targets":{"anyOf":[{"items":{"$ref":"#/components/schemas/MobileTarget"},"type":"array"},{"type":"null"}],"title":"Mobile Targets","description":"Saved device model + runtime targets for this test"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version","description":"Current version number for optimistic locking. Increments on each save."},"last_modified_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Modified By","description":"UUID of the user who last modified this test."},"expected_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version","description":"Expected version for optimistic locking. If provided and doesn't match current version, update will fail with 409 Conflict."}},"additionalProperties":true,"type":"object","title":"Test"},"TestCreationResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the operation was successful"},"test_id":{"type":"string","title":"Test Id","description":"Generated test ID"},"blocks_count":{"type":"integer","title":"Blocks Count","description":"Number of blocks created"},"generated_ids":{"items":{"type":"string"},"type":"array","title":"Generated Ids","description":"List of generated block IDs"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"Any errors that occurred"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"}},"type":"object","required":["success","test_id","blocks_count","generated_ids"],"title":"TestCreationResponse","description":"Response model for test creation"},"TestDeleteResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Success message"},"id":{"type":"string","title":"Id","description":"ID of the deleted test"}},"type":"object","required":["message","id"],"title":"TestDeleteResponse","description":"Response model for test deletion."},"TestEnhancedHistoryItem":{"properties":{"id":{"type":"string","title":"Id"},"test_uid":{"type":"string","title":"Test Uid"},"execution_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Time"},"status":{"type":"string","title":"Status"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"enhanced_task":{"$ref":"#/components/schemas/TestExecutionTasksEnhanced"},"has_report":{"type":"boolean","title":"Has Report","default":false}},"type":"object","required":["id","test_uid","status","enhanced_task"],"title":"TestEnhancedHistoryItem","description":"Enhanced history item with task tracking details"},"TestEnhancedHistoryResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TestEnhancedHistoryItem"},"type":"array","title":"Items"},"total_count":{"type":"integer","title":"Total Count"},"requested_count":{"type":"integer","title":"Requested Count"},"found_count":{"type":"integer","title":"Found Count"}},"type":"object","required":["items","total_count","requested_count","found_count"],"title":"TestEnhancedHistoryResponse","description":"Response for test enhanced history endpoint"},"TestEvalReport":{"properties":{"task_id":{"type":"string","title":"Task Id"},"test_id":{"type":"string","title":"Test Id"},"test_outcome":{"type":"string","enum":["PASSED","FAILED","ERROR"],"title":"Test Outcome"},"total_steps":{"type":"integer","title":"Total Steps"},"total_retries":{"type":"integer","title":"Total Retries"},"quality":{"anyOf":[{"$ref":"#/components/schemas/QualityScore"},{"type":"null"}]},"error_summary":{"$ref":"#/components/schemas/EvalErrorSummary"},"steps":{"items":{"$ref":"#/components/schemas/StepEval"},"type":"array","title":"Steps"},"raw_manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Raw Manifest","description":"Raw manifest data for debugging"}},"type":"object","required":["task_id","test_id","test_outcome","total_steps","total_retries","error_summary"],"title":"TestEvalReport","description":"Complete evaluation report for a test run."},"TestExecutionBatchResponse":{"properties":{"task_statuses":{"additionalProperties":{"$ref":"#/components/schemas/TestStatusResponse"},"type":"object","title":"Task Statuses"},"requested_count":{"type":"integer","title":"Requested Count"},"found_count":{"type":"integer","title":"Found Count"}},"type":"object","required":["task_statuses","requested_count","found_count"],"title":"TestExecutionBatchResponse","description":"Response model for batch test status requests."},"TestExecutionCreate":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"session_id":{"type":"string","title":"Session Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"org_id":{"type":"string","title":"Org Id"},"workflow_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Execution Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"resolved_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Build Id"},"was_quarantined":{"type":"boolean","title":"Was Quarantined","default":false}},"type":"object","required":["session_id","org_id"],"title":"TestExecutionCreate","description":"Request model for creating a test execution.\n\nNote: source, platform, status, phase, and timing are NOT stored on test_executions.\nThey come from the linked device_sessions table via session_id FK.\nUse test_executions_full view to read these fields."},"TestExecutionResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["message","success"],"title":"TestExecutionResponse","description":"Response model for test execution operations."},"TestExecutionSummary":{"properties":{"id":{"type":"string","title":"Id","description":"Test execution ID"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Device session ID for the test execution"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id","description":"Hatchet workflow run ID for direct cancellation support"}},"type":"object","required":["id"],"title":"TestExecutionSummary","description":"Summary of a test execution for workflow operations (e.g., cancellation).\n\nContains the minimal data needed to perform workflow-level operations on child tests\nwithout requiring N+1 queries to fetch each test's details individually."},"TestExecutionTaskCreateResponse":{"properties":{"message":{"type":"string","title":"Message"},"id":{"type":"string","title":"Id"}},"type":"object","required":["message","id"],"title":"TestExecutionTaskCreateResponse","description":"Response for test execution task creation"},"TestExecutionTaskUpdateResponse":{"properties":{"message":{"type":"string","title":"Message"},"id":{"type":"string","title":"Id"}},"type":"object","required":["message","id"],"title":"TestExecutionTaskUpdateResponse","description":"Response for test execution task update"},"TestExecutionTasksBatchResponse":{"properties":{"tasks":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/TestExecutionTasksEnhanced"},{"type":"null"}]},"type":"object","title":"Tasks"},"requested_count":{"type":"integer","title":"Requested Count"},"found_count":{"type":"integer","title":"Found Count"}},"type":"object","required":["tasks","requested_count","found_count"],"title":"TestExecutionTasksBatchResponse","description":"Response for batch test execution tasks request"},"TestExecutionTasksEnhanced":{"properties":{"id":{"type":"string","title":"Id","description":"Execution ID (primary key)"},"test_id":{"type":"string","title":"Test Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"workflow_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Execution Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"progress":{"type":"number","title":"Progress","default":0.0},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"current_step_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Step Index","default":0},"total_steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Steps"},"steps_completed":{"type":"integer","title":"Steps Completed","default":0},"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"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"report_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Report Metadata"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"resolved_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Build Id"},"was_quarantined":{"type":"boolean","title":"Was Quarantined","default":false},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"execution_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Execution Time Seconds"}},"type":"object","required":["id","test_id"],"title":"TestExecutionTasksEnhanced","description":"Enhanced test execution tasks model with tracking fields.\n\nWhen queried via test_executions_full view, includes status and timing\nfrom device_sessions (the source of truth for state)."},"TestExecutionTasksEnhancedCreate":{"properties":{"id":{"type":"string","title":"Id","description":"Execution ID (primary key)"},"test_id":{"type":"string","title":"Test Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"FK to device_sessions (required in DB, but optional here for update-fallback pattern)"},"workflow_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Execution Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"progress":{"type":"number","title":"Progress","default":0.0},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"current_step_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Step Index","default":0},"total_steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Steps"},"steps_completed":{"type":"integer","title":"Steps Completed","default":0},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"report_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Report Metadata"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"resolved_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Build Id"},"was_quarantined":{"type":"boolean","title":"Was Quarantined","default":false}},"type":"object","required":["id","test_id"],"title":"TestExecutionTasksEnhancedCreate","description":"Create model for enhanced test execution tasks (writer input).\n\nNote: status, phase, and timing are NOT on this model.\nDevice_sessions is the source of truth for these fields.\n\ncreated_at and updated_at are auto-generated by the database:\n- created_at: DEFAULT NOW()\n- updated_at: tr_test_executions_updated_at trigger"},"TestExecutionTasksEnhancedUpdate":{"properties":{"id":{"type":"string","title":"Id","description":"Execution ID (primary key, used for lookup)"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"workflow_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Execution Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"current_step_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Step Index"},"total_steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Steps"},"steps_completed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steps Completed"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"report_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Report Metadata"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"resolved_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Build Id"},"was_quarantined":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Was Quarantined"}},"type":"object","required":["id"],"title":"TestExecutionTasksEnhancedUpdate","description":"Partial update model for enhanced test execution tasks (writer input).\n\nNote: status, phase, and timing are NOT written to test_executions.\nDevice_sessions is the source of truth for state and timing.\n\ncreated_at and updated_at are auto-managed by the database:\n- created_at: set once at insert (DEFAULT NOW())\n- updated_at: auto-updated by tr_test_executions_updated_at trigger"},"TestExecutionUpdate":{"properties":{"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"current_step_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Step Index"},"total_steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Steps"},"steps_completed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steps Completed"}},"type":"object","title":"TestExecutionUpdate","description":"Request model for updating a test execution.\n\nNote: status, phase, and timing are NOT stored on test_executions.\nThey come from the linked device_sessions table via session_id FK.\nTo update status/timing, update device_sessions directly."},"TestHealthTimePoint":{"properties":{"date":{"type":"string","title":"Date","description":"Date string (e.g., 'Jan 5' or '2024-01-05')"},"passing":{"type":"integer","title":"Passing","description":"Number of passing tests at this point"},"failing":{"type":"integer","title":"Failing","description":"Number of failing tests at this point"}},"type":"object","required":["date","passing","failing"],"title":"TestHealthTimePoint","description":"A single data point for test health over time."},"TestHealthTimeSeries":{"properties":{"data_points":{"items":{"$ref":"#/components/schemas/TestHealthTimePoint"},"type":"array","title":"Data Points","description":"List of time points with passing/failing counts"},"total_passing":{"type":"integer","title":"Total Passing","description":"Current total passing tests"},"total_failing":{"type":"integer","title":"Total Failing","description":"Current total failing tests"}},"type":"object","required":["data_points","total_passing","total_failing"],"title":"TestHealthTimeSeries","description":"Time series data for test health graph showing passing/failing trends."},"TestInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["id"],"title":"TestInfo"},"TestListResponse":{"properties":{"tests":{"items":{"$ref":"#/components/schemas/Test-Output"},"type":"array","title":"Tests","description":"List of tests"},"count":{"type":"integer","title":"Count","description":"Number of tests in this page"},"total_count":{"type":"integer","title":"Total Count","description":"Total number of tests across all pages","default":0},"offset":{"type":"integer","title":"Offset","description":"Offset used for this page","default":0},"limit":{"type":"integer","title":"Limit","description":"Limit used for this page","default":150},"has_more":{"type":"boolean","title":"Has More","description":"Whether more tests exist beyond this page","default":false},"status_counts":{"anyOf":[{"$ref":"#/components/schemas/TestStatusCounts"},{"type":"null"}],"description":"Org-wide test counts by status"},"apps":{"items":{"$ref":"#/components/schemas/AppResponse"},"type":"array","title":"Apps","description":"List of apps for the organization"},"total_tests_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Tests Wow","description":"Week-over-week percentage change in total tests (positive = increase)"},"passing_tests_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Passing Tests Wow","description":"Week-over-week percentage change in passing tests as % of total (positive = increase)"},"failing_tests_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Failing Tests Wow","description":"Week-over-week percentage change in failing tests as % of total (positive = increase)"},"not_run_tests_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Not Run Tests Wow","description":"Week-over-week percentage change in not run tests as % of total (positive = increase)"}},"type":"object","required":["tests","count"],"title":"TestListResponse","description":"Response model for listing tests."},"TestMatrixBuild":{"properties":{"build_id":{"type":"string","title":"Build Id"},"version":{"type":"string","title":"Version"},"uploaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Uploaded At"}},"type":"object","required":["build_id","version"],"title":"TestMatrixBuild"},"TestMatrixCell":{"properties":{"build_id":{"type":"string","title":"Build Id"},"build_version":{"type":"string","title":"Build Version"},"total_runs":{"type":"integer","title":"Total Runs","default":0},"passed_runs":{"type":"integer","title":"Passed Runs","default":0},"failed_runs":{"type":"integer","title":"Failed Runs","default":0},"cancelled_runs":{"type":"integer","title":"Cancelled Runs","default":0},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"top_failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Top Failure Reason"},"failure_details":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Failure Details"},"test_version_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Test Version Number"},"latest_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Execution Id"}},"type":"object","required":["build_id","build_version"],"title":"TestMatrixCell"},"TestMatrixResponse":{"properties":{"app_id":{"type":"string","title":"App Id"},"builds":{"items":{"$ref":"#/components/schemas/TestMatrixBuild"},"type":"array","title":"Builds"},"tests":{"items":{"$ref":"#/components/schemas/TestMatrixRow"},"type":"array","title":"Tests"},"build_count":{"type":"integer","title":"Build Count","default":0},"test_count":{"type":"integer","title":"Test Count","default":0},"total_builds":{"type":"integer","title":"Total Builds","default":0},"page":{"type":"integer","title":"Page","default":1},"page_size":{"type":"integer","title":"Page Size","default":10}},"type":"object","required":["app_id"],"title":"TestMatrixResponse"},"TestMatrixRow":{"properties":{"test_id":{"type":"string","title":"Test Id"},"test_name":{"type":"string","title":"Test Name"},"cells":{"items":{"$ref":"#/components/schemas/TestMatrixCell"},"type":"array","title":"Cells"},"flaky_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Flaky Score"},"classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classification"},"classification_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classification Detail"}},"type":"object","required":["test_id","test_name"],"title":"TestMatrixRow"},"TestNotificationResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"}},"type":"object","required":["success","message"],"title":"TestNotificationResponse","description":"Response after sending a test notification."},"TestRestoreVersionRequest":{"properties":{"version":{"type":"integer","title":"Version","description":"Version number to restore to"}},"type":"object","required":["version"],"title":"TestRestoreVersionRequest","description":"Request model for restoring a test to a previous version."},"TestRestoreVersionResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Success message"},"new_version":{"type":"integer","title":"New Version","description":"The new version number after restore"},"restored_from":{"type":"integer","title":"Restored From","description":"The version that was restored"}},"type":"object","required":["message","new_version","restored_from"],"title":"TestRestoreVersionResponse","description":"Response model for restoring a test version."},"TestRunConfig-Input":{"properties":{"llm_config":{"$ref":"#/components/schemas/LLMConfig","description":"LLM model configuration","default":{"primary_model":"gemini/gemini-3-flash-preview","reflection_model":"gemini/gemini-3-flash-preview","planning_model":"gemini/gemini-3-flash-preview"}},"execution_mode":{"$ref":"#/components/schemas/ExecutionModeConfig-Input","description":"Execution mode configuration","default":{"human_in_the_loop":false,"enable_reflection":true,"enable_planning":false,"retries":1,"reflection_retries":1,"skip_app_install":false,"grounder_type":"moondream3"}},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"cache_retry_mode":{"$ref":"#/components/schemas/CacheRetryMode","description":"Cache retry policy","default":"full_rerun"},"fallback_trigger":{"$ref":"#/components/schemas/FallbackTrigger","description":"When to trigger cache fallback","default":"final_fail"},"disable_grid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disable Grid","description":"Admin-only: Disable grid preprocessing for grounding"}},"type":"object","title":"TestRunConfig","description":"Complete configuration for a test run."},"TestRunConfig-Output":{"properties":{"llm_config":{"$ref":"#/components/schemas/LLMConfig","description":"LLM model configuration","default":{"primary_model":"gemini/gemini-3-flash-preview","reflection_model":"gemini/gemini-3-flash-preview","planning_model":"gemini/gemini-3-flash-preview"}},"execution_mode":{"$ref":"#/components/schemas/ExecutionModeConfig-Output","description":"Execution mode configuration","default":{"human_in_the_loop":false,"enable_reflection":true,"enable_planning":false,"retries":1,"reflection_retries":1,"skip_app_install":false,"grounder_type":"moondream3"}},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"cache_retry_mode":{"$ref":"#/components/schemas/CacheRetryMode","description":"Cache retry policy","default":"full_rerun"},"fallback_trigger":{"$ref":"#/components/schemas/FallbackTrigger","description":"When to trigger cache fallback","default":"final_fail"},"disable_grid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disable Grid","description":"Admin-only: Disable grid preprocessing for grounding"}},"type":"object","title":"TestRunConfig","description":"Complete configuration for a test run."},"TestRunInfo":{"properties":{"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"app_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Link"},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Package"},"start_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Time"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"additionalProperties":true,"type":"object","title":"TestRunInfo","description":"Test run information that can be stored as run_info."},"TestStatistics":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Unique identifier of the user"},"test_history_count":{"type":"integer","title":"Test History Count","description":"Total number of test executions"},"success_count":{"type":"integer","title":"Success Count","description":"Number of successful test executions"},"failure_count":{"type":"integer","title":"Failure Count","description":"Number of failed test executions"},"success_rate":{"type":"number","title":"Success Rate","description":"Percentage of successful test executions"},"average_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Duration","description":"Average duration of test executions"},"currently_failing":{"type":"integer","title":"Currently Failing","description":"Number of currently failing tests"},"test_history_count_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Test History Count Wow","description":"Week-over-week percentage change in test executions (positive = increase)"},"currently_failing_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Currently Failing Wow","description":"Week-over-week percentage change in failing tests (positive = increase)"},"average_duration_wow":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Duration Wow","description":"Week-over-week percentage change in average duration (positive = increase)"}},"type":"object","required":["user_id","test_history_count","success_count","failure_count","success_rate","average_duration","currently_failing"],"title":"TestStatistics","description":"Model representing test execution statistics for a user."},"TestStatusCounts":{"properties":{"total":{"type":"integer","title":"Total","description":"Total number of tests in the org"},"passing":{"type":"integer","title":"Passing","description":"Tests with last_status = 'success'"},"failing":{"type":"integer","title":"Failing","description":"Tests with last_status in ('failure', 'failed', 'timeout', 'cancelled')"},"not_run":{"type":"integer","title":"Not Run","description":"Tests with no status or 'verifying'"},"running":{"type":"integer","title":"Running","description":"Tests with last_status in ('running', 'queued', 'setup')"}},"type":"object","required":["total","passing","failing","not_run","running"],"title":"TestStatusCounts","description":"Server-side test counts by status, computed across all tests (not just the current page)."},"TestStatusResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Execution ID (was task_id)"},"test_id":{"type":"string","title":"Test Id"},"status":{"$ref":"#/components/schemas/SessionStatus"},"progress":{"type":"number","title":"Progress","default":0.0},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"current_step_index":{"type":"integer","title":"Current Step Index","default":0},"total_steps":{"type":"integer","title":"Total Steps","default":1},"steps_completed":{"type":"integer","title":"Steps Completed","default":0},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"execution_errors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Execution Errors"},"validation_failures":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Validation Failures"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"test_history_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test History Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"execution_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Execution Time Seconds"}},"type":"object","required":["id","test_id","status"],"title":"TestStatusResponse","description":"Response model for test execution status.\n\nUses 'id' instead of 'task_id' as the primary identifier.\nNote: Timing data (started_at, completed_at, execution_time_seconds) comes from\ndevice_sessions, not test_executions. Query with device_sessions join for timing.\n\nStatus field uses SessionStatus directly (queued, starting, running, etc.)."},"TestVersionInfo":{"properties":{"id":{"type":"string","title":"Id","description":"Version record ID"},"test_id":{"type":"string","title":"Test Id","description":"Test ID this version belongs to"},"version":{"type":"integer","title":"Version","description":"Version number"},"tasks":{"title":"Tasks","description":"Tasks at this version"},"modified_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modified By","description":"User ID who created this version"},"modified_by_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modified By Email","description":"Email of user who created this version"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When this version was created"}},"type":"object","required":["id","test_id","version","tasks","created_at"],"title":"TestVersionInfo","description":"Information about a specific test version."},"TestVersionListResponse":{"properties":{"versions":{"items":{"$ref":"#/components/schemas/TestVersionInfo"},"type":"array","title":"Versions","description":"List of versions"},"total":{"type":"integer","title":"Total","description":"Total number of versions"}},"type":"object","required":["versions","total"],"title":"TestVersionListResponse","description":"Response model for listing test versions."},"TestWithDetails":{"properties":{"id":{"type":"string","title":"Id","description":"Unique identifier of the test"},"name":{"type":"string","title":"Name","description":"Name of the test"},"last_status":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Last Status","description":"Success status of the most recent execution"},"last_execution_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Execution Time","description":"ISO timestamp of the most recent execution"},"last_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Duration","description":"Duration of the most recent execution in seconds"},"recent_statuses":{"items":{"type":"boolean"},"type":"array","title":"Recent Statuses","description":"List of success statuses from recent executions"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link","description":"URL or link associated with the test"},"platform":{"type":"string","title":"Platform","description":"Platform the test runs on (ios, android)"},"latest_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Execution Id","description":"Execution ID of the most recent execution for deep-linking to report (was latest_task_id)"}},"type":"object","required":["id","name","platform"],"title":"TestWithDetails","description":"Model representing a single test with its execution details.","example":{"id":"test-123","last_duration":45.5,"last_execution_time":"2024-03-14T12:00:00Z","last_status":true,"latest_execution_id":"exec-abc-123","link":"https://example.com","name":"Login Test","platform":"ios","recent_statuses":[true,true,false,true]}},"TimelineEvent":{"properties":{"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"event_type":{"type":"string","title":"Event Type"},"title":{"type":"string","title":"Title"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["occurred_at","event_type","title"],"title":"TimelineEvent"},"ToolCall":{"properties":{"id":{"type":"string","title":"Id","description":"Unique identifier for this tool call"},"type":{"type":"string","title":"Type","description":"Type of tool call","default":"function"},"function":{"$ref":"#/components/schemas/ToolCallFunction","description":"Function call details"}},"additionalProperties":true,"type":"object","required":["id","function"],"title":"ToolCall","description":"A tool/function call made by the assistant."},"ToolCallFunction":{"properties":{"name":{"type":"string","title":"Name","description":"Name of the function to call"},"arguments":{"type":"string","title":"Arguments","description":"JSON-encoded function arguments"}},"type":"object","required":["name","arguments"],"title":"ToolCallFunction","description":"Function details within a tool call."},"TopTest":{"properties":{"test_id":{"type":"string","title":"Test Id"},"test_name":{"type":"string","title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"run_count":{"type":"integer","title":"Run Count","default":0},"passed":{"type":"integer","title":"Passed","default":0},"failed":{"type":"integer","title":"Failed","default":0},"pass_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Rate"},"last_run":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run"},"avg_duration_min":{"type":"number","title":"Avg Duration Min","default":0}},"type":"object","required":["test_id","test_name"],"title":"TopTest"},"TopWorkflow":{"properties":{"workflow_id":{"type":"string","title":"Workflow Id"},"workflow_name":{"type":"string","title":"Workflow Name"},"run_count":{"type":"integer","title":"Run Count","default":0},"passed":{"type":"integer","title":"Passed","default":0},"failed":{"type":"integer","title":"Failed","default":0},"pass_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Rate"},"last_run":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run"},"avg_duration_min":{"type":"number","title":"Avg Duration Min","default":0},"test_count":{"type":"integer","title":"Test Count","default":0}},"type":"object","required":["workflow_id","workflow_name"],"title":"TopWorkflow"},"TourResponse":{"properties":{"success":{"type":"boolean","title":"Success"}},"type":"object","required":["success"],"title":"TourResponse"},"TrainingImageUploadRequest":{"properties":{"task_id":{"type":"string","title":"Task Id"},"step_id":{"type":"string","title":"Step Id"},"predicted_x":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Predicted X"},"predicted_y":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Predicted Y"},"actual_x":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual X"},"actual_y":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Y"},"raw_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Target"},"grounder_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grounder Target"},"instruction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instruction"},"action_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type"},"actual_bbox_x1":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Bbox X1"},"actual_bbox_y1":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Bbox Y1"},"actual_bbox_x2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Bbox X2"},"actual_bbox_y2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Bbox Y2"}},"type":"object","required":["task_id","step_id"],"title":"TrainingImageUploadRequest"},"TrainingImageUploadResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"bucket":{"type":"string","title":"Bucket"},"key":{"type":"string","title":"Key"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},"type":"object","required":["success","bucket","key"],"title":"TrainingImageUploadResponse"},"UnifiedPRHistoryRequest":{"properties":{"repositories":{"anyOf":[{"items":{"$ref":"#/components/schemas/RepositoryIdentifier"},"type":"array"},{"type":"null"}],"title":"Repositories"},"all_repos":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"All Repos","default":false}},"type":"object","title":"UnifiedPRHistoryRequest","description":"Unified request model for PR history that handles both single and multi-repo queries."},"UnifiedReportRequest":{"properties":{"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testid"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"taskId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taskid"},"progressive":{"type":"boolean","title":"Progressive","default":false},"loadImages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Loadimages"},"normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Normalize"}},"type":"object","title":"UnifiedReportRequest","description":"Request model for unified report endpoint that supports both token and auth-based access"},"UnifiedWorkflowReportRequest":{"properties":{"workflow_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Task Id"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"include_video_metadata":{"type":"boolean","title":"Include Video Metadata","default":false}},"type":"object","title":"UnifiedWorkflowReportRequest"},"UnifiedWorkflowReportResponse":{"properties":{"workflow_task":{"$ref":"#/components/schemas/WorkflowTaskInfo"},"workflow_detail":{"anyOf":[{"$ref":"#/components/schemas/WorkflowDetailInfo"},{"type":"null"}]},"test_info":{"items":{"$ref":"#/components/schemas/TestInfo"},"type":"array","title":"Test Info","default":[]},"child_tasks":{"items":{"$ref":"#/components/schemas/ChildTaskReportInfo"},"type":"array","title":"Child Tasks","default":[]},"video_metadata":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/VideoMetadataInfo"},"type":"object"},{"type":"null"}],"title":"Video Metadata"},"child_share_status":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Child Share Status","default":{}},"is_public_view":{"type":"boolean","title":"Is Public View","default":false}},"type":"object","required":["workflow_task"],"title":"UnifiedWorkflowReportResponse"},"UnitsOfWorkData":{"properties":{"developer":{"type":"string","title":"Developer"},"features":{"type":"integer","title":"Features"},"bug_fixes":{"type":"integer","title":"Bug Fixes"},"refactoring":{"type":"integer","title":"Refactoring"},"other":{"type":"integer","title":"Other"}},"type":"object","required":["developer","features","bug_fixes","refactoring","other"],"title":"UnitsOfWorkData"},"UpdateActionScreenshotRequest":{"properties":{"screenshot_after_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot After S3 Key"},"screenshot_before_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Before S3 Key"}},"type":"object","title":"UpdateActionScreenshotRequest"},"UpdateAppLaunchEnvVarModel":{"properties":{"env_var_id":{"type":"string","title":"Env Var Id","description":"Env var ID to update"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key","description":"Updated env var key"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"Updated env var value"}},"type":"object","required":["env_var_id"],"title":"UpdateAppLaunchEnvVarModel","description":"Model for updating app launch environment variables"},"UpdateDefaultRoleRequest":{"properties":{"default_role":{"type":"string","title":"Default Role"}},"type":"object","required":["default_role"],"title":"UpdateDefaultRoleRequest","description":"Request to update the default role for new users."},"UpdateDeviceTargetRequest":{"properties":{"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation"}},"type":"object","title":"UpdateDeviceTargetRequest"},"UpdateDeviceTargetResponse":{"properties":{"device_model":{"type":"string","title":"Device Model"},"os_version":{"type":"string","title":"Os Version"}},"type":"object","required":["device_model","os_version"],"title":"UpdateDeviceTargetResponse"},"UpdateExpoProjectRequest":{"properties":{"project_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Name","description":"Display name for the project"}},"type":"object","title":"UpdateExpoProjectRequest","description":"Request to update an Expo project configuration."},"UpdateFailurePolicyRequest":{"properties":{"failure_policy":{"type":"string","title":"Failure Policy"}},"type":"object","required":["failure_policy"],"title":"UpdateFailurePolicyRequest"},"UpdateInternalSlackRuleRequest":{"properties":{"notify_on_failure":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Failure"},"notify_on_success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Success"},"notify_on_timeout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Timeout"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"add_workflow_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Add Workflow Ids"},"remove_workflow_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Remove Workflow Ids"}},"type":"object","title":"UpdateInternalSlackRuleRequest","description":"Request to update an internal notification rule."},"UpdateModuleRequest":{"properties":{"name":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Name","description":"New name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"New description"},"blocks":{"anyOf":[{"items":{"$ref":"#/components/schemas/ModuleBlock"},"type":"array"},{"type":"null"}],"title":"Blocks","description":"New blocks array"},"expected_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version","description":"Expected version for optimistic locking"}},"type":"object","title":"UpdateModuleRequest","description":"Request model for updating an existing module"},"UpdatePRCommentRequest":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"pr_number":{"type":"integer","title":"Pr Number"},"comment_id":{"type":"string","title":"Comment Id"},"comment_body":{"type":"string","title":"Comment Body"}},"type":"object","required":["owner","repo","pr_number","comment_id","comment_body"],"title":"UpdatePRCommentRequest","description":"Request to update a PR comment."},"UpdatePropelMetadataRequest":{"properties":{"expo_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expo Token"},"expo_projects":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExpoProjectMetadataEntry"},"type":"array"},{"type":"null"}],"title":"Expo Projects"},"browser_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Browser Provider"},"concurrency_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Concurrency Limit"},"proxy_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Proxy Enabled"}},"type":"object","title":"UpdatePropelMetadataRequest","description":"Update request for Propel organization metadata."},"UpdateRebelOrgSettings":{"properties":{"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"custom_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Prompt"},"response_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Language"},"cursor_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Api Key"},"expo_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expo Token"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"UpdateRebelOrgSettings","description":"Update request for organization settings."},"UpdateReportRequest":{"properties":{"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"test_goal_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Goal Summary"},"expected_states":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Expected States"},"tldr":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tldr"},"video_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video S3 Key"},"video_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Duration"},"device_logs_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Logs S3 Key"}},"type":"object","title":"UpdateReportRequest","description":"Request model for updating a report."},"UpdateReportResponse":{"properties":{"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["message","success"],"title":"UpdateReportResponse","description":"Response model for report update."},"UpdateSandboxRequest":{"properties":{"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id","description":"Organization ID to assign this sandbox to. Set to empty string to clear (move to shared pool). Admin only."},"tunnel_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tunnel Hostname","description":"Cloudflare tunnel hostname for SSH"},"status":{"anyOf":[{"type":"string","enum":["available","claimed","maintenance","reserved"]},{"type":"null"}],"title":"Status","description":"Sandbox status"},"ssh_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ssh User","description":"SSH username"},"ssh_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ssh Port","description":"SSH port"},"specs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Specs","description":"Hardware specs"},"tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tags","description":"Flexible labels"}},"type":"object","title":"UpdateSandboxRequest","description":"Request payload for updating sandbox properties (admin only).\n\nAll fields are optional - only provided fields will be updated.\n\nAttributes:\n org_id: Organization ID to assign this sandbox to. Set to empty string\n to clear (move to shared pool). Admin only.\n tunnel_hostname: Cloudflare tunnel hostname for SSH access.\n status: Sandbox status (available, claimed, maintenance, reserved).\n ssh_user: SSH username for connections.\n ssh_port: SSH port number.\n specs: Hardware specifications.\n tags: Flexible labels for filtering."},"UpdateSandboxResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether update succeeded"},"message":{"type":"string","title":"Message","description":"Status message"},"sandbox":{"anyOf":[{"$ref":"#/components/schemas/FleetSandbox"},{"type":"null"}],"description":"Updated sandbox data"}},"type":"object","required":["success","message"],"title":"UpdateSandboxResponse","description":"Response from updating a sandbox.\n\nAttributes:\n success: Whether the update succeeded.\n message: Human-readable status message.\n sandbox: Updated sandbox data."},"UpdateSeatsRequest":{"properties":{"assignments":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Assignments"},"unassignments":{"items":{"type":"string"},"type":"array","title":"Unassignments"}},"type":"object","required":["assignments","unassignments"],"title":"UpdateSeatsRequest"},"UpdateSeatsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"assigned_count":{"type":"integer","title":"Assigned Count"},"unassigned_count":{"type":"integer","title":"Unassigned Count"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","assigned_count","unassigned_count","message"],"title":"UpdateSeatsResponse"},"UpdateSlackNotificationRuleRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"notify_on_start":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Start"},"notify_on_failure":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Failure"},"notify_on_success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Success"},"notify_on_timeout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Timeout"},"notify_on_cancelled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Cancelled"},"mention_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mention Preference"},"workflow_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Workflow Ids"},"applies_to_all":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To All"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"UpdateSlackNotificationRuleRequest","description":"Request to update an existing notification rule."},"UpdateStepRequest":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"llm_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Call Id"},"video_timestamp_start":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp Start"},"video_timestamp_end":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp End"},"validation_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Validation Data"},"video_validation_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Video Validation Data"},"decision_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Decision Data"},"loop_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Loop Data"},"extraction_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extraction Data"},"code_execution_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Code Execution Data"}},"type":"object","title":"UpdateStepRequest","description":"Request model for updating a report step."},"UpdateStepResponse":{"properties":{"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["message","success"],"title":"UpdateStepResponse","description":"Response model for step update."},"UpdateTagRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"UpdateTagRequest","description":"Request to update a tag."},"UpdateVariableNameModel":{"properties":{"test_uid":{"type":"string","title":"Test Uid"},"variable_name":{"type":"string","title":"Variable Name"}},"type":"object","required":["test_uid","variable_name"],"title":"UpdateVariableNameModel"},"UpdateVariableValueModel":{"properties":{"variable_id":{"type":"string","title":"Variable Id"},"variable_value":{"type":"string","title":"Variable Value"}},"type":"object","required":["variable_id","variable_value"],"title":"UpdateVariableValueModel"},"UpdateWorkflowBuildConfigRequest":{"properties":{"build_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Build Config"},"override_build_config":{"type":"boolean","title":"Override Build Config"}},"type":"object","required":["build_config","override_build_config"],"title":"UpdateWorkflowBuildConfigRequest"},"UpdateWorkflowLocationConfigRequest":{"properties":{"location_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location Config"},"override_location":{"type":"boolean","title":"Override Location"}},"type":"object","required":["location_config","override_location"],"title":"UpdateWorkflowLocationConfigRequest"},"UpdateWorkflowNameRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"UpdateWorkflowNameRequest"},"UpdateWorkflowRunConfigRequest":{"properties":{"run_config":{"additionalProperties":true,"type":"object","title":"Run Config"},"override_run_config":{"type":"boolean","title":"Override Run Config"}},"type":"object","required":["run_config","override_run_config"],"title":"UpdateWorkflowRunConfigRequest"},"UpdateWorkflowScheduleRequest":{"properties":{"schedule":{"type":"string","title":"Schedule"},"schedule_enabled":{"type":"boolean","title":"Schedule Enabled"},"schedule_timezone":{"type":"string","title":"Schedule Timezone","default":"UTC"}},"type":"object","required":["schedule","schedule_enabled"],"title":"UpdateWorkflowScheduleRequest"},"UpdateWorkflowTimeoutConfigRequest":{"properties":{"test_timeout_seconds":{"anyOf":[{"type":"integer","maximum":10800.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Test Timeout Seconds","description":"Timeout in seconds (1–10800). Null to disable."}},"type":"object","title":"UpdateWorkflowTimeoutConfigRequest"},"UsageHeatmapCell":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"dow":{"type":"integer","title":"Dow"},"hour":{"type":"integer","title":"Hour"},"events":{"type":"integer","title":"Events","default":0},"pageviews":{"type":"integer","title":"Pageviews","default":0}},"type":"object","required":["dow","hour"],"title":"UsageHeatmapCell"},"UserActivityItem":{"properties":{"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"session_count":{"type":"integer","title":"Session Count"},"device_minutes":{"type":"number","title":"Device Minutes"}},"type":"object","required":["user_id","session_count","device_minutes"],"title":"UserActivityItem","description":"Per-user activity breakdown."},"UserBackfillStatus":{"properties":{"github_login":{"type":"string","title":"Github Login"},"total_tasks":{"type":"integer","title":"Total Tasks"},"completed_tasks":{"type":"integer","title":"Completed Tasks"},"in_progress_tasks":{"type":"integer","title":"In Progress Tasks"},"failed_tasks":{"type":"integer","title":"Failed Tasks"},"overall_status":{"type":"string","title":"Overall Status"},"repos":{"items":{"type":"string"},"type":"array","title":"Repos"}},"type":"object","required":["github_login","total_tasks","completed_tasks","in_progress_tasks","failed_tasks","overall_status"],"title":"UserBackfillStatus"},"UserTestsResponse":{"properties":{"tests":{"items":{"$ref":"#/components/schemas/TestWithDetails"},"type":"array","title":"Tests","description":"List of tests with their execution details"}},"type":"object","title":"UserTestsResponse","description":"Model representing the response from get_user_tests_with_details.","example":{"tests":[{"id":"test-123","last_duration":45.5,"last_execution_time":"2024-03-14T12:00:00Z","last_status":true,"link":"https://example.com","name":"Login Test","platform":"ios","recent_statuses":[true,true,false,true]}]}},"UserWebActivity":{"properties":{"email":{"type":"string","title":"Email"},"pageviews":{"type":"integer","title":"Pageviews","default":0},"last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen"},"tests_views":{"type":"integer","title":"Tests Views","default":0},"workflows_views":{"type":"integer","title":"Workflows Views","default":0},"dashboard_views":{"type":"integer","title":"Dashboard Views","default":0},"execute_views":{"type":"integer","title":"Execute Views","default":0},"sessions_views":{"type":"integer","title":"Sessions Views","default":0},"report_views":{"type":"integer","title":"Report Views","default":0}},"type":"object","required":["email"],"title":"UserWebActivity"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValidationErrorType":{"type":"string","enum":["none","false_positive","false_negative"],"title":"ValidationErrorType","description":"Types of validation errors that can occur."},"ValidationEval":{"properties":{"correct":{"type":"boolean","title":"Correct","description":"Whether the validation result was correct"},"error_type":{"$ref":"#/components/schemas/ValidationErrorType","default":"none"},"validation_instruction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Instruction","description":"What was being validated"},"agent_result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Agent Result","description":"What the agent returned (True/False)"},"expected_result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Expected Result","description":"What the result should have been"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation","description":"Reasoning for the evaluation"}},"type":"object","required":["correct"],"title":"ValidationEval","description":"Evaluation result for validation step accuracy."},"ValidationRequest":{"properties":{"yaml_content":{"type":"string","title":"Yaml Content","description":"YAML content to validate"},"validation_type":{"$ref":"#/components/schemas/ValidationTypeEnum","description":"Type of validation","default":"full_test"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Target platform for validation"}},"type":"object","required":["yaml_content"],"title":"ValidationRequest","description":"Request model for YAML validation"},"ValidationResponse":{"properties":{"is_valid":{"type":"boolean","title":"Is Valid","description":"Whether the YAML is valid"},"validation_type":{"$ref":"#/components/schemas/ValidationTypeEnum","description":"Type of validation performed"},"errors":{"type":"integer","title":"Errors","description":"Number of errors found"},"warnings":{"type":"integer","title":"Warnings","description":"Number of warnings found"},"messages":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Messages","description":"Validation messages"}},"type":"object","required":["is_valid","validation_type","errors","warnings","messages"],"title":"ValidationResponse","description":"Response model for YAML validation"},"ValidationTypeEnum":{"type":"string","enum":["full_test","blocks_only"],"title":"ValidationTypeEnum","description":"Types of YAML validation supported"},"VariableModel":{"properties":{"test_uid":{"type":"string","title":"Test Uid"},"variable_name":{"type":"string","title":"Variable Name"},"variable_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Value"}},"type":"object","required":["test_uid","variable_name"],"title":"VariableModel"},"VariableResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Response message"},"result":{"$ref":"#/components/schemas/VariableRow","description":"Variable record"}},"type":"object","required":["message","result"],"title":"VariableResponse","description":"Response model for single variable operations."},"VariableRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Unique identifier of the variable"},"test_uid":{"type":"string","format":"uuid","title":"Test Uid","description":"Test UID associated with variable"},"variable_name":{"type":"string","title":"Variable Name","description":"Name of the variable"},"variable_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Value","description":"Value of the variable"}},"type":"object","required":["id","test_uid","variable_name"],"title":"VariableRow"},"VariablesResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Response message"},"result":{"items":{"$ref":"#/components/schemas/VariableRow"},"type":"array","title":"Result","description":"List of variable records"}},"type":"object","required":["message","result"],"title":"VariablesResponse","description":"Response model for variable list operations."},"VideoMetadataBatchRequest":{"properties":{"execution_ids":{"items":{"type":"string"},"type":"array","title":"Execution Ids"}},"type":"object","required":["execution_ids"],"title":"VideoMetadataBatchRequest","description":"Request for batch video metadata."},"VideoMetadataBatchRequestV1":{"properties":{"task_ids":{"items":{"type":"string"},"type":"array","title":"Task Ids"}},"type":"object","required":["task_ids"],"title":"VideoMetadataBatchRequestV1","description":"Request model for batch video metadata."},"VideoMetadataBatchResponse":{"properties":{"videos":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/VideoMetadataItemV3"},{"type":"null"}]},"type":"object","title":"Videos"},"requested_count":{"type":"integer","title":"Requested Count"},"found_count":{"type":"integer","title":"Found Count"}},"type":"object","required":["videos","requested_count","found_count"],"title":"VideoMetadataBatchResponse","description":"Response for batch video metadata."},"VideoMetadataBatchResponseV1":{"properties":{"videos":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/VideoMetadataItem"},{"type":"null"}]},"type":"object","title":"Videos"},"requested_count":{"type":"integer","title":"Requested Count"},"found_count":{"type":"integer","title":"Found Count"}},"type":"object","required":["videos","requested_count","found_count"],"title":"VideoMetadataBatchResponseV1","description":"Response model for batch video metadata."},"VideoMetadataInfo":{"properties":{"task_id":{"type":"string","title":"Task Id"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"duration":{"type":"number","title":"Duration"},"video_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Duration"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"steps":{"items":{"$ref":"#/components/schemas/app__routes__workflow_routes__workflow_share_xpt__StepMetadata"},"type":"array","title":"Steps","default":[]},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["task_id","duration"],"title":"VideoMetadataInfo"},"VideoMetadataItem":{"properties":{"task_id":{"type":"string","title":"Task Id"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"video_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Duration"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"steps":{"items":{"$ref":"#/components/schemas/app__routes__report_routes__test_report_xpt__StepMetadata"},"type":"array","title":"Steps","default":[]},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["task_id"],"title":"VideoMetadataItem","description":"Lightweight video + step metadata for a single task."},"VideoMetadataItemV3":{"properties":{"execution_id":{"type":"string","title":"Execution Id"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"video_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Duration"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"steps":{"items":{"$ref":"#/components/schemas/VideoMetadataStepV3"},"type":"array","title":"Steps","default":[]}},"type":"object","required":["execution_id"],"title":"VideoMetadataItemV3","description":"Video metadata for a single execution."},"VideoMetadataStepV3":{"properties":{"index":{"type":"integer","title":"Index"},"step_type":{"type":"string","title":"Step Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"video_timestamp_start":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp Start"},"video_timestamp_end":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Timestamp End"}},"type":"object","required":["index","step_type"],"title":"VideoMetadataStepV3","description":"Lightweight step data for video timeline."},"Viewport":{"properties":{"width":{"type":"integer","title":"Width","default":1024},"height":{"type":"integer","title":"Height","default":768}},"type":"object","title":"Viewport","description":"Model for viewport dimensions used in browser sessions."},"WaitlistJoinRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"type":"string","title":"Name"},"company_name":{"type":"string","title":"Company Name"},"referral_source":{"type":"string","title":"Referral Source"}},"type":"object","required":["email","name","company_name","referral_source"],"title":"WaitlistJoinRequest"},"WaitlistJoinResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"WaitlistJoinResponse"},"WeakestComponent":{"type":"string","enum":["grounding","reflection","instruction","validation","bounding_box","grounder_hint"],"title":"WeakestComponent","description":"Which component was weakest in the test execution."},"WebEngagement":{"properties":{"available":{"type":"boolean","title":"Available","default":false},"page_views":{"type":"integer","title":"Page Views","default":0},"unique_users":{"type":"integer","title":"Unique Users","default":0},"last_web_activity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Web Activity"},"top_sections":{"additionalProperties":{"type":"integer"},"type":"object","title":"Top Sections"},"top_pages":{"items":{"$ref":"#/components/schemas/WebPageVisit"},"type":"array","title":"Top Pages"},"usage_heatmap":{"items":{"$ref":"#/components/schemas/UsageHeatmapCell"},"type":"array","title":"Usage Heatmap"},"daily_trend":{"items":{"$ref":"#/components/schemas/DailyUsageTrend"},"type":"array","title":"Daily Trend"},"user_activity":{"items":{"$ref":"#/components/schemas/UserWebActivity"},"type":"array","title":"User Activity"}},"type":"object","title":"WebEngagement"},"WebPageVisit":{"properties":{"page":{"type":"string","title":"Page"},"views":{"type":"integer","title":"Views","default":0},"unique_visitors":{"type":"integer","title":"Unique Visitors","default":0}},"type":"object","required":["page"],"title":"WebPageVisit"},"WeeklyActivityPoint":{"properties":{"week":{"type":"string","title":"Week"},"total":{"type":"integer","title":"Total","default":0},"completed":{"type":"integer","title":"Completed","default":0},"failed":{"type":"integer","title":"Failed","default":0},"other":{"type":"integer","title":"Other","default":0},"device_minutes":{"type":"number","title":"Device Minutes","default":0},"unique_users":{"type":"integer","title":"Unique Users","default":0}},"type":"object","required":["week"],"title":"WeeklyActivityPoint"},"WeeklyMetrics":{"properties":{"total_executions":{"type":"number","title":"Total Executions","description":"Total workflow executions in the period","default":0},"successful_runs":{"type":"number","title":"Successful Runs","description":"Number of successful workflow runs","default":0},"failed_runs":{"type":"number","title":"Failed Runs","description":"Number of failed workflow runs","default":0},"avg_success_rate":{"type":"number","title":"Avg Success Rate","description":"Average test success rate as percentage","default":0}},"type":"object","title":"WeeklyMetrics","description":"Weekly metrics for workflow performance."},"WeeklySummaryResponse":{"properties":{"summary":{"$ref":"#/components/schemas/SummaryData"},"retrieved_at":{"type":"string","title":"Retrieved At"}},"type":"object","required":["summary","retrieved_at"],"title":"WeeklySummaryResponse"},"WhatGotDoneChange":{"properties":{"type":{"type":"string","title":"Type","description":"Type of change (feature, bug_fix, optimization)"},"title":{"type":"string","title":"Title","description":"Title of the change"},"description":{"type":"string","title":"Description","description":"Description of the change"},"pr_references":{"items":{"$ref":"#/components/schemas/PRReference"},"type":"array","title":"Pr References","description":"Related pull requests"}},"type":"object","required":["type","title","description","pr_references"],"title":"WhatGotDoneChange","description":"Individual change in the What Got Done summary."},"WhatGotDoneSummary":{"properties":{"features":{"items":{"$ref":"#/components/schemas/WhatGotDoneChange"},"type":"array","title":"Features","description":"New features"},"bug_fixes":{"items":{"$ref":"#/components/schemas/WhatGotDoneChange"},"type":"array","title":"Bug Fixes","description":"Bug fixes"},"optimizations":{"items":{"$ref":"#/components/schemas/WhatGotDoneChange"},"type":"array","title":"Optimizations","description":"Performance optimizations"},"summary_text":{"type":"string","title":"Summary Text","description":"Overall summary text"}},"type":"object","required":["summary_text"],"title":"WhatGotDoneSummary","description":"What Got Done summary with categorized changes."},"WhileBlock-Input":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for the block (auto-generated if not provided)"},"type":{"type":"string","const":"while","title":"Type"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description","description":"Condition to evaluate for loop continuation (alternative to 'condition')"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition","description":"Condition to evaluate for loop continuation (alternative to 'step_description')"},"children":{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Input"},{"$ref":"#/components/schemas/WhileBlock-Input"}]},"type":"array","title":"Children","description":"Blocks to execute in the loop"}},"type":"object","required":["type"],"title":"WhileBlock","description":"Block for loop logic."},"WhileBlock-Output":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for the block (auto-generated if not provided)"},"type":{"type":"string","const":"while","title":"Type"},"step_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Description","description":"Condition to evaluate for loop continuation (alternative to 'condition')"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition","description":"Condition to evaluate for loop continuation (alternative to 'step_description')"},"children":{"items":{"anyOf":[{"$ref":"#/components/schemas/ActionBlock"},{"$ref":"#/components/schemas/IfBlock-Output"},{"$ref":"#/components/schemas/WhileBlock-Output"}]},"type":"array","title":"Children","description":"Blocks to execute in the loop"}},"type":"object","required":["type"],"title":"WhileBlock","description":"Block for loop logic."},"WorkBreakdown":{"properties":{"features":{"type":"integer","title":"Features"},"bug_fixes":{"type":"integer","title":"Bug Fixes"},"refactoring":{"type":"integer","title":"Refactoring"},"documentation":{"type":"integer","title":"Documentation"},"testing":{"type":"integer","title":"Testing"}},"type":"object","required":["features","bug_fixes","refactoring","documentation","testing"],"title":"WorkBreakdown"},"WorkerConnectionResponse":{"properties":{"status":{"type":"string","enum":["ready","not_ready","cancelled","stopped","failed"],"title":"Status"},"workflow_run_id":{"type":"string","title":"Workflow Run Id"},"worker_ws_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worker Ws Url"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status","workflow_run_id"],"title":"WorkerConnectionResponse","description":"Worker connection information."},"WorkflowAppConfig":{"properties":{"ios_build":{"anyOf":[{"$ref":"#/components/schemas/PlatformApp"},{"type":"null"}],"description":"iOS app override"},"android_build":{"anyOf":[{"$ref":"#/components/schemas/PlatformApp"},{"type":"null"}],"description":"Android app override"}},"type":"object","title":"WorkflowAppConfig","description":"Workflow-level app configuration for iOS and Android.\n\nWhen set on a workflow with override_build_config=True, these apps\noverride individual test app configurations for matching platforms.\n\nAttributes:\n ios_app: Optional iOS app override configuration.\n android_app: Optional Android app override configuration."},"WorkflowCancelResponse":{"properties":{"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"},"task_id":{"type":"string","title":"Task Id"}},"type":"object","required":["message","success","task_id"],"title":"WorkflowCancelResponse","description":"Response model for workflow cancellation."},"WorkflowConfig":{"properties":{"workflow_id":{"type":"string","title":"Workflow Id"}},"type":"object","required":["workflow_id"],"title":"WorkflowConfig","description":"Configuration for a Revyl workflow."},"WorkflowData":{"properties":{"name":{"type":"string","title":"Name"},"tests":{"items":{"type":"string"},"type":"array","title":"Tests"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule","default":"No Schedule"},"owner":{"type":"string","title":"Owner"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}},"type":"object","required":["name","tests","owner"],"title":"WorkflowData"},"WorkflowDetailData":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"deleted":{"type":"boolean","title":"Deleted"},"last_run":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run"},"name":{"type":"string","title":"Name"},"org_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Org Id"},"owner":{"type":"string","format":"uuid4","title":"Owner"},"schedule":{"type":"string","title":"Schedule"},"schedule_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Timezone"},"tests":{"items":{"type":"string"},"type":"array","title":"Tests"},"schedule_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Schedule Enabled"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Output"},{"type":"null"}],"description":"Workflow-level run configuration that overrides individual test configs"},"override_run_config":{"type":"boolean","title":"Override Run Config"},"build_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Build Config","description":"Workflow-level build configuration (JSONB with ios_build and android_build)"},"override_build_config":{"type":"boolean","title":"Override Build Config","description":"When True, build_config overrides individual test build configurations","default":false},"location_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location Config","description":"Workflow-level location configuration (JSONB with latitude, longitude)"},"override_location":{"type":"boolean","title":"Override Location","description":"When True, location_config overrides individual test locations. Independent of override_run_config.","default":false},"test_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Test Timeout Seconds","description":"Per-test execution timeout in seconds. Applied to all tests dispatched by this workflow."},"quarantined_test_ids":{"items":{"type":"string"},"type":"array","title":"Quarantined Test Ids","description":"Test IDs with failure_policy='ignore_failure'. Failures in these tests do not fail the workflow."},"last_execution":{"anyOf":[{"$ref":"#/components/schemas/WorkflowLastExecution"},{"type":"null"}],"description":"Last execution status and metadata"},"test_count":{"type":"integer","title":"Test Count","description":"Number of tests in workflow"},"test_info":{"items":{"$ref":"#/components/schemas/WorkflowTestInfo"},"type":"array","title":"Test Info","description":"Detailed test information"},"execution_history":{"items":{"$ref":"#/components/schemas/WorkflowExecutionHistoryItem"},"type":"array","title":"Execution History","description":"Complete execution history"},"execution_total_count":{"type":"integer","title":"Execution Total Count","description":"Total number of executions for pagination","default":0},"chart_data":{"items":{"$ref":"#/components/schemas/cognisim_schemas__schemas__backend_schema__ChartDataPoint"},"type":"array","title":"Chart Data","description":"Aggregated chart data for the past 90 days with daily pass/fail counts and success rates (independent of pagination)"},"metrics_current_week":{"anyOf":[{"$ref":"#/components/schemas/WeeklyMetrics"},{"type":"null"}],"description":"Metrics for the current week (last 7 days)"},"metrics_previous_week":{"anyOf":[{"$ref":"#/components/schemas/WeeklyMetrics"},{"type":"null"}],"description":"Metrics for the previous week (7-14 days ago)"},"metrics_weekly_change":{"anyOf":[{"$ref":"#/components/schemas/WeeklyMetrics"},{"type":"null"}],"description":"Week-over-week percentage change for each metric"},"overall_metrics":{"anyOf":[{"$ref":"#/components/schemas/WeeklyMetrics"},{"type":"null"}],"description":"All-time aggregate metrics (not scoped to any week)"}},"type":"object","required":["id","deleted","name","owner","schedule","override_run_config","test_count"],"title":"WorkflowDetailData","description":"Enriched workflow data for detail view."},"WorkflowDetailInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tests":{"items":{"type":"string"},"type":"array","title":"Tests","default":[]},"run_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Run Config"},"override_run_config":{"type":"boolean","title":"Override Run Config","default":false},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"schedule_enabled":{"type":"boolean","title":"Schedule Enabled","default":false},"schedule_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Timezone"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id"],"title":"WorkflowDetailInfo"},"WorkflowExecutionCreate":{"properties":{"workflow_id":{"type":"string","title":"Workflow Id"},"org_id":{"type":"string","title":"Org Id"},"source":{"type":"string","title":"Source"},"source_metadata":{"additionalProperties":true,"type":"object","title":"Source Metadata"},"status":{"type":"string","title":"Status","default":"queued"},"total_tests":{"type":"integer","title":"Total Tests","default":0},"concurrency_limit":{"type":"integer","title":"Concurrency Limit","default":3},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"}},"type":"object","required":["workflow_id","org_id","source","source_metadata"],"title":"WorkflowExecutionCreate","description":"Request model for creating a workflow execution."},"WorkflowExecutionHistoryItem":{"properties":{"id":{"type":"string","title":"Id","description":"Execution ID (was task_id)"},"status":{"type":"string","title":"Status","description":"Execution status"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success","description":"Success flag"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Execution duration"},"created_at":{"type":"string","title":"Created At","description":"Execution timestamp"},"triggered_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Triggered By","description":"How execution was triggered","default":"Manual"},"test_results":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Test Results","description":"Individual test results"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"OpenTelemetry trace ID for Grafana correlation"}},"type":"object","required":["id","status","created_at"],"title":"WorkflowExecutionHistoryItem","description":"Single execution history item for workflow detail view.\n\nNote: 'id' is now the primary identifier (was task_id in old schema)."},"WorkflowExecutionHistoryResponse":{"properties":{"workflow_id":{"type":"string","title":"Workflow Id"},"executions":{"items":{"$ref":"#/components/schemas/WorkflowStatusResponse"},"type":"array","title":"Executions"},"total_count":{"type":"integer","title":"Total Count"},"success_rate":{"type":"number","title":"Success Rate"},"average_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Duration"}},"type":"object","required":["workflow_id","executions","total_count","success_rate"],"title":"WorkflowExecutionHistoryResponse","description":"Response model for workflow execution history."},"WorkflowExecutionHistoryStatus":{"properties":{"status":{"type":"string","title":"Status","description":"Execution status (success/failure/unknown)"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At","description":"Execution timestamp"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Execution duration in seconds"}},"type":"object","required":["status"],"title":"WorkflowExecutionHistoryStatus","description":"Simplified execution history status for workflow cards."},"WorkflowExecutionResponse":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["message","success"],"title":"WorkflowExecutionResponse","description":"Response model for workflow execution operations."},"WorkflowExecutionUpdate":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"total_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tests"},"completed_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completed Tests"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"}},"type":"object","title":"WorkflowExecutionUpdate","description":"Request model for updating a workflow execution."},"WorkflowExecutionsBaseSchema":{"properties":{"id":{"type":"string","title":"Id"},"workflow_id":{"type":"string","format":"uuid4","title":"Workflow Id"},"source":{"type":"string","title":"Source","description":"Execution source: ui, cli, api, ci_cd, or workflow","default":"ui"},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"total_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tests","default":0},"completed_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completed Tests","default":0},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"concurrency_limit":{"type":"integer","title":"Concurrency Limit","default":3},"test_executions":{"items":{"$ref":"#/components/schemas/TestExecutionSummary"},"type":"array","title":"Test Executions","description":"Child test executions with session data for efficient operations"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"OpenTelemetry trace ID for Grafana correlation"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id","description":"Hatchet workflow run ID for cancellation support"},"task_id":{"type":"string","title":"Task Id","description":"Alias for id, for backwards compatibility with older clients.","readOnly":true}},"type":"object","required":["id","workflow_id","status","task_id"],"title":"WorkflowExecutionsBaseSchema","description":"WorkflowExecutions Base Schema for the new workflow_executions table.\n\nThis replaces WorkflowTasksBaseSchema with cleaner field names:\n- id (was task_id) - Primary key\n- source (was user_id) - Execution source enum"},"WorkflowExecutionsInsert":{"properties":{"id":{"type":"string","title":"Id"},"workflow_id":{"type":"string","format":"uuid4","title":"Workflow Id"},"source":{"type":"string","title":"Source","default":"ui"},"source_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Metadata"},"status":{"type":"string","title":"Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"total_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tests","default":0},"completed_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completed Tests","default":0},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"concurrency_limit":{"type":"integer","title":"Concurrency Limit","default":3},"test_executions":{"items":{"$ref":"#/components/schemas/TestExecutionSummary"},"type":"array","title":"Test Executions"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"}},"type":"object","required":["id","workflow_id","status"],"title":"WorkflowExecutionsInsert","description":"WorkflowExecutions Insert Schema for the new workflow_executions table."},"WorkflowExecutionsUpdate":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"string"},{"type":"null"}],"title":"Workflow Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"total_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tests"},"completed_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completed Tests"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"concurrency_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Concurrency Limit"},"test_executions":{"anyOf":[{"items":{"$ref":"#/components/schemas/TestExecutionSummary"},"type":"array"},{"type":"null"}],"title":"Test Executions"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"}},"type":"object","title":"WorkflowExecutionsUpdate","description":"WorkflowExecutions Update Schema for the new workflow_executions table."},"WorkflowForTestItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"WorkflowForTestItem"},"WorkflowInfo-Input":{"properties":{"workflow_id":{"type":"string","title":"Workflow Id"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Input"},{"type":"null"}]},"build_config":{"anyOf":[{"$ref":"#/components/schemas/WorkflowAppConfig"},{"type":"null"}],"description":"Build configuration override for this workflow execution"},"override_build_config":{"type":"boolean","title":"Override Build Config","description":"When True, build_config overrides individual test build configurations","default":false}},"type":"object","required":["workflow_id"],"title":"WorkflowInfo","description":"Request model for triggering workflow execution.\n\nAttributes:\n workflow_id: UUID of the workflow to execute.\n run_config: Optional run configuration override for workflow-triggered tests.\n build_config: Optional build configuration override for this execution.\n override_build_config: When True with build_config, overrides test builds."},"WorkflowInfo-Output":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"org_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"}},"type":"object","required":["id","name"],"title":"WorkflowInfo","description":"Basic workflow info for rule display."},"WorkflowLastExecution":{"properties":{"status":{"type":"string","enum":["success","failure","not_run","running","timeout","cancelled"],"title":"Status","description":"Status of the last execution"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Duration of the last execution in seconds"},"last_run":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Run","description":"ISO timestamp of the last execution"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At","description":"When the execution started"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Execution ID of the last execution (was task_id)"}},"type":"object","required":["status"],"title":"WorkflowLastExecution","description":"Model for workflow last execution data."},"WorkflowRulesResponse":{"properties":{"workflow_id":{"type":"string","format":"uuid","title":"Workflow Id"},"rules":{"items":{"$ref":"#/components/schemas/SlackNotificationRuleWithWorkflows"},"type":"array","title":"Rules"}},"type":"object","required":["workflow_id","rules"],"title":"WorkflowRulesResponse","description":"Response containing rules for a specific workflow."},"WorkflowShareStatusResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"shareable_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shareable Link"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"child_tests_shared":{"type":"integer","title":"Child Tests Shared","default":0},"child_tests_total":{"type":"integer","title":"Child Tests Total","default":0}},"type":"object","required":["enabled"],"title":"WorkflowShareStatusResponse"},"WorkflowStatus":{"type":"string","enum":["queued","setup","running","completed","failed","cancelled","timeout"],"title":"WorkflowStatus","description":"Workflow execution status."},"WorkflowStatusResponse":{"properties":{"execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Id"},"workflow_id":{"type":"string","title":"Workflow Id"},"status":{"$ref":"#/components/schemas/WorkflowStatus"},"progress":{"type":"number","title":"Progress"},"completed_tests":{"type":"integer","title":"Completed Tests"},"total_tests":{"type":"integer","title":"Total Tests"},"passed_tests":{"type":"integer","title":"Passed Tests","default":0},"failed_tests":{"type":"integer","title":"Failed Tests","default":0},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"estimated_completion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Completion"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","default":{}}},"type":"object","required":["workflow_id","status","progress","completed_tests","total_tests"],"title":"WorkflowStatusResponse","description":"Response model for workflow status polling that matches frontend expectations."},"WorkflowTaskInfo":{"properties":{"task_id":{"type":"string","title":"Task Id"},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"total_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tests"},"completed_tests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completed Tests"},"task_ids":{"items":{"type":"string"},"type":"array","title":"Task Ids","default":[]},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"triggered_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Triggered By"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"}},"type":"object","required":["task_id"],"title":"WorkflowTaskInfo"},"WorkflowTaskReportInfo":{"properties":{"task_id":{"type":"string","title":"Task Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"execution_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Execution Time Seconds"},"steps_completed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steps Completed"},"total_steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Steps"},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"current_step_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Step Index"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"was_quarantined":{"type":"boolean","title":"Was Quarantined","default":false}},"type":"object","required":["task_id"],"title":"WorkflowTaskReportInfo","description":"Enriched task info for workflow report cards."},"WorkflowTasksReportBatchRequest":{"properties":{"task_ids":{"items":{"type":"string"},"type":"array","title":"Task Ids"}},"type":"object","required":["task_ids"],"title":"WorkflowTasksReportBatchRequest","description":"Request model for batch workflow task report info."},"WorkflowTasksReportBatchResponse":{"properties":{"tasks":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/WorkflowTaskReportInfo"},{"type":"null"}]},"type":"object","title":"Tasks"},"requested_count":{"type":"integer","title":"Requested Count"},"found_count":{"type":"integer","title":"Found Count"}},"type":"object","required":["tasks","requested_count","found_count"],"title":"WorkflowTasksReportBatchResponse","description":"Response model for batch workflow task report info."},"WorkflowTestInfo":{"properties":{"id":{"type":"string","title":"Id","description":"Test ID"},"name":{"type":"string","title":"Name","description":"Test name"},"platform":{"type":"string","title":"Platform","description":"Test platform"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status","description":"Last execution status"},"last_execution_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Execution Time","description":"Last execution timestamp"},"last_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Duration","description":"Last execution duration"}},"type":"object","required":["id","name","platform"],"title":"WorkflowTestInfo","description":"Test information for workflow detail view."},"WorkflowUpdateResponse":{"properties":{"message":{"type":"string","title":"Message"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["message","data"],"title":"WorkflowUpdateResponse"},"WorkflowWithLastStatus":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"deleted":{"type":"boolean","title":"Deleted"},"last_run":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run"},"name":{"type":"string","title":"Name"},"org_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Org Id"},"owner":{"type":"string","format":"uuid4","title":"Owner"},"schedule":{"type":"string","title":"Schedule"},"schedule_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Timezone"},"tests":{"items":{"type":"string"},"type":"array","title":"Tests"},"schedule_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Schedule Enabled"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Output"},{"type":"null"}],"description":"Workflow-level run configuration that overrides individual test configs"},"override_run_config":{"type":"boolean","title":"Override Run Config"},"build_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Build Config","description":"Workflow-level build configuration (JSONB with ios_build and android_build)"},"override_build_config":{"type":"boolean","title":"Override Build Config","description":"When True, build_config overrides individual test build configurations","default":false},"location_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location Config","description":"Workflow-level location configuration (JSONB with latitude, longitude)"},"override_location":{"type":"boolean","title":"Override Location","description":"When True, location_config overrides individual test locations. Independent of override_run_config.","default":false},"test_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Test Timeout Seconds","description":"Per-test execution timeout in seconds. Applied to all tests dispatched by this workflow."},"quarantined_test_ids":{"items":{"type":"string"},"type":"array","title":"Quarantined Test Ids","description":"Test IDs with failure_policy='ignore_failure'. Failures in these tests do not fail the workflow."},"last_execution":{"$ref":"#/components/schemas/WorkflowLastExecution","description":"Last execution status and metadata"},"test_count":{"type":"integer","title":"Test Count","description":"Number of tests in this workflow"},"execution_history":{"items":{"$ref":"#/components/schemas/WorkflowExecutionHistoryStatus"},"type":"array","title":"Execution History","description":"Last N execution statuses"}},"type":"object","required":["id","deleted","name","owner","schedule","override_run_config","last_execution","test_count"],"title":"WorkflowWithLastStatus","description":"Workflow model with last execution status for workflow cards."},"WorkflowsBaseSchema":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"deleted":{"type":"boolean","title":"Deleted"},"last_run":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run"},"name":{"type":"string","title":"Name"},"org_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Org Id"},"owner":{"type":"string","format":"uuid4","title":"Owner"},"schedule":{"type":"string","title":"Schedule"},"schedule_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Timezone"},"tests":{"items":{"type":"string"},"type":"array","title":"Tests"},"schedule_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Schedule Enabled"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"run_config":{"anyOf":[{"$ref":"#/components/schemas/TestRunConfig-Output"},{"type":"null"}],"description":"Workflow-level run configuration that overrides individual test configs"},"override_run_config":{"type":"boolean","title":"Override Run Config"},"build_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Build Config","description":"Workflow-level build configuration (JSONB with ios_build and android_build)"},"override_build_config":{"type":"boolean","title":"Override Build Config","description":"When True, build_config overrides individual test build configurations","default":false},"location_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location Config","description":"Workflow-level location configuration (JSONB with latitude, longitude)"},"override_location":{"type":"boolean","title":"Override Location","description":"When True, location_config overrides individual test locations. Independent of override_run_config.","default":false},"test_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Test Timeout Seconds","description":"Per-test execution timeout in seconds. Applied to all tests dispatched by this workflow."},"quarantined_test_ids":{"items":{"type":"string"},"type":"array","title":"Quarantined Test Ids","description":"Test IDs with failure_policy='ignore_failure'. Failures in these tests do not fail the workflow."}},"type":"object","required":["id","deleted","name","owner","schedule","override_run_config"],"title":"WorkflowsBaseSchema","description":"Workflows Base Schema."},"WorkflowsForTestResponse":{"properties":{"workflows":{"items":{"$ref":"#/components/schemas/WorkflowForTestItem"},"type":"array","title":"Workflows"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["workflows","total"],"title":"WorkflowsForTestResponse"},"YamlCreationRequest":{"properties":{"yaml_content":{"type":"string","title":"Yaml Content","description":"YAML content"},"metadata_overrides":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata Overrides","description":"Metadata overrides"}},"type":"object","required":["yaml_content"],"title":"YamlCreationRequest","description":"Request model for creating tests from YAML"},"YamlCreationResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the operation was successful"},"test_id":{"type":"string","title":"Test Id","description":"Generated test ID"},"extracted_metadata":{"additionalProperties":true,"type":"object","title":"Extracted Metadata","description":"Metadata extracted from YAML"},"blocks_count":{"type":"integer","title":"Blocks Count","description":"Number of blocks created"},"generated_ids":{"items":{"type":"string"},"type":"array","title":"Generated Ids","description":"List of generated block IDs"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"Any errors that occurred"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message"}},"type":"object","required":["success","test_id","extracted_metadata","blocks_count","generated_ids"],"title":"YamlCreationResponse","description":"Response model for YAML test creation"},"YamlToBlocksRequest":{"properties":{"yaml_content":{"type":"string","title":"Yaml Content","description":"YAML content to convert"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options","description":"Conversion options"}},"type":"object","required":["yaml_content"],"title":"YamlToBlocksRequest","description":"Request model for YAML to blocks conversion"},"app__routes__execution_routes__billing_xpt__AttachRequest":{"properties":{"redirect_url":{"type":"string","title":"Redirect Url"},"product_id":{"type":"string","title":"Product Id","default":"starter"}},"type":"object","required":["redirect_url"],"title":"AttachRequest"},"app__routes__execution_routes__billing_xpt__AttachResponse":{"properties":{"message":{"type":"string","title":"Message"},"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"}},"type":"object","required":["message"],"title":"AttachResponse"},"app__routes__execution_routes__billing_xpt__SessionHistoryItem":{"properties":{"usage_id":{"type":"string","title":"Usage Id"},"session_id":{"type":"string","title":"Session Id"},"platform":{"type":"string","title":"Platform"},"is_real_device":{"type":"boolean","title":"Is Real Device"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"device_cost_usd":{"type":"number","title":"Device Cost Usd"},"llm_cost_usd":{"type":"number","title":"Llm Cost Usd"},"total_cost_usd":{"type":"number","title":"Total Cost Usd"},"billing_status":{"type":"string","title":"Billing Status"},"billed_at":{"type":"string","title":"Billed At"},"session_status":{"type":"string","title":"Session Status"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"session_started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Started At"},"session_ended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Ended At"}},"type":"object","required":["usage_id","session_id","platform","is_real_device","duration_seconds","device_cost_usd","llm_cost_usd","total_cost_usd","billing_status","billed_at","session_status"],"title":"SessionHistoryItem"},"app__routes__execution_routes__billing_xpt__SessionHistoryResponse":{"properties":{"sessions":{"items":{"$ref":"#/components/schemas/app__routes__execution_routes__billing_xpt__SessionHistoryItem"},"type":"array","title":"Sessions"},"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["sessions","period_start","period_end","limit","offset"],"title":"SessionHistoryResponse"},"app__routes__execution_routes__device_sessions_xpt__SessionHistoryItem":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"source_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Metadata"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ended At"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"workflow_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Run Id"},"report_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Id"},"has_video":{"type":"boolean","title":"Has Video","default":false},"step_count":{"type":"integer","title":"Step Count","default":0},"test_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Execution Id"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"test_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Name"},"workflow_execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Execution Id"},"workflow_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Name"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},"type":"object","required":["id","org_id","status"],"title":"SessionHistoryItem","description":"Single row in the device session history listing."},"app__routes__execution_routes__device_sessions_xpt__SessionHistoryResponse":{"properties":{"sessions":{"items":{"$ref":"#/components/schemas/app__routes__execution_routes__device_sessions_xpt__SessionHistoryItem"},"type":"array","title":"Sessions"},"org_id":{"type":"string","title":"Org Id"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["sessions","org_id","total","limit","offset"],"title":"SessionHistoryResponse","description":"Paginated device session history response."},"app__routes__rebel_routes__analytics_xpt__ChartDataPoint":{"properties":{"date":{"type":"string","title":"Date"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"trend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend"},"deployments":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deployments"},"team_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Team Average"},"median_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Hours"},"p25_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P25 Hours"},"p75_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P75 Hours"}},"type":"object","required":["date"],"title":"ChartDataPoint"},"app__routes__rebel_routes__billing_xpt__AttachRequest":{"properties":{"redirect_url":{"type":"string","title":"Redirect Url"},"quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity","default":2}},"type":"object","required":["redirect_url"],"title":"AttachRequest"},"app__routes__rebel_routes__billing_xpt__AttachResponse":{"properties":{"message":{"type":"string","title":"Message"},"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"}},"type":"object","required":["message"],"title":"AttachResponse"},"app__routes__report_routes__test_report_xpt__StepMetadata":{"properties":{"index":{"type":"integer","title":"Index"},"action_type":{"type":"string","title":"Action Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_time":{"type":"number","title":"Start Time"},"end_time":{"type":"number","title":"End Time"}},"type":"object","required":["index","action_type","start_time","end_time"],"title":"StepMetadata","description":"Lightweight step metadata for replay timeline."},"app__routes__workflow_routes__workflow_share_xpt__StepMetadata":{"properties":{"index":{"type":"integer","title":"Index"},"action_type":{"type":"string","title":"Action Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_time":{"type":"number","title":"Start Time"},"end_time":{"type":"number","title":"End Time"}},"type":"object","required":["index","action_type","start_time","end_time"],"title":"StepMetadata"},"cognisim_schemas__schemas__backend_schema__ChartDataPoint":{"properties":{"date":{"type":"string","title":"Date","description":"Date in YYYY-MM-DD format"},"passed":{"type":"integer","title":"Passed","description":"Number of passed tests on this date"},"failed":{"type":"integer","title":"Failed","description":"Number of failed tests on this date"},"total":{"type":"integer","title":"Total","description":"Total number of tests on this date"},"success_rate":{"type":"number","title":"Success Rate","description":"Success rate as percentage (0-100)"},"avg_duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Duration","description":"Average execution duration in seconds for this date"}},"type":"object","required":["date","passed","failed","total","success_rate"],"title":"ChartDataPoint","description":"Daily aggregated chart data point."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}